dflash-console 0.3.240__tar.gz → 0.3.241__tar.gz

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.
Files changed (202) hide show
  1. {dflash_console-0.3.240 → dflash_console-0.3.241}/PKG-INFO +3 -3
  2. {dflash_console-0.3.240 → dflash_console-0.3.241}/README.md +2 -2
  3. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/config.py +23 -5
  4. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/version.py +1 -1
  5. {dflash_console-0.3.240 → dflash_console-0.3.241}/pyproject.toml +1 -1
  6. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/index.html +2 -2
  7. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/js/settings-live.js +5 -2
  8. {dflash_console-0.3.240 → dflash_console-0.3.241}/.gitignore +0 -0
  9. {dflash_console-0.3.240 → dflash_console-0.3.241}/LICENSE +0 -0
  10. {dflash_console-0.3.240 → dflash_console-0.3.241}/NOTICE.md +0 -0
  11. {dflash_console-0.3.240 → dflash_console-0.3.241}/api/__init__.py +0 -0
  12. {dflash_console-0.3.240 → dflash_console-0.3.241}/api/app.py +0 -0
  13. {dflash_console-0.3.240 → dflash_console-0.3.241}/api/gateway.py +0 -0
  14. {dflash_console-0.3.240 → dflash_console-0.3.241}/assets/dflash_console_logo.png +0 -0
  15. {dflash_console-0.3.240 → dflash_console-0.3.241}/assets/dflash_console_logo_only.png +0 -0
  16. {dflash_console-0.3.240 → dflash_console-0.3.241}/assets/dflash_console_logo_only2.png +0 -0
  17. {dflash_console-0.3.240 → dflash_console-0.3.241}/assets/dflash_console_logo_only_clear.png +0 -0
  18. {dflash_console-0.3.240 → dflash_console-0.3.241}/assets/dflash_txt_logo.png +0 -0
  19. {dflash_console-0.3.240 → dflash_console-0.3.241}/config.example.json +0 -0
  20. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/__init__.py +0 -0
  21. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/api_access_log.py +0 -0
  22. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/api_catalog.py +0 -0
  23. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/api_introspection.py +0 -0
  24. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/api_providers.py +0 -0
  25. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/auto_register.py +0 -0
  26. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/catalog_load.py +0 -0
  27. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/chat_proxy.py +0 -0
  28. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/chat_queue.py +0 -0
  29. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/chat_ready.py +0 -0
  30. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/chat_vision.py +0 -0
  31. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/client_identity.py +0 -0
  32. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/components_hub.py +0 -0
  33. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/dflash_generation.py +0 -0
  34. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/diagnostics_bundle.py +0 -0
  35. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/display_names.py +0 -0
  36. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/embedding_server.py +0 -0
  37. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/engine_state.py +0 -0
  38. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/freetoken_runtime_install.py +0 -0
  39. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/fs_browse.py +0 -0
  40. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/fs_reveal.py +0 -0
  41. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/gateway_access_log.py +0 -0
  42. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/gateway_routing.py +0 -0
  43. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/gguf_meta.py +0 -0
  44. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/gpu_devices.py +0 -0
  45. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/gpu_policy.py +0 -0
  46. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/gpu_process_memory_windows.py +0 -0
  47. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/gpu_processes.py +0 -0
  48. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/gpu_relief.py +0 -0
  49. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/hardware_apply.py +0 -0
  50. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/hardware_info.py +0 -0
  51. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/hf_catalog_cache.py +0 -0
  52. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/hf_catalog_draft.py +0 -0
  53. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/hf_catalog_index.py +0 -0
  54. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/hf_catalog_recommend.py +0 -0
  55. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/hf_engines.py +0 -0
  56. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/hf_install.py +0 -0
  57. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/hf_local_match.py +0 -0
  58. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/hf_model_fit.py +0 -0
  59. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/huggingface.py +0 -0
  60. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/inference_stats.py +0 -0
  61. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/library_import.py +0 -0
  62. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/load_progress.py +0 -0
  63. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/local_models.py +0 -0
  64. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/log_utils.py +0 -0
  65. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/memory_guardrails.py +0 -0
  66. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/model_discovery.py +0 -0
  67. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/model_paths.py +0 -0
  68. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/model_presets.py +0 -0
  69. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/model_runtime_policy.py +0 -0
  70. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/model_stack.py +0 -0
  71. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/net_listeners.py +0 -0
  72. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/node_connect.py +0 -0
  73. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/ocr_setup.py +0 -0
  74. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/remote_nodes.py +0 -0
  75. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/runtime.py +0 -0
  76. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/runtime_install_job.py +0 -0
  77. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/runtime_recommendations.py +0 -0
  78. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/runtimes/__init__.py +0 -0
  79. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/runtimes/base.py +0 -0
  80. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/runtimes/contention.py +0 -0
  81. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/runtimes/faster_whisper.py +0 -0
  82. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/runtimes/freetoken.py +0 -0
  83. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/runtimes/noop.py +0 -0
  84. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/runtimes/ollama.py +0 -0
  85. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/runtimes/piper.py +0 -0
  86. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/runtimes/registry.py +0 -0
  87. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/runtimes/stt.py +0 -0
  88. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/runtimes/transformers_hf.py +0 -0
  89. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/runtimes/vibevoice.py +0 -0
  90. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/runtimes/vllm.py +0 -0
  91. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/server_boot.py +0 -0
  92. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/setup.py +0 -0
  93. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/stack_match.py +0 -0
  94. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/status_report.py +0 -0
  95. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/support_journal.py +0 -0
  96. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/system_stats.py +0 -0
  97. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/transformers_runtime_install.py +0 -0
  98. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/vision_setup.py +0 -0
  99. {dflash_console-0.3.240 → dflash_console-0.3.241}/core/vllm_runtime_install.py +0 -0
  100. {dflash_console-0.3.240 → dflash_console-0.3.241}/dflash_cli/__init__.py +0 -0
  101. {dflash_console-0.3.240 → dflash_console-0.3.241}/dflash_cli/__main__.py +0 -0
  102. {dflash_console-0.3.240 → dflash_console-0.3.241}/dflash_cli/cli.py +0 -0
  103. {dflash_console-0.3.240 → dflash_console-0.3.241}/dflash_cli/commands.py +0 -0
  104. {dflash_console-0.3.240 → dflash_console-0.3.241}/dflash_cli/http.py +0 -0
  105. {dflash_console-0.3.240 → dflash_console-0.3.241}/dflash_cli/render.py +0 -0
  106. {dflash_console-0.3.240 → dflash_console-0.3.241}/dflash_cli/resolve.py +0 -0
  107. {dflash_console-0.3.240 → dflash_console-0.3.241}/dflash_cli/server_takeover.py +0 -0
  108. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/AGENT-PROMPT-CLIENT-IDENTITY.md +0 -0
  109. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/AGENT-PROMPT-DFLASH-TRANSLATION-PERF-AI-TOOLS.md +0 -0
  110. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/AGENT-PROMPT-TRANSLATEGEMMA-AI-TOOLS.md +0 -0
  111. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/ARCHITECTURE.md +0 -0
  112. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/BUG-REPORTS.md +0 -0
  113. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/CLI.md +0 -0
  114. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/CLIENT-IDENTITY.md +0 -0
  115. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/CURSOR.md +0 -0
  116. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/GOING-PUBLIC.md +0 -0
  117. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/LICENSING.md +0 -0
  118. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/LINUX-CLI.md +0 -0
  119. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/MULTI-MODAL-AGENT-PROMPT.md +0 -0
  120. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/MULTI-MODAL-RUNTIME-PLAN.md +0 -0
  121. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/PRODUCTION.md +0 -0
  122. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/RELEASING.md +0 -0
  123. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/STT-ENGINE-DECISION.md +0 -0
  124. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/USER-GUIDE.md +0 -0
  125. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/announcements/public-preview-v0.3.103.md +0 -0
  126. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/announcements/public-preview-v0.3.122.md +0 -0
  127. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/announcements/public-preview.md +0 -0
  128. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/automatic-updates.md +0 -0
  129. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/plans/shared-speak-stt-service.md +0 -0
  130. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/release-notes-0.3.103.md +0 -0
  131. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/release-notes-0.3.106.md +0 -0
  132. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/release-notes-0.3.117.md +0 -0
  133. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/release-notes-0.3.118.md +0 -0
  134. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/release-notes-0.3.119.md +0 -0
  135. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/release-notes-0.3.120.md +0 -0
  136. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/release-notes-0.3.121.md +0 -0
  137. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/release-notes-0.3.122.md +0 -0
  138. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/release-notes-0.3.123.md +0 -0
  139. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/release-notes-0.3.128.md +0 -0
  140. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/release-notes-0.3.129.md +0 -0
  141. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/release-notes-0.3.132.md +0 -0
  142. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/release-notes-0.3.133.md +0 -0
  143. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/release-notes-0.3.208.md +0 -0
  144. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/ui/README.md +0 -0
  145. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/ui/devices-view.md +0 -0
  146. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/ui/model-search.md +0 -0
  147. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/ui/models-view.md +0 -0
  148. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/ui/nodes-v1-plan.md +0 -0
  149. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/ui/settings-appearance.md +0 -0
  150. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/ui/settings-chat.md +0 -0
  151. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/ui/settings-developer.md +0 -0
  152. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/ui/settings-general.md +0 -0
  153. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/ui/settings-hardware.md +0 -0
  154. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/ui/settings-integrations.md +0 -0
  155. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/ui/settings-lm-link.md +0 -0
  156. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/ui/settings-model-defaults.md +0 -0
  157. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/ui/settings-runtime.md +0 -0
  158. {dflash_console-0.3.240 → dflash_console-0.3.241}/docs/ui/settings-runtimes.md +0 -0
  159. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/app-functional.html +0 -0
  160. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/css/dflash-console.css +0 -0
  161. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/css/dflash-console.css.bak-density +0 -0
  162. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/css/dflash-shell.css +0 -0
  163. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/css/dflash-shell.css.bak-density +0 -0
  164. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/css/studio.css +0 -0
  165. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/js/about-live.js +0 -0
  166. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/js/app-settings-live.js +0 -0
  167. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/js/app.js +0 -0
  168. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/js/bug-report-live.js +0 -0
  169. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/js/chat-live.js +0 -0
  170. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/js/component-install-live.js +0 -0
  171. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/js/console-api.js +0 -0
  172. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/js/dashboard.js +0 -0
  173. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/js/desktop-shell.js +0 -0
  174. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/js/dflash-console-ui.js +0 -0
  175. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/js/docs-live.js +0 -0
  176. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/js/download-queue.js +0 -0
  177. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/js/downloads-live.js +0 -0
  178. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/js/library-browse-live.js +0 -0
  179. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/js/library-scan-live.js +0 -0
  180. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/js/library-type-options.js +0 -0
  181. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/js/log-format.js +0 -0
  182. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/js/model-card.js +0 -0
  183. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/js/model-catalog-groups.js +0 -0
  184. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/js/model-search-live.js +0 -0
  185. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/js/models-live.js +0 -0
  186. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/js/nodes-live.js +0 -0
  187. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/js/runtime-recommendations.js +0 -0
  188. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/js/runtime-steppers.js +0 -0
  189. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/js/select-theme.js +0 -0
  190. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/js/server-live.js +0 -0
  191. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/js/server-reload-watch.js +0 -0
  192. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/js/settings-live.js.api-providers-bak +0 -0
  193. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/js/settings-live.js.pre-api-merge-bak +0 -0
  194. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/js/setup-wizard-live.js +0 -0
  195. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/js/speak-live.js +0 -0
  196. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/js/stack-wizard.js +0 -0
  197. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/js/status-feed.js +0 -0
  198. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/js/sysbar-live.js +0 -0
  199. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/js/table-column-resize.js +0 -0
  200. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/js/ui-layout-prefs.js +0 -0
  201. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/vendor/marked.min.js +0 -0
  202. {dflash_console-0.3.240 → dflash_console-0.3.241}/static/vendor/purify.min.js +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: dflash-console
3
- Version: 0.3.240
3
+ Version: 0.3.241
4
4
  Summary: Local control panel and terminal CLI for DFlash stacks and local model runtimes
5
5
  Project-URL: Homepage, https://github.com/ilan4ever/Dflash-Console
6
6
  Project-URL: Repository, https://github.com/ilan4ever/Dflash-Console
@@ -674,7 +674,7 @@ from one UI, then talk to them through a single OpenAI-compatible port.
674
674
  > supported platform**; Linux and macOS are not supported or tested (see
675
675
  > [Platform support](#platform-support) below).
676
676
 
677
- **Developer:** ILAN AVIV · **UI:** [http://127.0.0.1:8900/](http://127.0.0.1:8900/) · **Version:** v0.3.240
677
+ **Developer:** ILAN AVIV · **UI:** [http://127.0.0.1:8900/](http://127.0.0.1:8900/) · **Version:** v0.3.241
678
678
 
679
679
  ## Download (Windows)
680
680
 
@@ -753,7 +753,7 @@ Typical first session:
753
753
  3. For a DFlash GGUF, right-click and **Find and attach draft** if you want speculative decoding.
754
754
  4. Chat in the **Playground**, or point any OpenAI client at `http://127.0.0.1:8001/v1` with optional `X-DFlash-Client: YourApp` so **Engines** shows who is using each model.
755
755
 
756
- ### Recent improvements (v0.3.240)
756
+ ### Recent improvements (v0.3.241)
757
757
 
758
758
  - **Engine standby** — Running toggle gates load/chat until you arm the pipeline
759
759
  - **External GPU cards** — OneVoice, LM Studio, and other apps on the GPU; compact mobile layout; loading state expires when models are ready
@@ -8,7 +8,7 @@ from one UI, then talk to them through a single OpenAI-compatible port.
8
8
  > supported platform**; Linux and macOS are not supported or tested (see
9
9
  > [Platform support](#platform-support) below).
10
10
 
11
- **Developer:** ILAN AVIV · **UI:** [http://127.0.0.1:8900/](http://127.0.0.1:8900/) · **Version:** v0.3.240
11
+ **Developer:** ILAN AVIV · **UI:** [http://127.0.0.1:8900/](http://127.0.0.1:8900/) · **Version:** v0.3.241
12
12
 
13
13
  ## Download (Windows)
14
14
 
@@ -87,7 +87,7 @@ Typical first session:
87
87
  3. For a DFlash GGUF, right-click and **Find and attach draft** if you want speculative decoding.
88
88
  4. Chat in the **Playground**, or point any OpenAI client at `http://127.0.0.1:8001/v1` with optional `X-DFlash-Client: YourApp` so **Engines** shows who is using each model.
89
89
 
90
- ### Recent improvements (v0.3.240)
90
+ ### Recent improvements (v0.3.241)
91
91
 
92
92
  - **Engine standby** — Running toggle gates load/chat until you arm the pipeline
93
93
  - **External GPU cards** — OneVoice, LM Studio, and other apps on the GPU; compact mobile layout; loading state expires when models are ready
@@ -689,7 +689,7 @@ def suggest_runtime_port(*, cfg: dict[str, Any] | None = None) -> int:
689
689
  return candidate
690
690
 
691
691
 
692
- def save_config(cfg: dict[str, Any]) -> None:
692
+ def save_config(cfg: dict[str, Any]) -> None:
693
693
  validate_config(cfg)
694
694
  if os.environ.get('PYTEST_CURRENT_TEST'):
695
695
  default_cfg = (ROOT / 'config.json').resolve()
@@ -717,14 +717,32 @@ def save_config(cfg: dict[str, Any]) -> None:
717
717
  handle.write(payload)
718
718
  handle.flush()
719
719
  os.fsync(handle.fileno())
720
- os.replace(temp_name, CONFIG_PATH)
721
- temp_name = ''
720
+ _replace_config_file(temp_name)
721
+ temp_name = ''
722
722
  finally:
723
723
  if temp_name:
724
724
  try:
725
725
  os.unlink(temp_name)
726
- except OSError:
727
- pass
726
+ except OSError:
727
+ pass
728
+
729
+
730
+ def _replace_config_file(temp_name: str) -> None:
731
+ """Atomically replace config, tolerating short Windows file locks.
732
+
733
+ Electron, antivirus, and file-indexing readers can briefly deny the
734
+ destination during an otherwise valid save. Keep the atomic replacement,
735
+ but retry the transient Windows failure before surfacing HTTP 500.
736
+ """
737
+ attempts = 6 if os.name == 'nt' else 1
738
+ for attempt in range(attempts):
739
+ try:
740
+ os.replace(temp_name, CONFIG_PATH)
741
+ return
742
+ except PermissionError:
743
+ if attempt >= attempts - 1:
744
+ raise
745
+ time.sleep(0.1 * (attempt + 1))
728
746
 
729
747
 
730
748
  @contextmanager
@@ -1,3 +1,3 @@
1
1
  """DFlash Console release label."""
2
2
 
3
- APP_VERSION = "0.3.240"
3
+ APP_VERSION = "0.3.241"
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "dflash-console"
7
- version = "0.3.240"
7
+ version = "0.3.241"
8
8
  description = "Local control panel and terminal CLI for DFlash stacks and local model runtimes"
9
9
  readme = "README.md"
10
10
  license = { file = "LICENSE" }
@@ -17,7 +17,7 @@
17
17
  <div class="df-brand-text">
18
18
  <div class="df-brand-title-row">
19
19
  <span class="df-brand-title">DFlash Console</span>
20
- <span class="df-app-version" id="dfAppVersion" title="DFlash Console version">v0.3.240</span>
20
+ <span class="df-app-version" id="dfAppVersion" title="DFlash Console version">v0.3.241</span>
21
21
  </div>
22
22
  </div>
23
23
  </div>
@@ -533,7 +533,7 @@ try {
533
533
  </article>
534
534
  <article class="df-about-meta-card">
535
535
  <span class="df-about-meta-label">Version</span>
536
- <strong id="dfAboutVersion">v0.3.240</strong>
536
+ <strong id="dfAboutVersion">v0.3.241</strong>
537
537
  <span>Current Console release</span>
538
538
  </article>
539
539
  <article class="df-about-meta-card">
@@ -2277,7 +2277,7 @@
2277
2277
  </div>
2278
2278
  <div class="lm-field">
2279
2279
  <label for="apiProviderWizardApiKey">API key</label>
2280
- <input type="password" class="lm-input" id="apiProviderWizardApiKey" value="" placeholder="${escapeHtml(apiProviderWizard.api_key_set ? (apiProviderWizard.api_key_preview || '•••• saved') : 'sk-…')}" autocomplete="off" spellcheck="false">
2280
+ <input type="password" class="lm-input" id="apiProviderWizardApiKey" value="${escapeHtml(apiProviderWizard.typedKey || '')}" placeholder="${escapeHtml(apiProviderWizard.api_key_set ? (apiProviderWizard.api_key_preview || '•••• saved') : 'sk-…')}" autocomplete="off" spellcheck="false">
2281
2281
  </div>
2282
2282
  </div>
2283
2283
  ${apiProviderWizard.isCustom ? `
@@ -2315,7 +2315,10 @@
2315
2315
  if (baseEl) apiProviderWizard.base_url = String(baseEl.value || '').trim();
2316
2316
  if (keyEl) {
2317
2317
  const typed = String(keyEl.value || '');
2318
- apiProviderWizard.typedKey = typed;
2318
+ // The wizard re-renders after Test & fetch models and the password input
2319
+ // is rebuilt. Keep a previously captured key so a following Save still
2320
+ // sends api_key instead of silently dropping it.
2321
+ if (typed) apiProviderWizard.typedKey = typed;
2319
2322
  apiProviderWizard.keyDirty = typed.length > 0 || apiProviderWizard.keyDirty;
2320
2323
  }
2321
2324
  if (enabledEl) apiProviderWizard.enabled = !!enabledEl.checked;