MetaList 0.24.2__tar.gz → 0.25.0__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 (658) hide show
  1. {metalist-0.24.2/metalist.egg-info → metalist-0.25.0}/PKG-INFO +19 -1
  2. {metalist-0.24.2 → metalist-0.25.0}/README.md +17 -0
  3. {metalist-0.24.2 → metalist-0.25.0}/app/api/note_requests.py +19 -8
  4. {metalist-0.24.2 → metalist-0.25.0}/app/api/routes/ai.py +92 -56
  5. {metalist-0.24.2 → metalist-0.25.0}/app/api/routes/auth.py +14 -11
  6. {metalist-0.24.2 → metalist-0.25.0}/app/api/routes/notes.py +90 -49
  7. {metalist-0.24.2 → metalist-0.25.0}/app/api/transactions.py +19 -9
  8. metalist-0.25.0/app/db/link_icons_sql.py +175 -0
  9. {metalist-0.24.2 → metalist-0.25.0}/app/db/migrations.py +53 -1
  10. {metalist-0.24.2 → metalist-0.25.0}/app/db/schema.py +46 -0
  11. {metalist-0.24.2 → metalist-0.25.0}/app/db/settings_sql.py +55 -16
  12. {metalist-0.24.2 → metalist-0.25.0}/app/db/version.py +1 -1
  13. {metalist-0.24.2 → metalist-0.25.0}/app/encryption_audit.py +63 -1
  14. {metalist-0.24.2 → metalist-0.25.0}/app/exception_boundaries.py +6 -0
  15. {metalist-0.24.2 → metalist-0.25.0}/app/main.py +6 -1
  16. {metalist-0.24.2 → metalist-0.25.0}/app/presentation/render/note_renderer.py +15 -4
  17. {metalist-0.24.2 → metalist-0.25.0}/app/security/rendered_html.py +1 -1
  18. {metalist-0.24.2 → metalist-0.25.0}/app/security/sensitive_cache.py +13 -0
  19. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/agent_loop.py +1 -2
  20. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/ai_send.py +2 -4
  21. metalist-0.25.0/app/services/agent/anthropic_inference.py +613 -0
  22. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/cloud_privacy.py +7 -3
  23. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/export_title_suggestions.py +4 -4
  24. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/failure_explanations.py +18 -7
  25. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/history.py +0 -1
  26. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/inference.py +28 -4
  27. metalist-0.25.0/app/services/agent/openai_compatible_inference.py +423 -0
  28. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/openai_inference.py +8 -25
  29. metalist-0.25.0/app/services/agent/openai_models.py +12 -0
  30. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/prompts/agent.md +6 -3
  31. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/release_notes.py +22 -3
  32. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/retrieval_settings.py +14 -17
  33. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/runtime.py +2 -14
  34. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/skills/help-ai.md +31 -13
  35. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/skills/help-data.md +10 -10
  36. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/skills/help-dictation.md +3 -3
  37. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/skills/help-formatting.md +10 -8
  38. metalist-0.25.0/app/services/agent/skills/help-menus.md +140 -0
  39. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/skills/help-mouse.md +7 -4
  40. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/skills/help-notes.md +18 -14
  41. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/skills/help-ontology.md +1 -1
  42. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/skills/help-privacy.md +7 -5
  43. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/skills/help-references.md +17 -14
  44. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/skills/help-releases.md +18 -31
  45. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/skills/help-reminders.md +10 -10
  46. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/skills/help-search.md +9 -6
  47. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/skills/help-tags.md +7 -5
  48. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/structured_inference.py +17 -1
  49. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/tagging_run.py +2 -2
  50. metalist-0.25.0/app/services/ai_catalog.py +110 -0
  51. {metalist-0.24.2 → metalist-0.25.0}/app/services/ai_chat.py +3 -2
  52. {metalist-0.24.2 → metalist-0.25.0}/app/services/ai_chat_rendering.py +8 -3
  53. metalist-0.25.0/app/services/ai_credentials.py +221 -0
  54. {metalist-0.24.2 → metalist-0.25.0}/app/services/ai_setup.py +33 -23
  55. {metalist-0.24.2 → metalist-0.25.0}/app/services/auth_service.py +11 -0
  56. {metalist-0.24.2 → metalist-0.25.0}/app/services/backlinks.py +13 -1
  57. {metalist-0.24.2 → metalist-0.25.0}/app/services/client_state_service.py +71 -14
  58. {metalist-0.24.2 → metalist-0.25.0}/app/services/content_cache.py +57 -8
  59. {metalist-0.24.2 → metalist-0.25.0}/app/services/content_formatting.py +192 -37
  60. {metalist-0.24.2 → metalist-0.25.0}/app/services/dictation_cleanup.py +5 -4
  61. {metalist-0.24.2 → metalist-0.25.0}/app/services/embedded_references.py +275 -137
  62. {metalist-0.24.2 → metalist-0.25.0}/app/services/file_registry.py +14 -10
  63. {metalist-0.24.2 → metalist-0.25.0}/app/services/html_export.py +39 -9
  64. metalist-0.25.0/app/services/link_icons.py +758 -0
  65. {metalist-0.24.2 → metalist-0.25.0}/app/services/link_titles.py +37 -1
  66. {metalist-0.24.2 → metalist-0.25.0}/app/services/markdown_rendering.py +49 -10
  67. {metalist-0.24.2 → metalist-0.25.0}/app/services/memory_breakdown.py +2 -0
  68. metalist-0.25.0/app/services/meta_tag_renames.py +62 -0
  69. {metalist-0.24.2 → metalist-0.25.0}/app/services/note_fullscreen.py +55 -6
  70. {metalist-0.24.2 → metalist-0.25.0}/app/services/note_store.py +24 -2
  71. metalist-0.25.0/app/services/reference_suggestions.py +509 -0
  72. {metalist-0.24.2 → metalist-0.25.0}/app/services/request_recovery.py +1 -1
  73. {metalist-0.24.2 → metalist-0.25.0}/app/services/reset_for_tests.py +1 -1
  74. {metalist-0.24.2 → metalist-0.25.0}/app/services/search_index.py +259 -7
  75. {metalist-0.24.2 → metalist-0.25.0}/app/services/search_query.py +22 -3
  76. {metalist-0.24.2 → metalist-0.25.0}/app/services/snapshot.py +22 -2
  77. metalist-0.25.0/app/services/subtree_stats.py +430 -0
  78. {metalist-0.24.2 → metalist-0.25.0}/app/services/tab_state.py +72 -6
  79. {metalist-0.24.2 → metalist-0.25.0}/app/services/tag_properties.py +47 -0
  80. {metalist-0.24.2 → metalist-0.25.0}/app/services/tag_suggestions.py +113 -4
  81. {metalist-0.24.2 → metalist-0.25.0}/app/startup_environment.py +13 -0
  82. {metalist-0.24.2 → metalist-0.25.0}/app/startup_sanity_config.py +6 -6
  83. {metalist-0.24.2 → metalist-0.25.0}/app/static/config/agent-menu-actions.json +98 -74
  84. {metalist-0.24.2 → metalist-0.25.0}/app/static/config/command_palette_tags.json +16 -0
  85. {metalist-0.24.2 → metalist-0.25.0}/app/static/css/main.css +1617 -746
  86. metalist-0.25.0/app/static/css/reference-preview.css +19 -0
  87. metalist-0.25.0/app/static/img/apple-touch-icon.png +0 -0
  88. metalist-0.25.0/app/static/img/favicon.ico +0 -0
  89. metalist-0.25.0/app/static/img/favicon.svg +9 -0
  90. metalist-0.25.0/app/static/img/icon-192.png +0 -0
  91. metalist-0.25.0/app/static/img/icon-512.png +0 -0
  92. metalist-0.25.0/app/static/img/icon-maskable-512.png +0 -0
  93. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/main.js +5 -0
  94. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/ai-chat/agent-menu-actions.js +7 -0
  95. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/ai-chat/agent-retrieval-settings.js +10 -16
  96. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/ai-chat/ai-chat-api.js +30 -20
  97. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/ai-chat/ai-chat-panel-controller.js +58 -50
  98. metalist-0.25.0/app/static/js/modules/ai-chat/ai-model-names.js +41 -0
  99. metalist-0.25.0/app/static/js/modules/ai-chat/ai-providers.js +20 -0
  100. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/ai-chat/ai-thinking-level-service.js +4 -3
  101. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/ai-chat/bulk-proposal-ui.js +21 -35
  102. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/ai-chat/confirmation-card.js +4 -3
  103. metalist-0.25.0/app/static/js/modules/ai-chat/proposal-menu.js +186 -0
  104. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/api-client.js +43 -28
  105. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/auth.js +81 -3
  106. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/command-palette/command-palette-controller.js +184 -45
  107. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/command-palette/endpoint-registry.js +164 -71
  108. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/config.js +5 -4
  109. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/context-menu/context-menu-registry.js +135 -105
  110. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/context-menu/context-menu-service.js +7 -0
  111. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/dom-utils.js +1 -1
  112. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/error-handler.js +45 -63
  113. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/excalidraw/excalidraw-editor-service.js +36 -14
  114. metalist-0.25.0/app/static/js/modules/excalidraw/excalidraw-status-shown.js +19 -0
  115. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/expected-errors.js +14 -0
  116. metalist-0.25.0/app/static/js/modules/floating-messages.js +279 -0
  117. metalist-0.25.0/app/static/js/modules/modals/action-row.js +100 -0
  118. metalist-0.25.0/app/static/js/modules/modals/ai-agent-settings-modal.js +510 -0
  119. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/alphabetize-root-notes-modal.js +10 -20
  120. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/backup-restore-modal.js +65 -61
  121. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/backup-settings-modal.js +56 -95
  122. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/base-modal.js +65 -0
  123. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/confirmation-modal.js +10 -8
  124. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/date-range-modal.js +10 -4
  125. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/delete-namespace-modal.js +53 -79
  126. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/delete-namespace-validation.js +5 -3
  127. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/dictation-settings-modal.js +26 -21
  128. metalist-0.25.0/app/static/js/modules/modals/error-dialog.js +207 -0
  129. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/export-options-modal.js +24 -14
  130. metalist-0.25.0/app/static/js/modules/modals/field-message.js +74 -0
  131. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/link-title-retry-modal.js +18 -4
  132. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/namespace-modals.js +219 -192
  133. metalist-0.25.0/app/static/js/modules/modals/namespace-rename-validation.js +51 -0
  134. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/note-layout-appearance-modal.js +12 -10
  135. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/ontology-modal.js +53 -58
  136. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/password-modal.js +81 -71
  137. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/prioritize-modal.js +49 -47
  138. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/random-password-modal.js +4 -21
  139. metalist-0.25.0/app/static/js/modules/modals/recent-messages-modal.js +58 -0
  140. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/reminder-modal.js +35 -19
  141. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/reset-updated-at-modal.js +10 -20
  142. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/search-suggestion-statistics-modal.js +55 -25
  143. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/session-timeout-modal.js +45 -35
  144. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/version-info-modal.js +6 -8
  145. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/actions/content-actions.js +1 -1
  146. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/actions/history-actions.js +1 -1
  147. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/actions/note-actions.js +3 -12
  148. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/actions/selection-actions.js +2 -2
  149. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/actions/ui-actions.js +17 -13
  150. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/events/context-menu-events.js +17 -70
  151. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/events/input-events.js +5 -0
  152. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/events/keyboard-events.js +15 -84
  153. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/events/mouse-events.js +8 -8
  154. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/mode-context.js +0 -15
  155. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/add-style-service.js +1 -1
  156. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/collapse-affordance-service.js +19 -6
  157. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/date-range-kinds.js +3 -3
  158. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/dictation-paste-service.js +1 -1
  159. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/differential-view-service.js +12 -12
  160. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/file-filter-kinds.js +3 -3
  161. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/file-reference-service.js +59 -17
  162. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/find-in-list-service.js +15 -2
  163. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/floating-note-service.js +2 -0
  164. metalist-0.25.0/app/static/js/modules/mode-manager/services/fold-arrow-alignment-service.js +192 -0
  165. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/image-file-insert-choice-modal-service.js +12 -6
  166. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/infinite-scroll-service.js +8 -1
  167. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/note-fullscreen-service.js +2 -0
  168. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/polling-service.js +1 -1
  169. metalist-0.25.0/app/static/js/modules/mode-manager/services/reference-hover-preview-service.js +132 -0
  170. metalist-0.24.2/app/static/js/modules/mode-manager/services/paste-reference-here-service.js → metalist-0.25.0/app/static/js/modules/mode-manager/services/reference-insert-point-service.js +6 -6
  171. metalist-0.25.0/app/static/js/modules/mode-manager/services/reference-preview-card-service.js +129 -0
  172. metalist-0.25.0/app/static/js/modules/mode-manager/services/reference-suggestions-service.js +523 -0
  173. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/root-date-separator-service.js +1 -1
  174. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/search-syntax-service.js +20 -1
  175. metalist-0.25.0/app/static/js/modules/mode-manager/services/tab-context-actions.js +20 -0
  176. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/tab-dom-cache-service.js +1 -1
  177. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/tag-syntax-service.js +11 -4
  178. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/viewport-hold-service.js +65 -15
  179. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/viewport-reference.js +18 -0
  180. metalist-0.25.0/app/static/js/modules/phone/phone-mode.js +584 -0
  181. metalist-0.25.0/app/static/js/modules/phone/phone-search-terms.js +65 -0
  182. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/reminder-surface-service.js +1 -1
  183. metalist-0.25.0/app/static/manifest.json +13 -0
  184. metalist-0.25.0/app/templates/_logo_mark.html +10 -0
  185. {metalist-0.24.2 → metalist-0.25.0}/app/templates/base.html +4 -1
  186. {metalist-0.24.2 → metalist-0.25.0}/app/templates/index.html +5 -2
  187. {metalist-0.24.2 → metalist-0.25.0}/app/templates/locked.html +4 -1
  188. {metalist-0.24.2 → metalist-0.25.0}/app/templates/namespace_deleted.html +4 -1
  189. {metalist-0.24.2 → metalist-0.25.0}/app/templates/namespace_renamed.html +4 -1
  190. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/search_context_tags.py +2 -1
  191. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/update_content.py +3 -7
  192. {metalist-0.24.2 → metalist-0.25.0}/app/version.py +1 -1
  193. {metalist-0.24.2 → metalist-0.25.0/metalist.egg-info}/PKG-INFO +19 -1
  194. {metalist-0.24.2 → metalist-0.25.0}/metalist.egg-info/SOURCES.txt +32 -9
  195. {metalist-0.24.2 → metalist-0.25.0}/metalist.egg-info/requires.txt +1 -0
  196. {metalist-0.24.2 → metalist-0.25.0}/pyproject.toml +10 -0
  197. metalist-0.24.2/app/services/agent/openai_models.py +0 -25
  198. metalist-0.24.2/app/services/agent/skills/help-menus.md +0 -136
  199. metalist-0.24.2/app/services/openai_credentials.py +0 -191
  200. metalist-0.24.2/app/static/img/favicon.ico +0 -0
  201. metalist-0.24.2/app/static/img/metalist-logo-black-1024.png +0 -0
  202. metalist-0.24.2/app/static/img/metalist-logo-black-512.png +0 -0
  203. metalist-0.24.2/app/static/img/metalist-logo-black.svg +0 -9
  204. metalist-0.24.2/app/static/img/metalist-logo-white-1024.png +0 -0
  205. metalist-0.24.2/app/static/img/metalist-logo-white-512.png +0 -0
  206. metalist-0.24.2/app/static/img/metalist-logo-white.svg +0 -9
  207. metalist-0.24.2/app/static/js/modules/ai-chat/proposal-menu.js +0 -86
  208. metalist-0.24.2/app/static/js/modules/modals/ai-agent-settings-modal.js +0 -596
  209. metalist-0.24.2/app/static/js/modules/modals/namespace-rename-validation.js +0 -32
  210. metalist-0.24.2/app/templates/_logo_mark.html +0 -6
  211. metalist-0.24.2/app/usecases/paste_reference.py +0 -78
  212. {metalist-0.24.2 → metalist-0.25.0}/MANIFEST.in +0 -0
  213. {metalist-0.24.2 → metalist-0.25.0}/app/__init__.py +0 -0
  214. {metalist-0.24.2 → metalist-0.25.0}/app/api/__init__.py +0 -0
  215. {metalist-0.24.2 → metalist-0.25.0}/app/api/deps.py +0 -0
  216. {metalist-0.24.2 → metalist-0.25.0}/app/api/dev.py +0 -0
  217. {metalist-0.24.2 → metalist-0.25.0}/app/api/middleware/auth.py +0 -0
  218. {metalist-0.24.2 → metalist-0.25.0}/app/api/request_auth.py +0 -0
  219. {metalist-0.24.2 → metalist-0.25.0}/app/api/routes/app_updates.py +0 -0
  220. {metalist-0.24.2 → metalist-0.25.0}/app/api/routes/backups.py +0 -0
  221. {metalist-0.24.2 → metalist-0.25.0}/app/api/routes/files.py +0 -0
  222. {metalist-0.24.2 → metalist-0.25.0}/app/api/routes/ontology.py +0 -0
  223. {metalist-0.24.2 → metalist-0.25.0}/app/api/routes/reminders.py +0 -0
  224. {metalist-0.24.2 → metalist-0.25.0}/app/api/routes/remote_images.py +0 -0
  225. {metalist-0.24.2 → metalist-0.25.0}/app/api/routes/test.py +0 -0
  226. {metalist-0.24.2 → metalist-0.25.0}/app/api/upload_limits.py +0 -0
  227. {metalist-0.24.2 → metalist-0.25.0}/app/config.py +0 -0
  228. {metalist-0.24.2 → metalist-0.25.0}/app/contracts.py +0 -0
  229. {metalist-0.24.2 → metalist-0.25.0}/app/data_directory.py +0 -0
  230. {metalist-0.24.2 → metalist-0.25.0}/app/db/__init__.py +0 -0
  231. {metalist-0.24.2 → metalist-0.25.0}/app/db/backup_settings_sql.py +0 -0
  232. {metalist-0.24.2 → metalist-0.25.0}/app/db/content_migrations_sql.py +0 -0
  233. {metalist-0.24.2 → metalist-0.25.0}/app/db/editable_files_migration.py +0 -0
  234. {metalist-0.24.2 → metalist-0.25.0}/app/db/engine.py +0 -0
  235. {metalist-0.24.2 → metalist-0.25.0}/app/db/file_schema.py +0 -0
  236. {metalist-0.24.2 → metalist-0.25.0}/app/db/file_session.py +0 -0
  237. {metalist-0.24.2 → metalist-0.25.0}/app/db/files_sql.py +0 -0
  238. {metalist-0.24.2 → metalist-0.25.0}/app/db/link_titles_sql.py +0 -0
  239. {metalist-0.24.2 → metalist-0.25.0}/app/db/live_recovery.py +0 -0
  240. {metalist-0.24.2 → metalist-0.25.0}/app/db/notes_sql.py +0 -0
  241. {metalist-0.24.2 → metalist-0.25.0}/app/db/ontology_rules_sql.py +0 -0
  242. {metalist-0.24.2 → metalist-0.25.0}/app/db/raw_connection.py +0 -0
  243. {metalist-0.24.2 → metalist-0.25.0}/app/db/reminders_sql.py +0 -0
  244. {metalist-0.24.2 → metalist-0.25.0}/app/db/retire_sounds.py +0 -0
  245. {metalist-0.24.2 → metalist-0.25.0}/app/db/search_history_sql.py +0 -0
  246. {metalist-0.24.2 → metalist-0.25.0}/app/db/session.py +0 -0
  247. {metalist-0.24.2 → metalist-0.25.0}/app/db/tab_state_sql.py +0 -0
  248. {metalist-0.24.2 → metalist-0.25.0}/app/https_proxy.py +0 -0
  249. {metalist-0.24.2 → metalist-0.25.0}/app/launch_clock.py +0 -0
  250. {metalist-0.24.2 → metalist-0.25.0}/app/models/database.py +0 -0
  251. {metalist-0.24.2 → metalist-0.25.0}/app/models/utils.py +0 -0
  252. {metalist-0.24.2 → metalist-0.25.0}/app/network_settings.py +0 -0
  253. {metalist-0.24.2 → metalist-0.25.0}/app/presentation/__init__.py +0 -0
  254. {metalist-0.24.2 → metalist-0.25.0}/app/presentation/login_page.py +0 -0
  255. {metalist-0.24.2 → metalist-0.25.0}/app/presentation/render/__init__.py +0 -0
  256. {metalist-0.24.2 → metalist-0.25.0}/app/presentation/templates.py +0 -0
  257. {metalist-0.24.2 → metalist-0.25.0}/app/process_memory.py +0 -0
  258. {metalist-0.24.2 → metalist-0.25.0}/app/security/authenticated_logging.py +0 -0
  259. {metalist-0.24.2 → metalist-0.25.0}/app/security/crypto_sizes.py +0 -0
  260. {metalist-0.24.2 → metalist-0.25.0}/app/security/encryption.py +0 -0
  261. {metalist-0.24.2 → metalist-0.25.0}/app/security/http_error_diagnostics.py +0 -0
  262. {metalist-0.24.2 → metalist-0.25.0}/app/security/http_headers.py +0 -0
  263. {metalist-0.24.2 → metalist-0.25.0}/app/security/note_html.py +0 -0
  264. {metalist-0.24.2 → metalist-0.25.0}/app/security/request_boundary.py +0 -0
  265. {metalist-0.24.2 → metalist-0.25.0}/app/security/request_hosts.py +0 -0
  266. {metalist-0.24.2 → metalist-0.25.0}/app/security/sensitive_logging.py +0 -0
  267. {metalist-0.24.2 → metalist-0.25.0}/app/security/shell_execution.py +0 -0
  268. {metalist-0.24.2 → metalist-0.25.0}/app/security/validation_errors.py +0 -0
  269. {metalist-0.24.2 → metalist-0.25.0}/app/server_runtime.py +0 -0
  270. {metalist-0.24.2 → metalist-0.25.0}/app/services/__init__.py +0 -0
  271. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/__init__.py +0 -0
  272. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/action_log.py +0 -0
  273. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/agent_tools.py +0 -0
  274. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/citation_tokens.py +0 -0
  275. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/context.py +0 -0
  276. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/evidence_serialization.py +0 -0
  277. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/execution_errors.py +0 -0
  278. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/help_catalog.py +0 -0
  279. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/investigation.py +0 -0
  280. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/judging.py +0 -0
  281. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/menu_actions.py +0 -0
  282. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/model_policy.py +0 -0
  283. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/note_aliases.py +0 -0
  284. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/note_tag_suggestions.py +0 -0
  285. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/openai_cost_tracking.py +0 -0
  286. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/privacy_guard.py +0 -0
  287. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/prompt_settings.py +0 -0
  288. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/prompts/__init__.py +0 -0
  289. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/prompts/final-response.md +0 -0
  290. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/prompts/system.md +0 -0
  291. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/scope.py +0 -0
  292. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/skill_settings.py +0 -0
  293. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/skills/__init__.py +0 -0
  294. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/skills/staged-summary.md +0 -0
  295. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/skills/tag-proposals.md +0 -0
  296. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/skills/web-browsing.md +0 -0
  297. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/staged_summary.py +0 -0
  298. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/strict_structured_outputs.py +0 -0
  299. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/summary_batch_store.py +0 -0
  300. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/tagging.py +0 -0
  301. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/token_estimation.py +0 -0
  302. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/tool_calling.py +0 -0
  303. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/trace.py +0 -0
  304. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/web_actions.py +0 -0
  305. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/web_capabilities.py +0 -0
  306. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/web_evidence.py +0 -0
  307. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/web_fetch.py +0 -0
  308. {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/web_settings.py +0 -0
  309. {metalist-0.24.2 → metalist-0.25.0}/app/services/ai_chat_stream.py +0 -0
  310. {metalist-0.24.2 → metalist-0.25.0}/app/services/app_update_worker.py +0 -0
  311. {metalist-0.24.2 → metalist-0.25.0}/app/services/app_updates.py +0 -0
  312. {metalist-0.24.2 → metalist-0.25.0}/app/services/auth.py +0 -0
  313. {metalist-0.24.2 → metalist-0.25.0}/app/services/auth_cache_state.py +0 -0
  314. {metalist-0.24.2 → metalist-0.25.0}/app/services/backlink_index.py +0 -0
  315. {metalist-0.24.2 → metalist-0.25.0}/app/services/backup_service.py +0 -0
  316. {metalist-0.24.2 → metalist-0.25.0}/app/services/backup_settings_service.py +0 -0
  317. {metalist-0.24.2 → metalist-0.25.0}/app/services/bulk_operation.py +0 -0
  318. {metalist-0.24.2 → metalist-0.25.0}/app/services/chess_rendering.py +0 -0
  319. {metalist-0.24.2 → metalist-0.25.0}/app/services/code_rendering.py +0 -0
  320. {metalist-0.24.2 → metalist-0.25.0}/app/services/diagnostics.py +0 -0
  321. {metalist-0.24.2 → metalist-0.25.0}/app/services/diff_rendering.py +0 -0
  322. {metalist-0.24.2 → metalist-0.25.0}/app/services/editing_image_sizes.py +0 -0
  323. {metalist-0.24.2 → metalist-0.25.0}/app/services/encryption.py +0 -0
  324. {metalist-0.24.2 → metalist-0.25.0}/app/services/exception_capture.py +0 -0
  325. {metalist-0.24.2 → metalist-0.25.0}/app/services/file_edit_sessions.py +0 -0
  326. {metalist-0.24.2 → metalist-0.25.0}/app/services/file_kinds.py +0 -0
  327. {metalist-0.24.2 → metalist-0.25.0}/app/services/file_storage.py +0 -0
  328. {metalist-0.24.2 → metalist-0.25.0}/app/services/file_text_preview.py +0 -0
  329. {metalist-0.24.2 → metalist-0.25.0}/app/services/find_text.py +0 -0
  330. {metalist-0.24.2 → metalist-0.25.0}/app/services/footnote_layout.py +0 -0
  331. {metalist-0.24.2 → metalist-0.25.0}/app/services/footnote_rendering.py +0 -0
  332. {metalist-0.24.2 → metalist-0.25.0}/app/services/hierarchy.py +0 -0
  333. {metalist-0.24.2 → metalist-0.25.0}/app/services/html_unformatting.py +0 -0
  334. {metalist-0.24.2 → metalist-0.25.0}/app/services/hydration_state.py +0 -0
  335. {metalist-0.24.2 → metalist-0.25.0}/app/services/image_size_formatting.py +0 -0
  336. {metalist-0.24.2 → metalist-0.25.0}/app/services/inline_image_dimensions.py +0 -0
  337. {metalist-0.24.2 → metalist-0.25.0}/app/services/inline_image_occurrences.py +0 -0
  338. {metalist-0.24.2 → metalist-0.25.0}/app/services/input_errors.py +0 -0
  339. {metalist-0.24.2 → metalist-0.25.0}/app/services/integrity.py +0 -0
  340. {metalist-0.24.2 → metalist-0.25.0}/app/services/latex_rendering.py +0 -0
  341. {metalist-0.24.2 → metalist-0.25.0}/app/services/link_title_retry.py +0 -0
  342. {metalist-0.24.2 → metalist-0.25.0}/app/services/login_rate_limit.py +0 -0
  343. {metalist-0.24.2 → metalist-0.25.0}/app/services/maintenance_mode.py +0 -0
  344. {metalist-0.24.2 → metalist-0.25.0}/app/services/memory_usage.py +0 -0
  345. {metalist-0.24.2 → metalist-0.25.0}/app/services/mermaid_note_rendering.py +0 -0
  346. {metalist-0.24.2 → metalist-0.25.0}/app/services/namespace_deletion_jobs.py +0 -0
  347. {metalist-0.24.2 → metalist-0.25.0}/app/services/namespace_deletion_worker.py +0 -0
  348. {metalist-0.24.2 → metalist-0.25.0}/app/services/namespace_rename_jobs.py +0 -0
  349. {metalist-0.24.2 → metalist-0.25.0}/app/services/namespace_rename_worker.py +0 -0
  350. {metalist-0.24.2 → metalist-0.25.0}/app/services/namespace_runtime_guard.py +0 -0
  351. {metalist-0.24.2 → metalist-0.25.0}/app/services/namespace_switcher.py +0 -0
  352. {metalist-0.24.2 → metalist-0.25.0}/app/services/note_image_tags.py +0 -0
  353. {metalist-0.24.2 → metalist-0.25.0}/app/services/note_ordering.py +0 -0
  354. {metalist-0.24.2 → metalist-0.25.0}/app/services/ontology_rules_store.py +0 -0
  355. {metalist-0.24.2 → metalist-0.25.0}/app/services/password_note_fields.py +0 -0
  356. {metalist-0.24.2 → metalist-0.25.0}/app/services/preference_values.py +0 -0
  357. {metalist-0.24.2 → metalist-0.25.0}/app/services/public_http.py +0 -0
  358. {metalist-0.24.2 → metalist-0.25.0}/app/services/reference_presentation.py +0 -0
  359. {metalist-0.24.2 → metalist-0.25.0}/app/services/reminders.py +0 -0
  360. {metalist-0.24.2 → metalist-0.25.0}/app/services/remote_image_proxy.py +0 -0
  361. {metalist-0.24.2 → metalist-0.25.0}/app/services/resource_limits.py +0 -0
  362. {metalist-0.24.2 → metalist-0.25.0}/app/services/root_date_filter.py +0 -0
  363. {metalist-0.24.2 → metalist-0.25.0}/app/services/root_sorting.py +0 -0
  364. {metalist-0.24.2 → metalist-0.25.0}/app/services/runtime_generation.py +0 -0
  365. {metalist-0.24.2 → metalist-0.25.0}/app/services/runtime_hardening.py +0 -0
  366. {metalist-0.24.2 → metalist-0.25.0}/app/services/runtime_lock.py +0 -0
  367. {metalist-0.24.2 → metalist-0.25.0}/app/services/search_history.py +0 -0
  368. {metalist-0.24.2 → metalist-0.25.0}/app/services/search_history_storage.py +0 -0
  369. {metalist-0.24.2 → metalist-0.25.0}/app/services/search_text.py +0 -0
  370. {metalist-0.24.2 → metalist-0.25.0}/app/services/selected_text_tag.py +0 -0
  371. {metalist-0.24.2 → metalist-0.25.0}/app/services/self_update.py +0 -0
  372. {metalist-0.24.2 → metalist-0.25.0}/app/services/session_timeout_service.py +0 -0
  373. {metalist-0.24.2 → metalist-0.25.0}/app/services/shared_sets.py +0 -0
  374. {metalist-0.24.2 → metalist-0.25.0}/app/services/shell_session_service.py +0 -0
  375. {metalist-0.24.2 → metalist-0.25.0}/app/services/store.py +0 -0
  376. {metalist-0.24.2 → metalist-0.25.0}/app/services/structured_note_renderers.py +0 -0
  377. {metalist-0.24.2 → metalist-0.25.0}/app/services/sync.py +0 -0
  378. {metalist-0.24.2 → metalist-0.25.0}/app/services/tag_case.py +0 -0
  379. {metalist-0.24.2 → metalist-0.25.0}/app/services/tag_details.py +0 -0
  380. {metalist-0.24.2 → metalist-0.25.0}/app/services/tag_ontology.py +0 -0
  381. {metalist-0.24.2 → metalist-0.25.0}/app/services/tag_plural_variants.py +0 -0
  382. {metalist-0.24.2 → metalist-0.25.0}/app/services/tag_rename.py +0 -0
  383. {metalist-0.24.2 → metalist-0.25.0}/app/services/tag_suggestion_reasons.py +0 -0
  384. {metalist-0.24.2 → metalist-0.25.0}/app/services/tag_term_matching.py +0 -0
  385. {metalist-0.24.2 → metalist-0.25.0}/app/services/tokens.py +0 -0
  386. {metalist-0.24.2 → metalist-0.25.0}/app/services/undo_state.py +0 -0
  387. {metalist-0.24.2 → metalist-0.25.0}/app/services/update_backups.py +0 -0
  388. {metalist-0.24.2 → metalist-0.25.0}/app/services/update_installer.py +0 -0
  389. {metalist-0.24.2 → metalist-0.25.0}/app/services/update_preflight.py +0 -0
  390. {metalist-0.24.2 → metalist-0.25.0}/app/services/view_cache.py +0 -0
  391. {metalist-0.24.2 → metalist-0.25.0}/app/services/view_diff.py +0 -0
  392. {metalist-0.24.2 → metalist-0.25.0}/app/services/view_state.py +0 -0
  393. {metalist-0.24.2 → metalist-0.25.0}/app/services/windows_process_control.py +0 -0
  394. {metalist-0.24.2 → metalist-0.25.0}/app/startup_console.py +0 -0
  395. {metalist-0.24.2 → metalist-0.25.0}/app/startup_js_sanity.py +0 -0
  396. {metalist-0.24.2 → metalist-0.25.0}/app/startup_sanity.py +0 -0
  397. {metalist-0.24.2 → metalist-0.25.0}/app/startup_shockharness.py +0 -0
  398. {metalist-0.24.2 → metalist-0.25.0}/app/static/css/floating-notes.css +0 -0
  399. {metalist-0.24.2 → metalist-0.25.0}/app/static/css/forms.css +0 -0
  400. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/locked.js +0 -0
  401. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/activity-tracker.js +0 -0
  402. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/ai-chat/agent-web-settings.js +0 -0
  403. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/ai-chat/ai-agent-debug-view.js +0 -0
  404. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/ai-chat/ai-chat-message-placement.js +0 -0
  405. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/ai-chat/ai-chat-panel-service.js +0 -0
  406. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/ai-chat/ai-chat-refused-turns.js +0 -0
  407. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/ai-chat/ai-chat-size-limits.js +0 -0
  408. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/ai-chat/bulk-elapsed-clock.js +0 -0
  409. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/ai-chat/bulk-scope-question.js +0 -0
  410. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/ai-chat/cloud-privacy-policy.js +0 -0
  411. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/ai-chat/confirmation-question.js +0 -0
  412. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/ai-chat/summary-batch-preview.js +0 -0
  413. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/api-error-diagnostics.js +0 -0
  414. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/api-failure-classification-service.js +0 -0
  415. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/app-notice-stack.js +0 -0
  416. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/app-update-service.js +0 -0
  417. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/application-state.js +0 -0
  418. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/async-result.js +0 -0
  419. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/backup-reminder-schedule.js +0 -0
  420. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/backup-reminder-service.js +0 -0
  421. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/byte-sizes.js +0 -0
  422. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/client-state-api.js +0 -0
  423. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/client-state-migration.js +0 -0
  424. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/command-palette/activation-auth-policy.js +0 -0
  425. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/command-palette/backup-command-availability.js +0 -0
  426. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/command-palette/click-activation-service.js +0 -0
  427. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/command-palette/note-layout-preferences.js +0 -0
  428. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/command-palette/preferences-store.js +0 -0
  429. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/command-palette/tag-config-loader.js +0 -0
  430. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/command-palette/usage-store.js +0 -0
  431. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/context-menu/context-menu-target-service.js +0 -0
  432. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/context-menu/input-caret-service.js +0 -0
  433. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/decimal-integer.js +0 -0
  434. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/disconnect-editing-state-service.js +0 -0
  435. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/dom-focus.js +0 -0
  436. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/editor-commands.js +0 -0
  437. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/editor-selection.js +0 -0
  438. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/editor-toolbar.js +0 -0
  439. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/elapsed-time.js +0 -0
  440. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/error-overlay.js +0 -0
  441. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/excalidraw/excalidraw-actions.js +0 -0
  442. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/excalidraw/excalidraw-autosave.js +0 -0
  443. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/excalidraw/excalidraw-editor-state.js +0 -0
  444. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/excalidraw/excalidraw-loader.js +0 -0
  445. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/excalidraw/excalidraw-preview-service.js +0 -0
  446. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/excalidraw/excalidraw-scene.js +0 -0
  447. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/half.js +0 -0
  448. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/html-escape.js +0 -0
  449. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/http-status.js +0 -0
  450. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/list-selection.js +0 -0
  451. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/local-date-text.js +0 -0
  452. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/location-flags.js +0 -0
  453. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/login-namespace-picker.js +0 -0
  454. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/maintenance.js +0 -0
  455. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/backup-result-modal.js +0 -0
  456. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/help-modal.js +0 -0
  457. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/memory-usage-modal.js +0 -0
  458. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/namespace-loading-page.js +0 -0
  459. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/namespace-ports-profile.js +0 -0
  460. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/visual-cues-modal.js +0 -0
  461. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/actions/search-actions.js +0 -0
  462. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/events/focus-events.js +0 -0
  463. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/events/inactivity-events.js +0 -0
  464. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/events/search-events.js +0 -0
  465. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/mode-logger.js +0 -0
  466. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/mode-manager-controller.js +0 -0
  467. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/animated-scroll-service.js +0 -0
  468. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/backlinks-navigation-service.js +0 -0
  469. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/clipboard-shortcut-policy-service.js +0 -0
  470. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/collapse-editing-policy-service.js +0 -0
  471. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/command-gate-service.js +0 -0
  472. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/context-menu-target-service.js +0 -0
  473. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/date-range-filter-service.js +0 -0
  474. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/deselect-selection-state-service.js +0 -0
  475. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/dictation-note-paste.js +0 -0
  476. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/dictation-paste-padding.js +0 -0
  477. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/dropped-file-preview-service.js +0 -0
  478. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/edit-session-collapse-policy-service.js +0 -0
  479. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/edit-session-collapse-service.js +0 -0
  480. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/editing-image-size-service.js +0 -0
  481. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/embedded-image-service.js +0 -0
  482. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/export-service.js +0 -0
  483. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/export-title-service.js +0 -0
  484. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/file-drop-policy-service.js +0 -0
  485. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/file-filter-service.js +0 -0
  486. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/file-image-preview-service.js +0 -0
  487. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/filtered-refresh-selection-service.js +0 -0
  488. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/floating-note-dom.js +0 -0
  489. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/floating-note-layout.js +0 -0
  490. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/footnote-navigation-service.js +0 -0
  491. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/formatted-paste-format-service.js +0 -0
  492. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/history-selection-policy-service.js +0 -0
  493. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/history-shortcut-policy-service.js +0 -0
  494. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/html-paste-sanitizer-service.js +0 -0
  495. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/image-context-menu-action-service.js +0 -0
  496. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/link-context-menu-action-service.js +0 -0
  497. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/link-target-service.js +0 -0
  498. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/link-title-prefetch-service.js +0 -0
  499. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/mermaid-render-service.js +0 -0
  500. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/note-click-target-service.js +0 -0
  501. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/note-clipboard-write-service.js +0 -0
  502. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/note-collapse-animation-service.js +0 -0
  503. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/note-context-menu-action-service.js +0 -0
  504. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/note-delete-shortcut-policy-service.js +0 -0
  505. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/note-drag-indicator-service.js +0 -0
  506. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/note-drag-service.js +0 -0
  507. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/note-reposition-animation-service.js +0 -0
  508. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/note-split-service.js +0 -0
  509. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/note-timestamp-hover-service.js +0 -0
  510. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/password-clipboard-service.js +0 -0
  511. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/paste-format-detection-service.js +0 -0
  512. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/paste-format-guess-service.js +0 -0
  513. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/paste-format-offer-service.js +0 -0
  514. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/print-service.js +0 -0
  515. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/reference-source-navigation-service.js +0 -0
  516. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/reference-view-transition-service.js +0 -0
  517. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/referenced-note-removal-service.js +0 -0
  518. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/remote-image-proxy-service.js +0 -0
  519. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/remove-formatting-service.js +0 -0
  520. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/right-press-focus-service.js +0 -0
  521. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/root-note-creation-service.js +0 -0
  522. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/root-sort-indicator-service.js +0 -0
  523. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/root-sort-service.js +0 -0
  524. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/scroll-anchor-service.js +0 -0
  525. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/scroll-restoration-service.js +0 -0
  526. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/scroll-to-top-service.js +0 -0
  527. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/search-contexts-overlay-service.js +0 -0
  528. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/search-debounce-service.js +0 -0
  529. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/search-highlight-matching.js +0 -0
  530. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/search-highlight-service.js +0 -0
  531. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/search-input-chip-service.js +0 -0
  532. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/search-input-service.js +0 -0
  533. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/search-interaction-service.js +0 -0
  534. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/search-redaction-reveal-service.js +0 -0
  535. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/search-suggestion-statistics-service.js +0 -0
  536. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/search-suggestion-window-labels-service.js +0 -0
  537. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/search-suggestion-windows-service.js +0 -0
  538. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/search-suggestions-service.js +0 -0
  539. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/selected-formatting-removal-service.js +0 -0
  540. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/selected-text-tag-service.js +0 -0
  541. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/shell-output-service.js +0 -0
  542. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/tab-drag-service.js +0 -0
  543. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/tab-duplication-service.js +0 -0
  544. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/tab-state-service.js +0 -0
  545. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/tag-bar-service.js +0 -0
  546. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/tag-input-selection-service.js +0 -0
  547. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/tag-proposal-service.js +0 -0
  548. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/tag-suggestions-service.js +0 -0
  549. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/todo-toggle-editing-service.js +0 -0
  550. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/untagged-view-indicator-service.js +0 -0
  551. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/view-mode-search-shortcut-service.js +0 -0
  552. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/not-found.js +0 -0
  553. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/note-html-sanitizer.js +0 -0
  554. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/password-generator.js +0 -0
  555. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/password-operation-response.js +0 -0
  556. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/password-policy.js +0 -0
  557. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/password-strength.js +0 -0
  558. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/reminder-store.js +0 -0
  559. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/server-rendered-html.js +0 -0
  560. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/session-auth.js +0 -0
  561. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/startup-timing.js +0 -0
  562. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/tag-token.js +0 -0
  563. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/tcp-ports.js +0 -0
  564. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/time-units.js +0 -0
  565. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/url-tracking-cleaner.js +0 -0
  566. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/uuid.js +0 -0
  567. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/namespace-deleted.js +0 -0
  568. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/namespace-renamed.js +0 -0
  569. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/shockharness/contracts.d.ts +0 -0
  570. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/shockharness/contracts.js +0 -0
  571. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/dompurify-3.4.17.LICENSE.txt +0 -0
  572. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/dompurify-3.4.17.min.js +0 -0
  573. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/excalidraw.css +0 -0
  574. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Assistant/Assistant-Bold.woff2 +0 -0
  575. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Assistant/Assistant-Medium.woff2 +0 -0
  576. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Assistant/Assistant-Regular.woff2 +0 -0
  577. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Assistant/Assistant-SemiBold.woff2 +0 -0
  578. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Cascadia/CascadiaCode-Regular.woff2 +0 -0
  579. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/ComicShanns/ComicShanns-Regular-279a7b317d12eb88de06167bd672b4b4.woff2 +0 -0
  580. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/ComicShanns/ComicShanns-Regular-6e066e8de2ac57ea9283adb9c24d7f0c.woff2 +0 -0
  581. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/ComicShanns/ComicShanns-Regular-dc6a8806fa96795d7b3be5026f989a17.woff2 +0 -0
  582. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/ComicShanns/ComicShanns-Regular-fcb0fc02dcbee4c9846b3e2508668039.woff2 +0 -0
  583. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-349fac6ca4700ffec595a7150a0d1e1d.woff2 +0 -0
  584. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-3f2c5db56cc93c5a6873b1361d730c16.woff2 +0 -0
  585. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-41b173a47b57366892116a575a43e2b6.woff2 +0 -0
  586. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-623ccf21b21ef6b3a0d87738f77eb071.woff2 +0 -0
  587. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2 +0 -0
  588. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-b9dcf9d2e50a1eaf42fc664b50a3fd0d.woff2 +0 -0
  589. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-be310b9bcd4f1a43f571c46df7809174.woff2 +0 -0
  590. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYE98RXi4EwSsbg.woff2 +0 -0
  591. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYEF8RXi4EwQ.woff2 +0 -0
  592. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTA3j6zbXWjgevT5.woff2 +0 -0
  593. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTQ3j6zbXWjgeg.woff2 +0 -0
  594. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTk3j6zbXWjgevT5.woff2 +0 -0
  595. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTo3j6zbXWjgevT5.woff2 +0 -0
  596. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTs3j6zbXWjgevT5.woff2 +0 -0
  597. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Virgil/Virgil-Regular.woff2 +0 -0
  598. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1.LICENSE.txt +0 -0
  599. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1.min.js +0 -0
  600. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/mermaid-11.16.1.LICENSE.txt +0 -0
  601. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/mermaid-11.16.1.min.js +0 -0
  602. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/zxcvbn-4.4.2.LICENSE.txt +0 -0
  603. {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/zxcvbn-4.4.2.js +0 -0
  604. {metalist-0.24.2 → metalist-0.25.0}/app/static/note-html-policy.json +0 -0
  605. {metalist-0.24.2 → metalist-0.25.0}/app/templates/maintenance.html +0 -0
  606. {metalist-0.24.2 → metalist-0.25.0}/app/templates/notes_list.html +0 -0
  607. {metalist-0.24.2 → metalist-0.25.0}/app/upload_limits.py +0 -0
  608. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/__init__.py +0 -0
  609. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/add_selected_text_tag.py +0 -0
  610. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/alphabetize_root_notes.py +0 -0
  611. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/base.py +0 -0
  612. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/bulk_tag_proposals.py +0 -0
  613. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/collapse.py +0 -0
  614. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/copy_note.py +0 -0
  615. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/create_child.py +0 -0
  616. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/create_file_preview_child.py +0 -0
  617. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/create_note.py +0 -0
  618. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/create_sibling.py +0 -0
  619. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/delete_subtree.py +0 -0
  620. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/delete_tag.py +0 -0
  621. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/expand.py +0 -0
  622. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/file_edit_session.py +0 -0
  623. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/indent.py +0 -0
  624. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/move.py +0 -0
  625. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/move_to_top.py +0 -0
  626. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/outdent.py +0 -0
  627. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/paste_child.py +0 -0
  628. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/paste_sibling.py +0 -0
  629. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/prefetch_link_titles.py +0 -0
  630. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/prioritize.py +0 -0
  631. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/redo.py +0 -0
  632. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/rename_tag.py +0 -0
  633. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/reset_updated_at.py +0 -0
  634. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/resize_image.py +0 -0
  635. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/run_shell.py +0 -0
  636. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/search_comment_autofill.py +0 -0
  637. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/set_collapse_bulk.py +0 -0
  638. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/set_collapse_in_context.py +0 -0
  639. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/split_note.py +0 -0
  640. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/tag_proposals.py +0 -0
  641. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/toggle_todo_done.py +0 -0
  642. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/undo.py +0 -0
  643. {metalist-0.24.2 → metalist-0.25.0}/app/usecases/unformat_content.py +0 -0
  644. {metalist-0.24.2 → metalist-0.25.0}/app/utils/__init__.py +0 -0
  645. {metalist-0.24.2 → metalist-0.25.0}/app/utils/byte_sizes.py +0 -0
  646. {metalist-0.24.2 → metalist-0.25.0}/app/utils/encryption.py +0 -0
  647. {metalist-0.24.2 → metalist-0.25.0}/app/utils/not_found.py +0 -0
  648. {metalist-0.24.2 → metalist-0.25.0}/app/utils/sent_fields.py +0 -0
  649. {metalist-0.24.2 → metalist-0.25.0}/app/utils/tcp_ports.py +0 -0
  650. {metalist-0.24.2 → metalist-0.25.0}/app/utils/text_utils.py +0 -0
  651. {metalist-0.24.2 → metalist-0.25.0}/app/utils/time_units.py +0 -0
  652. {metalist-0.24.2 → metalist-0.25.0}/convert-from-legacy.py +0 -0
  653. {metalist-0.24.2 → metalist-0.25.0}/main.py +0 -0
  654. {metalist-0.24.2 → metalist-0.25.0}/metalist.egg-info/dependency_links.txt +0 -0
  655. {metalist-0.24.2 → metalist-0.25.0}/metalist.egg-info/entry_points.txt +0 -0
  656. {metalist-0.24.2 → metalist-0.25.0}/metalist.egg-info/top_level.txt +0 -0
  657. {metalist-0.24.2 → metalist-0.25.0}/scripts/generate-lan-cert.sh +0 -0
  658. {metalist-0.24.2 → metalist-0.25.0}/setup.cfg +0 -0
@@ -1,12 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: metalist
3
- Version: 0.24.2
3
+ Version: 0.25.0
4
4
  Summary: A minimalist single-user note-taking app with SSR, fast in-memory tree operations, and efficient sync.
5
5
  Project-URL: Homepage, https://metalist.app
6
6
  Project-URL: Repository, https://github.com/metalist-app/metalist
7
7
  Project-URL: Issues, https://github.com/metalist-app/metalist/issues
8
8
  Requires-Python: <3.15,>=3.11
9
9
  Description-Content-Type: text/markdown
10
+ Requires-Dist: anthropic==1.12.1
10
11
  Requires-Dist: argon2-cffi==25.1.0
11
12
  Requires-Dist: cryptography==50.0.0
12
13
  Requires-Dist: fastapi==0.141.1
@@ -53,6 +54,23 @@ A minimalist single-user note-taking app focused on server-side rendering (SSR),
53
54
  - Multi-tab search contexts with server-persisted scroll/search state (survives browser restarts)
54
55
  - Manual namespace backups/restores to a user-selected backup folder with retention controls
55
56
 
57
+ ## Changes in 0.25.0
58
+
59
+ - **Claude and Gemini beside OpenAI.** AI Agent Settings has a key for each provider, on your own account; you pick the model in the chat, and a conversation carries on when you switch provider.
60
+ - **Stats of a note's subtree.** `@stats` shows, under a note's own text, the Total, Min, Max and Count of each number property in it and the notes under it; `@sum=calories` (and `@avg`, `@min`, `@max`, `@count`) shows one figure, and a plain `@sum` covers every property. With nothing logged yet, a sum or count reads 0. **Stats Style** in the command palette: Strip, Tiles or Ledger. Search the figures with `@sum:calories>2000`: the days over 2000, each with the notes under it.
61
+ - **Four built-in tags renamed:** `@highlighter` is now `@highlight`, `@llm` `@ai`, `@list-bulleted` `@bullets` and `@list-numbered` `@numbered`. Each vault converts its notes and saved searches once, the first time it is unlocked after the update; the old names stop working. `@gray` works as well as `@grey`.
62
+ - **Light and Dark everywhere:** dialogs, menus, the command palette, reminder cards and the tag rules editor follow the theme, and changing the theme cross-fades the page. After logging in, the login screen fades out over your notes.
63
+ - References: typing `[[` suggests notes to link or embed; `[[note|text]]` shows your own link text; a link to a password or username note shows its copyable row. A folded note reads as one line.
64
+ - The tag bar suggests a super tag with last time's values (`jogging:miles=12`), and property names for a tag that has none yet (`calories=` for a new `salad:`).
65
+ - Markdown tables: `<br>` breaks a line in a cell, rows with too few or too many cells and escaped `\|` work, and a wide table scrolls instead of squeezing its columns.
66
+ - Web links show their site's icon, their title and their domain.
67
+ - Under 640 px wide (a phone), MetaList shows a read-only layout with a box to capture new notes.
68
+ - Dialogs are consistent: the main action on the right, Cancel beside it, and Enter never confirms a deletion. Messages float instead of moving the page. The command palette keeps its order while it is open, and its box says "Type keywords".
69
+ - A new mark and favicon.
70
+ - Fixed: changing the sort order while the list was still loading could open it partway down; a refresh asked for during another could be dropped, leaving deleted notes or old search results on screen; a dropped file could land out of sight; tag suggestions failed on a note whose only tags were `@` tags.
71
+ - Vaults are upgraded (database version 12) when first unlocked: an older MetaList cannot open them afterwards.
72
+ - Security: msgpack 1.2.4 (CVE-2026-114613) in the tools that build and test MetaList; MetaList itself does not use msgpack.
73
+
56
74
  ## Changes in 0.24.2
57
75
 
58
76
  - ⇧⌘V pastes a copied note as a child again. Since 0.21.0, in Chrome, it put the copied note's text into the selected note instead.
@@ -12,6 +12,23 @@ A minimalist single-user note-taking app focused on server-side rendering (SSR),
12
12
  - Multi-tab search contexts with server-persisted scroll/search state (survives browser restarts)
13
13
  - Manual namespace backups/restores to a user-selected backup folder with retention controls
14
14
 
15
+ ## Changes in 0.25.0
16
+
17
+ - **Claude and Gemini beside OpenAI.** AI Agent Settings has a key for each provider, on your own account; you pick the model in the chat, and a conversation carries on when you switch provider.
18
+ - **Stats of a note's subtree.** `@stats` shows, under a note's own text, the Total, Min, Max and Count of each number property in it and the notes under it; `@sum=calories` (and `@avg`, `@min`, `@max`, `@count`) shows one figure, and a plain `@sum` covers every property. With nothing logged yet, a sum or count reads 0. **Stats Style** in the command palette: Strip, Tiles or Ledger. Search the figures with `@sum:calories>2000`: the days over 2000, each with the notes under it.
19
+ - **Four built-in tags renamed:** `@highlighter` is now `@highlight`, `@llm` `@ai`, `@list-bulleted` `@bullets` and `@list-numbered` `@numbered`. Each vault converts its notes and saved searches once, the first time it is unlocked after the update; the old names stop working. `@gray` works as well as `@grey`.
20
+ - **Light and Dark everywhere:** dialogs, menus, the command palette, reminder cards and the tag rules editor follow the theme, and changing the theme cross-fades the page. After logging in, the login screen fades out over your notes.
21
+ - References: typing `[[` suggests notes to link or embed; `[[note|text]]` shows your own link text; a link to a password or username note shows its copyable row. A folded note reads as one line.
22
+ - The tag bar suggests a super tag with last time's values (`jogging:miles=12`), and property names for a tag that has none yet (`calories=` for a new `salad:`).
23
+ - Markdown tables: `<br>` breaks a line in a cell, rows with too few or too many cells and escaped `\|` work, and a wide table scrolls instead of squeezing its columns.
24
+ - Web links show their site's icon, their title and their domain.
25
+ - Under 640 px wide (a phone), MetaList shows a read-only layout with a box to capture new notes.
26
+ - Dialogs are consistent: the main action on the right, Cancel beside it, and Enter never confirms a deletion. Messages float instead of moving the page. The command palette keeps its order while it is open, and its box says "Type keywords".
27
+ - A new mark and favicon.
28
+ - Fixed: changing the sort order while the list was still loading could open it partway down; a refresh asked for during another could be dropped, leaving deleted notes or old search results on screen; a dropped file could land out of sight; tag suggestions failed on a note whose only tags were `@` tags.
29
+ - Vaults are upgraded (database version 12) when first unlocked: an older MetaList cannot open them afterwards.
30
+ - Security: msgpack 1.2.4 (CVE-2026-114613) in the tools that build and test MetaList; MetaList itself does not use msgpack.
31
+
15
32
  ## Changes in 0.24.2
16
33
 
17
34
  - ⇧⌘V pastes a copied note as a child again. Since 0.21.0, in Chrome, it put the copied note's text into the selected note instead.
@@ -116,6 +116,8 @@ class UpdateTabStateRequest(TypedDict):
116
116
  tabs: dict[Identifier, Tab]
117
117
  tabOrder: list[Identifier]
118
118
  referenceViews: dict[Identifier, ReferenceView]
119
+ # The tab-state version the browser had when it read this snapshot.
120
+ version: Nonnegative
119
121
 
120
122
  @with_config(ConfigDict(strict=True))
121
123
  class UpdateTabSortModeRequest(TypedDict):
@@ -188,6 +190,16 @@ class DictationPasteRequest(TypedDict):
188
190
  # Spoken before a search term to exclude it (Dictation Settings).
189
191
  negate_phrase: Identifier
190
192
 
193
+ @with_config(ConfigDict(strict=True))
194
+ class ReferenceSuggestionsRequest(TypedDict):
195
+ """What was typed after `[[` in a note, the note it is typed in, and the tab's view
196
+ (its search, '' for none, and kind), whose notes rank first."""
197
+ query: Text
198
+ editing_note_id: Identifier
199
+ search: Text
200
+ tabId: Identifier
201
+ isUntaggedView: bool
202
+
191
203
  @with_config(ConfigDict(strict=True))
192
204
  class TagSuggestionsRequest(TypedDict):
193
205
  note_id: Identifier
@@ -273,6 +285,13 @@ class AddTagProposalsRequest(TypedDict):
273
285
  undoContext: UndoContext
274
286
  viewport: Viewport
275
287
 
288
+ # The fields naming a tab's view: its tab, search ('' for none) and kind. Every
289
+ # request below that names a view carries them (routes/notes.py _view_note_ids).
290
+ class ViewScope(TypedDict):
291
+ search: Text
292
+ tabId: Identifier
293
+ isUntaggedView: bool
294
+
276
295
  # The view a robot count (🤖 N) was shown in: its tab, search ('' for none) and kind.
277
296
  @with_config(ConfigDict(strict=True))
278
297
  class OpenToTagProposalsRequest(TypedDict):
@@ -480,11 +499,3 @@ class PasteChildEndpointRequest(TypedDict):
480
499
  undoContext: UndoContext
481
500
  viewport: Viewport
482
501
 
483
- @with_config(ConfigDict(strict=True))
484
- class PasteReferenceEndpointRequest(TypedDict):
485
- reference_note_id: Identifier
486
- search_query: Text | None
487
- clientId: Identifier
488
- undoContext: UndoContext
489
- viewport: Viewport
490
-
@@ -21,6 +21,7 @@ from app.api.transactions import transactional_route
21
21
  from app.models.utils import note_data_to_html
22
22
  from app.models.utils import render_note_data_read_only
23
23
  from app.services.ai_chat_stream import ChatTurnStream
24
+ from app.services.ai_setup import AI_PROVIDERS
24
25
  from app.services.ai_setup import AiConnection
25
26
  from app.services.ai_setup import AiNotSetUp
26
27
  from app.services.ai_setup import AiProvider
@@ -35,8 +36,9 @@ from app.services.agent.cloud_privacy import cloud_privacy_evaluator
35
36
  from app.services.agent.cloud_privacy import resolve_cloud_privacy_boundary
36
37
  from app.services.agent.inference import InferenceAdapter
37
38
  from app.services.agent.model_policy import SingleModelPolicy
38
- from app.services.agent.openai_models import OPENAI_MODELS
39
- from app.services.agent.openai_models import validate_openai_model
39
+ from app.services.ai_catalog import catalog_entry
40
+ from app.services.ai_catalog import require_shipped_model
41
+ from app.services.ai_catalog import validate_model_name
40
42
  from app.services.agent.openai_cost_tracking import OpenAICostSnapshot
41
43
  from app.services.agent.openai_cost_tracking import openai_cost_tracker
42
44
  from app.services.agent.prompt_settings import AgentPromptSet
@@ -54,9 +56,9 @@ from app.services.agent.trace import agent_trace_store
54
56
  from app.services.agent.menu_actions import MenuResult, menu_action_store
55
57
  from app.services.client_state_service import load_client_preferences
56
58
  from app.services.note_store import store as note_store
57
- from app.services.openai_credentials import OpenAICredentialInputError
58
- from app.services.openai_credentials import openai_credential_store
59
- from app.services.openai_credentials import validate_openai_api_key
59
+ from app.services.ai_credentials import AiCredentialInputError
60
+ from app.services.ai_credentials import ai_credential_store
61
+ from app.services.ai_credentials import validate_ai_api_key
60
62
  from app.services.sync import set_clipboard, get_current_sync_uuid
61
63
  from app.services.agent.tagging_run import TaggingRun, proposal_scope_ids
62
64
  from app.services.agent.retrieval_settings import resolve_tagging_batch_tokens
@@ -84,6 +86,7 @@ from app.services.input_errors import InputRejected
84
86
  from app.utils.text_utils import strip_html
85
87
  from app.services.preference_values import preference_or_default
86
88
  from app.contracts import requires
89
+ from app.startup_environment import is_development_environment
87
90
 
88
91
 
89
92
  router = APIRouter(prefix="/ai", tags=["ai"])
@@ -98,7 +101,9 @@ _MAX_TAG_FILTER_LENGTH = 256
98
101
  agent_context_builder = AgentContextBuilder()
99
102
 
100
103
 
101
- def _require_ai_connection(*, provider: AiProvider, token: str, session_key: str) -> AiConnection:
104
+ def _require_ai_connection(*, provider: AiProvider, model: str, token: str, session_key: str) -> AiConnection:
105
+ """A connection to the AI, for one of the models MetaList offers for it."""
106
+ require_shipped_model(provider, model)
102
107
  # lint: allow-PY001 rationale="the user removed or never added the AI's key: an expected 409, not a defect"
103
108
  try:
104
109
  return connect_to_ai(provider=provider, token=token, session_key=session_key)
@@ -117,23 +122,24 @@ def _agent_runtime(*, inference: InferenceAdapter) -> AgentRuntime:
117
122
  )
118
123
 
119
124
 
120
- class AiModelsRequest(BaseModel):
121
- model_config = ConfigDict(extra="forbid")
125
+ class AiModelChoiceGroup(BaseModel):
126
+ provider: AiProvider
127
+ label: str
128
+ models: list[str]
122
129
 
123
- provider: Literal["openai"]
124
130
 
131
+ class AiModelChoicesResponse(BaseModel):
132
+ # One group per provider with a key, in the registry's order.
133
+ groups: list[AiModelChoiceGroup]
125
134
 
126
- class AiModelsResponse(BaseModel):
127
- models: list[str]
128
135
 
129
-
130
- class OpenAICredentialRequest(BaseModel):
136
+ class AiCredentialRequest(BaseModel):
131
137
  model_config = ConfigDict(extra="forbid")
132
138
 
133
139
  api_key: SecretStr
134
140
 
135
141
 
136
- class OpenAICredentialStatusResponse(BaseModel):
142
+ class AiCredentialStatusResponse(BaseModel):
137
143
  configured: bool
138
144
  persistent: bool
139
145
 
@@ -149,7 +155,7 @@ class OpenAICostResponse(BaseModel):
149
155
  class CloudPrivacyPreviewRequest(BaseModel):
150
156
  model_config = ConfigDict(extra="forbid")
151
157
 
152
- provider: Literal["openai"]
158
+ provider: AiProvider
153
159
  note_ids: list[str] = Field(..., max_length=_MAX_PRIVACY_PREVIEW_NOTE_IDS)
154
160
 
155
161
  @field_validator("note_ids")
@@ -170,7 +176,7 @@ class CloudPrivacyPreviewResponse(BaseModel):
170
176
  class AiChatRequest(BaseModel):
171
177
  model_config = ConfigDict(extra="forbid")
172
178
 
173
- provider: Literal["openai"]
179
+ provider: AiProvider
174
180
  model: str
175
181
  thinking_level: Literal["off", "low", "medium", "high"]
176
182
  show_diagnostics: bool
@@ -195,7 +201,7 @@ class AiChatRequest(BaseModel):
195
201
 
196
202
  @model_validator(mode="after")
197
203
  def validate_thinking_level_for_model(self) -> Self:
198
- validate_openai_model(self.model)
204
+ validate_model_name(self.model)
199
205
  return self
200
206
 
201
207
 
@@ -227,8 +233,7 @@ class NoteTagSuggestionRequest(BaseModel):
227
233
 
228
234
  @model_validator(mode="after")
229
235
  def validate_model_for_provider(self) -> Self:
230
- assert self.provider == "openai"
231
- validate_openai_model(self.model)
236
+ validate_model_name(self.model)
232
237
  return self
233
238
 
234
239
 
@@ -264,8 +269,7 @@ class ExportTitleSuggestionRequest(ExportTitleScope):
264
269
 
265
270
  @model_validator(mode="after")
266
271
  def validate_model_for_provider(self) -> Self:
267
- assert self.provider == "openai"
268
- validate_openai_model(self.model)
272
+ validate_model_name(self.model)
269
273
  return self
270
274
 
271
275
 
@@ -295,7 +299,7 @@ class AiChatMessage(BaseModel):
295
299
  rendered_thinking: str
296
300
  status: Literal["complete", "streaming", "error"]
297
301
  error: str
298
- provider: Literal["openai"]
302
+ provider: AiProvider
299
303
  model: str
300
304
  activities: list[AiChatActivity]
301
305
 
@@ -362,76 +366,94 @@ def _render_ai_response_note_content(*, markdown_text: str, session_key: str) ->
362
366
  )
363
367
 
364
368
 
365
- @router.post("/models", response_model=AiModelsResponse)
366
- @transactional_route
367
- async def list_ai_models(
368
- payload: AiModelsRequest,
369
+ # The chat's model picker: every model of every provider with a key, so picking a
370
+ # model picks its provider too (docs/ui/ai-chat.md, "Model picker"). A read, so it takes
371
+ # no mutation slot: the chat refreshes it while the user edits notes. current_provider is
372
+ # the provider of the model picked last; its models stay listed even without a key.
373
+ @router.get("/model-choices", response_model=AiModelChoicesResponse)
374
+ async def list_ai_model_choices(
375
+ current_provider: AiProvider,
369
376
  token: Annotated[str, Depends(require_request_auth_token)],
370
- ) -> AiModelsResponse:
371
- del token, payload
372
- return AiModelsResponse(models=list(OPENAI_MODELS))
373
-
374
-
377
+ ) -> AiModelChoicesResponse:
378
+ setup = describe_ai_setup(token=token, session_key=token_service.get_session_key(token))
379
+ groups = []
380
+ for provider in AI_PROVIDERS:
381
+ if not setup.is_ready_for(provider) and provider != current_provider:
382
+ continue
383
+ entry = catalog_entry(provider)
384
+ groups.append(AiModelChoiceGroup(
385
+ provider=provider, label=entry.label,
386
+ models=list(entry.models),
387
+ ))
388
+ assert groups, "the current provider is always listed"
389
+ return AiModelChoicesResponse(groups=groups)
390
+
391
+
392
+ # One key slot per provider, per vault (app/services/ai_credentials.py); a provider
393
+ # that is not registered has no route.
375
394
  @router.get(
376
- "/openai/credential",
377
- response_model=OpenAICredentialStatusResponse,
395
+ "/{provider}/credential",
396
+ response_model=AiCredentialStatusResponse,
378
397
  )
379
- def get_openai_credential_status(
398
+ def get_ai_credential_status(
399
+ provider: AiProvider,
380
400
  response: Response,
381
401
  token: Annotated[str, Depends(require_request_auth_token)],
382
- ) -> OpenAICredentialStatusResponse:
402
+ ) -> AiCredentialStatusResponse:
383
403
  response.headers["Cache-Control"] = "no-store"
384
404
  session_key = token_service.get_session_key(token)
385
- status = openai_credential_store.status(token=token, session_key=session_key)
386
- return OpenAICredentialStatusResponse(
405
+ status = ai_credential_store(provider).status(token=token, session_key=session_key)
406
+ return AiCredentialStatusResponse(
387
407
  configured=status.configured,
388
408
  persistent=status.persistent,
389
409
  )
390
410
 
391
411
 
392
412
  @router.put(
393
- "/openai/credential",
394
- response_model=OpenAICredentialStatusResponse,
413
+ "/{provider}/credential",
414
+ response_model=AiCredentialStatusResponse,
395
415
  )
396
416
  @transactional_route
397
- def put_openai_credential(
398
- payload: OpenAICredentialRequest,
417
+ def put_ai_credential(
418
+ provider: AiProvider,
419
+ payload: AiCredentialRequest,
399
420
  response: Response,
400
421
  token: Annotated[str, Depends(require_request_auth_token)],
401
- ) -> OpenAICredentialStatusResponse:
422
+ ) -> AiCredentialStatusResponse:
402
423
  response.headers["Cache-Control"] = "no-store"
403
424
  session_key = token_service.get_session_key(token)
404
425
  submitted_api_key = payload.api_key.get_secret_value()
405
426
  # lint: allow-PY001 rationale="validate user-supplied secret after Pydantic has masked it"
406
427
  try:
407
- api_key = validate_openai_api_key(submitted_api_key)
428
+ api_key = validate_ai_api_key(provider, submitted_api_key)
408
429
  # lint: allow-PY001 rationale="return a concise validation error without echoing the secret"
409
- except OpenAICredentialInputError as exc:
430
+ except AiCredentialInputError as exc:
410
431
  raise HTTPException(status_code=HTTPStatus.UNPROCESSABLE_ENTITY, detail=str(exc)) from exc
411
- status = openai_credential_store.configure(
432
+ status = ai_credential_store(provider).configure(
412
433
  token=token,
413
434
  session_key=session_key,
414
435
  api_key=api_key,
415
436
  )
416
- return OpenAICredentialStatusResponse(
437
+ return AiCredentialStatusResponse(
417
438
  configured=status.configured,
418
439
  persistent=status.persistent,
419
440
  )
420
441
 
421
442
 
422
443
  @router.delete(
423
- "/openai/credential",
424
- response_model=OpenAICredentialStatusResponse,
444
+ "/{provider}/credential",
445
+ response_model=AiCredentialStatusResponse,
425
446
  )
426
447
  @transactional_route
427
- def delete_openai_credential(
448
+ def delete_ai_credential(
449
+ provider: AiProvider,
428
450
  response: Response,
429
451
  token: Annotated[str, Depends(require_request_auth_token)],
430
- ) -> OpenAICredentialStatusResponse:
452
+ ) -> AiCredentialStatusResponse:
431
453
  response.headers["Cache-Control"] = "no-store"
432
454
  session_key = token_service.get_session_key(token)
433
- status = openai_credential_store.clear(session_key=session_key)
434
- return OpenAICredentialStatusResponse(
455
+ status = ai_credential_store(provider).clear(session_key=session_key)
456
+ return AiCredentialStatusResponse(
435
457
  configured=status.configured,
436
458
  persistent=status.persistent,
437
459
  )
@@ -488,7 +510,9 @@ def suggest_tags_for_note_with_ai(
488
510
  if not note_store.has_note(note_id):
489
511
  raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail=f"Note not found: {note_id}")
490
512
  session_key = token_service.get_session_key(token)
491
- connection = _require_ai_connection(provider=payload.provider, token=token, session_key=session_key)
513
+ connection = _require_ai_connection(
514
+ provider=payload.provider, model=payload.model, token=token, session_key=session_key,
515
+ )
492
516
  preferences = load_client_preferences(token=token)
493
517
  boundary = resolve_cloud_privacy_boundary(preferences=preferences, provider=payload.provider)
494
518
  if cloud_privacy_evaluator.exclusion_reason(note_id=note_id, boundary=boundary) != "":
@@ -593,7 +617,9 @@ def suggest_export_title_with_ai(
593
617
  """Ask the AI for an export's or print's title: one {"type": "title"} or {"type": "failed"} line.
594
618
  Streamed, so Stop (the client going away) ends the request."""
595
619
  session_key = token_service.get_session_key(token)
596
- connection = _require_ai_connection(provider=payload.provider, token=token, session_key=session_key)
620
+ connection = _require_ai_connection(
621
+ provider=payload.provider, model=payload.model, token=token, session_key=session_key,
622
+ )
597
623
  request = _export_title_request(payload, token)
598
624
  if not request.notes:
599
625
  raise InputRejected("These notes are private, so the AI can't suggest a title")
@@ -643,12 +669,19 @@ def _openai_cost_response(snapshot: OpenAICostSnapshot) -> OpenAICostResponse:
643
669
  )
644
670
 
645
671
 
672
+ def _require_cost_estimate_offered() -> None:
673
+ """The cost estimate is a developer tool (docs/ui/ai-chat.md): in production it does not exist."""
674
+ if not is_development_environment():
675
+ raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail="Not Found")
676
+
677
+
646
678
  @router.get("/openai/cost", response_model=OpenAICostResponse)
647
679
  def get_openai_cost(
648
680
  response: Response,
649
681
  token: Annotated[str, Depends(require_request_auth_token)],
650
682
  ) -> OpenAICostResponse:
651
683
  del token
684
+ _require_cost_estimate_offered()
652
685
  response.headers["Cache-Control"] = "no-store"
653
686
  return _openai_cost_response(openai_cost_tracker.snapshot())
654
687
 
@@ -660,6 +693,7 @@ def reset_openai_cost(
660
693
  token: Annotated[str, Depends(require_request_auth_token)],
661
694
  ) -> OpenAICostResponse:
662
695
  del token
696
+ _require_cost_estimate_offered()
663
697
  response.headers["Cache-Control"] = "no-store"
664
698
  openai_cost_tracker.reset()
665
699
  return _openai_cost_response(openai_cost_tracker.snapshot())
@@ -847,7 +881,7 @@ def copy_ai_message(
847
881
  if content == "":
848
882
  raise HTTPException(status_code=HTTPStatus.CONFLICT, detail="AI response is empty")
849
883
 
850
- tags = "@llm"
884
+ tags = "@ai"
851
885
  note_content = _render_ai_response_note_content(
852
886
  markdown_text=content,
853
887
  session_key=session_key,
@@ -882,7 +916,9 @@ def stream_ai_chat(
882
916
  token: Annotated[str, Depends(require_request_auth_token)],
883
917
  ) -> StreamingResponse:
884
918
  session_key = token_service.get_session_key(token)
885
- connection = _require_ai_connection(provider=payload.provider, token=token, session_key=session_key)
919
+ connection = _require_ai_connection(
920
+ provider=payload.provider, model=payload.model, token=token, session_key=session_key,
921
+ )
886
922
  preferences = load_client_preferences(token=token)
887
923
  prompts = DEFAULT_AGENT_PROMPTS
888
924
  skills = DEFAULT_AGENT_SKILLS
@@ -69,7 +69,7 @@ from app.services.root_sorting import clear_root_sort_cache
69
69
  from app.services.undo_state import reset_all_undo_state
70
70
  from app.services.sync import reset_state as reset_sync_state
71
71
  from app.services.runtime_generation import current_generation, invalidate_runtime_work
72
- from app.security.sensitive_cache import disable_and_clear_sensitive_caches, clear_sensitive_caches
72
+ from app.security.sensitive_cache import disable_and_clear_sensitive_caches, clear_sensitive_caches, enable_sensitive_caches
73
73
  from app.services.bulk_operation import bulk_operation_guard
74
74
  from app.services.diagnostics import activate_authenticated_logging
75
75
  from app.services.diagnostics import deactivate_authenticated_logging
@@ -95,7 +95,7 @@ from app.services.client_state_service import load_client_state
95
95
  from app.services.client_state_service import _validate_client_preferences, _validate_usage_state
96
96
  from app.services.client_state_service import save_client_preferences
97
97
  from app.services.client_state_service import save_command_palette_usage
98
- from app.services.openai_credentials import openai_credential_store
98
+ from app.services.ai_credentials import clear_ai_credential_sessions, reset_ai_credentials
99
99
  from app.services.input_errors import NamespaceInputRejected
100
100
  from app.services.link_title_retry import stop_link_title_retry
101
101
 
@@ -303,7 +303,7 @@ def _run_hydration(*, rebuild_required: bool) -> None:
303
303
  return
304
304
  session = SafeSession()
305
305
  try:
306
- prefetched_rows = populate_cache_from_db(session)
306
+ prefetched_rows = populate_cache_from_db(session, saved_searches=tab_state_store)
307
307
  session.commit()
308
308
  finally:
309
309
  session.close()
@@ -386,7 +386,7 @@ def _reset_runtime_state_after_restore() -> bool:
386
386
  web_evidence_store.reset()
387
387
  summary_batch_store.reset()
388
388
  agent_trace_store.reset()
389
- openai_credential_store.reset()
389
+ reset_ai_credentials()
390
390
  view_cache.clear()
391
391
  tab_state_store.reset()
392
392
  link_title_store.reset()
@@ -428,9 +428,12 @@ def _reset_runtime_state_after_restore() -> bool:
428
428
  if password_required:
429
429
  return True
430
430
 
431
- prefetched_rows = populate_cache_from_db(session)
431
+ prefetched_rows = populate_cache_from_db(session, saved_searches=tab_state_store)
432
432
  note_store.load_from_db(None, prefetched_rows=prefetched_rows)
433
433
  auth_cache_state.mark_cache_ready()
434
+ # Unlocking turns the caches of note text back on (set_encryption_key); a vault
435
+ # without a password has no unlock, so they come back on once its notes are loaded.
436
+ enable_sensitive_caches()
434
437
  del prefetched_rows
435
438
  release_freed_memory()
436
439
  return False
@@ -573,7 +576,7 @@ def login(
573
576
  web_evidence_store.reset()
574
577
  summary_batch_store.reset()
575
578
  agent_trace_store.reset()
576
- openai_credential_store.reset()
579
+ reset_ai_credentials()
577
580
  view_cache.clear()
578
581
  reset_all_undo_state()
579
582
  reset_sync_state()
@@ -599,7 +602,7 @@ def logout(
599
602
  web_evidence_store.clear_session(session_key=session_key)
600
603
  summary_batch_store.clear_session(session_key=session_key)
601
604
  agent_trace_store.clear_session(session_key=session_key)
602
- openai_credential_store.clear_session(session_key=session_key)
605
+ clear_ai_credential_sessions(session_key=session_key)
603
606
  token_service.revoke_token(token)
604
607
  shell_session_service.reset()
605
608
  # Lock and login end a retry through the runtime generation; a passwordless
@@ -668,7 +671,7 @@ def create_passwordless_session(
668
671
  web_evidence_store.reset()
669
672
  summary_batch_store.reset()
670
673
  agent_trace_store.reset()
671
- openai_credential_store.reset()
674
+ reset_ai_credentials()
672
675
  view_cache.clear()
673
676
  reset_all_undo_state()
674
677
  reset_sync_state()
@@ -1088,7 +1091,7 @@ def create_password(
1088
1091
  web_evidence_store.reset()
1089
1092
  summary_batch_store.reset()
1090
1093
  agent_trace_store.reset()
1091
- openai_credential_store.reset()
1094
+ reset_ai_credentials()
1092
1095
  clear_all_locks()
1093
1096
  return {"message": message}
1094
1097
 
@@ -1115,7 +1118,7 @@ def change_password(
1115
1118
  web_evidence_store.reset()
1116
1119
  summary_batch_store.reset()
1117
1120
  agent_trace_store.reset()
1118
- openai_credential_store.reset()
1121
+ reset_ai_credentials()
1119
1122
  clear_all_locks()
1120
1123
  return {"message": message}
1121
1124
 
@@ -1138,7 +1141,7 @@ def remove_password(
1138
1141
  web_evidence_store.reset()
1139
1142
  summary_batch_store.reset()
1140
1143
  agent_trace_store.reset()
1141
- openai_credential_store.reset()
1144
+ reset_ai_credentials()
1142
1145
  clear_all_locks()
1143
1146
  clear_encryption_key()
1144
1147
  deactivate_authenticated_logging()