MetaList 0.14.0__tar.gz → 0.16.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 (556) hide show
  1. {metalist-0.14.0 → metalist-0.16.0}/PKG-INFO +19 -1
  2. {metalist-0.14.0 → metalist-0.16.0}/README.md +17 -0
  3. {metalist-0.14.0 → metalist-0.16.0}/app/api/note_requests.py +9 -0
  4. {metalist-0.14.0 → metalist-0.16.0}/app/api/routes/notes.py +23 -4
  5. {metalist-0.14.0 → metalist-0.16.0}/app/presentation/login_page.py +7 -2
  6. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/skills/help-ai.md +1 -1
  7. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/skills/help-data.md +3 -1
  8. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/skills/help-dictation.md +1 -1
  9. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/skills/help-formatting.md +35 -0
  10. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/skills/help-menus.md +6 -4
  11. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/skills/help-notes.md +9 -8
  12. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/skills/help-privacy.md +2 -1
  13. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/skills/help-releases.md +17 -0
  14. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/skills/help-tags.md +12 -2
  15. metalist-0.16.0/app/services/chess_rendering.py +173 -0
  16. {metalist-0.14.0 → metalist-0.16.0}/app/services/client_state_service.py +39 -0
  17. metalist-0.16.0/app/services/code_rendering.py +73 -0
  18. {metalist-0.14.0 → metalist-0.16.0}/app/services/content_formatting.py +81 -3
  19. {metalist-0.14.0 → metalist-0.16.0}/app/services/dictation_cleanup.py +1 -1
  20. metalist-0.16.0/app/services/diff_rendering.py +52 -0
  21. metalist-0.16.0/app/services/mermaid_note_rendering.py +27 -0
  22. {metalist-0.14.0 → metalist-0.16.0}/app/services/snapshot.py +12 -3
  23. {metalist-0.14.0 → metalist-0.16.0}/app/services/structured_note_renderers.py +3 -0
  24. {metalist-0.14.0 → metalist-0.16.0}/app/services/tag_suggestions.py +44 -115
  25. {metalist-0.14.0 → metalist-0.16.0}/app/static/config/agent-menu-actions.json +14 -8
  26. {metalist-0.14.0 → metalist-0.16.0}/app/static/config/command_palette_tags.json +6 -2
  27. {metalist-0.14.0 → metalist-0.16.0}/app/static/css/main.css +340 -7
  28. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/ai-chat/proposal-menu.js +3 -3
  29. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/api-client.js +20 -1
  30. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/auth.js +71 -21
  31. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/command-palette/command-palette-controller.js +43 -8
  32. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/command-palette/endpoint-registry.js +14 -7
  33. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/config.js +1 -0
  34. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/context-menu/context-menu-registry.js +315 -254
  35. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/context-menu/context-menu-service.js +71 -0
  36. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/login-namespace-picker.js +17 -11
  37. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/modals/help-modal.js +1 -0
  38. metalist-0.16.0/app/static/js/modules/modals/namespace-loading-page.js +109 -0
  39. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/modals/namespace-modals.js +81 -16
  40. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/modals/password-modal.js +25 -8
  41. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/modals/reminder-modal.js +39 -17
  42. metalist-0.16.0/app/static/js/modules/modals/tag-suggestion-settings-modal.js +122 -0
  43. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/actions/note-actions.js +71 -0
  44. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/actions/ui-actions.js +34 -6
  45. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/events/context-menu-events.js +147 -22
  46. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/events/keyboard-events.js +182 -8
  47. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/events/mouse-events.js +4 -0
  48. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/mode-context.js +7 -0
  49. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/mode-manager-controller.js +26 -2
  50. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/infinite-scroll-service.js +5 -0
  51. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/mermaid-render-service.js +8 -3
  52. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/note-context-menu-action-service.js +7 -7
  53. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/note-fullscreen-service.js +14 -0
  54. metalist-0.16.0/app/static/js/modules/mode-manager/services/paste-format-detection-service.js +315 -0
  55. metalist-0.16.0/app/static/js/modules/mode-manager/services/scroll-to-top-service.js +152 -0
  56. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/tag-bar-service.js +14 -0
  57. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/tag-syntax-service.js +16 -4
  58. {metalist-0.14.0 → metalist-0.16.0}/app/templates/index.html +10 -0
  59. metalist-0.16.0/app/usecases/move_to_top.py +179 -0
  60. {metalist-0.14.0 → metalist-0.16.0}/app/version.py +1 -1
  61. {metalist-0.14.0 → metalist-0.16.0}/metalist.egg-info/PKG-INFO +19 -1
  62. {metalist-0.14.0 → metalist-0.16.0}/metalist.egg-info/SOURCES.txt +6 -0
  63. {metalist-0.14.0 → metalist-0.16.0}/metalist.egg-info/requires.txt +1 -0
  64. {metalist-0.14.0 → metalist-0.16.0}/pyproject.toml +1 -0
  65. metalist-0.14.0/app/static/js/modules/modals/namespace-loading-page.js +0 -138
  66. metalist-0.14.0/app/static/js/modules/mode-manager/services/scroll-to-top-service.js +0 -99
  67. metalist-0.14.0/app/usecases/move_to_top.py +0 -116
  68. {metalist-0.14.0 → metalist-0.16.0}/MANIFEST.in +0 -0
  69. {metalist-0.14.0 → metalist-0.16.0}/app/__init__.py +0 -0
  70. {metalist-0.14.0 → metalist-0.16.0}/app/api/__init__.py +0 -0
  71. {metalist-0.14.0 → metalist-0.16.0}/app/api/deps.py +0 -0
  72. {metalist-0.14.0 → metalist-0.16.0}/app/api/dev.py +0 -0
  73. {metalist-0.14.0 → metalist-0.16.0}/app/api/middleware/auth.py +0 -0
  74. {metalist-0.14.0 → metalist-0.16.0}/app/api/request_auth.py +0 -0
  75. {metalist-0.14.0 → metalist-0.16.0}/app/api/routes/ai.py +0 -0
  76. {metalist-0.14.0 → metalist-0.16.0}/app/api/routes/app_updates.py +0 -0
  77. {metalist-0.14.0 → metalist-0.16.0}/app/api/routes/auth.py +0 -0
  78. {metalist-0.14.0 → metalist-0.16.0}/app/api/routes/backups.py +0 -0
  79. {metalist-0.14.0 → metalist-0.16.0}/app/api/routes/files.py +0 -0
  80. {metalist-0.14.0 → metalist-0.16.0}/app/api/routes/ontology.py +0 -0
  81. {metalist-0.14.0 → metalist-0.16.0}/app/api/routes/reminders.py +0 -0
  82. {metalist-0.14.0 → metalist-0.16.0}/app/api/routes/remote_images.py +0 -0
  83. {metalist-0.14.0 → metalist-0.16.0}/app/api/routes/test.py +0 -0
  84. {metalist-0.14.0 → metalist-0.16.0}/app/api/transactions.py +0 -0
  85. {metalist-0.14.0 → metalist-0.16.0}/app/api/upload_limits.py +0 -0
  86. {metalist-0.14.0 → metalist-0.16.0}/app/config.py +0 -0
  87. {metalist-0.14.0 → metalist-0.16.0}/app/data_directory.py +0 -0
  88. {metalist-0.14.0 → metalist-0.16.0}/app/db/__init__.py +0 -0
  89. {metalist-0.14.0 → metalist-0.16.0}/app/db/backup_settings_sql.py +0 -0
  90. {metalist-0.14.0 → metalist-0.16.0}/app/db/editable_files_migration.py +0 -0
  91. {metalist-0.14.0 → metalist-0.16.0}/app/db/engine.py +0 -0
  92. {metalist-0.14.0 → metalist-0.16.0}/app/db/file_schema.py +0 -0
  93. {metalist-0.14.0 → metalist-0.16.0}/app/db/file_session.py +0 -0
  94. {metalist-0.14.0 → metalist-0.16.0}/app/db/files_sql.py +0 -0
  95. {metalist-0.14.0 → metalist-0.16.0}/app/db/link_titles_sql.py +0 -0
  96. {metalist-0.14.0 → metalist-0.16.0}/app/db/live_recovery.py +0 -0
  97. {metalist-0.14.0 → metalist-0.16.0}/app/db/migrations.py +0 -0
  98. {metalist-0.14.0 → metalist-0.16.0}/app/db/notes_sql.py +0 -0
  99. {metalist-0.14.0 → metalist-0.16.0}/app/db/ontology_rules_sql.py +0 -0
  100. {metalist-0.14.0 → metalist-0.16.0}/app/db/reminders_sql.py +0 -0
  101. {metalist-0.14.0 → metalist-0.16.0}/app/db/retire_sounds.py +0 -0
  102. {metalist-0.14.0 → metalist-0.16.0}/app/db/schema.py +0 -0
  103. {metalist-0.14.0 → metalist-0.16.0}/app/db/search_history_sql.py +0 -0
  104. {metalist-0.14.0 → metalist-0.16.0}/app/db/session.py +0 -0
  105. {metalist-0.14.0 → metalist-0.16.0}/app/db/settings_sql.py +0 -0
  106. {metalist-0.14.0 → metalist-0.16.0}/app/db/tab_state_sql.py +0 -0
  107. {metalist-0.14.0 → metalist-0.16.0}/app/db/version.py +0 -0
  108. {metalist-0.14.0 → metalist-0.16.0}/app/encryption_audit.py +0 -0
  109. {metalist-0.14.0 → metalist-0.16.0}/app/exception_boundaries.py +0 -0
  110. {metalist-0.14.0 → metalist-0.16.0}/app/https_proxy.py +0 -0
  111. {metalist-0.14.0 → metalist-0.16.0}/app/main.py +0 -0
  112. {metalist-0.14.0 → metalist-0.16.0}/app/models/commands.py +0 -0
  113. {metalist-0.14.0 → metalist-0.16.0}/app/models/database.py +0 -0
  114. {metalist-0.14.0 → metalist-0.16.0}/app/models/entities.py +0 -0
  115. {metalist-0.14.0 → metalist-0.16.0}/app/models/enums.py +0 -0
  116. {metalist-0.14.0 → metalist-0.16.0}/app/models/linked_list.py +0 -0
  117. {metalist-0.14.0 → metalist-0.16.0}/app/models/list_operations.py +0 -0
  118. {metalist-0.14.0 → metalist-0.16.0}/app/models/list_traversal.py +0 -0
  119. {metalist-0.14.0 → metalist-0.16.0}/app/models/note_crud.py +0 -0
  120. {metalist-0.14.0 → metalist-0.16.0}/app/models/utils.py +0 -0
  121. {metalist-0.14.0 → metalist-0.16.0}/app/network_settings.py +0 -0
  122. {metalist-0.14.0 → metalist-0.16.0}/app/presentation/__init__.py +0 -0
  123. {metalist-0.14.0 → metalist-0.16.0}/app/presentation/render/__init__.py +0 -0
  124. {metalist-0.14.0 → metalist-0.16.0}/app/presentation/render/note_renderer.py +0 -0
  125. {metalist-0.14.0 → metalist-0.16.0}/app/presentation/templates.py +0 -0
  126. {metalist-0.14.0 → metalist-0.16.0}/app/security/authenticated_logging.py +0 -0
  127. {metalist-0.14.0 → metalist-0.16.0}/app/security/encryption.py +0 -0
  128. {metalist-0.14.0 → metalist-0.16.0}/app/security/http_error_diagnostics.py +0 -0
  129. {metalist-0.14.0 → metalist-0.16.0}/app/security/http_headers.py +0 -0
  130. {metalist-0.14.0 → metalist-0.16.0}/app/security/note_html.py +0 -0
  131. {metalist-0.14.0 → metalist-0.16.0}/app/security/request_boundary.py +0 -0
  132. {metalist-0.14.0 → metalist-0.16.0}/app/security/request_hosts.py +0 -0
  133. {metalist-0.14.0 → metalist-0.16.0}/app/security/sensitive_cache.py +0 -0
  134. {metalist-0.14.0 → metalist-0.16.0}/app/security/sensitive_logging.py +0 -0
  135. {metalist-0.14.0 → metalist-0.16.0}/app/security/shell_execution.py +0 -0
  136. {metalist-0.14.0 → metalist-0.16.0}/app/security/validation_errors.py +0 -0
  137. {metalist-0.14.0 → metalist-0.16.0}/app/server_runtime.py +0 -0
  138. {metalist-0.14.0 → metalist-0.16.0}/app/services/__init__.py +0 -0
  139. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/__init__.py +0 -0
  140. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/action_log.py +0 -0
  141. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/agent_loop.py +0 -0
  142. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/agent_tools.py +0 -0
  143. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/citation_tokens.py +0 -0
  144. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/cloud_privacy.py +0 -0
  145. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/context.py +0 -0
  146. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/evidence_serialization.py +0 -0
  147. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/execution_errors.py +0 -0
  148. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/failure_explanations.py +0 -0
  149. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/help_catalog.py +0 -0
  150. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/history.py +0 -0
  151. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/inference.py +0 -0
  152. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/investigation.py +0 -0
  153. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/judging.py +0 -0
  154. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/menu_actions.py +0 -0
  155. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/model_policy.py +0 -0
  156. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/note_aliases.py +0 -0
  157. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/openai_cost_tracking.py +0 -0
  158. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/openai_inference.py +0 -0
  159. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/prompt_settings.py +0 -0
  160. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/prompts/__init__.py +0 -0
  161. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/prompts/agent.md +0 -0
  162. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/prompts/final-response.md +0 -0
  163. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/prompts/system.md +0 -0
  164. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/release_notes.py +0 -0
  165. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/retrieval_settings.py +0 -0
  166. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/runtime.py +0 -0
  167. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/scope.py +0 -0
  168. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/skill_settings.py +0 -0
  169. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/skills/__init__.py +0 -0
  170. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/skills/help-references.md +0 -0
  171. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/skills/help-reminders.md +0 -0
  172. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/skills/help-search.md +0 -0
  173. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/skills/staged-summary.md +0 -0
  174. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/skills/tag-proposals.md +0 -0
  175. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/skills/web-browsing.md +0 -0
  176. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/staged_summary.py +0 -0
  177. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/structured_inference.py +0 -0
  178. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/tagging.py +0 -0
  179. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/tagging_run.py +0 -0
  180. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/token_estimation.py +0 -0
  181. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/tool_calling.py +0 -0
  182. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/trace.py +0 -0
  183. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/web_actions.py +0 -0
  184. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/web_capabilities.py +0 -0
  185. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/web_evidence.py +0 -0
  186. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/web_fetch.py +0 -0
  187. {metalist-0.14.0 → metalist-0.16.0}/app/services/agent/web_settings.py +0 -0
  188. {metalist-0.14.0 → metalist-0.16.0}/app/services/ai_chat.py +0 -0
  189. {metalist-0.14.0 → metalist-0.16.0}/app/services/ai_chat_rendering.py +0 -0
  190. {metalist-0.14.0 → metalist-0.16.0}/app/services/ai_chat_stream.py +0 -0
  191. {metalist-0.14.0 → metalist-0.16.0}/app/services/app_update_worker.py +0 -0
  192. {metalist-0.14.0 → metalist-0.16.0}/app/services/app_updates.py +0 -0
  193. {metalist-0.14.0 → metalist-0.16.0}/app/services/auth.py +0 -0
  194. {metalist-0.14.0 → metalist-0.16.0}/app/services/auth_cache_state.py +0 -0
  195. {metalist-0.14.0 → metalist-0.16.0}/app/services/auth_service.py +0 -0
  196. {metalist-0.14.0 → metalist-0.16.0}/app/services/backlink_index.py +0 -0
  197. {metalist-0.14.0 → metalist-0.16.0}/app/services/backlinks.py +0 -0
  198. {metalist-0.14.0 → metalist-0.16.0}/app/services/backup_service.py +0 -0
  199. {metalist-0.14.0 → metalist-0.16.0}/app/services/backup_settings_service.py +0 -0
  200. {metalist-0.14.0 → metalist-0.16.0}/app/services/bulk_operation.py +0 -0
  201. {metalist-0.14.0 → metalist-0.16.0}/app/services/content_cache.py +0 -0
  202. {metalist-0.14.0 → metalist-0.16.0}/app/services/diagnostics.py +0 -0
  203. {metalist-0.14.0 → metalist-0.16.0}/app/services/embedded_references.py +0 -0
  204. {metalist-0.14.0 → metalist-0.16.0}/app/services/encryption.py +0 -0
  205. {metalist-0.14.0 → metalist-0.16.0}/app/services/exception_capture.py +0 -0
  206. {metalist-0.14.0 → metalist-0.16.0}/app/services/file_edit_sessions.py +0 -0
  207. {metalist-0.14.0 → metalist-0.16.0}/app/services/file_registry.py +0 -0
  208. {metalist-0.14.0 → metalist-0.16.0}/app/services/file_storage.py +0 -0
  209. {metalist-0.14.0 → metalist-0.16.0}/app/services/file_text_preview.py +0 -0
  210. {metalist-0.14.0 → metalist-0.16.0}/app/services/footnote_layout.py +0 -0
  211. {metalist-0.14.0 → metalist-0.16.0}/app/services/footnote_rendering.py +0 -0
  212. {metalist-0.14.0 → metalist-0.16.0}/app/services/hierarchy.py +0 -0
  213. {metalist-0.14.0 → metalist-0.16.0}/app/services/html_export.py +0 -0
  214. {metalist-0.14.0 → metalist-0.16.0}/app/services/html_unformatting.py +0 -0
  215. {metalist-0.14.0 → metalist-0.16.0}/app/services/hydration_state.py +0 -0
  216. {metalist-0.14.0 → metalist-0.16.0}/app/services/image_size_formatting.py +0 -0
  217. {metalist-0.14.0 → metalist-0.16.0}/app/services/inline_image_dimensions.py +0 -0
  218. {metalist-0.14.0 → metalist-0.16.0}/app/services/inline_image_occurrences.py +0 -0
  219. {metalist-0.14.0 → metalist-0.16.0}/app/services/input_errors.py +0 -0
  220. {metalist-0.14.0 → metalist-0.16.0}/app/services/integrity.py +0 -0
  221. {metalist-0.14.0 → metalist-0.16.0}/app/services/latex_rendering.py +0 -0
  222. {metalist-0.14.0 → metalist-0.16.0}/app/services/link_title_retry.py +0 -0
  223. {metalist-0.14.0 → metalist-0.16.0}/app/services/link_titles.py +0 -0
  224. {metalist-0.14.0 → metalist-0.16.0}/app/services/login_rate_limit.py +0 -0
  225. {metalist-0.14.0 → metalist-0.16.0}/app/services/maintenance_mode.py +0 -0
  226. {metalist-0.14.0 → metalist-0.16.0}/app/services/markdown_rendering.py +0 -0
  227. {metalist-0.14.0 → metalist-0.16.0}/app/services/namespace_deletion_jobs.py +0 -0
  228. {metalist-0.14.0 → metalist-0.16.0}/app/services/namespace_deletion_worker.py +0 -0
  229. {metalist-0.14.0 → metalist-0.16.0}/app/services/namespace_rename_jobs.py +0 -0
  230. {metalist-0.14.0 → metalist-0.16.0}/app/services/namespace_rename_worker.py +0 -0
  231. {metalist-0.14.0 → metalist-0.16.0}/app/services/namespace_runtime_guard.py +0 -0
  232. {metalist-0.14.0 → metalist-0.16.0}/app/services/namespace_switcher.py +0 -0
  233. {metalist-0.14.0 → metalist-0.16.0}/app/services/note_fullscreen.py +0 -0
  234. {metalist-0.14.0 → metalist-0.16.0}/app/services/note_image_tags.py +0 -0
  235. {metalist-0.14.0 → metalist-0.16.0}/app/services/note_ordering.py +0 -0
  236. {metalist-0.14.0 → metalist-0.16.0}/app/services/note_store.py +0 -0
  237. {metalist-0.14.0 → metalist-0.16.0}/app/services/ontology_rules_store.py +0 -0
  238. {metalist-0.14.0 → metalist-0.16.0}/app/services/openai_credentials.py +0 -0
  239. {metalist-0.14.0 → metalist-0.16.0}/app/services/password_note_fields.py +0 -0
  240. {metalist-0.14.0 → metalist-0.16.0}/app/services/public_http.py +0 -0
  241. {metalist-0.14.0 → metalist-0.16.0}/app/services/reference_presentation.py +0 -0
  242. {metalist-0.14.0 → metalist-0.16.0}/app/services/reminders.py +0 -0
  243. {metalist-0.14.0 → metalist-0.16.0}/app/services/remote_image_proxy.py +0 -0
  244. {metalist-0.14.0 → metalist-0.16.0}/app/services/request_recovery.py +0 -0
  245. {metalist-0.14.0 → metalist-0.16.0}/app/services/resource_limits.py +0 -0
  246. {metalist-0.14.0 → metalist-0.16.0}/app/services/root_sorting.py +0 -0
  247. {metalist-0.14.0 → metalist-0.16.0}/app/services/runtime_generation.py +0 -0
  248. {metalist-0.14.0 → metalist-0.16.0}/app/services/runtime_hardening.py +0 -0
  249. {metalist-0.14.0 → metalist-0.16.0}/app/services/runtime_lock.py +0 -0
  250. {metalist-0.14.0 → metalist-0.16.0}/app/services/search_history.py +0 -0
  251. {metalist-0.14.0 → metalist-0.16.0}/app/services/search_history_storage.py +0 -0
  252. {metalist-0.14.0 → metalist-0.16.0}/app/services/search_index.py +0 -0
  253. {metalist-0.14.0 → metalist-0.16.0}/app/services/search_query.py +0 -0
  254. {metalist-0.14.0 → metalist-0.16.0}/app/services/search_text.py +0 -0
  255. {metalist-0.14.0 → metalist-0.16.0}/app/services/selected_text_tag.py +0 -0
  256. {metalist-0.14.0 → metalist-0.16.0}/app/services/self_update.py +0 -0
  257. {metalist-0.14.0 → metalist-0.16.0}/app/services/session_timeout_service.py +0 -0
  258. {metalist-0.14.0 → metalist-0.16.0}/app/services/shell_session_service.py +0 -0
  259. {metalist-0.14.0 → metalist-0.16.0}/app/services/store.py +0 -0
  260. {metalist-0.14.0 → metalist-0.16.0}/app/services/sync.py +0 -0
  261. {metalist-0.14.0 → metalist-0.16.0}/app/services/sync_state.py +0 -0
  262. {metalist-0.14.0 → metalist-0.16.0}/app/services/tab_state.py +0 -0
  263. {metalist-0.14.0 → metalist-0.16.0}/app/services/tag_case.py +0 -0
  264. {metalist-0.14.0 → metalist-0.16.0}/app/services/tag_ontology.py +0 -0
  265. {metalist-0.14.0 → metalist-0.16.0}/app/services/tag_rename.py +0 -0
  266. {metalist-0.14.0 → metalist-0.16.0}/app/services/tag_term_matching.py +0 -0
  267. {metalist-0.14.0 → metalist-0.16.0}/app/services/test_reset.py +0 -0
  268. {metalist-0.14.0 → metalist-0.16.0}/app/services/tokens.py +0 -0
  269. {metalist-0.14.0 → metalist-0.16.0}/app/services/undo_state.py +0 -0
  270. {metalist-0.14.0 → metalist-0.16.0}/app/services/update_backups.py +0 -0
  271. {metalist-0.14.0 → metalist-0.16.0}/app/services/update_installer.py +0 -0
  272. {metalist-0.14.0 → metalist-0.16.0}/app/services/update_preflight.py +0 -0
  273. {metalist-0.14.0 → metalist-0.16.0}/app/services/view_cache.py +0 -0
  274. {metalist-0.14.0 → metalist-0.16.0}/app/services/view_diff.py +0 -0
  275. {metalist-0.14.0 → metalist-0.16.0}/app/services/view_state.py +0 -0
  276. {metalist-0.14.0 → metalist-0.16.0}/app/services/windows_process_control.py +0 -0
  277. {metalist-0.14.0 → metalist-0.16.0}/app/startup_console.py +0 -0
  278. {metalist-0.14.0 → metalist-0.16.0}/app/startup_environment.py +0 -0
  279. {metalist-0.14.0 → metalist-0.16.0}/app/startup_js_sanity.py +0 -0
  280. {metalist-0.14.0 → metalist-0.16.0}/app/startup_sanity.py +0 -0
  281. {metalist-0.14.0 → metalist-0.16.0}/app/startup_sanity_config.py +0 -0
  282. {metalist-0.14.0 → metalist-0.16.0}/app/static/css/floating-notes.css +0 -0
  283. {metalist-0.14.0 → metalist-0.16.0}/app/static/css/forms.css +0 -0
  284. {metalist-0.14.0 → metalist-0.16.0}/app/static/img/favicon.ico +0 -0
  285. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/locked.js +0 -0
  286. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/main.js +0 -0
  287. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/activity-tracker.js +0 -0
  288. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/ai-chat/agent-menu-actions.js +0 -0
  289. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/ai-chat/agent-retrieval-settings.js +0 -0
  290. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/ai-chat/agent-web-settings.js +0 -0
  291. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/ai-chat/ai-agent-debug-view.js +0 -0
  292. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/ai-chat/ai-chat-api.js +0 -0
  293. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/ai-chat/ai-chat-message-placement.js +0 -0
  294. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/ai-chat/ai-chat-panel-controller.js +0 -0
  295. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/ai-chat/ai-chat-panel-service.js +0 -0
  296. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/ai-chat/ai-thinking-level-service.js +0 -0
  297. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/ai-chat/bulk-elapsed-clock.js +0 -0
  298. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/ai-chat/bulk-proposal-ui.js +0 -0
  299. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/ai-chat/bulk-scope-question.js +0 -0
  300. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/ai-chat/cloud-privacy-policy.js +0 -0
  301. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/ai-chat/confirmation-card.js +0 -0
  302. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/ai-chat/confirmation-question.js +0 -0
  303. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/ai-chat/summary-batch-preview.js +0 -0
  304. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/api-error-diagnostics.js +0 -0
  305. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/api-failure-classification-service.js +0 -0
  306. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/app-update-service.js +0 -0
  307. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/application-state.js +0 -0
  308. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/async-result.js +0 -0
  309. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/client-state-api.js +0 -0
  310. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/client-state-migration.js +0 -0
  311. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/command-palette/activation-auth-policy.js +0 -0
  312. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/command-palette/backup-command-availability.js +0 -0
  313. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/command-palette/click-activation-service.js +0 -0
  314. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/command-palette/note-layout-preferences.js +0 -0
  315. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/command-palette/preferences-store.js +0 -0
  316. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/command-palette/tag-config-loader.js +0 -0
  317. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/command-palette/usage-store.js +0 -0
  318. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/connectivity-monitor.js +0 -0
  319. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/context-menu/context-menu-target-service.js +0 -0
  320. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/context-menu/input-caret-service.js +0 -0
  321. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/disconnect-editing-state-service.js +0 -0
  322. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/dom-utils-fixed.js +0 -0
  323. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/dom-utils.js +0 -0
  324. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/editor-commands.js +0 -0
  325. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/editor-selection.js +0 -0
  326. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/editor-toolbar.js +0 -0
  327. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/elapsed-time.js +0 -0
  328. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/error-handler.js +0 -0
  329. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/error-overlay.js +0 -0
  330. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/excalidraw/excalidraw-actions.js +0 -0
  331. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/excalidraw/excalidraw-autosave.js +0 -0
  332. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/excalidraw/excalidraw-editor-service.js +0 -0
  333. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/excalidraw/excalidraw-editor-state.js +0 -0
  334. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/excalidraw/excalidraw-loader.js +0 -0
  335. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/excalidraw/excalidraw-preview-service.js +0 -0
  336. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/excalidraw/excalidraw-scene.js +0 -0
  337. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/expected-errors.js +0 -0
  338. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/location-flags.js +0 -0
  339. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/maintenance.js +0 -0
  340. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/modals/ai-agent-settings-modal.js +0 -0
  341. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/modals/alphabetize-root-notes-modal.js +0 -0
  342. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/modals/backup-restore-modal.js +0 -0
  343. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/modals/backup-result-modal.js +0 -0
  344. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/modals/backup-retention-modal.js +0 -0
  345. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/modals/backup-settings-modal.js +0 -0
  346. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/modals/base-modal.js +0 -0
  347. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/modals/confirmation-modal.js +0 -0
  348. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/modals/delete-namespace-modal.js +0 -0
  349. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/modals/delete-namespace-validation.js +0 -0
  350. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/modals/dictation-settings-modal.js +0 -0
  351. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/modals/link-title-retry-modal.js +0 -0
  352. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/modals/namespace-ports-profile.js +0 -0
  353. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/modals/namespace-rename-validation.js +0 -0
  354. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/modals/note-layout-appearance-modal.js +0 -0
  355. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/modals/ontology-modal.js +0 -0
  356. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/modals/prioritize-modal.js +0 -0
  357. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/modals/random-password-modal.js +0 -0
  358. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/modals/reset-updated-at-modal.js +0 -0
  359. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/modals/search-suggestion-statistics-modal.js +0 -0
  360. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/modals/session-timeout-modal.js +0 -0
  361. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/modals/version-info-modal.js +0 -0
  362. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/modals/visual-cues-modal.js +0 -0
  363. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/actions/content-actions.js +0 -0
  364. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/actions/history-actions.js +0 -0
  365. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/actions/search-actions.js +0 -0
  366. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/actions/selection-actions.js +0 -0
  367. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/events/focus-events.js +0 -0
  368. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/events/inactivity-events.js +0 -0
  369. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/events/input-events.js +0 -0
  370. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/events/search-events.js +0 -0
  371. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/mode-logger.js +0 -0
  372. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/add-style-service.js +0 -0
  373. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/animated-scroll-service.js +0 -0
  374. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/backlinks-navigation-service.js +0 -0
  375. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/backlinks-panel-service.js +0 -0
  376. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/clipboard-shortcut-policy-service.js +0 -0
  377. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/collapse-affordance-service.js +0 -0
  378. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/collapse-editing-policy-service.js +0 -0
  379. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/command-gate-service.js +0 -0
  380. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/context-menu-target-service.js +0 -0
  381. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/deselect-selection-state-service.js +0 -0
  382. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/dictation-note-paste.js +0 -0
  383. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/dictation-paste-padding.js +0 -0
  384. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/dictation-paste-service.js +0 -0
  385. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/differential-view-service.js +0 -0
  386. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/dropped-file-preview-service.js +0 -0
  387. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/edit-session-collapse-policy-service.js +0 -0
  388. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/edit-session-collapse-service.js +0 -0
  389. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/embedded-image-service.js +0 -0
  390. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/file-drop-policy-service.js +0 -0
  391. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/file-image-preview-service.js +0 -0
  392. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/file-reference-service.js +0 -0
  393. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/filtered-refresh-selection-service.js +0 -0
  394. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/floating-note-dom.js +0 -0
  395. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/floating-note-layout.js +0 -0
  396. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/floating-note-service.js +0 -0
  397. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/footnote-navigation-service.js +0 -0
  398. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/history-selection-policy-service.js +0 -0
  399. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/history-shortcut-policy-service.js +0 -0
  400. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/html-paste-sanitizer-service.js +0 -0
  401. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/image-context-menu-action-service.js +0 -0
  402. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/image-file-insert-choice-modal-service.js +0 -0
  403. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/link-context-menu-action-service.js +0 -0
  404. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/link-title-prefetch-service.js +0 -0
  405. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/markdown-render-service.js +0 -0
  406. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/note-click-target-service.js +0 -0
  407. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/note-clipboard-write-service.js +0 -0
  408. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/note-collapse-animation-service.js +0 -0
  409. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/note-delete-shortcut-policy-service.js +0 -0
  410. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/note-drag-indicator-service.js +0 -0
  411. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/note-drag-service.js +0 -0
  412. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/note-reposition-animation-service.js +0 -0
  413. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/note-split-service.js +0 -0
  414. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/note-timestamp-hover-service.js +0 -0
  415. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/password-clipboard-service.js +0 -0
  416. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/polling-service.js +0 -0
  417. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/reference-source-navigation-service.js +0 -0
  418. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/remote-image-proxy-service.js +0 -0
  419. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/remove-formatting-service.js +0 -0
  420. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/root-date-separator-service.js +0 -0
  421. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/root-note-creation-service.js +0 -0
  422. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/root-sort-indicator-service.js +0 -0
  423. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/root-sort-service.js +0 -0
  424. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/scroll-anchor-service.js +0 -0
  425. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/scroll-restoration-service.js +0 -0
  426. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/search-contexts-overlay-service.js +0 -0
  427. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/search-debounce-service.js +0 -0
  428. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/search-input-service.js +0 -0
  429. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/search-interaction-service.js +0 -0
  430. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/search-redaction-reveal-service.js +0 -0
  431. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/search-suggestion-statistics-service.js +0 -0
  432. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/search-suggestion-window-labels-service.js +0 -0
  433. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/search-suggestion-windows-service.js +0 -0
  434. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/search-suggestions-service.js +0 -0
  435. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/search-syntax-service.js +0 -0
  436. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/selected-formatting-removal-service.js +0 -0
  437. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/selected-text-tag-service.js +0 -0
  438. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/shell-output-service.js +0 -0
  439. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/tab-dom-cache-service.js +0 -0
  440. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/tab-drag-service.js +0 -0
  441. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/tab-duplication-service.js +0 -0
  442. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/tab-state-service.js +0 -0
  443. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/tag-input-selection-service.js +0 -0
  444. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/tag-proposal-service.js +0 -0
  445. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/tag-suggestions-service.js +0 -0
  446. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/todo-toggle-editing-service.js +0 -0
  447. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/untagged-view-indicator-service.js +0 -0
  448. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/view-mode-search-shortcut-service.js +0 -0
  449. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/mode-manager/services/viewport-hold-service.js +0 -0
  450. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/note-html-sanitizer.js +0 -0
  451. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/password-generator.js +0 -0
  452. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/password-operation-response.js +0 -0
  453. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/password-policy.js +0 -0
  454. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/password-strength.js +0 -0
  455. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/reminder-store.js +0 -0
  456. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/reminder-surface-service.js +0 -0
  457. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/selection-markers.js +0 -0
  458. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/session-auth.js +0 -0
  459. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/tag-token.js +0 -0
  460. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/modules/uuid.js +0 -0
  461. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/namespace-deleted.js +0 -0
  462. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/namespace-renamed.js +0 -0
  463. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/vendor/dompurify-3.4.16.LICENSE.txt +0 -0
  464. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/vendor/dompurify-3.4.16.min.js +0 -0
  465. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/vendor/excalidraw-0.18.1-assets/excalidraw.css +0 -0
  466. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Assistant/Assistant-Bold.woff2 +0 -0
  467. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Assistant/Assistant-Medium.woff2 +0 -0
  468. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Assistant/Assistant-Regular.woff2 +0 -0
  469. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Assistant/Assistant-SemiBold.woff2 +0 -0
  470. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Cascadia/CascadiaCode-Regular.woff2 +0 -0
  471. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/ComicShanns/ComicShanns-Regular-279a7b317d12eb88de06167bd672b4b4.woff2 +0 -0
  472. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/ComicShanns/ComicShanns-Regular-6e066e8de2ac57ea9283adb9c24d7f0c.woff2 +0 -0
  473. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/ComicShanns/ComicShanns-Regular-dc6a8806fa96795d7b3be5026f989a17.woff2 +0 -0
  474. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/ComicShanns/ComicShanns-Regular-fcb0fc02dcbee4c9846b3e2508668039.woff2 +0 -0
  475. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-349fac6ca4700ffec595a7150a0d1e1d.woff2 +0 -0
  476. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-3f2c5db56cc93c5a6873b1361d730c16.woff2 +0 -0
  477. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-41b173a47b57366892116a575a43e2b6.woff2 +0 -0
  478. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-623ccf21b21ef6b3a0d87738f77eb071.woff2 +0 -0
  479. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2 +0 -0
  480. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-b9dcf9d2e50a1eaf42fc664b50a3fd0d.woff2 +0 -0
  481. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-be310b9bcd4f1a43f571c46df7809174.woff2 +0 -0
  482. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYE98RXi4EwSsbg.woff2 +0 -0
  483. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYEF8RXi4EwQ.woff2 +0 -0
  484. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTA3j6zbXWjgevT5.woff2 +0 -0
  485. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTQ3j6zbXWjgeg.woff2 +0 -0
  486. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTk3j6zbXWjgevT5.woff2 +0 -0
  487. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTo3j6zbXWjgevT5.woff2 +0 -0
  488. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTs3j6zbXWjgevT5.woff2 +0 -0
  489. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Virgil/Virgil-Regular.woff2 +0 -0
  490. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/vendor/excalidraw-0.18.1.LICENSE.txt +0 -0
  491. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/vendor/excalidraw-0.18.1.min.js +0 -0
  492. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/vendor/markdown-it-14.3.2.LICENSE.txt +0 -0
  493. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/vendor/markdown-it-14.3.2.min.js +0 -0
  494. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/vendor/mermaid-11.16.1.LICENSE.txt +0 -0
  495. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/vendor/mermaid-11.16.1.min.js +0 -0
  496. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/vendor/zxcvbn-4.4.2.LICENSE.txt +0 -0
  497. {metalist-0.14.0 → metalist-0.16.0}/app/static/js/vendor/zxcvbn-4.4.2.js +0 -0
  498. {metalist-0.14.0 → metalist-0.16.0}/app/static/note-html-policy.json +0 -0
  499. {metalist-0.14.0 → metalist-0.16.0}/app/templates/_logo_mark.html +0 -0
  500. {metalist-0.14.0 → metalist-0.16.0}/app/templates/base.html +0 -0
  501. {metalist-0.14.0 → metalist-0.16.0}/app/templates/locked.html +0 -0
  502. {metalist-0.14.0 → metalist-0.16.0}/app/templates/maintenance.html +0 -0
  503. {metalist-0.14.0 → metalist-0.16.0}/app/templates/namespace_deleted.html +0 -0
  504. {metalist-0.14.0 → metalist-0.16.0}/app/templates/namespace_renamed.html +0 -0
  505. {metalist-0.14.0 → metalist-0.16.0}/app/templates/notes_list.html +0 -0
  506. {metalist-0.14.0 → metalist-0.16.0}/app/upload_limits.py +0 -0
  507. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/__init__.py +0 -0
  508. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/add_selected_text_tag.py +0 -0
  509. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/alphabetize_root_notes.py +0 -0
  510. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/base.py +0 -0
  511. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/bulk_tag_proposals.py +0 -0
  512. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/collapse.py +0 -0
  513. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/copy_note.py +0 -0
  514. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/create_child.py +0 -0
  515. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/create_file_preview_child.py +0 -0
  516. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/create_note.py +0 -0
  517. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/create_sibling.py +0 -0
  518. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/delete_subtree.py +0 -0
  519. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/delete_tag.py +0 -0
  520. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/expand.py +0 -0
  521. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/file_edit_session.py +0 -0
  522. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/indent.py +0 -0
  523. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/lock.py +0 -0
  524. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/move.py +0 -0
  525. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/outdent.py +0 -0
  526. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/paste_child.py +0 -0
  527. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/paste_sibling.py +0 -0
  528. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/prefetch_link_titles.py +0 -0
  529. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/prioritize.py +0 -0
  530. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/redo.py +0 -0
  531. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/rename_tag.py +0 -0
  532. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/reset_updated_at.py +0 -0
  533. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/resize_image.py +0 -0
  534. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/run_shell.py +0 -0
  535. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/search_comment_autofill.py +0 -0
  536. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/search_context_tags.py +0 -0
  537. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/set_collapse_bulk.py +0 -0
  538. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/set_collapse_in_context.py +0 -0
  539. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/split_note.py +0 -0
  540. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/tag_proposals.py +0 -0
  541. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/toggle_reference_mode.py +0 -0
  542. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/toggle_todo_done.py +0 -0
  543. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/undo.py +0 -0
  544. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/unformat_content.py +0 -0
  545. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/update_content.py +0 -0
  546. {metalist-0.14.0 → metalist-0.16.0}/app/usecases/view.py +0 -0
  547. {metalist-0.14.0 → metalist-0.16.0}/app/utils/__init__.py +0 -0
  548. {metalist-0.14.0 → metalist-0.16.0}/app/utils/encryption.py +0 -0
  549. {metalist-0.14.0 → metalist-0.16.0}/app/utils/text_utils.py +0 -0
  550. {metalist-0.14.0 → metalist-0.16.0}/convert-from-legacy.py +0 -0
  551. {metalist-0.14.0 → metalist-0.16.0}/main.py +0 -0
  552. {metalist-0.14.0 → metalist-0.16.0}/metalist.egg-info/dependency_links.txt +0 -0
  553. {metalist-0.14.0 → metalist-0.16.0}/metalist.egg-info/entry_points.txt +0 -0
  554. {metalist-0.14.0 → metalist-0.16.0}/metalist.egg-info/top_level.txt +0 -0
  555. {metalist-0.14.0 → metalist-0.16.0}/scripts/generate-lan-cert.sh +0 -0
  556. {metalist-0.14.0 → metalist-0.16.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: metalist
3
- Version: 0.14.0
3
+ Version: 0.16.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://github.com/evolvingstuff/metalist
6
6
  Project-URL: Repository, https://github.com/evolvingstuff/metalist
@@ -20,6 +20,7 @@ Requires-Dist: nh3==0.3.6
20
20
  Requires-Dist: openai==2.54.0
21
21
  Requires-Dist: pillow==12.3.0
22
22
  Requires-Dist: pydantic==2.13.4
23
+ Requires-Dist: pygments==2.20.0
23
24
  Requires-Dist: pypdf==6.19.0
24
25
  Requires-Dist: python-dotenv==1.2.2
25
26
  Requires-Dist: python-multipart==0.0.32
@@ -50,6 +51,23 @@ A minimalist single-user note-taking app focused on server-side rendering (SSR),
50
51
  - Multi-tab search contexts with server-persisted scroll/search state (survives browser restarts)
51
52
  - Manual namespace backups/restores to a user-selected backup folder with retention controls
52
53
 
54
+ ## Changes in 0.16.0
55
+
56
+ - Right-clicking outside any note opens a fuller menu: Add/Paste Note at Top, Undo, Redo, Go to Top, Go to Bottom, Fully Expand/Collapse All, View (All or Untagged notes), Sort by, Show (Chat, Tabs, Tags in List), Theme (System, Light, Dark), New Tab, Open/Switch Namespace, Reminders, Export View as HTML and Log Out. The current choices are ticked.
57
+ - The note menu is grouped: Copy Note, Paste, Add, Move, Outline, Focus, Export, the editing actions, and Delete Note last. Keyboard shortcuts show on the right of both menus, and actions that cannot happen from that note are hidden.
58
+ - Move to Bottom (in Move, or ⇧⌘↓) puts a note after its last sibling, or after the view's last note (the last match in a search). The view stays put: the notes above keep their place and the ones below close the gap.
59
+ - A down arrow under the up arrow goes to the bottom of the list, even when the end is not loaded yet; each arrow is dimmed when you are already at its end. Both arrows, and Focus ▸ Full Screen (now also offered while editing), save the note and leave edit mode first.
60
+ - The right-click menu closes when the pointer moves well away from it, and keys pressed in full-screen view no longer reach the list behind it.
61
+
62
+ ## Changes in 0.15.0
63
+
64
+ - Pasting JSON, a chess position (FEN), a diff, a Mermaid diagram or a LaTeX block tags the note for it as you paste: the plain tag into an empty note, `((…))` around the paste in a note that already has text. ⌘Z right after the paste removes the tag with it; ⇧⌘V pastes without detection.
65
+ - New formats: `@code=python` (or any language) highlights code, `@diff` colours diffs, `@mermaid` draws a diagram without a Markdown fence, and `@chess` draws a FEN position as a board. JSON, code and diff blocks are more compact.
66
+ - Switching namespace stays in one tab: on the login screen the panel clears as you pick and the other namespace's login screen fades in under the same logo, with no white flash. In the app, Open/Switch namespace offers Open in This Tab or Open in New Tab.
67
+ - Tag suggestions: tags used elsewhere in the tree, or named in nearby notes, no longer get a boost; only the note's own text does. A new Tag Suggestions setting can also suggest tags that a parent or the rules already apply.
68
+ - Change password with no password opens Add password, and Open/Switch namespace with only one namespace opens Create namespace. The AI tag-proposal menu items now say they are about AI-proposed tags.
69
+ - Fixed: Add reminder did nothing (a missing title now says so); a password change could end on Session locked; right-clicking math or a Mermaid diagram showed the browser's menu; the Untagged notes × needed two clicks while editing a note; indented JSON and pie charts pasted into a note showed as invalid; a tiny scrollbar beside tall math; a white stripe and logo shift on the login screen with always-visible scrollbars.
70
+
53
71
  ## Changes in 0.14.0
54
72
 
55
73
  - A new login screen: one dark screen with the MetaList logo. The namespace, password and OK fade in together; once the password is accepted, the loading progress slides in with the current step and the seconds elapsed. When the first login after an update backs up and upgrades the namespace, a note under OK says so. The Session locked page has the same look, and there is no white flash between them.
@@ -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.16.0
16
+
17
+ - Right-clicking outside any note opens a fuller menu: Add/Paste Note at Top, Undo, Redo, Go to Top, Go to Bottom, Fully Expand/Collapse All, View (All or Untagged notes), Sort by, Show (Chat, Tabs, Tags in List), Theme (System, Light, Dark), New Tab, Open/Switch Namespace, Reminders, Export View as HTML and Log Out. The current choices are ticked.
18
+ - The note menu is grouped: Copy Note, Paste, Add, Move, Outline, Focus, Export, the editing actions, and Delete Note last. Keyboard shortcuts show on the right of both menus, and actions that cannot happen from that note are hidden.
19
+ - Move to Bottom (in Move, or ⇧⌘↓) puts a note after its last sibling, or after the view's last note (the last match in a search). The view stays put: the notes above keep their place and the ones below close the gap.
20
+ - A down arrow under the up arrow goes to the bottom of the list, even when the end is not loaded yet; each arrow is dimmed when you are already at its end. Both arrows, and Focus ▸ Full Screen (now also offered while editing), save the note and leave edit mode first.
21
+ - The right-click menu closes when the pointer moves well away from it, and keys pressed in full-screen view no longer reach the list behind it.
22
+
23
+ ## Changes in 0.15.0
24
+
25
+ - Pasting JSON, a chess position (FEN), a diff, a Mermaid diagram or a LaTeX block tags the note for it as you paste: the plain tag into an empty note, `((…))` around the paste in a note that already has text. ⌘Z right after the paste removes the tag with it; ⇧⌘V pastes without detection.
26
+ - New formats: `@code=python` (or any language) highlights code, `@diff` colours diffs, `@mermaid` draws a diagram without a Markdown fence, and `@chess` draws a FEN position as a board. JSON, code and diff blocks are more compact.
27
+ - Switching namespace stays in one tab: on the login screen the panel clears as you pick and the other namespace's login screen fades in under the same logo, with no white flash. In the app, Open/Switch namespace offers Open in This Tab or Open in New Tab.
28
+ - Tag suggestions: tags used elsewhere in the tree, or named in nearby notes, no longer get a boost; only the note's own text does. A new Tag Suggestions setting can also suggest tags that a parent or the rules already apply.
29
+ - Change password with no password opens Add password, and Open/Switch namespace with only one namespace opens Create namespace. The AI tag-proposal menu items now say they are about AI-proposed tags.
30
+ - Fixed: Add reminder did nothing (a missing title now says so); a password change could end on Session locked; right-clicking math or a Mermaid diagram showed the browser's menu; the Untagged notes × needed two clicks while editing a note; indented JSON and pie charts pasted into a note showed as invalid; a tiny scrollbar beside tall math; a white stripe and logo shift on the login screen with always-visible scrollbars.
31
+
15
32
  ## Changes in 0.14.0
16
33
 
17
34
  - A new login screen: one dark screen with the MetaList logo. The namespace, password and OK fade in together; once the password is accepted, the loading progress slides in with the current step and the seconds elapsed. When the first login after an update backs up and upgrades the namespace, a note under OK says so. The Session locked page has the same look, and there is no white flash between them.
@@ -60,6 +60,7 @@ class ViewDiffRequest(TypedDict):
60
60
  visibleTopRootId: Text | None
61
61
  visibleBottomRootId: Text | None
62
62
  isUntaggedView: bool
63
+ startAtListEnd: bool
63
64
 
64
65
  @with_config(ConfigDict(strict=True))
65
66
  class UpdateTabStateRequest(TypedDict):
@@ -272,6 +273,14 @@ class MoveNoteToTopEndpointRequest(TypedDict):
272
273
  undoContext: UndoContext
273
274
  viewport: Viewport
274
275
 
276
+ @with_config(ConfigDict(strict=True))
277
+ class MoveNoteToBottomEndpointRequest(TypedDict):
278
+ search_query: Text | None
279
+ tab_id: Identifier
280
+ clientId: Identifier
281
+ undoContext: UndoContext
282
+ viewport: Viewport
283
+
275
284
  @with_config(ConfigDict(strict=True))
276
285
  class IndentNoteEndpointRequest(TypedDict):
277
286
  visible_prev_id: Text | None
@@ -38,6 +38,7 @@ from app.api.note_requests import (
38
38
  RunShellEndpointRequest,
39
39
  ToggleReferenceModeEndpointRequest,
40
40
  MoveNoteEndpointRequest,
41
+ MoveNoteToBottomEndpointRequest,
41
42
  MoveNoteToTopEndpointRequest,
42
43
  IndentNoteEndpointRequest,
43
44
  OutdentNoteEndpointRequest,
@@ -81,7 +82,7 @@ from app.usecases.tag_proposals import (
81
82
  )
82
83
  from app.usecases.delete_subtree import CmdDeleteSubtree
83
84
  from app.usecases.move import CmdMove
84
- from app.usecases.move_to_top import CmdMoveToTop
85
+ from app.usecases.move_to_top import CmdMoveToBottom, CmdMoveToTop
85
86
  from app.usecases.prioritize import CmdPrioritize
86
87
  from app.usecases.alphabetize_root_notes import CmdAlphabetizeRootNotes
87
88
  from app.usecases.reset_updated_at import CmdResetUpdatedAtToCreatedAt
@@ -138,6 +139,7 @@ from app.services.link_titles import link_title_store
138
139
  from app.services.search_index import search_index
139
140
  from app.services.dictation_cleanup import clean_dictated_paste
140
141
  from app.services.tag_suggestions import suggest_tags_for_note
142
+ from app.services.client_state_service import suggests_already_applying_tags
141
143
  from app.services.undo_state import reset_undo_stack
142
144
  from app.usecases.prioritize import list_prioritize_tag_suggestions
143
145
  from app.services.selected_text_tag import SelectedTextTagValidationError
@@ -277,6 +279,10 @@ def view_diff(payload: ViewDiffRequest):
277
279
  is_untagged_view = payload["isUntaggedView"]
278
280
  if not isinstance(is_untagged_view, bool):
279
281
  raise TypeError("isUntaggedView must be a boolean")
282
+ # Go to Bottom: load the band that ends at the view's last root.
283
+ start_at_list_end = payload["startAtListEnd"]
284
+ if not isinstance(start_at_list_end, bool):
285
+ raise TypeError("startAtListEnd must be a boolean")
280
286
  if not isinstance(tab_view_empty, bool):
281
287
  raise TypeError("tabViewEmpty must be a boolean")
282
288
 
@@ -328,6 +334,7 @@ def view_diff(payload: ViewDiffRequest):
328
334
  visible_top_root_id=visible_top_root_id,
329
335
  visible_bottom_root_id=visible_bottom_root_id,
330
336
  is_untagged_view=is_untagged_view,
337
+ start_at_list_end=start_at_list_end,
331
338
  )
332
339
  update_uuid = get_current_sync_uuid()
333
340
  root_ids = list(state.children_by_parent.get(None, []))
@@ -599,7 +606,7 @@ def dictation_paste(payload: DictationPasteRequest) -> Dict[str, object]:
599
606
 
600
607
  @router.post("/notes/tag-suggestions")
601
608
  @transactional_route
602
- def tag_suggestions(payload: TagSuggestionsRequest) -> Dict[str, object]:
609
+ def tag_suggestions(request: Request, payload: TagSuggestionsRequest) -> Dict[str, object]:
603
610
  note_id = payload["note_id"]
604
611
  anchors = payload["anchors"]
605
612
  explicit_tags = payload["explicit_tags"]
@@ -626,6 +633,7 @@ def tag_suggestions(payload: TagSuggestionsRequest) -> Dict[str, object]:
626
633
  prefix=prefix,
627
634
  content_html=content_html,
628
635
  limit=MAX_TAG_SUGGESTIONS,
636
+ include_already_applying=suggests_already_applying_tags(token=_require_bearer_token(request)),
629
637
  )
630
638
  return {"suggestions": suggestions}
631
639
 
@@ -1097,8 +1105,19 @@ def move_note_endpoint(note_id: str, body: MoveNoteEndpointRequest):
1097
1105
  @router.post("/notes/{note_id}/move-to-top")
1098
1106
  @transactional_route
1099
1107
  def move_note_to_top_endpoint(note_id: str, body: MoveNoteToTopEndpointRequest):
1108
+ return _move_note_to_edge(note_id, body, command_class=CmdMoveToTop, context="notes.move-to-top")
1109
+
1110
+
1111
+ @router.post("/notes/{note_id}/move-to-bottom")
1112
+ @transactional_route
1113
+ def move_note_to_bottom_endpoint(note_id: str, body: MoveNoteToBottomEndpointRequest):
1114
+ return _move_note_to_edge(note_id, body, command_class=CmdMoveToBottom, context="notes.move-to-bottom")
1115
+
1116
+
1117
+ def _move_note_to_edge(note_id: str, body: MoveNoteToTopEndpointRequest, *, command_class: type, context: str):
1118
+ """Move a note to the top or bottom of its siblings (of the view's roots for a root)."""
1100
1119
  viewport = _require_viewport(body)
1101
- _require_note_present(note_id, context="notes.move-to-top")
1120
+ _require_note_present(note_id, context=context)
1102
1121
 
1103
1122
  search_query = body["search_query"]
1104
1123
  normalized_search: str | None = search_query
@@ -1117,7 +1136,7 @@ def move_note_to_top_endpoint(note_id: str, body: MoveNoteToTopEndpointRequest):
1117
1136
  new_parent_id=None,
1118
1137
  )
1119
1138
 
1120
- cmd = CmdMoveToTop(
1139
+ cmd = command_class(
1121
1140
  note_id=note_id,
1122
1141
  search_query=normalized_search,
1123
1142
  client_id=body["clientId"],
@@ -5,14 +5,19 @@ from __future__ import annotations
5
5
  from starlette.requests import Request
6
6
 
7
7
  from app.api.request_auth import AUTH_COOKIE_NAME
8
+ from app.services.tokens import token_service
8
9
 
9
10
 
10
11
  def login_is_certainly_needed(request: Request) -> bool:
11
12
  """Whether a password namespace's page can open on the login screen at once,
12
13
  with no white page before the browser checks its session: a re-login was asked
13
- for (the Session locked page's Go to Login), or the browser has no session."""
14
+ for (the Session locked page's Go to Login), or the browser has no session the
15
+ server still knows (no cookie, or one from a session that has ended)."""
14
16
  if not isinstance(request, Request):
15
17
  raise TypeError("request must be a Request")
16
18
  if request.query_params.get("force_reauth") == "1":
17
19
  return True
18
- return request.cookies.get(AUTH_COOKIE_NAME) is None
20
+ cookie_token = request.cookies.get(AUTH_COOKIE_NAME)
21
+ if cookie_token is None:
22
+ return True
23
+ return not token_service.verify_token(cookie_token)
@@ -83,7 +83,7 @@ for missing bulk undo. Removing an accepted tag requires editing that note's tag
83
83
  which this chat workflow cannot do. An explanation of these limits does not itself
84
84
  request opening the proposal-management dialog.
85
85
 
86
- Manage tag proposals opens the bulk acceptance/removal form. Tagging vocabulary
86
+ Accept or reject AI-proposed tags opens the bulk acceptance/removal form. AI tagging vocabulary
87
87
  chooses existing tags only, or existing and new tags. The AI's prompts and skills
88
88
  (including the tagging instructions and these help texts) are built into MetaList
89
89
  and cannot be edited, so the AI behaves the same for everyone; instructions saved
@@ -2,7 +2,9 @@
2
2
 
3
3
  Namespaces isolate notes, preferences, tags, reminders, and authentication. A
4
4
  namespace is not a search tab. Search tabs are views within the same namespace.
5
- Switch namespace opens a picker of reachable namespaces. Create namespace opens
5
+ Open/Switch namespace opens a picker of reachable namespaces with two buttons: Open in
6
+ This Tab (switching keeps one tab) and Open in New Tab; with no other namespace
7
+ yet it opens Create namespace instead. Create namespace opens
6
8
  a name/port form. Rename current namespace opens a rename form. Delete namespace
7
9
  opens a confirmation form; do not execute deletion or imply it has happened.
8
10
  Manage namespace ports edits saved future launch profiles; saving does not launch,
@@ -53,7 +53,7 @@ fixed rules, no AI, and it only reacts to pasting: typed text is never changed.
53
53
  like an acronym (`GPT`). Each word is its own tag unless the words together match
54
54
  one of the user's tags; a new multi-word tag has to be typed.
55
55
  - **Other one-tag fields** (Edit Tag Relationships' search box, Add tag, Implied
56
- tag, Synonym tag, Rename tag; Prioritize Tag; Manage tag proposals' tag filter):
56
+ tag, Synonym tag, Rename tag; Prioritize Tag; Accept or reject AI-proposed tags' tag filter):
57
57
  the whole paste becomes one tag, "Machine learning" gives `machine-learning`.
58
58
  - **Tag relationship conditions:** existing tags and quoted text; no regular
59
59
  expressions by voice.
@@ -180,3 +180,38 @@ Other (non-meta) tags may also appear inside wrapper tokens (e.g. `{{foo bar}}`)
180
180
  - `@csv`: parses the note content as CSV and renders it as a table in view mode.
181
181
  - Invalid CSV shows a red "Invalid CSV" badge and the raw content.
182
182
  - Scoped wrappers (e.g. `((@csv))`) render only the wrapped region as a CSV table.
183
+
184
+ ## Chess meta tags
185
+ - `@chess`: reads the note content as a FEN (Forsyth–Edwards Notation) position and draws it as a chess board in view mode, White at the bottom, files a–h and ranks 1–8 labelled. Example: `rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1` is the starting position.
186
+ - Only the piece placement (the first field) is required. When the FEN has them, a caption under the board gives the side to move, the move number, castling rights and the en passant square.
187
+ - Pieces use the chess symbols of the system font, coloured white or black. Hovering a square shows its name and piece (for example "e4 white pawn").
188
+ - A FEN that does not parse shows a red "Invalid FEN" badge, what to fix, and the raw content.
189
+ - Scoped wrappers (e.g. `((@chess))`) draw a board for only the wrapped FEN, inside the surrounding text.
190
+ - One position per note or wrapper; whole games (PGN) are not supported.
191
+ - A hidden extra: typed in the tag bar, not offered in the Add Style menu.
192
+
193
+ ## Diff meta tags
194
+ - `@diff`: shows the note content as a unified diff (what `git diff` and `diff -u` print) in view mode: added lines (`+`) green, removed lines (`-`) red, section starts (`@@ -1,3 +1,3 @@`) purple, file headers (`---`, `+++`, `diff --git`) grey and bold, unchanged lines plain.
195
+ - Lines jotted by hand with only `+`/`-` marks work too; nothing needs to parse, so there is no error state.
196
+ - Scoped wrappers (e.g. `((@diff))`) colour only the wrapped region.
197
+
198
+ ## Code meta tags
199
+ - `@code=<language>`: shows the note content as source code with syntax highlighting in view mode, for example `@code=python`, `@code=javascript`, `@code=sql`. One tag for every language: any name or alias the server's highlighter (Pygments) knows works (`py`, `js`, `c++`, `c#`...), case-insensitively. The language name is shown above the code.
200
+ - An unknown language (`@code=pyhton`) shows the code plainly with an "Unknown language" badge.
201
+ - Scoped wrappers (e.g. `((@code=sql))`) highlight only the wrapped region.
202
+
203
+ ## Mermaid meta tags
204
+ - `@mermaid`: the note content is one Mermaid diagram (no Markdown fence needed), drawn in view mode like a fenced `mermaid` block under `@markdown`, in its own block. Until it is drawn, and when it is invalid (with an `Invalid Mermaid diagram` badge), the source shows as a code block.
205
+ - Scoped wrappers (e.g. `((@mermaid))`) draw only the wrapped region.
206
+
207
+ ## Paste format detection
208
+ - Pasting text in an unambiguous format tags the note for it at the moment of the paste (the tag appears in the tag bar; the text renders when the note leaves editing):
209
+ - JSON (a complete object or array) → `@json`
210
+ - a chess FEN position → `@chess`
211
+ - a unified diff (with `@@` section lines, `---`/`+++` headers, or `diff --git`) → `@diff`
212
+ - Mermaid starting with a diagram keyword (`graph TD`, `sequenceDiagram`, `gantt`...) → `@mermaid`; a fenced ```` ```mermaid ```` block → `@markdown`
213
+ - a pure LaTeX block (`$$...$$`, `\[...\]`, or `\begin{...}...\end{...}`) → `@LaTeX`
214
+ - Into an otherwise empty note (or with all of its text selected), and when pasting creates a new note, the plain tag is added. Into a note with content, the pasted text is wrapped `((...))` and `((@json))` (etc.) is added, so the existing text is untouched.
215
+ - Nothing is added for anything uncertain (prose, code, CSV, JSON-looking text that does not parse), when the note already has a renderer tag, when pasting inside an existing wrapped region, or when `((...))` is already in use in that note.
216
+ - `⌘Z` right after the paste removes the added tag together with the pasted text (one undo step, like a normal paste). `⇧⌘V` (Ctrl+Shift+V) pastes as plain text without detection.
217
+ - Implementation: `paste-format-detection-service.js` (detection and planning, tests in `tests/unit/paste_format_detection.test.mjs`), wired in `keyboard-events.js`.
@@ -19,9 +19,9 @@ Opening or dismissing the command palette does not clear undo/redo. Global actio
19
19
 
20
20
  ## Tag proposal controls
21
21
 
22
- - **Manage tag proposals** selects acceptance/removal, current context/entire namespace, and an exact case-insensitive tag filter (blank means all proposals). Apply executes directly without another confirmation, model call, or progress/cancellation modal; the normal busy spinner remains visible until completion.
23
- - **Remove all tag suggestions (current context)** asks for confirmation, then removes every pending proposal in the active search context. It uses the same atomic bulk path and requires no configuration form or model call. After confirmation, the normal busy spinner replaces the confirmation without opening a second modal.
24
- - **Tagging vocabulary** sets one categorical preference: existing tags only or allow new tags. The tagging instructions themselves are built in and cannot be edited.
22
+ - **Accept or reject AI-proposed tags** (tags the AI chat proposed, not yet accepted) selects acceptance/removal, current context/entire namespace, and an exact case-insensitive tag filter (blank means all proposals). Apply executes directly without another confirmation, model call, or progress/cancellation modal; the normal busy spinner remains visible until completion.
23
+ - **Reject all AI-proposed tags (current context)** asks for confirmation, then removes every pending proposal in the active search context. It uses the same atomic bulk path and requires no configuration form or model call. After confirmation, the normal busy spinner replaces the confirmation without opening a second modal.
24
+ - **AI tagging vocabulary** sets one categorical preference: existing tags only or allow new tags. The tagging instructions themselves are built in and cannot be edited.
25
25
  - Generate proposals by explicitly requesting them in AI chat. Generation is not a menu action.
26
26
 
27
27
  ## Semantics
@@ -63,6 +63,7 @@ Opening or dismissing the command palette does not clear undo/redo. Global actio
63
63
  - Palette preferences (`pref.*`) and command usage history are persisted per namespace in the main SQLite DB via `/api2/auth/client-state*`, not in browser `localStorage`.
64
64
  - `Animated transitions` is on by default and controls UI motion such as tag-bar edit transitions and note expand/collapse transitions.
65
65
  - `Dictation Settings` sets the spoken phrases for pasted dictated text: the phrase that starts tags in a note (`start tags`), the phrases that start and end a quote (`quote`, `end quote`), and the phrase that excludes the next search term (`minus`). Each is words of letters, 2 to 64 characters; the quote and exclusion phrases must differ. Save applies them, Escape or a click outside closes without saving.
66
+ - `Tag Suggestions` opens a settings window with one checkbox, saved immediately: `Allow suggesting tags that already apply` (off by default). On: tags a parent already has, and tags the rules imply from them, are suggested and ranked like any other tag. Off: they are left out until typed, then listed after the other matches.
66
67
  - `Visual Cues` opens one window of independent checkboxes, all on by default and saved immediately. Under Drag and drop: `Drag ghost` (a dashed outline of the dragged note and its visible children follows the pointer), `Drop indicator` (a grey landing line plus a faint outline on the note it lands beside or under), and `Direction cursor` (the mouse cursor itself becomes an up, down, indent or outdent icon for a possible move; impossible moves and the option turned off keep the usual grabbing hand). They change only what is shown; dragging works the same. Close the window with Escape or by clicking outside it.
67
68
  - `Note Layout & Appearance` stores namespace-scoped presets for top-level note size, child indentation, vertical spacing, note corners, and tag style. The defaults are `Larger`, `Standard`, `Comfortable`, `Round`, and `Pills` respectively. Note corners can be `Subtle`, `Rounded`, or `Round`; tag style shows visible note tags as outlined `Pills` or `Plain text` in both themes.
68
69
  - `Search suggestion stats & settings` is the single suggestion-personalization control surface. Its ordered 1–365 day slots and default-on time-window-label and one-credit-per-note-per-search-context toggles save immediately when changed. The modal also displays retained daily tag-credit statistics and provides the confirmed activity reset. An empty slot list disables personalization; the default slots are 1, 7, and 30 days.
@@ -89,7 +90,8 @@ Opening or dismissing the command palette does not clear undo/redo. Global actio
89
90
  - `Note Layout & Appearance`: previews and saves the note hierarchy presets. Search terms include `layout`, `appearance`, `font`, `size`, `spacing`, `indentation`, and `hierarchy`.
90
91
  - `Search suggestion stats & settings`: combines ordered personalized-window editing, promoted-suggestion label visibility, default-on per-context note-credit suppression, retained daily tag-credit statistics, and confirmed activity reset. It does not collect search text or note content.
91
92
  - `AI Agent Settings`: configures the OpenAI API key, model, cloud privacy policy, evidence-token limit, and tagging batch size. Model and thinking level are also selected beside chat Send. See `docs/ui/ai-chat.md`.
92
- - `Switch namespace`: opens a simple namespace picker, leaves the current namespace tab open, and opens the selected non-current namespace in a new browser tab. A running namespace with an unchanged launch profile keeps its process and warm cache; stopped namespaces launch, and changed port profiles restart the target. Each namespace still permits only one active browser tab/session.
93
+ - `Open/Switch namespace`: opens a simple namespace picker with two buttons. `Open in This Tab` loads the selected non-current namespace in the same tab, on its login screen, so switching back and forth keeps one tab (Back returns to the previous namespace). `Open in New Tab` opens it in a new browser tab and leaves the current tab as it is. With no other namespace yet, it opens Create namespace instead.
94
+ Either way, a running namespace with an unchanged launch profile keeps its process and warm cache; stopped namespaces launch, and changed port profiles restart the target. Each namespace still permits only one active browser tab/session.
93
95
  - `Create namespace`: opens a namespace creation modal with defaulted HTTP / HTTPS ports that skip both saved MetaList reservations and ports with active OS listeners, saves the profile, launches the namespace, and opens it. Launch-time port races fail without terminating the process that owns the port. Running namespace servers revalidate their on-disk namespace identity every five seconds and terminate themselves if their database or launch profile disappears.
94
96
  - `Manage namespace ports`: opens a table of saved launch profiles from each namespace's main DB; saving this table only updates future launch profiles and does not switch tabs, launch namespaces, or restart the current process. Current-namespace port edits apply on the next MetaList launch.
95
97
  - `Delete namespace`: asks which namespace to delete, then opens a destructive confirmation view for that target. The confirm button is red and the user must type the namespace name. Deletion never requires the namespace password, so an inaccessible encrypted namespace can still be removed. Deleting the active namespace moves the tab to a dedicated namespace-removal status page; deleting an inactive namespace stays in the current tab and reports completion in the modal.
@@ -26,6 +26,7 @@ Sources: docs/ui/controls.md
26
26
  | `⌘ + ↑` | Move current note up (one visible sibling) |
27
27
  | `⇧ + ⌘ + ↑` | Move the selected root note to the top of the current root view (including filtered/search views), or move a child note to the top of its siblings |
28
28
  | `⌘ + ↓` | Move current note down (one visible sibling) |
29
+ | `⇧ + ⌘ + ↓` | Move the selected note to the bottom (a child after its last sibling; a root after the view's last root, or last match in a search). The view stays put; editing ends with the note saved. |
29
30
  | `⌘ + C` | Copy selection (default), or copy whole note when no selection |
30
31
  | `⌘ + R` | Paste embedded reference from the most recently copied note UUID |
31
32
  | `⌘ + S` | Split note at selection/caret into sibling notes; selected segment becomes its own note |
@@ -148,7 +149,7 @@ On macOS, `⌘ + Y` normally opens Safari History rather than performing native
148
149
  |--------|--------|
149
150
  | Click `+` button | Add new note at top |
150
151
  | Click menu (`≡`) button | Open command palette |
151
- | Click `↑` button | Scroll the page to the top. |
152
+ | Click `↑` / `↓` button | Go to the top / bottom of the list (bottom: the last note's bottom at the window's bottom); dimmed at that end. While editing, first saves and leaves edit mode. Unloaded notes are loaded by rebuilding the view at that end. |
152
153
  | Click note arrow | Toggle collapse/expand note. If the arrow is within the current edited note subtree, that edit session remains active; outside that subtree, the current edit saves/exits first. |
153
154
  | Click `⋮` under the edited note's tag bar | Expand that collapsed parent note to reveal its hidden children. |
154
155
  | Click note or blank space inside its outer card | Edit/select that note. Parent-note whitespace still counts as the parent until you click into a child note/card. What you clicked stays under the pointer while the note switches to its editable source, and the caret goes there: on the clicked text when it appears in the source (also when the source adds markup around it, such as `- ` list markers or `#` heading marks); on a Mermaid diagram box, at that box's label in the diagram source, with that source line under the pointer; elsewhere on a Mermaid diagram, at the start of its ```` ```mermaid ```` source, which starts where the diagram did; on a rendered LaTeX formula, at the start of its TeX source, which goes where the formula was. CSV rows, JSON keys and Markdown table rows map through their text. Leaving edit mode with the caret inside a formula's source keeps the rendered formula where that source was. |
@@ -162,17 +163,17 @@ On macOS, `⌘ + Y` normally opens Safari History rather than performing native
162
163
  | Click the tag bar while editing | Focus the tag input without re-selecting the note shell. Mouse or keyboard focus adds a soft focus ring and, when Animated Transitions is enabled, a single subtle outward halo. |
163
164
  | Click a Grammarly suggestion card | Keep the current note in edit mode while the assistant applies the correction. A subsequent ordinary outside click or `Escape` saves and exits as usual. |
164
165
  | Double-click a tag in the search input or tag bar | Select the complete tag, including prefixes and internal punctuation (`foo-bar`, `@red`), without surrounding whitespace. Scoped groups select only the individual tag. Quoted search text and tag-bar comments keep native word selection. |
165
- | Drag note body (while not editing) | Reorder among visible siblings based on vertical drop position (overshooting below the lowest sibling moves the note to the end of its siblings, and above the first sibling to the start; it never leaves its parent), or indent/outdent on horizontal drags. Once movement crosses the drag threshold, releasing back over the source note does not count as a click. While dragging, a dashed grey ghost of the note and its visible children follows the pointer on the drag's axis (vertical for reordering, horizontal for indent/outdent) and only within legal moves: between the first and lowest sibling, one level in under the note above, or one level out to the parent. A grey line marks where the note will land, with a faint outline on the note it lands beside or under; when a release would change nothing the ghost turns lighter and no line shows. The mouse cursor itself changes to name the action: an up or down arrow (the Move Note to Top icon and its mirror) for reordering, or indent/outdent icons for horizontal drags. A move that is not possible from there (dragging the first note up, indenting with nothing above to nest under, outdenting a root note) shows no icon, only the plain grabbing hand. The note lands where the drop line showed: its top on the line when moved up, its bottom on it when moved down, and the page does not scroll, whether the note is short or taller than the window. Only when that edge would land behind the search bar does the page scroll, just enough to put the note right below the bar with no extra space. Each of the three (ghost, drop indicator, direction cursor) can be turned on or off in the command palette's `Visual Cues` window; all are on by default and none changes the notes themselves. |
166
+ | Drag note body (while not editing) | Reorder among visible siblings based on vertical drop position (overshooting below the lowest sibling moves the note to the end of its siblings, and above the first sibling to the start; it never leaves its parent), or indent/outdent on horizontal drags. Once movement crosses the drag threshold, releasing back over the source note does not count as a click. While dragging, a dashed grey ghost of the note and its visible children follows the pointer on the drag's axis (vertical for reordering, horizontal for indent/outdent) and only within legal moves: between the first and lowest sibling, one level in under the note above, or one level out to the parent. A grey line marks where the note will land, with a faint outline on the note it lands beside or under; when a release would change nothing the ghost turns lighter and no line shows. The mouse cursor itself changes to name the action: an up or down arrow (the Move to Top icon and its mirror) for reordering, or indent/outdent icons for horizontal drags. A move that is not possible from there (dragging the first note up, indenting with nothing above to nest under, outdenting a root note) shows no icon, only the plain grabbing hand. The note lands where the drop line showed: its top on the line when moved up, its bottom on it when moved down, and the page does not scroll, whether the note is short or taller than the window. Only when that edge would land behind the search bar does the page scroll, just enough to put the note right below the bar with no extra space. Each of the three (ghost, drop indicator, direction cursor) can be turned on or off in the command palette's `Visual Cues` window; all are on by default and none changes the notes themselves. |
166
167
  | Drag-select text in note | Available only in edit mode; releasing mouse outside note keeps edit mode + selection |
167
168
  | Right-click external link | Open a link-only context menu with `Copy Link` and `Open Link in New Tab`. Note actions are hidden for link targets. |
168
- | Right-click note | Open the note context menu (`Copy Note`, `View Full Screen`, `Paste Sibling Note`, `Paste Child Note`, `Paste Sibling Reference`, `Paste Child Reference`, `Add Sibling Note`, `Add Child Note`, `Delete Note`, `Move Note to Top`, `Fully Expand Note`, `Fully Collapse Note`, `Export Note as HTML`, `Export View as HTML`). Fully expanding/collapsing applies recursively to the selected note and all descendants, including descendants hidden by collapsed ancestors. A dark, non-interactive footer at the bottom always shows the note's locally formatted `Created` and `Updated` date/times. `View Full Screen` is available only outside edit mode; it renders the selected note edge-to-edge with its complete descendant subtree but without ancestors, hides the menu and scroll-to-top controls, and closes with the upper-right `×` or `Esc`. While actively editing that note, `Add Style` opens a connected formatting flyout and `Remove Formatting` performs the same operation as `Cmd/Ctrl+U`. Paste actions appear only when a note has been copied. |
169
- | Open in Floating Window (note menu) | Open that note and its complete descendant subtree in a read-only floating window. The title shows a ↗ reference link that opens the source note in ML3; password titles stay masked. Open multiple windows, drag the title-bar grip or empty space, and resize using the bottom-right handle (or focus the handle and use arrow keys). Windows stay fixed while the background scrolls and survive searches and ML3 tab changes. Saved changes appear live. Links, password/username copying, copyable text, and file downloads remain interactive; note references open another floating window. Close with × or Escape while focused. Windows close on page reload, logout, or namespace navigation. |
170
- | Right-click selected note text | Open the note context menu with `Copy` for the selected text instead of `Copy Note`; while editing, `Add Style` scopes the chosen formatting tag to that range and `Remove Formatting` removes formatting only from that range. |
169
+ | Right-click note | Open the note menu: what you clicked (image, diagram or reference actions) first; `Copy Note`; `Paste ▸` (sibling/child note and reference, once a note is copied); `Add ▸` (sibling, child, and `Add Note at Top` outside edit mode); `Move ▸` (`Move to Top`, `Move Up`, `Move Down`, `Move to Bottom`); `Outline ▸` (`Fully Expand`, `Fully Collapse` for notes with children; `Indent`, `Outdent`); `Focus ▸` (`Full Screen`, `Floating Window`); `Export ▸` (note or view as HTML); while editing `Add Style`, `Remove Formatting`, `Add Excalidraw Diagram`; `Delete Note` last; a footer with Created/Updated times. Actions that cannot happen from that note are hidden (root moves too while a sort order is active); a group with one action shows it in place. Shortcuts show on the right. Moves act on the clicked note, saving another edited note first. Full Screen shows the note and its whole subtree edge-to-edge (no ancestors); from edit mode it first leaves edit mode as `Esc` would; close with `×` or `Esc`. |
170
+ | Focus ▸ Floating Window (note menu) | Open that note and its complete descendant subtree in a read-only floating window. The title shows a ↗ reference link that opens the source note in ML3; password titles stay masked. Open multiple windows, drag the title-bar grip or empty space, and resize using the bottom-right handle (or focus the handle and use arrow keys). Windows stay fixed while the background scrolls and survive searches and ML3 tab changes. Saved changes appear live. Links, password/username copying, copyable text, and file downloads remain interactive; note references open another floating window. Close with × or Escape while focused. Windows close on page reload, logout, or namespace navigation. |
171
+ | Right-click selected note text | Open the note menu with `Copy` and `Add as Tag` for the selected text instead of `Copy Note`; while editing, `Add Style` scopes the chosen formatting tag to that range and `Remove Formatting` removes formatting only from that range. |
171
172
  | Right-click image in note | Adds image actions to the note context menu: `Copy Image`, `Save Image`, `Zoom Image`, `Open Image in New Tab` |
172
173
  | Right-click anywhere in a completed AI response bubble (including padding and links) | Choose `Copy Response` to place its raw Markdown on the MetaList note clipboard with `@markdown @llm`, while also writing rendered HTML and raw Markdown to the system clipboard. It can be pasted as a note but not as a reference until inserted. |
173
- | Right-click notes view background | Outside edit mode, open the view context menu with dynamic `Show/Hide Tabs`, `Show/Hide AI Chat`, `Show/Hide Tags in List`, a `Sort by` submenu, and `Export View as HTML` actions |
174
+ | Right-click notes view background | Open the view menu: outside edit mode `Add Note at Top`, `Paste Note at Top` (once a note is copied), `Undo`, `Redo`; `Go to Top`, `Go to Bottom` (unless at that end), `Fully Expand All`, `Fully Collapse All`; `View ▸` (All / Untagged notes), `Sort by ▸`, `Show ▸` (Chat, Tabs, Tags in List), `Theme ▸` (System, Light, Dark), each ticking the current choice; `New Tab`, `Open/Switch Namespace…`, `Reminders…`; `Export View as HTML`; `Log Out`. Shortcuts show on the right; items that do not apply are hidden. |
174
175
  | Right-click tag in search input, tag bar, or their suggestion lists | Open tag context menu (Edit Tag Relationships). If a note is being edited, it is saved and the view refresh completes first, restoring view-only rendering such as cached URL titles. |
175
- | Right-click left or right lane | Open the same view menu: show/hide tabs, AI chat, or note-list tags, choose a sort mode, or export the current view as HTML |
176
+ | Right-click left or right lane | Open the same view menu |
176
177
  | Hover left side of search bar | Show the tab/search-context overlay |
177
178
  | Hover/click search input | Hide the tab/search-context overlay |
178
179
 
@@ -200,7 +201,7 @@ On macOS, `⌘ + Y` normally opens Safari History rather than performing native
200
201
 
201
202
  > Note: On Windows/Linux, use `Ctrl` instead of `⌘` (Command)
202
203
 
203
- App menus close with `Escape` or an outside click. Every modal has a standard upper-right circular `×` matching full-screen note view and also closes with `Escape` or an outside click. Dismiss-only footer `Close`/`OK` buttons are omitted; `Enter` still submits a modal's declared primary workflow action.
204
+ App menus close with `Escape` or an outside click. The right-click menu also closes once the pointer moves about 28px away from it and any open submenu, like the tab overlay; small movements just past its edge keep it open. Every modal has a standard upper-right circular `×` matching full-screen note view and also closes with `Escape` or an outside click. Dismiss-only footer `Close`/`OK` buttons are omitted; `Enter` still submits a modal's declared primary workflow action.
204
205
 
205
206
  When `Show tags in list` is enabled, the grey right-aligned tag column wraps and is capped at 25% of its note row so note content retains the majority of the available width.
206
207
 
@@ -120,7 +120,8 @@ current loading step and the seconds elapsed. When a database upgrade is due,
120
120
  that login takes longer. "Session locked" means the session moved to another tab
121
121
  or device; Go to Login opens the login screen.
122
122
 
123
- The Add password, Change password, and Remove password menus open forms. Opening
123
+ The Add password, Change password, and Remove password menus open forms. Change
124
+ password in a namespace with no password opens the Add password form. Opening
124
125
  is not submitting. An encryption explanation alone does not request a form or a
125
126
  password change. Never ask for an actual password or API key in chat.
126
127
 
@@ -5,6 +5,23 @@ README. Changes made after the newest listed version are not described here.
5
5
  Compare with installed_version from the help lookup to tell the user whether
6
6
  they already have a release. Version info offers updates (see the data topic).
7
7
 
8
+ ## 0.16.0
9
+
10
+ - Right-clicking outside any note opens a fuller menu: Add/Paste Note at Top, Undo, Redo, Go to Top, Go to Bottom, Fully Expand/Collapse All, View (All or Untagged notes), Sort by, Show (Chat, Tabs, Tags in List), Theme (System, Light, Dark), New Tab, Open/Switch Namespace, Reminders, Export View as HTML and Log Out. The current choices are ticked.
11
+ - The note menu is grouped: Copy Note, Paste, Add, Move, Outline, Focus, Export, the editing actions, and Delete Note last. Keyboard shortcuts show on the right of both menus, and actions that cannot happen from that note are hidden.
12
+ - Move to Bottom (in Move, or ⇧⌘↓) puts a note after its last sibling, or after the view's last note (the last match in a search). The view stays put: the notes above keep their place and the ones below close the gap.
13
+ - A down arrow under the up arrow goes to the bottom of the list, even when the end is not loaded yet; each arrow is dimmed when you are already at its end. Both arrows, and Focus ▸ Full Screen (now also offered while editing), save the note and leave edit mode first.
14
+ - The right-click menu closes when the pointer moves well away from it, and keys pressed in full-screen view no longer reach the list behind it.
15
+
16
+ ## 0.15.0
17
+
18
+ - Pasting JSON, a chess position (FEN), a diff, a Mermaid diagram or a LaTeX block tags the note for it as you paste: the plain tag into an empty note, `((…))` around the paste in a note that already has text. ⌘Z right after the paste removes the tag with it; ⇧⌘V pastes without detection.
19
+ - New formats: `@code=python` (or any language) highlights code, `@diff` colours diffs, `@mermaid` draws a diagram without a Markdown fence, and `@chess` draws a FEN position as a board. JSON, code and diff blocks are more compact.
20
+ - Switching namespace stays in one tab: on the login screen the panel clears as you pick and the other namespace's login screen fades in under the same logo, with no white flash. In the app, Open/Switch namespace offers Open in This Tab or Open in New Tab.
21
+ - Tag suggestions: tags used elsewhere in the tree, or named in nearby notes, no longer get a boost; only the note's own text does. A new Tag Suggestions setting can also suggest tags that a parent or the rules already apply.
22
+ - Change password with no password opens Add password, and Open/Switch namespace with only one namespace opens Create namespace. The AI tag-proposal menu items now say they are about AI-proposed tags.
23
+ - Fixed: Add reminder did nothing (a missing title now says so); a password change could end on Session locked; right-clicking math or a Mermaid diagram showed the browser's menu; the Untagged notes × needed two clicks while editing a note; indented JSON and pie charts pasted into a note showed as invalid; a tiny scrollbar beside tall math; a white stripe and logo shift on the login screen with always-visible scrollbars.
24
+
8
25
  ## 0.14.0
9
26
 
10
27
  - A new login screen: one dark screen with the MetaList logo. The namespace, password and OK fade in together; once the password is accepted, the loading progress slides in with the current step and the seconds elapsed. When the first login after an update backs up and upgrades the namespace, a note under OK says so. The Session locked page has the same look, and there is no white flash between them.
@@ -100,6 +100,16 @@ Examples (autocorrected while typing):
100
100
  - CSV meta tags:
101
101
  - `@csv` renders note content as a CSV table; invalid CSV shows an error badge and raw text.
102
102
  - `((@csv))` renders only the wrapped content as a CSV table.
103
+ - Chess meta tags:
104
+ - `@chess` draws the note's FEN chess position as a board (White at the bottom, with a caption for side to move, move number, castling and en passant); an invalid FEN shows an error badge saying what to fix.
105
+ - `((@chess))` draws a board for only the wrapped FEN, inside the surrounding text.
106
+ - Diff meta tags:
107
+ - `@diff` colours a unified diff (git diff / diff -u): added lines green, removed red, `@@` section starts and file headers marked; `((@diff))` colours only the wrapped content.
108
+ - Mermaid meta tags:
109
+ - `@mermaid` draws the note content as one Mermaid diagram (no Markdown fence needed); `((@mermaid))` draws only the wrapped content.
110
+ - Pasting JSON, a chess FEN, a unified diff, Mermaid or a pure LaTeX block adds the matching tag at once (`@json`, `@chess`, `@diff`, `@mermaid`, `@LaTeX`): the plain tag into an otherwise empty note, `((...))` and `((@json))` into a note with content. ⌘Z right after removes it with the paste; ⇧⌘V pastes without detection.
111
+ - Code meta tags:
112
+ - `@code=<language>` (for example `@code=python`, `@code=sql`) highlights source code; any language name the highlighter knows works, and an unknown one shows an "Unknown language" badge; `((@code=python))` highlights only the wrapped content.
103
113
 
104
114
  Wrapper regions in note content are always allowed (e.g. `((foo))`), but they are only consumed/hidden in view mode when there is a matching scoped wrapper tag in the tag bar (meta tags like `{{@red}}` or regular tags like `{{foo}}`). Otherwise the wrappers remain literal text.
105
115
 
@@ -136,7 +146,7 @@ Unclosed comments behave like unclosed wrappers:
136
146
  - Tags that match phrases in the current note content and the strongest direct co-occurrence hits from the current note's explicit non-meta tags share the top slots together: the strongest content hit appears first, then the strongest co-occurrence hit, then the next content hit, and so on.
137
147
  - Within those content hits, an exact standalone tag written in the current note is prioritized ahead of synonym-expanded recommendations. This keeps a specific literal such as `suprapubic` ahead of a generic ontology representative derived from an earlier word such as `message`.
138
148
  - For blank-prefix suggestions only, if a candidate's literal content match is driven entirely by segments that are already represented in an explicit or inherited tag on the note, that candidate is suppressed as redundant. Example: with `fat.appearance` already present, content-only matches like `fat-loss` or `body-fat` do not crowd out unrelated co-occurrence suggestions such as `overindulging`.
139
- - After that, suggestions are boosted by nearby hierarchy context: explicit tags and literal content matches from the current note's descendants, nearby sibling subtree, and ancestor note content.
149
+ - Where the note sits in the tree gives no boost: tags used on its children, siblings or anywhere under its parent, and tag names written in those notes' or its ancestors' text, compete like any other tag (they are not left out). A tag on two of three children does not belong on the parent, and a sibling naming Kyoto says nothing about this note. Only the note's own text counts.
140
150
  - Remaining suggestions fall back to other notes whose effective context overlaps the current note's explicit/inherited/inferred non-meta tags, but the emitted non-meta suggestions still come only from explicit tags assigned on those notes.
141
151
  - A literal content hit on any connector-separated segment can also surface a tag, but low-signal glue segments like `and`, `no`, `of`, `the`, `to`, or `up` do not count on their own. They still participate in exact full-phrase literal matches, so content like `No Kings` can strongly promote `no-kings` even though bare `no` would not.
142
152
  - Connector-heavy tags need near-complete literal coverage before they surface from content alone: after ignoring numeric-only chunks, a tag with `k` remaining connector-separated chunks requires at least `max(1, k-1)` meaningful matches, capped by its number of meaningful non-noise chunks. Thus `gpt-6-astra` behaves like `gpt-astra`: either `GPT` or `Astra` can surface it. Decimal versions such as `5.6` are ignored in the same way. `X-Y-Z` still needs two matches and cannot surface from just `X`, `Y`, or `Z`.
@@ -150,7 +160,7 @@ Unclosed comments behave like unclosed wrappers:
150
160
  - Ontology-equivalent tags are usually collapsed to one displayed suggestion. The representative is the most-used eligible tag spelling explicitly written in tag bars, not the ontology-inferred search frequency, but prefix filtering happens first, so typing `emo` can still show `emotion` even if `mood` is the more common synonym overall. If the current note content exactly matches a synonym alias, that alias can still appear immediately after the common representative within the interleaved content/co-occurrence ordering.
151
161
  - Tags declared in ontology rules remain eligible for literal-content matching and typed-prefix completion even when they have never been explicitly assigned to a note. With a blank prefix, unrelated unused ontology tags are not added as generic fallback suggestions.
152
162
  - Tags already present explicitly in the current tag bar are never suggested.
153
- - Tags already present only via inheritance or ontology inference are suppressed unless they match the prefix. For one-character prefixes they come right after the suggestions with evidence; for longer prefixes they appear at the bottom.
163
+ - Tags already present only via inheritance or ontology inference are suppressed unless they match the prefix. For one-character prefixes they come right after the suggestions with evidence; for longer prefixes they appear at the bottom. The **Tag Suggestions** settings dialog has `Allow suggesting tags that already apply` (off by default): when on, tags a parent already has and tags the rules imply from them are ranked like any other tag. Tags written in the note's own bar are still never suggested.
154
164
  - Suggestions appear below the tag bar when there is room; if the tag bar is near the bottom, the list flips upward but keeps the same best-on-top ordering and initial scroll position.
155
165
  - The server returns at most `MAX_TAG_SUGGESTIONS` note tag suggestions; the default is 20.
156
166