@astralyn/pi 0.99.0 → 1.0.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/CHANGELOG.md +39 -3
- package/dist/bundle/chunks/anthropic-messages-CG2BSDQS.js +6 -0
- package/dist/bundle/chunks/anthropic.js +2 -2
- package/dist/bundle/chunks/{azure-openai-responses-RPBERDXD.js → azure-openai-responses-PBA4QKCM.js} +1 -1
- package/dist/bundle/chunks/bedrock-converse-stream.js +2 -2
- package/dist/bundle/chunks/{chunk-ABVRAYXT.js → chunk-6UFFVA7M.js} +2 -2
- package/dist/bundle/chunks/chunk-GIG5IHES.js +2 -0
- package/dist/bundle/chunks/{chunk-VW2P3X6P.js → chunk-HESRDUKO.js} +414 -666
- package/dist/bundle/chunks/{chunk-A576H74Y.js → chunk-PFZKRUMO.js} +1 -1
- package/dist/bundle/chunks/chunk-SGLYRVQL.js +2 -0
- package/dist/bundle/chunks/chunk-TRHTWM3C.js +2 -0
- package/dist/bundle/chunks/{chunk-DEWXBB6W.js → chunk-V66VGGOM.js} +1 -1
- package/dist/bundle/chunks/chunk-Z2RKSI3O.js +2 -0
- package/dist/bundle/chunks/{cloudflare-workers-ai-system-one-ZYSAFXXL.js → cloudflare-workers-ai-system-one-YB7XPPP4.js} +1 -1
- package/dist/bundle/chunks/codemode-worker.js +67 -8
- package/dist/bundle/chunks/github-copilot.js +1 -1
- package/dist/bundle/chunks/{google-generative-ai-SDNQVVXA.js → google-generative-ai-V5ZM5MCL.js} +1 -1
- package/dist/bundle/chunks/{google-vertex-LZXOLBIO.js → google-vertex-22THOFP5.js} +1 -1
- package/dist/bundle/chunks/{llama-cpp-classify-7IYGGPND.js → llama-cpp-classify-R7DQLTQN.js} +1 -1
- package/dist/bundle/chunks/{mistral-conversations-VYKPSSAM.js → mistral-conversations-WHSCJJWP.js} +1 -1
- package/dist/bundle/chunks/openai-chatgpt.js +1 -1
- package/dist/bundle/chunks/{openai-codex-responses-HZ4VUDXD.js → openai-codex-responses-N7GDPBPP.js} +1 -1
- package/dist/bundle/chunks/openai-codex.js +1 -1
- package/dist/bundle/chunks/{openai-completions-SKDGF6OE.js → openai-completions-RGGQK5UW.js} +1 -1
- package/dist/bundle/chunks/{openai-responses-FPML4SSG.js → openai-responses-3ZLD5JYI.js} +1 -1
- package/dist/bundle/chunks/{openrouter-images-5524IQHX.js → openrouter-images-YP3YVB54.js} +1 -1
- package/dist/bundle/chunks/openrouter.js +1 -1
- package/dist/bundle/chunks/radius.js +1 -1
- package/dist/bundle/chunks/{typesafe-system-one-Z2CDLKEY.js → typesafe-system-one-RREJAKWB.js} +1 -1
- package/dist/bundle/chunks/virtual-modules-4RQ2L6W4.js +2 -0
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/cli/args.js +1 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/config.d.ts +5 -8
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +16 -13
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session.d.ts +21 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +64 -11
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +13 -1
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/types.d.ts +6 -1
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/keybindings.d.ts +51 -11
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +11 -3
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/mcp-servers.d.ts +34 -7
- package/dist/core/mcp-servers.d.ts.map +1 -1
- package/dist/core/mcp-servers.js +52 -11
- package/dist/core/mcp-servers.js.map +1 -1
- package/dist/core/model-registry.d.ts +3 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +4 -0
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-runtime.d.ts +6 -0
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +22 -18
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/radius.d.ts +2 -0
- package/dist/core/radius.d.ts.map +1 -1
- package/dist/core/radius.js +2 -0
- package/dist/core/radius.js.map +1 -1
- package/dist/core/remote-catalog-provider.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.js +4 -9
- package/dist/core/remote-catalog-provider.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +1 -0
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/settings-manager.d.ts +7 -5
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +2 -1
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/system-prompt.js +1 -1
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tasks/format.d.ts +7 -0
- package/dist/core/tasks/format.d.ts.map +1 -0
- package/dist/core/tasks/format.js +14 -0
- package/dist/core/tasks/format.js.map +1 -0
- package/dist/core/tasks/history.d.ts.map +1 -1
- package/dist/core/tasks/history.js +0 -19
- package/dist/core/tasks/history.js.map +1 -1
- package/dist/core/tasks/output.d.ts +8 -0
- package/dist/core/tasks/output.d.ts.map +1 -1
- package/dist/core/tasks/output.js +19 -0
- package/dist/core/tasks/output.js.map +1 -1
- package/dist/core/tasks/presentation.d.ts +1 -3
- package/dist/core/tasks/presentation.d.ts.map +1 -1
- package/dist/core/tasks/presentation.js +79 -166
- package/dist/core/tasks/presentation.js.map +1 -1
- package/dist/core/tasks/runtime.d.ts +16 -9
- package/dist/core/tasks/runtime.d.ts.map +1 -1
- package/dist/core/tasks/runtime.js +89 -106
- package/dist/core/tasks/runtime.js.map +1 -1
- package/dist/core/tasks/session.d.ts.map +1 -1
- package/dist/core/tasks/session.js +13 -4
- package/dist/core/tasks/session.js.map +1 -1
- package/dist/core/tasks/store.d.ts +20 -6
- package/dist/core/tasks/store.d.ts.map +1 -1
- package/dist/core/tasks/store.js +45 -18
- package/dist/core/tasks/store.js.map +1 -1
- package/dist/core/tasks/types.d.ts +14 -54
- package/dist/core/tasks/types.d.ts.map +1 -1
- package/dist/core/tasks/types.js +1 -5
- package/dist/core/tasks/types.js.map +1 -1
- package/dist/core/tools/renderers/bash.d.ts.map +1 -1
- package/dist/core/tools/renderers/bash.js +11 -34
- package/dist/core/tools/renderers/bash.js.map +1 -1
- package/dist/core/tools/shell-execution.d.ts +0 -1
- package/dist/core/tools/shell-execution.d.ts.map +1 -1
- package/dist/core/tools/shell-execution.js +3 -10
- package/dist/core/tools/shell-execution.js.map +1 -1
- package/dist/core/tools/shell-tool.d.ts.map +1 -1
- package/dist/core/tools/shell-tool.js +2 -4
- package/dist/core/tools/shell-tool.js.map +1 -1
- package/dist/core/tools/tasks/actions.d.ts +1 -1
- package/dist/core/tools/tasks/actions.d.ts.map +1 -1
- package/dist/core/tools/tasks/actions.js +26 -12
- package/dist/core/tools/tasks/actions.js.map +1 -1
- package/dist/core/tools/tasks/constants.d.ts +2 -6
- package/dist/core/tools/tasks/constants.d.ts.map +1 -1
- package/dist/core/tools/tasks/constants.js +2 -6
- package/dist/core/tools/tasks/constants.js.map +1 -1
- package/dist/core/tools/tasks/schema.d.ts +1 -1
- package/dist/core/tools/tasks/schema.d.ts.map +1 -1
- package/dist/core/tools/tasks/schema.js +8 -7
- package/dist/core/tools/tasks/schema.js.map +1 -1
- package/dist/core/tools/tasks/types.d.ts +8 -38
- package/dist/core/tools/tasks/types.d.ts.map +1 -1
- package/dist/core/tools/tasks/types.js +6 -11
- package/dist/core/tools/tasks/types.js.map +1 -1
- package/dist/core/virtual-models.d.ts +2 -0
- package/dist/core/virtual-models.d.ts.map +1 -1
- package/dist/core/virtual-models.js +19 -12
- package/dist/core/virtual-models.js.map +1 -1
- package/dist/extensions/btw/agent.d.ts +17 -8
- package/dist/extensions/btw/agent.d.ts.map +1 -1
- package/dist/extensions/btw/agent.js +74 -76
- package/dist/extensions/btw/agent.js.map +1 -1
- package/dist/extensions/btw/controller.d.ts +0 -1
- package/dist/extensions/btw/controller.d.ts.map +1 -1
- package/dist/extensions/btw/controller.js +26 -33
- package/dist/extensions/btw/controller.js.map +1 -1
- package/dist/extensions/btw/panel.d.ts +13 -14
- package/dist/extensions/btw/panel.d.ts.map +1 -1
- package/dist/extensions/btw/panel.js +38 -29
- package/dist/extensions/btw/panel.js.map +1 -1
- package/dist/extensions/codemode/execute.d.ts.map +1 -1
- package/dist/extensions/codemode/execute.js +197 -51
- package/dist/extensions/codemode/execute.js.map +1 -1
- package/dist/extensions/codemode/renderer.d.ts.map +1 -1
- package/dist/extensions/codemode/renderer.js +43 -25
- package/dist/extensions/codemode/renderer.js.map +1 -1
- package/dist/extensions/codemode/tool.d.ts +12 -11
- package/dist/extensions/codemode/tool.d.ts.map +1 -1
- package/dist/extensions/codemode/tool.js +73 -129
- package/dist/extensions/codemode/tool.js.map +1 -1
- package/dist/extensions/codemode/worker.d.ts +1 -1
- package/dist/extensions/codemode/worker.js +1 -1
- package/dist/extensions/codemode/worker.js.map +1 -1
- package/dist/extensions/deepwiki/schema.d.ts +1 -1
- package/dist/extensions/index.d.ts.map +1 -1
- package/dist/extensions/index.js +0 -2
- package/dist/extensions/index.js.map +1 -1
- package/dist/extensions/mcp/cli.d.ts.map +1 -1
- package/dist/extensions/mcp/cli.js +20 -5
- package/dist/extensions/mcp/cli.js.map +1 -1
- package/dist/extensions/mcp/config.d.ts +4 -2
- package/dist/extensions/mcp/config.d.ts.map +1 -1
- package/dist/extensions/mcp/config.js +14 -2
- package/dist/extensions/mcp/config.js.map +1 -1
- package/dist/extensions/mcp/index.d.ts +32 -8
- package/dist/extensions/mcp/index.d.ts.map +1 -1
- package/dist/extensions/mcp/index.js +235 -61
- package/dist/extensions/mcp/index.js.map +1 -1
- package/dist/extensions/mcp/oauth.d.ts +10 -7
- package/dist/extensions/mcp/oauth.d.ts.map +1 -1
- package/dist/extensions/mcp/oauth.js +56 -31
- package/dist/extensions/mcp/oauth.js.map +1 -1
- package/dist/extensions/mcp/runtime.d.ts +2 -0
- package/dist/extensions/mcp/runtime.d.ts.map +1 -1
- package/dist/extensions/mcp/runtime.js +16 -9
- package/dist/extensions/mcp/runtime.js.map +1 -1
- package/dist/extensions/mcp/tools.d.ts +5 -4
- package/dist/extensions/mcp/tools.d.ts.map +1 -1
- package/dist/extensions/mcp/tools.js +33 -15
- package/dist/extensions/mcp/tools.js.map +1 -1
- package/dist/extensions/mcp/ui.d.ts.map +1 -1
- package/dist/extensions/mcp/ui.js +4 -2
- package/dist/extensions/mcp/ui.js.map +1 -1
- package/dist/extensions/provider/catalog.d.ts +8 -1
- package/dist/extensions/provider/catalog.d.ts.map +1 -1
- package/dist/extensions/provider/catalog.js +31 -0
- package/dist/extensions/provider/catalog.js.map +1 -1
- package/dist/extensions/provider/connection.d.ts +4 -1
- package/dist/extensions/provider/connection.d.ts.map +1 -1
- package/dist/extensions/provider/connection.js +1 -5
- package/dist/extensions/provider/connection.js.map +1 -1
- package/dist/extensions/provider/editing.d.ts +36 -0
- package/dist/extensions/provider/editing.d.ts.map +1 -0
- package/dist/extensions/provider/editing.js +99 -0
- package/dist/extensions/provider/editing.js.map +1 -0
- package/dist/extensions/provider/json-fields.d.ts +5 -0
- package/dist/extensions/provider/json-fields.d.ts.map +1 -0
- package/dist/extensions/provider/json-fields.js +31 -0
- package/dist/extensions/provider/json-fields.js.map +1 -0
- package/dist/extensions/provider/store.d.ts +1 -4
- package/dist/extensions/provider/store.d.ts.map +1 -1
- package/dist/extensions/provider/store.js +2 -30
- package/dist/extensions/provider/store.js.map +1 -1
- package/dist/extensions/provider/ui/builtin-data.d.ts +0 -2
- package/dist/extensions/provider/ui/builtin-data.d.ts.map +1 -1
- package/dist/extensions/provider/ui/builtin-data.js +14 -79
- package/dist/extensions/provider/ui/builtin-data.js.map +1 -1
- package/dist/extensions/provider/ui/compat.d.ts.map +1 -1
- package/dist/extensions/provider/ui/compat.js +6 -9
- package/dist/extensions/provider/ui/compat.js.map +1 -1
- package/dist/extensions/provider/ui/controls.d.ts +48 -0
- package/dist/extensions/provider/ui/controls.d.ts.map +1 -0
- package/dist/extensions/provider/ui/controls.js +108 -0
- package/dist/extensions/provider/ui/controls.js.map +1 -0
- package/dist/extensions/provider/ui/dictionary.d.ts.map +1 -1
- package/dist/extensions/provider/ui/dictionary.js +6 -9
- package/dist/extensions/provider/ui/dictionary.js.map +1 -1
- package/dist/extensions/provider/ui/editor.d.ts +3 -3
- package/dist/extensions/provider/ui/editor.d.ts.map +1 -1
- package/dist/extensions/provider/ui/editor.js +35 -140
- package/dist/extensions/provider/ui/editor.js.map +1 -1
- package/dist/extensions/provider/ui/fetch-models.d.ts +0 -3
- package/dist/extensions/provider/ui/fetch-models.d.ts.map +1 -1
- package/dist/extensions/provider/ui/fetch-models.js +49 -44
- package/dist/extensions/provider/ui/fetch-models.js.map +1 -1
- package/dist/extensions/provider/ui/model-fields.d.ts.map +1 -1
- package/dist/extensions/provider/ui/model-fields.js +11 -14
- package/dist/extensions/provider/ui/model-fields.js.map +1 -1
- package/dist/extensions/provider/ui/model-options.d.ts +4 -34
- package/dist/extensions/provider/ui/model-options.d.ts.map +1 -1
- package/dist/extensions/provider/ui/model-options.js +90 -271
- package/dist/extensions/provider/ui/model-options.js.map +1 -1
- package/dist/extensions/provider/ui/pane.d.ts +4 -18
- package/dist/extensions/provider/ui/pane.d.ts.map +1 -1
- package/dist/extensions/provider/ui/pane.js.map +1 -1
- package/dist/extensions/provider/ui/provider-fields.d.ts +2 -19
- package/dist/extensions/provider/ui/provider-fields.d.ts.map +1 -1
- package/dist/extensions/provider/ui/provider-fields.js +58 -171
- package/dist/extensions/provider/ui/provider-fields.js.map +1 -1
- package/dist/extensions/provider/ui/thinking-map.d.ts.map +1 -1
- package/dist/extensions/provider/ui/thinking-map.js +6 -9
- package/dist/extensions/provider/ui/thinking-map.js.map +1 -1
- package/dist/extensions/question/detail-pane.d.ts +7 -2
- package/dist/extensions/question/detail-pane.d.ts.map +1 -1
- package/dist/extensions/question/detail-pane.js +16 -5
- package/dist/extensions/question/detail-pane.js.map +1 -1
- package/dist/extensions/question/dialog-view.d.ts +41 -0
- package/dist/extensions/question/dialog-view.d.ts.map +1 -0
- package/dist/extensions/question/dialog-view.js +329 -0
- package/dist/extensions/question/dialog-view.js.map +1 -0
- package/dist/extensions/question/dialog.d.ts +3 -3
- package/dist/extensions/question/dialog.d.ts.map +1 -1
- package/dist/extensions/question/dialog.js +220 -634
- package/dist/extensions/question/dialog.js.map +1 -1
- package/dist/extensions/question/index.d.ts.map +1 -1
- package/dist/extensions/question/index.js +2 -3
- package/dist/extensions/question/index.js.map +1 -1
- package/dist/extensions/question/render.d.ts.map +1 -1
- package/dist/extensions/question/render.js +22 -32
- package/dist/extensions/question/render.js.map +1 -1
- package/dist/extensions/question/results.d.ts.map +1 -1
- package/dist/extensions/question/results.js +56 -12
- package/dist/extensions/question/results.js.map +1 -1
- package/dist/extensions/question/schema.d.ts +21 -6
- package/dist/extensions/question/schema.d.ts.map +1 -1
- package/dist/extensions/question/schema.js.map +1 -1
- package/dist/extensions/question/state.d.ts +9 -7
- package/dist/extensions/question/state.d.ts.map +1 -1
- package/dist/extensions/question/state.js +63 -54
- package/dist/extensions/question/state.js.map +1 -1
- package/dist/extensions/question/types.d.ts +41 -18
- package/dist/extensions/question/types.d.ts.map +1 -1
- package/dist/extensions/question/types.js.map +1 -1
- package/dist/extensions/statusline/index.d.ts +4 -0
- package/dist/extensions/statusline/index.d.ts.map +1 -1
- package/dist/extensions/statusline/index.js +18 -355
- package/dist/extensions/statusline/index.js.map +1 -1
- package/dist/extensions/statusline/render.d.ts +19 -0
- package/dist/extensions/statusline/render.d.ts.map +1 -0
- package/dist/extensions/statusline/render.js +163 -0
- package/dist/extensions/statusline/render.js.map +1 -0
- package/dist/extensions/statusline/usage.d.ts +12 -0
- package/dist/extensions/statusline/usage.d.ts.map +1 -0
- package/dist/extensions/statusline/usage.js +36 -0
- package/dist/extensions/statusline/usage.js.map +1 -0
- package/dist/extensions/tool-search/tool.d.ts +5 -4
- package/dist/extensions/tool-search/tool.d.ts.map +1 -1
- package/dist/extensions/tool-search/tool.js +7 -28
- package/dist/extensions/tool-search/tool.js.map +1 -1
- package/dist/extensions/web-search/execute.d.ts +1 -5
- package/dist/extensions/web-search/execute.d.ts.map +1 -1
- package/dist/extensions/web-search/execute.js +4 -9
- package/dist/extensions/web-search/execute.js.map +1 -1
- package/dist/extensions/web-search/format.d.ts +12 -3
- package/dist/extensions/web-search/format.d.ts.map +1 -1
- package/dist/extensions/web-search/format.js +33 -25
- package/dist/extensions/web-search/format.js.map +1 -1
- package/dist/extensions/web-search/index.d.ts.map +1 -1
- package/dist/extensions/web-search/index.js +6 -29
- package/dist/extensions/web-search/index.js.map +1 -1
- package/dist/extensions/web-search/providers/deepseek.d.ts.map +1 -1
- package/dist/extensions/web-search/providers/deepseek.js +0 -1
- package/dist/extensions/web-search/providers/deepseek.js.map +1 -1
- package/dist/extensions/web-search/providers/http.d.ts +1 -1
- package/dist/extensions/web-search/providers/http.d.ts.map +1 -1
- package/dist/extensions/web-search/providers/http.js.map +1 -1
- package/dist/extensions/web-search/providers/minimax.d.ts.map +1 -1
- package/dist/extensions/web-search/providers/minimax.js +0 -1
- package/dist/extensions/web-search/providers/minimax.js.map +1 -1
- package/dist/extensions/web-search/render.d.ts +7 -2
- package/dist/extensions/web-search/render.d.ts.map +1 -1
- package/dist/extensions/web-search/render.js +32 -4
- package/dist/extensions/web-search/render.js.map +1 -1
- package/dist/extensions/web-search/results.d.ts.map +1 -1
- package/dist/extensions/web-search/results.js +3 -8
- package/dist/extensions/web-search/results.js.map +1 -1
- package/dist/extensions/web-search/types.d.ts +4 -2
- package/dist/extensions/web-search/types.d.ts.map +1 -1
- package/dist/extensions/web-search/types.js.map +1 -1
- package/dist/index.d.ts +2 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +6 -0
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts +8 -2
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js +24 -21
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/components/pi-logo-animation.d.ts +68 -0
- package/dist/modes/interactive/components/pi-logo-animation.d.ts.map +1 -0
- package/dist/modes/interactive/components/pi-logo-animation.js +1076 -0
- package/dist/modes/interactive/components/pi-logo-animation.js.map +1 -0
- package/dist/modes/interactive/components/pi-logo-animation.lazy.d.ts +7 -0
- package/dist/modes/interactive/components/pi-logo-animation.lazy.d.ts.map +1 -0
- package/dist/modes/interactive/components/pi-logo-animation.lazy.js +12 -0
- package/dist/modes/interactive/components/pi-logo-animation.lazy.js.map +1 -0
- package/dist/modes/interactive/components/pi-logo.d.ts +7 -0
- package/dist/modes/interactive/components/pi-logo.d.ts.map +1 -1
- package/dist/modes/interactive/components/pi-logo.js +13 -1
- package/dist/modes/interactive/components/pi-logo.js.map +1 -1
- package/dist/modes/interactive/components/radius-login-selector.d.ts +15 -0
- package/dist/modes/interactive/components/radius-login-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/radius-login-selector.js +83 -0
- package/dist/modes/interactive/components/radius-login-selector.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector.d.ts +3 -3
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +5 -5
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/status-marker.d.ts +0 -2
- package/dist/modes/interactive/components/status-marker.d.ts.map +1 -1
- package/dist/modes/interactive/components/status-marker.js +0 -4
- package/dist/modes/interactive/components/status-marker.js.map +1 -1
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message.js +5 -4
- package/dist/modes/interactive/components/user-message.js.map +1 -1
- package/dist/modes/interactive/components/visual-truncate.d.ts +27 -3
- package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
- package/dist/modes/interactive/components/visual-truncate.js +36 -6
- package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +10 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +167 -40
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/tasks/completion-render.d.ts +1 -1
- package/dist/modes/interactive/tasks/completion-render.d.ts.map +1 -1
- package/dist/modes/interactive/tasks/completion-render.js +28 -82
- package/dist/modes/interactive/tasks/completion-render.js.map +1 -1
- package/dist/modes/interactive/tasks/index.d.ts.map +1 -1
- package/dist/modes/interactive/tasks/index.js +18 -13
- package/dist/modes/interactive/tasks/index.js.map +1 -1
- package/dist/modes/interactive/tasks/inspector.d.ts +35 -0
- package/dist/modes/interactive/tasks/inspector.d.ts.map +1 -0
- package/dist/modes/interactive/tasks/inspector.js +93 -0
- package/dist/modes/interactive/tasks/inspector.js.map +1 -0
- package/dist/modes/interactive/tasks/layout.d.ts +40 -0
- package/dist/modes/interactive/tasks/layout.d.ts.map +1 -0
- package/dist/modes/interactive/tasks/layout.js +212 -0
- package/dist/modes/interactive/tasks/layout.js.map +1 -0
- package/dist/modes/interactive/tasks/list.d.ts +21 -0
- package/dist/modes/interactive/tasks/list.d.ts.map +1 -0
- package/dist/modes/interactive/tasks/list.js +96 -0
- package/dist/modes/interactive/tasks/list.js.map +1 -0
- package/dist/modes/interactive/tasks/manager.d.ts +29 -36
- package/dist/modes/interactive/tasks/manager.d.ts.map +1 -1
- package/dist/modes/interactive/tasks/manager.js +315 -315
- package/dist/modes/interactive/tasks/manager.js.map +1 -1
- package/dist/modes/interactive/tasks/model.d.ts +21 -0
- package/dist/modes/interactive/tasks/model.d.ts.map +1 -0
- package/dist/modes/interactive/tasks/model.js +41 -0
- package/dist/modes/interactive/tasks/model.js.map +1 -0
- package/dist/modes/interactive/tasks/render.d.ts +5 -19
- package/dist/modes/interactive/tasks/render.d.ts.map +1 -1
- package/dist/modes/interactive/tasks/render.js +18 -102
- package/dist/modes/interactive/tasks/render.js.map +1 -1
- package/dist/modes/interactive/tasks/task-view.d.ts +8 -48
- package/dist/modes/interactive/tasks/task-view.d.ts.map +1 -1
- package/dist/modes/interactive/tasks/task-view.js +11 -51
- package/dist/modes/interactive/tasks/task-view.js.map +1 -1
- package/dist/modes/interactive/tasks/text.d.ts +1 -7
- package/dist/modes/interactive/tasks/text.d.ts.map +1 -1
- package/dist/modes/interactive/tasks/text.js +6 -29
- package/dist/modes/interactive/tasks/text.js.map +1 -1
- package/dist/modes/interactive/tasks/viewport.d.ts +2 -0
- package/dist/modes/interactive/tasks/viewport.d.ts.map +1 -1
- package/dist/modes/interactive/tasks/viewport.js +17 -7
- package/dist/modes/interactive/tasks/viewport.js.map +1 -1
- package/dist/modes/interactive/tasks/views.d.ts +9 -0
- package/dist/modes/interactive/tasks/views.d.ts.map +1 -0
- package/dist/modes/interactive/tasks/views.js +42 -0
- package/dist/modes/interactive/tasks/views.js.map +1 -0
- package/dist/modes/interactive/theme/system-theme.d.ts +2 -1
- package/dist/modes/interactive/theme/system-theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/system-theme.js +16 -5
- package/dist/modes/interactive/theme/system-theme.js.map +1 -1
- package/docs/bundled/README.md +0 -1
- package/docs/bundled/extensions/question.md +2 -2
- package/docs/bundled/extensions/statusline.md +24 -15
- package/docs/bundled/tasks.md +34 -48
- package/docs/codemode.md +207 -0
- package/docs/docs.json +4 -4
- package/docs/environment-variables.md +1 -1
- package/docs/extensions.md +7 -9
- package/docs/keybindings.md +13 -6
- package/docs/mcp.md +142 -82
- package/docs/models.md +21 -0
- package/docs/providers.md +8 -0
- package/docs/sdk.md +2 -2
- package/docs/session-format.md +12 -22
- package/docs/settings.md +4 -2
- package/docs/tui.md +1 -1
- package/docs/usage.md +6 -16
- package/examples/README.md +1 -1
- package/examples/extensions/README.md +1 -2
- package/examples/extensions/built-in-tool-renderer.ts +16 -40
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/minimal-mode.ts +24 -96
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/examples/sdk/14-codemode-mcp.ts +2 -2
- package/npm-shrinkwrap.json +69 -58
- package/package.json +11 -10
- package/dist/bundle/chunks/anthropic-messages-KIXY7EDT.js +0 -6
- package/dist/bundle/chunks/chunk-CLLDCO64.js +0 -2
- package/dist/bundle/chunks/chunk-UUSTLCVC.js +0 -2
- package/dist/bundle/chunks/chunk-VWCWZD6E.js +0 -2
- package/dist/bundle/chunks/virtual-modules-TQRORWJQ.js +0 -2
- package/dist/core/tasks/view-data.d.ts +0 -8
- package/dist/core/tasks/view-data.d.ts.map +0 -1
- package/dist/core/tasks/view-data.js +0 -61
- package/dist/core/tasks/view-data.js.map +0 -1
- package/dist/core/tasks/view.d.ts +0 -30
- package/dist/core/tasks/view.d.ts.map +0 -1
- package/dist/core/tasks/view.js +0 -50
- package/dist/core/tasks/view.js.map +0 -1
- package/dist/core/tools/renderers/shell-task.d.ts +0 -4
- package/dist/core/tools/renderers/shell-task.d.ts.map +0 -1
- package/dist/core/tools/renderers/shell-task.js +0 -35
- package/dist/core/tools/renderers/shell-task.js.map +0 -1
- package/dist/extensions/todo/constants.d.ts +0 -16
- package/dist/extensions/todo/constants.d.ts.map +0 -1
- package/dist/extensions/todo/constants.js +0 -30
- package/dist/extensions/todo/constants.js.map +0 -1
- package/dist/extensions/todo/index.d.ts +0 -3
- package/dist/extensions/todo/index.d.ts.map +0 -1
- package/dist/extensions/todo/index.js +0 -98
- package/dist/extensions/todo/index.js.map +0 -1
- package/dist/extensions/todo/schema.d.ts +0 -60
- package/dist/extensions/todo/schema.d.ts.map +0 -1
- package/dist/extensions/todo/schema.js +0 -56
- package/dist/extensions/todo/schema.js.map +0 -1
- package/dist/extensions/todo/state.d.ts +0 -34
- package/dist/extensions/todo/state.d.ts.map +0 -1
- package/dist/extensions/todo/state.js +0 -425
- package/dist/extensions/todo/state.js.map +0 -1
- package/dist/extensions/todo/view.d.ts +0 -36
- package/dist/extensions/todo/view.d.ts.map +0 -1
- package/dist/extensions/todo/view.js +0 -580
- package/dist/extensions/todo/view.js.map +0 -1
- package/dist/extensions/todo/widget.d.ts +0 -15
- package/dist/extensions/todo/widget.d.ts.map +0 -1
- package/dist/extensions/todo/widget.js +0 -50
- package/dist/extensions/todo/widget.js.map +0 -1
- package/dist/modes/interactive/tasks/fallback-view.d.ts +0 -4
- package/dist/modes/interactive/tasks/fallback-view.d.ts.map +0 -1
- package/dist/modes/interactive/tasks/fallback-view.js +0 -27
- package/dist/modes/interactive/tasks/fallback-view.js.map +0 -1
- package/docs/bundled/extensions/todo.md +0 -104
- package/examples/extensions/todo.ts +0 -297
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/** Saved provider configuration, canonical authentication, and catalog import operations. */
|
|
2
2
|
import type { ModelRuntime } from "../../core/model-runtime.ts";
|
|
3
|
+
import type { ProviderEdits } from "./editing.ts";
|
|
3
4
|
import { type ProbeModel, type ProbeResult } from "./probe.ts";
|
|
4
5
|
import type { RefreshCoordinator } from "./refresh.ts";
|
|
5
6
|
import type { ModelsJsonStore } from "./store.ts";
|
|
@@ -10,5 +11,7 @@ export interface ProviderConnectionOptions {
|
|
|
10
11
|
runtime: Pick<ModelRuntime, "getAuth" | "getProviderAuthStatus">;
|
|
11
12
|
}
|
|
12
13
|
export declare function fetchProviderModels(options: ProviderConnectionOptions, signal: AbortSignal): Promise<ProbeResult>;
|
|
13
|
-
export declare function importProviderModels(options: ProviderConnectionOptions
|
|
14
|
+
export declare function importProviderModels(options: ProviderConnectionOptions & {
|
|
15
|
+
edits: Pick<ProviderEdits, "addModels">;
|
|
16
|
+
}, models: readonly ProbeModel[], signal: AbortSignal): Promise<string | undefined>;
|
|
14
17
|
//# sourceMappingURL=connection.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../../src/extensions/provider/connection.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAE7F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAIhE,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,WAAW,EAAuB,MAAM,YAAY,CAAC;AACpF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,WAAW,yBAAyB;IACzC,KAAK,EAAE,eAAe,CAAC;IACvB,SAAS,EAAE,kBAAkB,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,uBAAuB,CAAC,CAAC;CACjE;AAED,wBAAsB,mBAAmB,CACxC,OAAO,EAAE,yBAAyB,EAClC,MAAM,EAAE,WAAW,GACjB,OAAO,CAAC,WAAW,CAAC,CA0CtB;AAED,wBAAsB,oBAAoB,CACzC,OAAO,EAAE,yBAAyB,
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../../src/extensions/provider/connection.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAE7F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAIhE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,WAAW,EAAuB,MAAM,YAAY,CAAC;AACpF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,WAAW,yBAAyB;IACzC,KAAK,EAAE,eAAe,CAAC;IACvB,SAAS,EAAE,kBAAkB,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,uBAAuB,CAAC,CAAC;CACjE;AAED,wBAAsB,mBAAmB,CACxC,OAAO,EAAE,yBAAyB,EAClC,MAAM,EAAE,WAAW,GACjB,OAAO,CAAC,WAAW,CAAC,CA0CtB;AAED,wBAAsB,oBAAoB,CACzC,OAAO,EAAE,yBAAyB,GAAG;IAAE,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAA;CAAE,EAChF,MAAM,EAAE,SAAS,UAAU,EAAE,EAC7B,MAAM,EAAE,WAAW,GACjB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAuB7B"}
|
|
@@ -68,11 +68,7 @@ export async function importProviderModels(options, models, signal) {
|
|
|
68
68
|
if (fresh.length === 0)
|
|
69
69
|
return undefined;
|
|
70
70
|
signal.throwIfAborted();
|
|
71
|
-
|
|
72
|
-
for (const model of fresh)
|
|
73
|
-
store.addModel(providerId, model);
|
|
74
|
-
});
|
|
75
|
-
refresher.touch(providerId);
|
|
71
|
+
options.edits.addModels(fresh);
|
|
76
72
|
// These edits were confirmed. Finish the write even if the originating pane closes.
|
|
77
73
|
await store.flush();
|
|
78
74
|
const saveError = store.getPendingError(providerId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../src/extensions/provider/connection.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAG7F,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../src/extensions/provider/connection.ts"],"names":[],"mappings":"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","sourcesContent":["/** Saved provider configuration, canonical authentication, and catalog import operations. */\n\nimport type { ModelRuntime } from \"../../core/model-runtime.ts\";\nimport { raceWithAbortSignal } from \"../../utils/abort.ts\";\nimport { effectiveModelSettings } from \"./configuration.ts\";\nimport { formatError, PROBE_LIMITS } from \"./constants.ts\";\nimport type { ProviderEdits } from \"./editing.ts\";\nimport { type ProbeModel, type ProbeResult, probeProviderModels } from \"./probe.ts\";\nimport type { RefreshCoordinator } from \"./refresh.ts\";\nimport type { ModelsJsonStore } from \"./store.ts\";\n\nexport interface ProviderConnectionOptions {\n\tstore: ModelsJsonStore;\n\trefresher: RefreshCoordinator;\n\tproviderId: string;\n\truntime: Pick<ModelRuntime, \"getAuth\" | \"getProviderAuthStatus\">;\n}\n\nexport async function fetchProviderModels(\n\toptions: ProviderConnectionOptions,\n\tsignal: AbortSignal,\n): Promise<ProbeResult> {\n\tconst { store, refresher, runtime, providerId } = options;\n\tconst deadline = AbortSignal.any([signal, AbortSignal.timeout(PROBE_LIMITS.timeoutMs)]);\n\ttry {\n\t\tawait raceWithAbortSignal(store.flush(), deadline);\n\t\tconst unsaved = store.getPendingError(providerId);\n\t\tif (unsaved) return { ok: false, error: `Save the provider changes before fetching: ${unsaved}` };\n\t\tconst provider = store.getProvider(providerId);\n\t\tconst settings = effectiveModelSettings(providerId, provider);\n\t\tif (!settings.baseUrl) return { ok: false, error: \"Set a baseUrl under API Auth first.\" };\n\t\tconst sync = await refresher.refreshNow(providerId, deadline);\n\t\tdeadline.throwIfAborted();\n\t\tif (!sync.ok) return { ok: false, error: `The provider did not reload: ${sync.errors.join(\"; \")}` };\n\t\tconst resolved = await raceWithAbortSignal(runtime.getAuth(providerId, { signal: deadline }), deadline);\n\t\tconst configured =\n\t\t\tprovider?.apiKey !== undefined ||\n\t\t\tprovider?.authHeader === true ||\n\t\t\tObject.keys(provider?.headers ?? {}).length > 0 ||\n\t\t\truntime.getProviderAuthStatus(providerId).configured;\n\t\tif (!resolved && configured) {\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\terror: \"Configured credentials or headers did not resolve; check the provider authentication.\",\n\t\t\t};\n\t\t}\n\t\tconst result = await probeProviderModels({\n\t\t\tbaseUrl: resolved?.auth.baseUrl ?? settings.baseUrl,\n\t\t\tauth: resolved?.auth,\n\t\t\tapi: settings.api,\n\t\t\tsignal: deadline,\n\t\t});\n\t\tdeadline.throwIfAborted();\n\t\treturn result;\n\t} catch (error) {\n\t\tif (deadline.aborted) {\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\terror: signal.aborted ? \"Cancelled.\" : \"Timed out while preparing or fetching the model catalog.\",\n\t\t\t};\n\t\t}\n\t\treturn { ok: false, error: formatError(error) };\n\t}\n}\n\nexport async function importProviderModels(\n\toptions: ProviderConnectionOptions & { edits: Pick<ProviderEdits, \"addModels\"> },\n\tmodels: readonly ProbeModel[],\n\tsignal: AbortSignal,\n): Promise<string | undefined> {\n\tconst { store, refresher, providerId } = options;\n\tawait raceWithAbortSignal(store.flush(), signal);\n\tconst unsaved = store.getPendingError(providerId);\n\tif (unsaved) return unsaved;\n\tconst settings = effectiveModelSettings(providerId, store.getProvider(providerId));\n\tif (!settings.api || !settings.baseUrl) return \"Set baseUrl and API Type under API Auth before importing models.\";\n\tconst existing = new Set(store.getModels(providerId).map((model) => model.id));\n\tconst fresh = models.filter((model) => {\n\t\tif (existing.has(model.id)) return false;\n\t\texisting.add(model.id);\n\t\treturn true;\n\t});\n\tif (fresh.length === 0) return undefined;\n\tsignal.throwIfAborted();\n\toptions.edits.addModels(fresh);\n\t// These edits were confirmed. Finish the write even if the originating pane closes.\n\tawait store.flush();\n\tconst saveError = store.getPendingError(providerId);\n\tif (saveError) return saveError;\n\tconst outcome = await refresher.refreshNow(providerId, signal);\n\tif (!outcome.ok) return `Models were saved, but refresh failed: ${outcome.errors.join(\"; \")}`;\n\treturn undefined;\n}\n"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/** Owns edits and refresh tracking; model handles keep persistence out of panes. */
|
|
2
|
+
import type { ModelsJsonModel } from "../../core/model-config.ts";
|
|
3
|
+
import type { RefreshCoordinator } from "./refresh.ts";
|
|
4
|
+
import type { ModelsJsonStore } from "./store.ts";
|
|
5
|
+
interface ModelFields {
|
|
6
|
+
read(): Partial<ModelsJsonModel>;
|
|
7
|
+
setField(path: readonly string[], value: unknown): void;
|
|
8
|
+
}
|
|
9
|
+
export interface DraftModelHandle extends ModelFields {
|
|
10
|
+
readonly isDraft: true;
|
|
11
|
+
}
|
|
12
|
+
export interface PersistedModelHandle extends ModelFields {
|
|
13
|
+
readonly isDraft: false;
|
|
14
|
+
rename(newId: string): Promise<string | undefined>;
|
|
15
|
+
}
|
|
16
|
+
export type ModelHandle = DraftModelHandle | PersistedModelHandle;
|
|
17
|
+
export type ProviderView = Pick<ModelsJsonStore, "getProvider" | "getModels" | "getModel">;
|
|
18
|
+
export declare class ProviderEdits {
|
|
19
|
+
private readonly store;
|
|
20
|
+
private readonly providerId;
|
|
21
|
+
private readonly refresher;
|
|
22
|
+
private readonly refresh;
|
|
23
|
+
renaming: boolean;
|
|
24
|
+
constructor(store: ModelsJsonStore, providerId: string, refresher: RefreshCoordinator, refresh: () => void);
|
|
25
|
+
private changed;
|
|
26
|
+
setProviderField(path: readonly string[], value: unknown): void;
|
|
27
|
+
removeProvider(): void;
|
|
28
|
+
removeModel(modelId: string): void;
|
|
29
|
+
batch(apply: () => void): void;
|
|
30
|
+
addModels(models: readonly ModelsJsonModel[]): void;
|
|
31
|
+
draft(): DraftModelHandle;
|
|
32
|
+
commitDraft(draft: DraftModelHandle): string | undefined;
|
|
33
|
+
model(modelId: string, onRename: (oldId: string, newId: string) => void): PersistedModelHandle;
|
|
34
|
+
}
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=editing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editing.d.ts","sourceRoot":"","sources":["../../../src/extensions/provider/editing.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAGlE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,UAAU,WAAW;IACpB,IAAI,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;CACxD;AAED,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACpD,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,oBAAqB,SAAQ,WAAW;IACxD,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACxB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACnD;AAED,MAAM,MAAM,WAAW,GAAG,gBAAgB,GAAG,oBAAoB,CAAC;AAClE,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,aAAa,GAAG,WAAW,GAAG,UAAU,CAAC,CAAC;AAE3F,qBAAa,aAAa;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkB;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;IACrC,QAAQ,UAAS;gBAEL,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,IAAI;IAO1G,OAAO,CAAC,OAAO;IAUf,gBAAgB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAK/D,cAAc,IAAI,IAAI;IAKtB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKlC,KAAK,CAAC,KAAK,EAAE,MAAM,IAAI,GAAG,IAAI;IAI9B,SAAS,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,GAAG,IAAI;IAOnD,KAAK,IAAI,gBAAgB;IAYzB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,GAAG,SAAS;IAcxD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,oBAAoB;CA4B9F"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { effectiveModelSettings, hasProviderSettings } from "./configuration.js";
|
|
2
|
+
import { setPath } from "./json-fields.js";
|
|
3
|
+
export class ProviderEdits {
|
|
4
|
+
constructor(store, providerId, refresher, refresh) {
|
|
5
|
+
this.renaming = false;
|
|
6
|
+
this.store = store;
|
|
7
|
+
this.providerId = providerId;
|
|
8
|
+
this.refresher = refresher;
|
|
9
|
+
this.refresh = refresh;
|
|
10
|
+
}
|
|
11
|
+
changed() {
|
|
12
|
+
if (!this.store.isDraftProvider(this.providerId) ||
|
|
13
|
+
hasProviderSettings(this.store.getProvider(this.providerId))) {
|
|
14
|
+
this.refresher.touch(this.providerId);
|
|
15
|
+
}
|
|
16
|
+
this.refresh();
|
|
17
|
+
}
|
|
18
|
+
setProviderField(path, value) {
|
|
19
|
+
this.store.setProviderField(this.providerId, path, value);
|
|
20
|
+
this.changed();
|
|
21
|
+
}
|
|
22
|
+
removeProvider() {
|
|
23
|
+
this.store.removeProvider(this.providerId);
|
|
24
|
+
this.changed();
|
|
25
|
+
}
|
|
26
|
+
removeModel(modelId) {
|
|
27
|
+
this.store.removeModel(this.providerId, modelId);
|
|
28
|
+
this.changed();
|
|
29
|
+
}
|
|
30
|
+
batch(apply) {
|
|
31
|
+
this.store.batch(apply);
|
|
32
|
+
}
|
|
33
|
+
addModels(models) {
|
|
34
|
+
this.store.batch(() => {
|
|
35
|
+
for (const model of models)
|
|
36
|
+
this.store.addModel(this.providerId, model);
|
|
37
|
+
});
|
|
38
|
+
if (models.length > 0)
|
|
39
|
+
this.changed();
|
|
40
|
+
}
|
|
41
|
+
draft() {
|
|
42
|
+
const fields = {};
|
|
43
|
+
return {
|
|
44
|
+
isDraft: true,
|
|
45
|
+
read: () => fields,
|
|
46
|
+
setField: (path, value) => {
|
|
47
|
+
setPath(fields, path, value);
|
|
48
|
+
this.refresh();
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
commitDraft(draft) {
|
|
53
|
+
const fields = draft.read();
|
|
54
|
+
const id = (fields.id ?? "").trim();
|
|
55
|
+
if (!id)
|
|
56
|
+
return "Model id is required.";
|
|
57
|
+
if (this.store.getModel(this.providerId, id))
|
|
58
|
+
return `Model "${id}" already exists.`;
|
|
59
|
+
const settings = effectiveModelSettings(this.providerId, this.store.getProvider(this.providerId), fields);
|
|
60
|
+
if (!settings.api)
|
|
61
|
+
return "Cannot resolve an api — set one under Model-Specific API or the provider's API Auth.";
|
|
62
|
+
if (!settings.baseUrl)
|
|
63
|
+
return "Cannot resolve a baseUrl — set one under Model-Specific API or the provider's API Auth.";
|
|
64
|
+
this.store.addModel(this.providerId, { ...fields, id });
|
|
65
|
+
this.changed();
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
model(modelId, onRename) {
|
|
69
|
+
let id = modelId;
|
|
70
|
+
let snapshot;
|
|
71
|
+
return {
|
|
72
|
+
isDraft: false,
|
|
73
|
+
read: () => snapshot ?? this.store.getModel(this.providerId, id) ?? { id },
|
|
74
|
+
setField: (path, value) => {
|
|
75
|
+
this.store.setModelField(this.providerId, id, path, value);
|
|
76
|
+
this.changed();
|
|
77
|
+
},
|
|
78
|
+
rename: async (newId) => {
|
|
79
|
+
const oldId = id;
|
|
80
|
+
snapshot = this.store.getModel(this.providerId, id);
|
|
81
|
+
this.renaming = true;
|
|
82
|
+
try {
|
|
83
|
+
const error = await this.store.renameModel(this.providerId, id, newId);
|
|
84
|
+
if (error)
|
|
85
|
+
return error;
|
|
86
|
+
id = newId;
|
|
87
|
+
this.changed();
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
snapshot = undefined;
|
|
92
|
+
this.renaming = false;
|
|
93
|
+
onRename(oldId, id);
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=editing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editing.js","sourceRoot":"","sources":["../../../src/extensions/provider/editing.ts"],"names":[],"mappings":"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","sourcesContent":["/** Owns edits and refresh tracking; model handles keep persistence out of panes. */\nimport type { ModelsJsonModel } from \"../../core/model-config.ts\";\nimport { effectiveModelSettings, hasProviderSettings } from \"./configuration.ts\";\nimport { setPath } from \"./json-fields.ts\";\nimport type { RefreshCoordinator } from \"./refresh.ts\";\nimport type { ModelsJsonStore } from \"./store.ts\";\n\ninterface ModelFields {\n\tread(): Partial<ModelsJsonModel>;\n\tsetField(path: readonly string[], value: unknown): void;\n}\n\nexport interface DraftModelHandle extends ModelFields {\n\treadonly isDraft: true;\n}\n\nexport interface PersistedModelHandle extends ModelFields {\n\treadonly isDraft: false;\n\trename(newId: string): Promise<string | undefined>;\n}\n\nexport type ModelHandle = DraftModelHandle | PersistedModelHandle;\nexport type ProviderView = Pick<ModelsJsonStore, \"getProvider\" | \"getModels\" | \"getModel\">;\n\nexport class ProviderEdits {\n\tprivate readonly store: ModelsJsonStore;\n\tprivate readonly providerId: string;\n\tprivate readonly refresher: RefreshCoordinator;\n\tprivate readonly refresh: () => void;\n\trenaming = false;\n\n\tconstructor(store: ModelsJsonStore, providerId: string, refresher: RefreshCoordinator, refresh: () => void) {\n\t\tthis.store = store;\n\t\tthis.providerId = providerId;\n\t\tthis.refresher = refresher;\n\t\tthis.refresh = refresh;\n\t}\n\n\tprivate changed(): void {\n\t\tif (\n\t\t\t!this.store.isDraftProvider(this.providerId) ||\n\t\t\thasProviderSettings(this.store.getProvider(this.providerId))\n\t\t) {\n\t\t\tthis.refresher.touch(this.providerId);\n\t\t}\n\t\tthis.refresh();\n\t}\n\n\tsetProviderField(path: readonly string[], value: unknown): void {\n\t\tthis.store.setProviderField(this.providerId, path, value);\n\t\tthis.changed();\n\t}\n\n\tremoveProvider(): void {\n\t\tthis.store.removeProvider(this.providerId);\n\t\tthis.changed();\n\t}\n\n\tremoveModel(modelId: string): void {\n\t\tthis.store.removeModel(this.providerId, modelId);\n\t\tthis.changed();\n\t}\n\n\tbatch(apply: () => void): void {\n\t\tthis.store.batch(apply);\n\t}\n\n\taddModels(models: readonly ModelsJsonModel[]): void {\n\t\tthis.store.batch(() => {\n\t\t\tfor (const model of models) this.store.addModel(this.providerId, model);\n\t\t});\n\t\tif (models.length > 0) this.changed();\n\t}\n\n\tdraft(): DraftModelHandle {\n\t\tconst fields: Partial<ModelsJsonModel> = {};\n\t\treturn {\n\t\t\tisDraft: true,\n\t\t\tread: () => fields,\n\t\t\tsetField: (path, value) => {\n\t\t\t\tsetPath(fields, path, value);\n\t\t\t\tthis.refresh();\n\t\t\t},\n\t\t};\n\t}\n\n\tcommitDraft(draft: DraftModelHandle): string | undefined {\n\t\tconst fields = draft.read();\n\t\tconst id = (fields.id ?? \"\").trim();\n\t\tif (!id) return \"Model id is required.\";\n\t\tif (this.store.getModel(this.providerId, id)) return `Model \"${id}\" already exists.`;\n\t\tconst settings = effectiveModelSettings(this.providerId, this.store.getProvider(this.providerId), fields);\n\t\tif (!settings.api) return \"Cannot resolve an api — set one under Model-Specific API or the provider's API Auth.\";\n\t\tif (!settings.baseUrl)\n\t\t\treturn \"Cannot resolve a baseUrl — set one under Model-Specific API or the provider's API Auth.\";\n\t\tthis.store.addModel(this.providerId, { ...fields, id });\n\t\tthis.changed();\n\t\treturn undefined;\n\t}\n\n\tmodel(modelId: string, onRename: (oldId: string, newId: string) => void): PersistedModelHandle {\n\t\tlet id = modelId;\n\t\tlet snapshot: ModelsJsonModel | undefined;\n\t\treturn {\n\t\t\tisDraft: false,\n\t\t\tread: () => snapshot ?? this.store.getModel(this.providerId, id) ?? { id },\n\t\t\tsetField: (path, value) => {\n\t\t\t\tthis.store.setModelField(this.providerId, id, path, value);\n\t\t\t\tthis.changed();\n\t\t\t},\n\t\t\trename: async (newId) => {\n\t\t\t\tconst oldId = id;\n\t\t\t\tsnapshot = this.store.getModel(this.providerId, id);\n\t\t\t\tthis.renaming = true;\n\t\t\t\ttry {\n\t\t\t\t\tconst error = await this.store.renameModel(this.providerId, id, newId);\n\t\t\t\t\tif (error) return error;\n\t\t\t\t\tid = newId;\n\t\t\t\t\tthis.changed();\n\t\t\t\t\treturn undefined;\n\t\t\t\t} finally {\n\t\t\t\t\tsnapshot = undefined;\n\t\t\t\t\tthis.renaming = false;\n\t\t\t\t\tonRename(oldId, id);\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t}\n}\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** JSON field updates shared by drafts and queued store operations. */
|
|
2
|
+
export declare const DELETE: unique symbol;
|
|
3
|
+
export type DeleteMarker = typeof DELETE;
|
|
4
|
+
export declare function setPath(root: Record<string, unknown>, path: readonly string[], value: unknown): void;
|
|
5
|
+
//# sourceMappingURL=json-fields.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-fields.d.ts","sourceRoot":"","sources":["../../../src/extensions/provider/json-fields.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,eAAO,MAAM,MAAM,EAAE,OAAO,MAAwC,CAAC;AACrE,MAAM,MAAM,YAAY,GAAG,OAAO,MAAM,CAAC;AAEzC,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAyBpG"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/** JSON field updates shared by drafts and queued store operations. */
|
|
2
|
+
export const DELETE = Symbol("provider-store-delete");
|
|
3
|
+
export function setPath(root, path, value) {
|
|
4
|
+
let current = root;
|
|
5
|
+
for (const segment of path.slice(0, -1)) {
|
|
6
|
+
const next = Object.hasOwn(current, segment) ? current[segment] : undefined;
|
|
7
|
+
if (typeof next === "object" && next !== null && !Array.isArray(next))
|
|
8
|
+
current = next;
|
|
9
|
+
else {
|
|
10
|
+
const created = {};
|
|
11
|
+
Object.defineProperty(current, segment, {
|
|
12
|
+
value: created,
|
|
13
|
+
writable: true,
|
|
14
|
+
enumerable: true,
|
|
15
|
+
configurable: true,
|
|
16
|
+
});
|
|
17
|
+
current = created;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
const leaf = path[path.length - 1];
|
|
21
|
+
if (value === DELETE)
|
|
22
|
+
delete current[leaf];
|
|
23
|
+
else
|
|
24
|
+
Object.defineProperty(current, leaf, {
|
|
25
|
+
value: structuredClone(value),
|
|
26
|
+
writable: true,
|
|
27
|
+
enumerable: true,
|
|
28
|
+
configurable: true,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=json-fields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-fields.js","sourceRoot":"","sources":["../../../src/extensions/provider/json-fields.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,MAAM,CAAC,MAAM,MAAM,GAAkB,MAAM,CAAC,uBAAuB,CAAC,CAAC;AAGrE,MAAM,UAAU,OAAO,CAAC,IAA6B,EAAE,IAAuB,EAAE,KAAc;IAC7F,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5E,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,OAAO,GAAG,IAA+B,CAAC;aAC5G,CAAC;YACL,MAAM,OAAO,GAA4B,EAAE,CAAC;YAC5C,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE;gBACvC,KAAK,EAAE,OAAO;gBACd,QAAQ,EAAE,IAAI;gBACd,UAAU,EAAE,IAAI;gBAChB,YAAY,EAAE,IAAI;aAClB,CAAC,CAAC;YACH,OAAO,GAAG,OAAO,CAAC;QACnB,CAAC;IACF,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;IACpC,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;;QAE1C,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,EAAE;YACpC,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC;YAC7B,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,IAAI;YAChB,YAAY,EAAE,IAAI;SAClB,CAAC,CAAC;AACL,CAAC","sourcesContent":["/** JSON field updates shared by drafts and queued store operations. */\nexport const DELETE: unique symbol = Symbol(\"provider-store-delete\");\nexport type DeleteMarker = typeof DELETE;\n\nexport function setPath(root: Record<string, unknown>, path: readonly string[], value: unknown): void {\n\tlet current = root;\n\tfor (const segment of path.slice(0, -1)) {\n\t\tconst next = Object.hasOwn(current, segment) ? current[segment] : undefined;\n\t\tif (typeof next === \"object\" && next !== null && !Array.isArray(next)) current = next as Record<string, unknown>;\n\t\telse {\n\t\t\tconst created: Record<string, unknown> = {};\n\t\t\tObject.defineProperty(current, segment, {\n\t\t\t\tvalue: created,\n\t\t\t\twritable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tconfigurable: true,\n\t\t\t});\n\t\t\tcurrent = created;\n\t\t}\n\t}\n\tconst leaf = path[path.length - 1]!;\n\tif (value === DELETE) delete current[leaf];\n\telse\n\t\tObject.defineProperty(current, leaf, {\n\t\t\tvalue: structuredClone(value),\n\t\t\twritable: true,\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t});\n}\n"]}
|
|
@@ -16,9 +16,7 @@
|
|
|
16
16
|
* unknown fields anywhere in the document are preserved verbatim.
|
|
17
17
|
*/
|
|
18
18
|
import { type ModelsJsonModel, type ModelsJsonProvider } from "../../core/model-config.ts";
|
|
19
|
-
|
|
20
|
-
export declare const DELETE: unique symbol;
|
|
21
|
-
export type DeleteMarker = typeof DELETE;
|
|
19
|
+
export { DELETE, type DeleteMarker } from "./json-fields.ts";
|
|
22
20
|
export interface ModelsJsonDocument {
|
|
23
21
|
providers: Record<string, ModelsJsonProvider>;
|
|
24
22
|
[key: string]: unknown;
|
|
@@ -127,5 +125,4 @@ export declare class ModelsJsonStore {
|
|
|
127
125
|
private save;
|
|
128
126
|
private saveLocked;
|
|
129
127
|
}
|
|
130
|
-
export {};
|
|
131
128
|
//# sourceMappingURL=store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/extensions/provider/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAMH,OAAO,EAAe,KAAK,eAAe,EAAE,KAAK,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/extensions/provider/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,8 +26,8 @@ import { normalizePath } from "../../utils/paths.js";
|
|
|
26
26
|
import { stripBom } from "../../utils/text.js";
|
|
27
27
|
import { hasProviderSettings } from "./configuration.js";
|
|
28
28
|
import { formatError } from "./constants.js";
|
|
29
|
-
|
|
30
|
-
export
|
|
29
|
+
import { DELETE, setPath } from "./json-fields.js";
|
|
30
|
+
export { DELETE } from "./json-fields.js";
|
|
31
31
|
function isPlainObject(value) {
|
|
32
32
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
33
33
|
}
|
|
@@ -46,34 +46,6 @@ export function jsonEquals(a, b) {
|
|
|
46
46
|
}
|
|
47
47
|
return false;
|
|
48
48
|
}
|
|
49
|
-
function setPath(root, path, value) {
|
|
50
|
-
let current = root;
|
|
51
|
-
for (const segment of path.slice(0, -1)) {
|
|
52
|
-
const next = Object.hasOwn(current, segment) ? current[segment] : undefined;
|
|
53
|
-
if (isPlainObject(next))
|
|
54
|
-
current = next;
|
|
55
|
-
else {
|
|
56
|
-
const created = {};
|
|
57
|
-
Object.defineProperty(current, segment, {
|
|
58
|
-
value: created,
|
|
59
|
-
writable: true,
|
|
60
|
-
enumerable: true,
|
|
61
|
-
configurable: true,
|
|
62
|
-
});
|
|
63
|
-
current = created;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
const leaf = path[path.length - 1];
|
|
67
|
-
if (value === DELETE)
|
|
68
|
-
delete current[leaf];
|
|
69
|
-
else
|
|
70
|
-
Object.defineProperty(current, leaf, {
|
|
71
|
-
value: structuredClone(value),
|
|
72
|
-
writable: true,
|
|
73
|
-
enumerable: true,
|
|
74
|
-
configurable: true,
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
49
|
function cloneValue(value) {
|
|
78
50
|
return value === DELETE ? value : structuredClone(value);
|
|
79
51
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/extensions/provider/store.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Op-based models.json editing store.\n *\n * Three states are tracked: `baseline` (last known disk content), pending\n * field-level ops, and `view` (baseline + ops, what the UI renders). Every\n * confirmed edit queues an op and schedules a save. A save re-reads the file\n * under a cross-process lock and applies the pending ops onto that freshest\n * content — unrelated external edits are preserved, a same-field race\n * resolves last-writer-wins, and ops targeting externally removed models\n * simply miss. The candidate is validated via ModelConfig on a temp file,\n * backed up once per session, and atomically renamed into place. Failed\n * saves keep the ops pending; closing offers retry or explicit discard.\n * Whole-snapshot blind overwrites are never performed.\n *\n * Comments and custom formatting are normalized to two-space JSON on save;\n * unknown fields anywhere in the document are preserved verbatim.\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport { mkdir, readFile, realpath, rename, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport lockfile from \"proper-lockfile\";\nimport { ModelConfig, type ModelsJsonModel, type ModelsJsonProvider } from \"../../core/model-config.ts\";\nimport { withFileMutationQueue } from \"../../core/tools/file-mutation-queue.ts\";\nimport { stripJsonComments } from \"../../utils/json.ts\";\nimport { normalizePath } from \"../../utils/paths.ts\";\nimport { stripBom } from \"../../utils/text.ts\";\nimport { hasProviderSettings } from \"./configuration.ts\";\nimport { formatError } from \"./constants.ts\";\n\n/** Sentinel op value removing the key at the op path. */\nexport const DELETE: unique symbol = Symbol(\"provider-store-delete\");\nexport type DeleteMarker = typeof DELETE;\n\nexport interface ModelsJsonDocument {\n\tproviders: Record<string, ModelsJsonProvider>;\n\t[key: string]: unknown;\n}\n\ninterface OpBase {\n\tseq: number;\n}\nexport interface SetFieldOp extends OpBase {\n\tkind: \"set\";\n\tproviderId: string;\n\t/** Undefined for provider-level fields. */\n\tmodelId?: string;\n\t/** Path within the provider/model object, e.g. [\"compat\", \"allowEmptySignature\"]. */\n\tpath: readonly string[];\n\tvalue: unknown;\n\tcreateProvider: boolean;\n}\nexport interface AddModelOp extends OpBase {\n\tkind: \"addModel\";\n\tproviderId: string;\n\tmodel: ModelsJsonModel;\n\tcreateProvider: boolean;\n}\nexport interface RemoveModelOp extends OpBase {\n\tkind: \"removeModel\";\n\tproviderId: string;\n\tmodelId: string;\n}\nexport interface RenameModelOp extends OpBase {\n\tkind: \"renameModel\";\n\tproviderId: string;\n\toldId: string;\n\tnewId: string;\n}\nexport interface RemoveProviderOp extends OpBase {\n\tkind: \"removeProvider\";\n\tproviderId: string;\n}\nexport type Op = SetFieldOp | AddModelOp | RemoveModelOp | RenameModelOp | RemoveProviderOp;\n\nexport type SaveResult =\n\t| { kind: \"clean\" }\n\t| { kind: \"saved\"; applied: number }\n\t| { kind: \"invalid\"; error: string }\n\t| { kind: \"error\"; error: string };\n\nexport type StoreLoad = { ok: true; store: ModelsJsonStore } | { ok: false; error: string };\n\ninterface DiskRead {\n\texists: boolean;\n\tdoc: ModelsJsonDocument;\n\trawText?: string;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** Canonical comparison for JSON values, insensitive to object key order. */\nexport function jsonEquals(a: unknown, b: unknown): boolean {\n\tif (a === b) return true;\n\tif (Array.isArray(a) && Array.isArray(b)) {\n\t\treturn a.length === b.length && a.every((entry, index) => jsonEquals(entry, b[index]));\n\t}\n\tif (isPlainObject(a) && isPlainObject(b)) {\n\t\tconst aKeys = Object.keys(a).sort();\n\t\tconst bKeys = Object.keys(b).sort();\n\t\treturn (\n\t\t\taKeys.length === bKeys.length &&\n\t\t\taKeys.every((key, index) => key === bKeys[index] && jsonEquals(a[key], b[key]))\n\t\t);\n\t}\n\treturn false;\n}\n\nfunction setPath(root: Record<string, unknown>, path: readonly string[], value: unknown): void {\n\tlet current = root;\n\tfor (const segment of path.slice(0, -1)) {\n\t\tconst next = Object.hasOwn(current, segment) ? current[segment] : undefined;\n\t\tif (isPlainObject(next)) current = next;\n\t\telse {\n\t\t\tconst created: Record<string, unknown> = {};\n\t\t\tObject.defineProperty(current, segment, {\n\t\t\t\tvalue: created,\n\t\t\t\twritable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tconfigurable: true,\n\t\t\t});\n\t\t\tcurrent = created;\n\t\t}\n\t}\n\tconst leaf = path[path.length - 1]!;\n\tif (value === DELETE) delete current[leaf];\n\telse\n\t\tObject.defineProperty(current, leaf, {\n\t\t\tvalue: structuredClone(value),\n\t\t\twritable: true,\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t});\n}\n\nfunction cloneValue(value: unknown): unknown {\n\treturn value === DELETE ? value : structuredClone(value);\n}\n\nasync function readDocument(path: string): Promise<DiskRead> {\n\tlet rawText: string;\n\ttry {\n\t\trawText = await readFile(path, \"utf8\");\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return { exists: false, doc: { providers: {} } };\n\t\tthrow error;\n\t}\n\tconst parsed: unknown = JSON.parse(stripJsonComments(stripBom(rawText)));\n\tif (!isPlainObject(parsed)) throw new Error(\"models.json root must be a JSON object.\");\n\tconst doc = parsed as ModelsJsonDocument;\n\tif (!isPlainObject(doc.providers)) throw new Error('models.json \"providers\" must be an object.');\n\treturn { exists: true, doc, rawText };\n}\n\nexport class ModelsJsonStore {\n\treadonly path: string;\n\tprivate baseline: ModelsJsonDocument;\n\tprivate ops: Op[] = [];\n\tprivate view: ModelsJsonDocument;\n\tprivate seq = 0;\n\tprivate backedUp = false;\n\tprivate batching = false;\n\tprivate saveChain: Promise<void> = Promise.resolve();\n\tprivate readonly drafts = new Set<string>();\n\tprivate lastSaveResult: SaveResult = { kind: \"clean\" };\n\t/** Called after each save settles (success, conflict, or failure). */\n\tonSaveResult: ((result: SaveResult) => void) | undefined;\n\n\tprivate constructor(path: string, baseline: ModelsJsonDocument) {\n\t\tthis.path = path;\n\t\tthis.baseline = baseline;\n\t\tthis.view = structuredClone(baseline);\n\t}\n\n\tstatic async load(path: string): Promise<StoreLoad> {\n\t\tlet normalized = normalizePath(path);\n\t\tlet disk: DiskRead;\n\t\ttry {\n\t\t\tnormalized = await realpath(normalized).catch((error: NodeJS.ErrnoException) => {\n\t\t\t\tif (error.code === \"ENOENT\") return normalized;\n\t\t\t\tthrow error;\n\t\t\t});\n\t\t\tdisk = await readDocument(normalized);\n\t\t} catch (error) {\n\t\t\treturn { ok: false, error: `Failed to parse models.json: ${formatError(error)}\\n\\nFile: ${normalized}` };\n\t\t}\n\t\tif (disk.exists) {\n\t\t\t// Surface schema errors as a read-only state; never auto-overwrite an invalid file.\n\t\t\tconst check = await ModelConfig.load(normalized);\n\t\t\tconst validationError = check.getError();\n\t\t\tif (validationError) return { ok: false, error: validationError };\n\t\t}\n\t\treturn { ok: true, store: new ModelsJsonStore(normalized, disk.doc) };\n\t}\n\n\t// ---------------------------------------------------------------------\n\t// View access (read-only for the UI; mutations go through the methods)\n\t// ---------------------------------------------------------------------\n\n\tgetDoc(): ModelsJsonDocument {\n\t\treturn this.view;\n\t}\n\n\tgetProviderIds(): string[] {\n\t\treturn [...new Set([...Object.keys(this.view.providers), ...this.ops.map((op) => op.providerId)])];\n\t}\n\n\tgetProvider(providerId: string): ModelsJsonProvider | undefined {\n\t\treturn Object.hasOwn(this.view.providers, providerId) ? this.view.providers[providerId] : undefined;\n\t}\n\n\t/** Materialize a draft provider in the view without queueing an op (never written while empty). */\n\tensureProviderView(providerId: string): void {\n\t\tif (Object.hasOwn(this.view.providers, providerId)) return;\n\t\tthis.drafts.add(providerId);\n\t\tthis.recomputeView();\n\t}\n\n\t/** Provider present in the view but not yet on disk. */\n\tisDraftProvider(providerId: string): boolean {\n\t\treturn !Object.hasOwn(this.baseline.providers, providerId) && Object.hasOwn(this.view.providers, providerId);\n\t}\n\n\tgetModels(providerId: string): ModelsJsonModel[] {\n\t\tconst provider = this.getProvider(providerId);\n\t\treturn Array.isArray(provider?.models) ? provider.models : [];\n\t}\n\n\tgetModel(providerId: string, modelId: string): ModelsJsonModel | undefined {\n\t\treturn this.getModels(providerId).find((model) => model.id === modelId);\n\t}\n\n\tget pendingCount(): number {\n\t\treturn this.ops.length;\n\t}\n\n\tgetPendingError(providerId?: string): string | undefined {\n\t\tconst pending = this.ops.filter((op) => providerId === undefined || op.providerId === providerId);\n\t\tif (pending.length === 0) return undefined;\n\t\tif (this.lastSaveResult.kind === \"error\" || this.lastSaveResult.kind === \"invalid\")\n\t\t\treturn this.lastSaveResult.error;\n\t\treturn `${pending.length} change(s) are not saved; retry or discard before continuing.`;\n\t}\n\n\tretrySave(): void {\n\t\tif (this.ops.length > 0) this.scheduleSave();\n\t}\n\n\t/** Used only after flush, when the user explicitly discards unsaved edits. */\n\tdiscardPending(): void {\n\t\tthis.ops = [];\n\t\tthis.drafts.clear();\n\t\tthis.recomputeView();\n\t}\n\n\t// ---------------------------------------------------------------------\n\t// Mutations (queue an op, refresh the view, schedule a save)\n\t// ---------------------------------------------------------------------\n\n\tprivate enqueue(op: Op): void {\n\t\tthis.ops.push(op);\n\t\tthis.recomputeView();\n\t\tthis.scheduleSave();\n\t}\n\n\tprivate nextSeq(): number {\n\t\treturn ++this.seq;\n\t}\n\n\tsetProviderField(providerId: string, path: readonly string[], value: unknown): void {\n\t\tthis.enqueue({\n\t\t\tkind: \"set\",\n\t\t\tseq: this.nextSeq(),\n\t\t\tproviderId,\n\t\t\tpath,\n\t\t\tvalue: cloneValue(value),\n\t\t\tcreateProvider: !Object.hasOwn(this.baseline.providers, providerId),\n\t\t});\n\t}\n\n\tsetModelField(providerId: string, modelId: string, path: readonly string[], value: unknown): void {\n\t\tthis.enqueue({\n\t\t\tkind: \"set\",\n\t\t\tseq: this.nextSeq(),\n\t\t\tproviderId,\n\t\t\tmodelId,\n\t\t\tpath,\n\t\t\tvalue: cloneValue(value),\n\t\t\tcreateProvider: !Object.hasOwn(this.baseline.providers, providerId),\n\t\t});\n\t}\n\n\taddModel(providerId: string, model: ModelsJsonModel): void {\n\t\tthis.enqueue({\n\t\t\tkind: \"addModel\",\n\t\t\tseq: this.nextSeq(),\n\t\t\tproviderId,\n\t\t\tmodel: structuredClone(model),\n\t\t\tcreateProvider: !Object.hasOwn(this.baseline.providers, providerId),\n\t\t});\n\t}\n\n\tremoveModel(providerId: string, modelId: string): void {\n\t\tthis.enqueue({\n\t\t\tkind: \"removeModel\",\n\t\t\tseq: this.nextSeq(),\n\t\t\tproviderId,\n\t\t\tmodelId,\n\t\t});\n\t}\n\n\tasync renameModel(providerId: string, oldId: string, newId: string): Promise<string | undefined> {\n\t\tawait this.flush();\n\t\tconst pendingError = this.getPendingError(providerId);\n\t\tif (pendingError) return pendingError;\n\t\tconst before = this.getModel(providerId, oldId);\n\t\tif (!before) return \"The model no longer exists.\";\n\t\tconst seq = this.nextSeq();\n\t\tthis.enqueue({\n\t\t\tkind: \"renameModel\",\n\t\t\tseq,\n\t\t\tproviderId,\n\t\t\toldId,\n\t\t\tnewId,\n\t\t});\n\t\tawait this.flush();\n\t\tif (this.ops.some((op) => op.seq === seq)) {\n\t\t\t// The save failed; drop the rename rather than surprising the user later.\n\t\t\tthis.ops = this.ops.filter((op) => op.seq !== seq);\n\t\t\tthis.recomputeView();\n\t\t\treturn this.getPendingError(providerId) ?? \"Failed to save models.json.\";\n\t\t}\n\t\t// A settled rename can still have missed when the model moved on disk; never\n\t\t// adopt an unrelated model that already uses the destination id.\n\t\tconst renamed = this.getModel(providerId, newId);\n\t\treturn renamed && jsonEquals(renamed, { ...before, id: newId })\n\t\t\t? undefined\n\t\t\t: \"The model changed on disk; reopen it before renaming.\";\n\t}\n\n\tremoveProvider(providerId: string): void {\n\t\tthis.enqueue({\n\t\t\tkind: \"removeProvider\",\n\t\t\tseq: this.nextSeq(),\n\t\t\tproviderId,\n\t\t});\n\t}\n\n\t/** Queue several ops but schedule a single save (batch import, built-in data apply). */\n\tbatch(mutate: () => void): void {\n\t\tthis.batching = true;\n\t\ttry {\n\t\t\tmutate();\n\t\t} finally {\n\t\t\tthis.batching = false;\n\t\t}\n\t\tif (this.ops.length > 0) this.scheduleSave();\n\t}\n\n\t/** Drop all pending ops targeting a draft provider (used when leaving its editor untouched). */\n\tdiscardProviderDraft(providerId: string): void {\n\t\tthis.drafts.delete(providerId);\n\t\tif (Object.hasOwn(this.baseline.providers, providerId)) return;\n\t\tthis.ops = this.ops.filter((op) => op.providerId !== providerId);\n\t\tthis.recomputeView();\n\t}\n\n\t// ---------------------------------------------------------------------\n\t// View computation\n\t// ---------------------------------------------------------------------\n\n\tprivate recomputeView(): void {\n\t\tconst view = structuredClone(this.baseline);\n\t\tfor (const id of this.drafts) ensureProvider(view, id);\n\t\tfor (const op of this.ops) applyOp(view, op);\n\t\tthis.view = view;\n\t}\n\n\t// ---------------------------------------------------------------------\n\t// Saving\n\t// ---------------------------------------------------------------------\n\n\tprivate scheduleSave(): void {\n\t\tif (this.batching) return;\n\t\tthis.saveChain = this.saveChain\n\t\t\t.catch(() => {})\n\t\t\t.then(async () => {\n\t\t\t\tconst result = await this.save();\n\t\t\t\tthis.lastSaveResult = result;\n\t\t\t\tif (result.kind !== \"clean\") this.onSaveResult?.(result);\n\t\t\t});\n\t}\n\n\t/** Wait for all scheduled saves; the settled result of the last save, if any. */\n\tasync flush(): Promise<void> {\n\t\tlet pending: Promise<void>;\n\t\tdo {\n\t\t\tpending = this.saveChain;\n\t\t\tawait pending;\n\t\t} while (pending !== this.saveChain);\n\t}\n\n\tprivate async save(): Promise<SaveResult> {\n\t\tif (this.ops.length === 0) return { kind: \"clean\" };\n\t\ttry {\n\t\t\treturn await withFileMutationQueue(this.path, async () => {\n\t\t\t\tawait mkdir(dirname(this.path), { recursive: true });\n\t\t\t\tlet compromised: Error | undefined;\n\t\t\t\tconst release = await lockfile.lock(this.path, {\n\t\t\t\t\trealpath: false,\n\t\t\t\t\tstale: 30_000,\n\t\t\t\t\tretries: { retries: 20, factor: 1.2, minTimeout: 50, maxTimeout: 250 },\n\t\t\t\t\tonCompromised: (error) => {\n\t\t\t\t\t\tcompromised = error;\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tlet result: SaveResult;\n\t\t\t\ttry {\n\t\t\t\t\tresult = await this.saveLocked(() => {\n\t\t\t\t\t\tif (compromised) throw compromised;\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tresult = { kind: \"error\", error: `Failed to save models.json: ${formatError(error)}` };\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tawait release();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!compromised && result.kind !== \"error\" && result.kind !== \"invalid\") {\n\t\t\t\t\t\tresult = { kind: \"error\", error: `Could not release the models.json lock: ${formatError(error)}` };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t});\n\t\t} catch (error) {\n\t\t\treturn { kind: \"error\", error: `Failed to access models.json for saving: ${formatError(error)}` };\n\t\t}\n\t}\n\n\tprivate async saveLocked(assertLock: () => void): Promise<SaveResult> {\n\t\tconst tempPath = join(dirname(this.path), `.models.${randomUUID()}.tmp`);\n\t\ttry {\n\t\t\tassertLock();\n\t\t\tlet disk: DiskRead;\n\t\t\ttry {\n\t\t\t\tdisk = await readDocument(this.path);\n\t\t\t} catch (error) {\n\t\t\t\t// Never clobber a file we cannot parse.\n\t\t\t\treturn { kind: \"error\", error: `models.json changed on disk and is unreadable: ${formatError(error)}` };\n\t\t\t}\n\t\t\tconst working = structuredClone(disk.doc);\n\t\t\tconst batch = this.ops.filter((op) => {\n\t\t\t\tconst provider = this.getProvider(op.providerId);\n\t\t\t\treturn (\n\t\t\t\t\tObject.hasOwn(disk.doc.providers, op.providerId) ||\n\t\t\t\t\t!provider ||\n\t\t\t\t\tObject.keys(provider).length === 0 ||\n\t\t\t\t\thasProviderSettings(provider)\n\t\t\t\t);\n\t\t\t});\n\t\t\t// Apply blindly onto the freshest disk content: unrelated external\n\t\t\t// edits are preserved, a same-field race resolves last-writer-wins,\n\t\t\t// and ops targeting externally removed models simply miss.\n\t\t\tfor (const op of batch) applyOp(working, op);\n\t\t\tpruneEmptyNewProviders(working, disk.doc);\n\t\t\tconst settle = () => {\n\t\t\t\tconst settled = new Set(batch.map((op) => op.seq));\n\t\t\t\tthis.ops = this.ops.filter((op) => !settled.has(op.seq));\n\t\t\t\tthis.recomputeView();\n\t\t\t};\n\t\t\tif (jsonEquals(working, disk.doc)) {\n\t\t\t\t// Ops cancelled each other out or already matched disk; nothing to write.\n\t\t\t\tthis.baseline = disk.doc;\n\t\t\t\tsettle();\n\t\t\t\treturn { kind: \"saved\", applied: batch.length };\n\t\t\t}\n\t\t\tconst candidate = `${JSON.stringify(working, null, 2)}\\n`;\n\t\t\tawait writeFile(tempPath, candidate, { encoding: \"utf8\", mode: 0o600 });\n\t\t\tconst check = await ModelConfig.load(tempPath);\n\t\t\tconst validationError = check.getError();\n\t\t\tif (validationError) {\n\t\t\t\treturn { kind: \"invalid\", error: validationError };\n\t\t\t}\n\t\t\tconst latest = await readDocument(this.path);\n\t\t\tif (latest.exists !== disk.exists || latest.rawText !== disk.rawText) {\n\t\t\t\tthrow new Error(\"models.json changed while saving; the edits were kept for retry.\");\n\t\t\t}\n\t\t\tif (!this.backedUp && disk.exists && disk.rawText !== undefined) {\n\t\t\t\tawait writeFile(`${this.path}.bak`, disk.rawText, { encoding: \"utf8\", mode: 0o600 });\n\t\t\t\tthis.backedUp = true;\n\t\t\t}\n\t\t\tassertLock();\n\t\t\tawait rename(tempPath, this.path);\n\t\t\tthis.baseline = working;\n\t\t\tsettle();\n\t\t\treturn { kind: \"saved\", applied: batch.length };\n\t\t} finally {\n\t\t\tawait rm(tempPath, { force: true }).catch(() => {});\n\t\t}\n\t}\n}\n\n// -------------------------------------------------------------------------\n// Op application\n// -------------------------------------------------------------------------\n\nfunction ensureProvider(doc: ModelsJsonDocument, providerId: string): Record<string, unknown> {\n\tconst existing = Object.hasOwn(doc.providers, providerId) ? doc.providers[providerId] : undefined;\n\tif (existing) return existing;\n\tconst created: Record<string, unknown> = {};\n\tObject.defineProperty(doc.providers, providerId, {\n\t\tvalue: created,\n\t\twritable: true,\n\t\tenumerable: true,\n\t\tconfigurable: true,\n\t});\n\treturn created;\n}\n\nfunction applyOp(doc: ModelsJsonDocument, op: Op): void {\n\tswitch (op.kind) {\n\t\tcase \"set\": {\n\t\t\tconst provider = ensureProvider(doc, op.providerId);\n\t\t\tif (op.modelId === undefined) {\n\t\t\t\tsetPath(provider, op.path, op.value);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst models = Array.isArray(provider.models) ? (provider.models as Record<string, unknown>[]) : [];\n\t\t\tconst model = models.find((entry) => entry.id === op.modelId);\n\t\t\tif (model) setPath(model, op.path, op.value);\n\t\t\treturn;\n\t\t}\n\t\tcase \"addModel\": {\n\t\t\tconst provider = ensureProvider(doc, op.providerId);\n\t\t\tconst models = Array.isArray(provider.models) ? (provider.models as Record<string, unknown>[]) : [];\n\t\t\tconst index = models.findIndex((entry) => entry.id === op.model.id);\n\t\t\tconst clone = structuredClone(op.model) as Record<string, unknown>;\n\t\t\tif (index >= 0) models[index] = clone;\n\t\t\telse models.push(clone);\n\t\t\tprovider.models = models;\n\t\t\treturn;\n\t\t}\n\t\tcase \"removeModel\": {\n\t\t\tconst provider = doc.providers[op.providerId] as Record<string, unknown> | undefined;\n\t\t\tconst models = Array.isArray(provider?.models) ? (provider.models as Record<string, unknown>[]) : undefined;\n\t\t\tif (!provider || !models) return;\n\t\t\tprovider.models = models.filter((entry) => entry.id !== op.modelId);\n\t\t\treturn;\n\t\t}\n\t\tcase \"renameModel\": {\n\t\t\tconst provider = doc.providers[op.providerId] as Record<string, unknown> | undefined;\n\t\t\tconst models = Array.isArray(provider?.models) ? (provider.models as Record<string, unknown>[]) : undefined;\n\t\t\tif (!models) return;\n\t\t\tconst model = models.find((entry) => entry.id === op.oldId);\n\t\t\tif (model && !models.some((entry) => entry.id === op.newId)) model.id = op.newId;\n\t\t\treturn;\n\t\t}\n\t\tcase \"removeProvider\": {\n\t\t\tdelete doc.providers[op.providerId];\n\t\t\treturn;\n\t\t}\n\t}\n}\n\n/** Remove providers the ops materialized but which ended up with no keys (self-cancelled drafts). */\nfunction pruneEmptyNewProviders(working: ModelsJsonDocument, disk: ModelsJsonDocument): void {\n\tfor (const [providerId, provider] of Object.entries(working.providers)) {\n\t\tif (Object.hasOwn(disk.providers, providerId)) continue;\n\t\tif (isPlainObject(provider) && Object.keys(provider).length === 0) delete working.providers[providerId];\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/extensions/provider/store.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Op-based models.json editing store.\n *\n * Three states are tracked: `baseline` (last known disk content), pending\n * field-level ops, and `view` (baseline + ops, what the UI renders). Every\n * confirmed edit queues an op and schedules a save. A save re-reads the file\n * under a cross-process lock and applies the pending ops onto that freshest\n * content — unrelated external edits are preserved, a same-field race\n * resolves last-writer-wins, and ops targeting externally removed models\n * simply miss. The candidate is validated via ModelConfig on a temp file,\n * backed up once per session, and atomically renamed into place. Failed\n * saves keep the ops pending; closing offers retry or explicit discard.\n * Whole-snapshot blind overwrites are never performed.\n *\n * Comments and custom formatting are normalized to two-space JSON on save;\n * unknown fields anywhere in the document are preserved verbatim.\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport { mkdir, readFile, realpath, rename, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport lockfile from \"proper-lockfile\";\nimport { ModelConfig, type ModelsJsonModel, type ModelsJsonProvider } from \"../../core/model-config.ts\";\nimport { withFileMutationQueue } from \"../../core/tools/file-mutation-queue.ts\";\nimport { stripJsonComments } from \"../../utils/json.ts\";\nimport { normalizePath } from \"../../utils/paths.ts\";\nimport { stripBom } from \"../../utils/text.ts\";\nimport { hasProviderSettings } from \"./configuration.ts\";\nimport { formatError } from \"./constants.ts\";\nimport { DELETE, setPath } from \"./json-fields.ts\";\n\nexport { DELETE, type DeleteMarker } from \"./json-fields.ts\";\n\nexport interface ModelsJsonDocument {\n\tproviders: Record<string, ModelsJsonProvider>;\n\t[key: string]: unknown;\n}\n\ninterface OpBase {\n\tseq: number;\n}\nexport interface SetFieldOp extends OpBase {\n\tkind: \"set\";\n\tproviderId: string;\n\t/** Undefined for provider-level fields. */\n\tmodelId?: string;\n\t/** Path within the provider/model object, e.g. [\"compat\", \"allowEmptySignature\"]. */\n\tpath: readonly string[];\n\tvalue: unknown;\n\tcreateProvider: boolean;\n}\nexport interface AddModelOp extends OpBase {\n\tkind: \"addModel\";\n\tproviderId: string;\n\tmodel: ModelsJsonModel;\n\tcreateProvider: boolean;\n}\nexport interface RemoveModelOp extends OpBase {\n\tkind: \"removeModel\";\n\tproviderId: string;\n\tmodelId: string;\n}\nexport interface RenameModelOp extends OpBase {\n\tkind: \"renameModel\";\n\tproviderId: string;\n\toldId: string;\n\tnewId: string;\n}\nexport interface RemoveProviderOp extends OpBase {\n\tkind: \"removeProvider\";\n\tproviderId: string;\n}\nexport type Op = SetFieldOp | AddModelOp | RemoveModelOp | RenameModelOp | RemoveProviderOp;\n\nexport type SaveResult =\n\t| { kind: \"clean\" }\n\t| { kind: \"saved\"; applied: number }\n\t| { kind: \"invalid\"; error: string }\n\t| { kind: \"error\"; error: string };\n\nexport type StoreLoad = { ok: true; store: ModelsJsonStore } | { ok: false; error: string };\n\ninterface DiskRead {\n\texists: boolean;\n\tdoc: ModelsJsonDocument;\n\trawText?: string;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** Canonical comparison for JSON values, insensitive to object key order. */\nexport function jsonEquals(a: unknown, b: unknown): boolean {\n\tif (a === b) return true;\n\tif (Array.isArray(a) && Array.isArray(b)) {\n\t\treturn a.length === b.length && a.every((entry, index) => jsonEquals(entry, b[index]));\n\t}\n\tif (isPlainObject(a) && isPlainObject(b)) {\n\t\tconst aKeys = Object.keys(a).sort();\n\t\tconst bKeys = Object.keys(b).sort();\n\t\treturn (\n\t\t\taKeys.length === bKeys.length &&\n\t\t\taKeys.every((key, index) => key === bKeys[index] && jsonEquals(a[key], b[key]))\n\t\t);\n\t}\n\treturn false;\n}\n\nfunction cloneValue(value: unknown): unknown {\n\treturn value === DELETE ? value : structuredClone(value);\n}\n\nasync function readDocument(path: string): Promise<DiskRead> {\n\tlet rawText: string;\n\ttry {\n\t\trawText = await readFile(path, \"utf8\");\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return { exists: false, doc: { providers: {} } };\n\t\tthrow error;\n\t}\n\tconst parsed: unknown = JSON.parse(stripJsonComments(stripBom(rawText)));\n\tif (!isPlainObject(parsed)) throw new Error(\"models.json root must be a JSON object.\");\n\tconst doc = parsed as ModelsJsonDocument;\n\tif (!isPlainObject(doc.providers)) throw new Error('models.json \"providers\" must be an object.');\n\treturn { exists: true, doc, rawText };\n}\n\nexport class ModelsJsonStore {\n\treadonly path: string;\n\tprivate baseline: ModelsJsonDocument;\n\tprivate ops: Op[] = [];\n\tprivate view: ModelsJsonDocument;\n\tprivate seq = 0;\n\tprivate backedUp = false;\n\tprivate batching = false;\n\tprivate saveChain: Promise<void> = Promise.resolve();\n\tprivate readonly drafts = new Set<string>();\n\tprivate lastSaveResult: SaveResult = { kind: \"clean\" };\n\t/** Called after each save settles (success, conflict, or failure). */\n\tonSaveResult: ((result: SaveResult) => void) | undefined;\n\n\tprivate constructor(path: string, baseline: ModelsJsonDocument) {\n\t\tthis.path = path;\n\t\tthis.baseline = baseline;\n\t\tthis.view = structuredClone(baseline);\n\t}\n\n\tstatic async load(path: string): Promise<StoreLoad> {\n\t\tlet normalized = normalizePath(path);\n\t\tlet disk: DiskRead;\n\t\ttry {\n\t\t\tnormalized = await realpath(normalized).catch((error: NodeJS.ErrnoException) => {\n\t\t\t\tif (error.code === \"ENOENT\") return normalized;\n\t\t\t\tthrow error;\n\t\t\t});\n\t\t\tdisk = await readDocument(normalized);\n\t\t} catch (error) {\n\t\t\treturn { ok: false, error: `Failed to parse models.json: ${formatError(error)}\\n\\nFile: ${normalized}` };\n\t\t}\n\t\tif (disk.exists) {\n\t\t\t// Surface schema errors as a read-only state; never auto-overwrite an invalid file.\n\t\t\tconst check = await ModelConfig.load(normalized);\n\t\t\tconst validationError = check.getError();\n\t\t\tif (validationError) return { ok: false, error: validationError };\n\t\t}\n\t\treturn { ok: true, store: new ModelsJsonStore(normalized, disk.doc) };\n\t}\n\n\t// ---------------------------------------------------------------------\n\t// View access (read-only for the UI; mutations go through the methods)\n\t// ---------------------------------------------------------------------\n\n\tgetDoc(): ModelsJsonDocument {\n\t\treturn this.view;\n\t}\n\n\tgetProviderIds(): string[] {\n\t\treturn [...new Set([...Object.keys(this.view.providers), ...this.ops.map((op) => op.providerId)])];\n\t}\n\n\tgetProvider(providerId: string): ModelsJsonProvider | undefined {\n\t\treturn Object.hasOwn(this.view.providers, providerId) ? this.view.providers[providerId] : undefined;\n\t}\n\n\t/** Materialize a draft provider in the view without queueing an op (never written while empty). */\n\tensureProviderView(providerId: string): void {\n\t\tif (Object.hasOwn(this.view.providers, providerId)) return;\n\t\tthis.drafts.add(providerId);\n\t\tthis.recomputeView();\n\t}\n\n\t/** Provider present in the view but not yet on disk. */\n\tisDraftProvider(providerId: string): boolean {\n\t\treturn !Object.hasOwn(this.baseline.providers, providerId) && Object.hasOwn(this.view.providers, providerId);\n\t}\n\n\tgetModels(providerId: string): ModelsJsonModel[] {\n\t\tconst provider = this.getProvider(providerId);\n\t\treturn Array.isArray(provider?.models) ? provider.models : [];\n\t}\n\n\tgetModel(providerId: string, modelId: string): ModelsJsonModel | undefined {\n\t\treturn this.getModels(providerId).find((model) => model.id === modelId);\n\t}\n\n\tget pendingCount(): number {\n\t\treturn this.ops.length;\n\t}\n\n\tgetPendingError(providerId?: string): string | undefined {\n\t\tconst pending = this.ops.filter((op) => providerId === undefined || op.providerId === providerId);\n\t\tif (pending.length === 0) return undefined;\n\t\tif (this.lastSaveResult.kind === \"error\" || this.lastSaveResult.kind === \"invalid\")\n\t\t\treturn this.lastSaveResult.error;\n\t\treturn `${pending.length} change(s) are not saved; retry or discard before continuing.`;\n\t}\n\n\tretrySave(): void {\n\t\tif (this.ops.length > 0) this.scheduleSave();\n\t}\n\n\t/** Used only after flush, when the user explicitly discards unsaved edits. */\n\tdiscardPending(): void {\n\t\tthis.ops = [];\n\t\tthis.drafts.clear();\n\t\tthis.recomputeView();\n\t}\n\n\t// ---------------------------------------------------------------------\n\t// Mutations (queue an op, refresh the view, schedule a save)\n\t// ---------------------------------------------------------------------\n\n\tprivate enqueue(op: Op): void {\n\t\tthis.ops.push(op);\n\t\tthis.recomputeView();\n\t\tthis.scheduleSave();\n\t}\n\n\tprivate nextSeq(): number {\n\t\treturn ++this.seq;\n\t}\n\n\tsetProviderField(providerId: string, path: readonly string[], value: unknown): void {\n\t\tthis.enqueue({\n\t\t\tkind: \"set\",\n\t\t\tseq: this.nextSeq(),\n\t\t\tproviderId,\n\t\t\tpath,\n\t\t\tvalue: cloneValue(value),\n\t\t\tcreateProvider: !Object.hasOwn(this.baseline.providers, providerId),\n\t\t});\n\t}\n\n\tsetModelField(providerId: string, modelId: string, path: readonly string[], value: unknown): void {\n\t\tthis.enqueue({\n\t\t\tkind: \"set\",\n\t\t\tseq: this.nextSeq(),\n\t\t\tproviderId,\n\t\t\tmodelId,\n\t\t\tpath,\n\t\t\tvalue: cloneValue(value),\n\t\t\tcreateProvider: !Object.hasOwn(this.baseline.providers, providerId),\n\t\t});\n\t}\n\n\taddModel(providerId: string, model: ModelsJsonModel): void {\n\t\tthis.enqueue({\n\t\t\tkind: \"addModel\",\n\t\t\tseq: this.nextSeq(),\n\t\t\tproviderId,\n\t\t\tmodel: structuredClone(model),\n\t\t\tcreateProvider: !Object.hasOwn(this.baseline.providers, providerId),\n\t\t});\n\t}\n\n\tremoveModel(providerId: string, modelId: string): void {\n\t\tthis.enqueue({\n\t\t\tkind: \"removeModel\",\n\t\t\tseq: this.nextSeq(),\n\t\t\tproviderId,\n\t\t\tmodelId,\n\t\t});\n\t}\n\n\tasync renameModel(providerId: string, oldId: string, newId: string): Promise<string | undefined> {\n\t\tawait this.flush();\n\t\tconst pendingError = this.getPendingError(providerId);\n\t\tif (pendingError) return pendingError;\n\t\tconst before = this.getModel(providerId, oldId);\n\t\tif (!before) return \"The model no longer exists.\";\n\t\tconst seq = this.nextSeq();\n\t\tthis.enqueue({\n\t\t\tkind: \"renameModel\",\n\t\t\tseq,\n\t\t\tproviderId,\n\t\t\toldId,\n\t\t\tnewId,\n\t\t});\n\t\tawait this.flush();\n\t\tif (this.ops.some((op) => op.seq === seq)) {\n\t\t\t// The save failed; drop the rename rather than surprising the user later.\n\t\t\tthis.ops = this.ops.filter((op) => op.seq !== seq);\n\t\t\tthis.recomputeView();\n\t\t\treturn this.getPendingError(providerId) ?? \"Failed to save models.json.\";\n\t\t}\n\t\t// A settled rename can still have missed when the model moved on disk; never\n\t\t// adopt an unrelated model that already uses the destination id.\n\t\tconst renamed = this.getModel(providerId, newId);\n\t\treturn renamed && jsonEquals(renamed, { ...before, id: newId })\n\t\t\t? undefined\n\t\t\t: \"The model changed on disk; reopen it before renaming.\";\n\t}\n\n\tremoveProvider(providerId: string): void {\n\t\tthis.enqueue({\n\t\t\tkind: \"removeProvider\",\n\t\t\tseq: this.nextSeq(),\n\t\t\tproviderId,\n\t\t});\n\t}\n\n\t/** Queue several ops but schedule a single save (batch import, built-in data apply). */\n\tbatch(mutate: () => void): void {\n\t\tthis.batching = true;\n\t\ttry {\n\t\t\tmutate();\n\t\t} finally {\n\t\t\tthis.batching = false;\n\t\t}\n\t\tif (this.ops.length > 0) this.scheduleSave();\n\t}\n\n\t/** Drop all pending ops targeting a draft provider (used when leaving its editor untouched). */\n\tdiscardProviderDraft(providerId: string): void {\n\t\tthis.drafts.delete(providerId);\n\t\tif (Object.hasOwn(this.baseline.providers, providerId)) return;\n\t\tthis.ops = this.ops.filter((op) => op.providerId !== providerId);\n\t\tthis.recomputeView();\n\t}\n\n\t// ---------------------------------------------------------------------\n\t// View computation\n\t// ---------------------------------------------------------------------\n\n\tprivate recomputeView(): void {\n\t\tconst view = structuredClone(this.baseline);\n\t\tfor (const id of this.drafts) ensureProvider(view, id);\n\t\tfor (const op of this.ops) applyOp(view, op);\n\t\tthis.view = view;\n\t}\n\n\t// ---------------------------------------------------------------------\n\t// Saving\n\t// ---------------------------------------------------------------------\n\n\tprivate scheduleSave(): void {\n\t\tif (this.batching) return;\n\t\tthis.saveChain = this.saveChain\n\t\t\t.catch(() => {})\n\t\t\t.then(async () => {\n\t\t\t\tconst result = await this.save();\n\t\t\t\tthis.lastSaveResult = result;\n\t\t\t\tif (result.kind !== \"clean\") this.onSaveResult?.(result);\n\t\t\t});\n\t}\n\n\t/** Wait for all scheduled saves; the settled result of the last save, if any. */\n\tasync flush(): Promise<void> {\n\t\tlet pending: Promise<void>;\n\t\tdo {\n\t\t\tpending = this.saveChain;\n\t\t\tawait pending;\n\t\t} while (pending !== this.saveChain);\n\t}\n\n\tprivate async save(): Promise<SaveResult> {\n\t\tif (this.ops.length === 0) return { kind: \"clean\" };\n\t\ttry {\n\t\t\treturn await withFileMutationQueue(this.path, async () => {\n\t\t\t\tawait mkdir(dirname(this.path), { recursive: true });\n\t\t\t\tlet compromised: Error | undefined;\n\t\t\t\tconst release = await lockfile.lock(this.path, {\n\t\t\t\t\trealpath: false,\n\t\t\t\t\tstale: 30_000,\n\t\t\t\t\tretries: { retries: 20, factor: 1.2, minTimeout: 50, maxTimeout: 250 },\n\t\t\t\t\tonCompromised: (error) => {\n\t\t\t\t\t\tcompromised = error;\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tlet result: SaveResult;\n\t\t\t\ttry {\n\t\t\t\t\tresult = await this.saveLocked(() => {\n\t\t\t\t\t\tif (compromised) throw compromised;\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tresult = { kind: \"error\", error: `Failed to save models.json: ${formatError(error)}` };\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tawait release();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!compromised && result.kind !== \"error\" && result.kind !== \"invalid\") {\n\t\t\t\t\t\tresult = { kind: \"error\", error: `Could not release the models.json lock: ${formatError(error)}` };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t});\n\t\t} catch (error) {\n\t\t\treturn { kind: \"error\", error: `Failed to access models.json for saving: ${formatError(error)}` };\n\t\t}\n\t}\n\n\tprivate async saveLocked(assertLock: () => void): Promise<SaveResult> {\n\t\tconst tempPath = join(dirname(this.path), `.models.${randomUUID()}.tmp`);\n\t\ttry {\n\t\t\tassertLock();\n\t\t\tlet disk: DiskRead;\n\t\t\ttry {\n\t\t\t\tdisk = await readDocument(this.path);\n\t\t\t} catch (error) {\n\t\t\t\t// Never clobber a file we cannot parse.\n\t\t\t\treturn { kind: \"error\", error: `models.json changed on disk and is unreadable: ${formatError(error)}` };\n\t\t\t}\n\t\t\tconst working = structuredClone(disk.doc);\n\t\t\tconst batch = this.ops.filter((op) => {\n\t\t\t\tconst provider = this.getProvider(op.providerId);\n\t\t\t\treturn (\n\t\t\t\t\tObject.hasOwn(disk.doc.providers, op.providerId) ||\n\t\t\t\t\t!provider ||\n\t\t\t\t\tObject.keys(provider).length === 0 ||\n\t\t\t\t\thasProviderSettings(provider)\n\t\t\t\t);\n\t\t\t});\n\t\t\t// Apply blindly onto the freshest disk content: unrelated external\n\t\t\t// edits are preserved, a same-field race resolves last-writer-wins,\n\t\t\t// and ops targeting externally removed models simply miss.\n\t\t\tfor (const op of batch) applyOp(working, op);\n\t\t\tpruneEmptyNewProviders(working, disk.doc);\n\t\t\tconst settle = () => {\n\t\t\t\tconst settled = new Set(batch.map((op) => op.seq));\n\t\t\t\tthis.ops = this.ops.filter((op) => !settled.has(op.seq));\n\t\t\t\tthis.recomputeView();\n\t\t\t};\n\t\t\tif (jsonEquals(working, disk.doc)) {\n\t\t\t\t// Ops cancelled each other out or already matched disk; nothing to write.\n\t\t\t\tthis.baseline = disk.doc;\n\t\t\t\tsettle();\n\t\t\t\treturn { kind: \"saved\", applied: batch.length };\n\t\t\t}\n\t\t\tconst candidate = `${JSON.stringify(working, null, 2)}\\n`;\n\t\t\tawait writeFile(tempPath, candidate, { encoding: \"utf8\", mode: 0o600 });\n\t\t\tconst check = await ModelConfig.load(tempPath);\n\t\t\tconst validationError = check.getError();\n\t\t\tif (validationError) {\n\t\t\t\treturn { kind: \"invalid\", error: validationError };\n\t\t\t}\n\t\t\tconst latest = await readDocument(this.path);\n\t\t\tif (latest.exists !== disk.exists || latest.rawText !== disk.rawText) {\n\t\t\t\tthrow new Error(\"models.json changed while saving; the edits were kept for retry.\");\n\t\t\t}\n\t\t\tif (!this.backedUp && disk.exists && disk.rawText !== undefined) {\n\t\t\t\tawait writeFile(`${this.path}.bak`, disk.rawText, { encoding: \"utf8\", mode: 0o600 });\n\t\t\t\tthis.backedUp = true;\n\t\t\t}\n\t\t\tassertLock();\n\t\t\tawait rename(tempPath, this.path);\n\t\t\tthis.baseline = working;\n\t\t\tsettle();\n\t\t\treturn { kind: \"saved\", applied: batch.length };\n\t\t} finally {\n\t\t\tawait rm(tempPath, { force: true }).catch(() => {});\n\t\t}\n\t}\n}\n\n// -------------------------------------------------------------------------\n// Op application\n// -------------------------------------------------------------------------\n\nfunction ensureProvider(doc: ModelsJsonDocument, providerId: string): Record<string, unknown> {\n\tconst existing = Object.hasOwn(doc.providers, providerId) ? doc.providers[providerId] : undefined;\n\tif (existing) return existing;\n\tconst created: Record<string, unknown> = {};\n\tObject.defineProperty(doc.providers, providerId, {\n\t\tvalue: created,\n\t\twritable: true,\n\t\tenumerable: true,\n\t\tconfigurable: true,\n\t});\n\treturn created;\n}\n\nfunction applyOp(doc: ModelsJsonDocument, op: Op): void {\n\tswitch (op.kind) {\n\t\tcase \"set\": {\n\t\t\tconst provider = ensureProvider(doc, op.providerId);\n\t\t\tif (op.modelId === undefined) {\n\t\t\t\tsetPath(provider, op.path, op.value);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst models = Array.isArray(provider.models) ? (provider.models as Record<string, unknown>[]) : [];\n\t\t\tconst model = models.find((entry) => entry.id === op.modelId);\n\t\t\tif (model) setPath(model, op.path, op.value);\n\t\t\treturn;\n\t\t}\n\t\tcase \"addModel\": {\n\t\t\tconst provider = ensureProvider(doc, op.providerId);\n\t\t\tconst models = Array.isArray(provider.models) ? (provider.models as Record<string, unknown>[]) : [];\n\t\t\tconst index = models.findIndex((entry) => entry.id === op.model.id);\n\t\t\tconst clone = structuredClone(op.model) as Record<string, unknown>;\n\t\t\tif (index >= 0) models[index] = clone;\n\t\t\telse models.push(clone);\n\t\t\tprovider.models = models;\n\t\t\treturn;\n\t\t}\n\t\tcase \"removeModel\": {\n\t\t\tconst provider = doc.providers[op.providerId] as Record<string, unknown> | undefined;\n\t\t\tconst models = Array.isArray(provider?.models) ? (provider.models as Record<string, unknown>[]) : undefined;\n\t\t\tif (!provider || !models) return;\n\t\t\tprovider.models = models.filter((entry) => entry.id !== op.modelId);\n\t\t\treturn;\n\t\t}\n\t\tcase \"renameModel\": {\n\t\t\tconst provider = doc.providers[op.providerId] as Record<string, unknown> | undefined;\n\t\t\tconst models = Array.isArray(provider?.models) ? (provider.models as Record<string, unknown>[]) : undefined;\n\t\t\tif (!models) return;\n\t\t\tconst model = models.find((entry) => entry.id === op.oldId);\n\t\t\tif (model && !models.some((entry) => entry.id === op.newId)) model.id = op.newId;\n\t\t\treturn;\n\t\t}\n\t\tcase \"removeProvider\": {\n\t\t\tdelete doc.providers[op.providerId];\n\t\t\treturn;\n\t\t}\n\t}\n}\n\n/** Remove providers the ops materialized but which ended up with no keys (self-cancelled drafts). */\nfunction pruneEmptyNewProviders(working: ModelsJsonDocument, disk: ModelsJsonDocument): void {\n\tfor (const [providerId, provider] of Object.entries(working.providers)) {\n\t\tif (Object.hasOwn(disk.providers, providerId)) continue;\n\t\tif (isPlainObject(provider) && Object.keys(provider).length === 0) delete working.providers[providerId];\n\t}\n}\n"]}
|
|
@@ -19,7 +19,6 @@ export declare class BuiltinCandidatesPane implements EditorPane {
|
|
|
19
19
|
private readonly model;
|
|
20
20
|
constructor(host: EditorHost, model: ModelHandle);
|
|
21
21
|
private candidates;
|
|
22
|
-
private tiers;
|
|
23
22
|
render(width: number): string[];
|
|
24
23
|
scrollWindow(): ScrollWindowInfo;
|
|
25
24
|
private pickCurrent;
|
|
@@ -47,7 +46,6 @@ export declare class BuiltinPreviewPane implements EditorPane {
|
|
|
47
46
|
scrollWindow(): ScrollWindowInfo;
|
|
48
47
|
handleInput(data: string): void;
|
|
49
48
|
private apply;
|
|
50
|
-
private applyChange;
|
|
51
49
|
setFocused(focused: boolean): void;
|
|
52
50
|
hints(): string;
|
|
53
51
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builtin-data.d.ts","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/builtin-data.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,mBAAmB,CAAC;AAI3B,OAAO,EAAE,KAAK,YAAY,EAA6D,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"builtin-data.d.ts","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/builtin-data.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,mBAAmB,CAAC;AAI3B,OAAO,EAAE,KAAK,YAAY,EAA6D,MAAM,eAAe,CAAC;AAI7G,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACrE,OAAO,EAAmC,KAAK,gBAAgB,EAAe,MAAM,gBAAgB,CAAC;AAOrG,qBAAa,qBAAsB,YAAW,UAAU;IACvD,QAAQ,CAAC,KAAK,uBAAuB;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;gBACxB,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW;IAYhD,OAAO,CAAC,UAAU;IAIlB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IA4B/B,YAAY,IAAI,gBAAgB;IAKhC,OAAO,CAAC,WAAW;IAMnB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAwB/B,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAKlC,SAAS,IAAI,OAAO;IAIpB,KAAK,IAAI,MAAM;CAQf;AAED,qBAAa,kBAAmB,YAAW,UAAU;IACpD,QAAQ,CAAC,KAAK,sCAAiC;IAC/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAY;IACpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6C;IACtE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;gBAC7B,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY;IAYzE,OAAO,CAAC,QAAQ;IAIhB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAsC/B,YAAY,IAAI,gBAAgB;IAahC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAwC/B,OAAO,CAAC,KAAK;IA+Bb,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIlC,KAAK,IAAI,MAAM;CAOf"}
|