MetaList 0.22.0__tar.gz → 0.24.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 (619) hide show
  1. {metalist-0.22.0/metalist.egg-info → metalist-0.24.0}/PKG-INFO +27 -2
  2. {metalist-0.22.0 → metalist-0.24.0}/README.md +25 -0
  3. {metalist-0.22.0 → metalist-0.24.0}/app/api/note_requests.py +49 -3
  4. {metalist-0.22.0 → metalist-0.24.0}/app/api/routes/ai.py +10 -1
  5. {metalist-0.22.0 → metalist-0.24.0}/app/api/routes/auth.py +2 -2
  6. {metalist-0.22.0 → metalist-0.24.0}/app/api/routes/backups.py +10 -10
  7. {metalist-0.22.0 → metalist-0.24.0}/app/api/routes/notes.py +135 -3
  8. {metalist-0.22.0 → metalist-0.24.0}/app/api/routes/ontology.py +196 -51
  9. {metalist-0.22.0 → metalist-0.24.0}/app/api/transactions.py +2 -2
  10. {metalist-0.22.0 → metalist-0.24.0}/app/db/engine.py +0 -4
  11. {metalist-0.22.0 → metalist-0.24.0}/app/main.py +15 -15
  12. {metalist-0.22.0 → metalist-0.24.0}/app/security/authenticated_logging.py +5 -3
  13. {metalist-0.22.0 → metalist-0.24.0}/app/server_runtime.py +10 -8
  14. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/agent_tools.py +2 -2
  15. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/cloud_privacy.py +50 -2
  16. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/help_catalog.py +1 -1
  17. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/note_tag_suggestions.py +10 -4
  18. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/scope.py +12 -1
  19. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skills/help-ai.md +3 -3
  20. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skills/help-data.md +15 -15
  21. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skills/help-dictation.md +3 -4
  22. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skills/help-formatting.md +3 -3
  23. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skills/help-menus.md +35 -24
  24. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skills/help-mouse.md +6 -5
  25. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skills/help-notes.md +16 -7
  26. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skills/help-ontology.md +40 -2
  27. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skills/help-privacy.md +17 -17
  28. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skills/help-references.md +11 -11
  29. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skills/help-releases.md +25 -0
  30. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skills/help-reminders.md +3 -3
  31. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skills/help-search.md +54 -4
  32. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skills/help-tags.md +19 -2
  33. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skills/tag-proposals.md +10 -0
  34. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/tagging.py +10 -6
  35. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/tagging_run.py +14 -10
  36. {metalist-0.22.0 → metalist-0.24.0}/app/services/app_updates.py +1 -1
  37. {metalist-0.22.0 → metalist-0.24.0}/app/services/auth_service.py +1 -1
  38. {metalist-0.22.0 → metalist-0.24.0}/app/services/backup_service.py +2 -2
  39. {metalist-0.22.0 → metalist-0.24.0}/app/services/bulk_operation.py +1 -1
  40. {metalist-0.22.0 → metalist-0.24.0}/app/services/content_formatting.py +7 -1
  41. {metalist-0.22.0 → metalist-0.24.0}/app/services/dictation_cleanup.py +10 -17
  42. {metalist-0.22.0 → metalist-0.24.0}/app/services/embedded_references.py +66 -5
  43. {metalist-0.22.0 → metalist-0.24.0}/app/services/file_registry.py +63 -1
  44. {metalist-0.22.0 → metalist-0.24.0}/app/services/file_storage.py +23 -1
  45. metalist-0.24.0/app/services/find_text.py +119 -0
  46. {metalist-0.22.0 → metalist-0.24.0}/app/services/html_export.py +11 -5
  47. {metalist-0.22.0 → metalist-0.24.0}/app/services/namespace_deletion_jobs.py +1 -1
  48. {metalist-0.22.0 → metalist-0.24.0}/app/services/namespace_deletion_worker.py +1 -1
  49. {metalist-0.22.0 → metalist-0.24.0}/app/services/namespace_rename_worker.py +1 -1
  50. {metalist-0.22.0 → metalist-0.24.0}/app/services/namespace_runtime_guard.py +5 -5
  51. {metalist-0.22.0 → metalist-0.24.0}/app/services/namespace_switcher.py +42 -42
  52. {metalist-0.22.0 → metalist-0.24.0}/app/services/note_store.py +66 -7
  53. {metalist-0.22.0 → metalist-0.24.0}/app/services/ontology_rules_store.py +7 -1
  54. {metalist-0.22.0 → metalist-0.24.0}/app/services/openai_credentials.py +1 -1
  55. metalist-0.24.0/app/services/root_date_filter.py +153 -0
  56. {metalist-0.22.0 → metalist-0.24.0}/app/services/root_sorting.py +32 -4
  57. {metalist-0.22.0 → metalist-0.24.0}/app/services/search_index.py +369 -4
  58. {metalist-0.22.0 → metalist-0.24.0}/app/services/search_query.py +52 -0
  59. {metalist-0.22.0 → metalist-0.24.0}/app/services/search_text.py +6 -1
  60. {metalist-0.22.0 → metalist-0.24.0}/app/services/self_update.py +2 -2
  61. {metalist-0.22.0 → metalist-0.24.0}/app/services/snapshot.py +346 -66
  62. {metalist-0.22.0 → metalist-0.24.0}/app/services/tab_state.py +174 -3
  63. {metalist-0.22.0 → metalist-0.24.0}/app/services/tag_ontology.py +196 -2
  64. metalist-0.24.0/app/services/tag_properties.py +472 -0
  65. {metalist-0.22.0 → metalist-0.24.0}/app/services/tag_rename.py +6 -3
  66. {metalist-0.22.0 → metalist-0.24.0}/app/services/update_backups.py +1 -1
  67. {metalist-0.22.0 → metalist-0.24.0}/app/services/update_preflight.py +1 -1
  68. {metalist-0.22.0 → metalist-0.24.0}/app/static/config/agent-menu-actions.json +68 -8
  69. {metalist-0.22.0 → metalist-0.24.0}/app/static/config/command_palette_tags.json +45 -5
  70. {metalist-0.22.0 → metalist-0.24.0}/app/static/css/main.css +518 -135
  71. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/proposal-menu.js +1 -1
  72. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/api-client.js +22 -0
  73. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/auth.js +5 -5
  74. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/backup-reminder-schedule.js +1 -1
  75. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/command-palette/command-palette-controller.js +119 -1
  76. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/command-palette/endpoint-registry.js +75 -12
  77. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/command-palette/tag-config-loader.js +25 -0
  78. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/config.js +2 -0
  79. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/context-menu/context-menu-registry.js +131 -21
  80. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/context-menu/context-menu-service.js +21 -0
  81. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/login-namespace-picker.js +1 -1
  82. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/ai-agent-settings-modal.js +3 -3
  83. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/backup-restore-modal.js +12 -12
  84. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/backup-result-modal.js +1 -1
  85. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/backup-settings-modal.js +5 -5
  86. metalist-0.24.0/app/static/js/modules/modals/date-range-modal.js +178 -0
  87. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/delete-namespace-modal.js +22 -22
  88. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/help-modal.js +4 -0
  89. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/memory-usage-modal.js +2 -2
  90. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/namespace-modals.js +46 -46
  91. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/note-layout-appearance-modal.js +1 -1
  92. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/ontology-modal.js +127 -67
  93. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/search-suggestion-statistics-modal.js +1 -1
  94. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/session-timeout-modal.js +1 -1
  95. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/version-info-modal.js +3 -3
  96. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/actions/ui-actions.js +5 -0
  97. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/events/context-menu-events.js +184 -21
  98. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/events/keyboard-events.js +280 -30
  99. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/events/mouse-events.js +48 -4
  100. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/events/search-events.js +31 -5
  101. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/mode-context.js +27 -0
  102. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/context-menu-target-service.js +2 -1
  103. metalist-0.24.0/app/static/js/modules/mode-manager/services/date-range-filter-service.js +173 -0
  104. metalist-0.24.0/app/static/js/modules/mode-manager/services/date-range-kinds.js +20 -0
  105. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/dictation-paste-service.js +18 -3
  106. metalist-0.24.0/app/static/js/modules/mode-manager/services/find-in-list-service.js +779 -0
  107. metalist-0.24.0/app/static/js/modules/mode-manager/services/reference-source-navigation-service.js +606 -0
  108. metalist-0.24.0/app/static/js/modules/mode-manager/services/reference-view-transition-service.js +206 -0
  109. metalist-0.24.0/app/static/js/modules/mode-manager/services/root-sort-indicator-service.js +81 -0
  110. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/root-sort-service.js +59 -26
  111. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/scroll-anchor-service.js +7 -2
  112. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/search-debounce-service.js +5 -0
  113. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/search-highlight-service.js +3 -2
  114. metalist-0.24.0/app/static/js/modules/mode-manager/services/search-input-chip-service.js +85 -0
  115. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/search-suggestions-service.js +24 -2
  116. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/search-syntax-service.js +87 -0
  117. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/tab-state-service.js +31 -4
  118. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/tag-suggestions-service.js +19 -3
  119. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/tag-syntax-service.js +158 -7
  120. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/untagged-view-indicator-service.js +3 -1
  121. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/viewport-hold-service.js +67 -8
  122. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/namespace-deleted.js +18 -18
  123. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/namespace-renamed.js +5 -5
  124. metalist-0.24.0/app/static/js/vendor/dompurify-3.4.17.min.js +7 -0
  125. {metalist-0.22.0 → metalist-0.24.0}/app/templates/base.html +1 -1
  126. {metalist-0.22.0 → metalist-0.24.0}/app/templates/index.html +65 -35
  127. {metalist-0.22.0 → metalist-0.24.0}/app/templates/namespace_deleted.html +5 -5
  128. {metalist-0.22.0 → metalist-0.24.0}/app/templates/namespace_renamed.html +1 -1
  129. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/alphabetize_root_notes.py +1 -0
  130. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/bulk_tag_proposals.py +10 -9
  131. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/move_to_top.py +1 -0
  132. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/reset_updated_at.py +1 -0
  133. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/search_context_tags.py +35 -1
  134. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/set_collapse_in_context.py +21 -0
  135. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/tag_proposals.py +82 -19
  136. {metalist-0.22.0 → metalist-0.24.0}/app/version.py +1 -1
  137. {metalist-0.22.0 → metalist-0.24.0}/main.py +6 -6
  138. {metalist-0.22.0 → metalist-0.24.0/metalist.egg-info}/PKG-INFO +27 -2
  139. {metalist-0.22.0 → metalist-0.24.0}/metalist.egg-info/SOURCES.txt +11 -2
  140. {metalist-0.22.0 → metalist-0.24.0}/metalist.egg-info/requires.txt +1 -1
  141. {metalist-0.22.0 → metalist-0.24.0}/pyproject.toml +1 -1
  142. metalist-0.22.0/app/static/js/modules/mode-manager/services/reference-source-navigation-service.js +0 -309
  143. metalist-0.22.0/app/static/js/modules/mode-manager/services/root-sort-indicator-service.js +0 -48
  144. metalist-0.22.0/app/static/js/vendor/dompurify-3.4.16.min.js +0 -7
  145. {metalist-0.22.0 → metalist-0.24.0}/MANIFEST.in +0 -0
  146. {metalist-0.22.0 → metalist-0.24.0}/app/__init__.py +0 -0
  147. {metalist-0.22.0 → metalist-0.24.0}/app/api/__init__.py +0 -0
  148. {metalist-0.22.0 → metalist-0.24.0}/app/api/deps.py +0 -0
  149. {metalist-0.22.0 → metalist-0.24.0}/app/api/dev.py +0 -0
  150. {metalist-0.22.0 → metalist-0.24.0}/app/api/middleware/auth.py +0 -0
  151. {metalist-0.22.0 → metalist-0.24.0}/app/api/request_auth.py +0 -0
  152. {metalist-0.22.0 → metalist-0.24.0}/app/api/routes/app_updates.py +0 -0
  153. {metalist-0.22.0 → metalist-0.24.0}/app/api/routes/files.py +0 -0
  154. {metalist-0.22.0 → metalist-0.24.0}/app/api/routes/reminders.py +0 -0
  155. {metalist-0.22.0 → metalist-0.24.0}/app/api/routes/remote_images.py +0 -0
  156. {metalist-0.22.0 → metalist-0.24.0}/app/api/routes/test.py +0 -0
  157. {metalist-0.22.0 → metalist-0.24.0}/app/api/upload_limits.py +0 -0
  158. {metalist-0.22.0 → metalist-0.24.0}/app/config.py +0 -0
  159. {metalist-0.22.0 → metalist-0.24.0}/app/contracts.py +0 -0
  160. {metalist-0.22.0 → metalist-0.24.0}/app/data_directory.py +0 -0
  161. {metalist-0.22.0 → metalist-0.24.0}/app/db/__init__.py +0 -0
  162. {metalist-0.22.0 → metalist-0.24.0}/app/db/backup_settings_sql.py +0 -0
  163. {metalist-0.22.0 → metalist-0.24.0}/app/db/content_migrations_sql.py +0 -0
  164. {metalist-0.22.0 → metalist-0.24.0}/app/db/editable_files_migration.py +0 -0
  165. {metalist-0.22.0 → metalist-0.24.0}/app/db/file_schema.py +0 -0
  166. {metalist-0.22.0 → metalist-0.24.0}/app/db/file_session.py +0 -0
  167. {metalist-0.22.0 → metalist-0.24.0}/app/db/files_sql.py +0 -0
  168. {metalist-0.22.0 → metalist-0.24.0}/app/db/link_titles_sql.py +0 -0
  169. {metalist-0.22.0 → metalist-0.24.0}/app/db/live_recovery.py +0 -0
  170. {metalist-0.22.0 → metalist-0.24.0}/app/db/migrations.py +0 -0
  171. {metalist-0.22.0 → metalist-0.24.0}/app/db/notes_sql.py +0 -0
  172. {metalist-0.22.0 → metalist-0.24.0}/app/db/ontology_rules_sql.py +0 -0
  173. {metalist-0.22.0 → metalist-0.24.0}/app/db/raw_connection.py +0 -0
  174. {metalist-0.22.0 → metalist-0.24.0}/app/db/reminders_sql.py +0 -0
  175. {metalist-0.22.0 → metalist-0.24.0}/app/db/retire_sounds.py +0 -0
  176. {metalist-0.22.0 → metalist-0.24.0}/app/db/schema.py +0 -0
  177. {metalist-0.22.0 → metalist-0.24.0}/app/db/search_history_sql.py +0 -0
  178. {metalist-0.22.0 → metalist-0.24.0}/app/db/session.py +0 -0
  179. {metalist-0.22.0 → metalist-0.24.0}/app/db/settings_sql.py +0 -0
  180. {metalist-0.22.0 → metalist-0.24.0}/app/db/tab_state_sql.py +0 -0
  181. {metalist-0.22.0 → metalist-0.24.0}/app/db/version.py +0 -0
  182. {metalist-0.22.0 → metalist-0.24.0}/app/encryption_audit.py +0 -0
  183. {metalist-0.22.0 → metalist-0.24.0}/app/exception_boundaries.py +0 -0
  184. {metalist-0.22.0 → metalist-0.24.0}/app/https_proxy.py +0 -0
  185. {metalist-0.22.0 → metalist-0.24.0}/app/launch_clock.py +0 -0
  186. {metalist-0.22.0 → metalist-0.24.0}/app/models/database.py +0 -0
  187. {metalist-0.22.0 → metalist-0.24.0}/app/models/utils.py +0 -0
  188. {metalist-0.22.0 → metalist-0.24.0}/app/network_settings.py +0 -0
  189. {metalist-0.22.0 → metalist-0.24.0}/app/presentation/__init__.py +0 -0
  190. {metalist-0.22.0 → metalist-0.24.0}/app/presentation/login_page.py +0 -0
  191. {metalist-0.22.0 → metalist-0.24.0}/app/presentation/render/__init__.py +0 -0
  192. {metalist-0.22.0 → metalist-0.24.0}/app/presentation/render/note_renderer.py +0 -0
  193. {metalist-0.22.0 → metalist-0.24.0}/app/presentation/templates.py +0 -0
  194. {metalist-0.22.0 → metalist-0.24.0}/app/process_memory.py +0 -0
  195. {metalist-0.22.0 → metalist-0.24.0}/app/security/crypto_sizes.py +0 -0
  196. {metalist-0.22.0 → metalist-0.24.0}/app/security/encryption.py +0 -0
  197. {metalist-0.22.0 → metalist-0.24.0}/app/security/http_error_diagnostics.py +0 -0
  198. {metalist-0.22.0 → metalist-0.24.0}/app/security/http_headers.py +0 -0
  199. {metalist-0.22.0 → metalist-0.24.0}/app/security/note_html.py +0 -0
  200. {metalist-0.22.0 → metalist-0.24.0}/app/security/rendered_html.py +0 -0
  201. {metalist-0.22.0 → metalist-0.24.0}/app/security/request_boundary.py +0 -0
  202. {metalist-0.22.0 → metalist-0.24.0}/app/security/request_hosts.py +0 -0
  203. {metalist-0.22.0 → metalist-0.24.0}/app/security/sensitive_cache.py +0 -0
  204. {metalist-0.22.0 → metalist-0.24.0}/app/security/sensitive_logging.py +0 -0
  205. {metalist-0.22.0 → metalist-0.24.0}/app/security/shell_execution.py +0 -0
  206. {metalist-0.22.0 → metalist-0.24.0}/app/security/validation_errors.py +0 -0
  207. {metalist-0.22.0 → metalist-0.24.0}/app/services/__init__.py +0 -0
  208. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/__init__.py +0 -0
  209. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/action_log.py +0 -0
  210. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/agent_loop.py +0 -0
  211. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/ai_send.py +0 -0
  212. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/citation_tokens.py +0 -0
  213. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/context.py +0 -0
  214. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/evidence_serialization.py +0 -0
  215. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/execution_errors.py +0 -0
  216. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/export_title_suggestions.py +0 -0
  217. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/failure_explanations.py +0 -0
  218. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/history.py +0 -0
  219. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/inference.py +0 -0
  220. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/investigation.py +0 -0
  221. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/judging.py +0 -0
  222. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/menu_actions.py +0 -0
  223. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/model_policy.py +0 -0
  224. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/note_aliases.py +0 -0
  225. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/openai_cost_tracking.py +0 -0
  226. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/openai_inference.py +0 -0
  227. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/openai_models.py +0 -0
  228. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/privacy_guard.py +0 -0
  229. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/prompt_settings.py +0 -0
  230. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/prompts/__init__.py +0 -0
  231. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/prompts/agent.md +0 -0
  232. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/prompts/final-response.md +0 -0
  233. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/prompts/system.md +0 -0
  234. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/release_notes.py +0 -0
  235. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/retrieval_settings.py +0 -0
  236. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/runtime.py +0 -0
  237. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skill_settings.py +0 -0
  238. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skills/__init__.py +0 -0
  239. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skills/staged-summary.md +0 -0
  240. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skills/web-browsing.md +0 -0
  241. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/staged_summary.py +0 -0
  242. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/strict_structured_outputs.py +0 -0
  243. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/structured_inference.py +0 -0
  244. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/summary_batch_store.py +0 -0
  245. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/token_estimation.py +0 -0
  246. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/tool_calling.py +0 -0
  247. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/trace.py +0 -0
  248. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/web_actions.py +0 -0
  249. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/web_capabilities.py +0 -0
  250. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/web_evidence.py +0 -0
  251. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/web_fetch.py +0 -0
  252. {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/web_settings.py +0 -0
  253. {metalist-0.22.0 → metalist-0.24.0}/app/services/ai_chat.py +0 -0
  254. {metalist-0.22.0 → metalist-0.24.0}/app/services/ai_chat_rendering.py +0 -0
  255. {metalist-0.22.0 → metalist-0.24.0}/app/services/ai_chat_stream.py +0 -0
  256. {metalist-0.22.0 → metalist-0.24.0}/app/services/ai_setup.py +0 -0
  257. {metalist-0.22.0 → metalist-0.24.0}/app/services/app_update_worker.py +0 -0
  258. {metalist-0.22.0 → metalist-0.24.0}/app/services/auth.py +0 -0
  259. {metalist-0.22.0 → metalist-0.24.0}/app/services/auth_cache_state.py +0 -0
  260. {metalist-0.22.0 → metalist-0.24.0}/app/services/backlink_index.py +0 -0
  261. {metalist-0.22.0 → metalist-0.24.0}/app/services/backlinks.py +0 -0
  262. {metalist-0.22.0 → metalist-0.24.0}/app/services/backup_settings_service.py +0 -0
  263. {metalist-0.22.0 → metalist-0.24.0}/app/services/chess_rendering.py +0 -0
  264. {metalist-0.22.0 → metalist-0.24.0}/app/services/client_state_service.py +0 -0
  265. {metalist-0.22.0 → metalist-0.24.0}/app/services/code_rendering.py +0 -0
  266. {metalist-0.22.0 → metalist-0.24.0}/app/services/content_cache.py +0 -0
  267. {metalist-0.22.0 → metalist-0.24.0}/app/services/diagnostics.py +0 -0
  268. {metalist-0.22.0 → metalist-0.24.0}/app/services/diff_rendering.py +0 -0
  269. {metalist-0.22.0 → metalist-0.24.0}/app/services/editing_image_sizes.py +0 -0
  270. {metalist-0.22.0 → metalist-0.24.0}/app/services/encryption.py +0 -0
  271. {metalist-0.22.0 → metalist-0.24.0}/app/services/exception_capture.py +0 -0
  272. {metalist-0.22.0 → metalist-0.24.0}/app/services/file_edit_sessions.py +0 -0
  273. {metalist-0.22.0 → metalist-0.24.0}/app/services/file_text_preview.py +0 -0
  274. {metalist-0.22.0 → metalist-0.24.0}/app/services/footnote_layout.py +0 -0
  275. {metalist-0.22.0 → metalist-0.24.0}/app/services/footnote_rendering.py +0 -0
  276. {metalist-0.22.0 → metalist-0.24.0}/app/services/hierarchy.py +0 -0
  277. {metalist-0.22.0 → metalist-0.24.0}/app/services/html_unformatting.py +0 -0
  278. {metalist-0.22.0 → metalist-0.24.0}/app/services/hydration_state.py +0 -0
  279. {metalist-0.22.0 → metalist-0.24.0}/app/services/image_size_formatting.py +0 -0
  280. {metalist-0.22.0 → metalist-0.24.0}/app/services/inline_image_dimensions.py +0 -0
  281. {metalist-0.22.0 → metalist-0.24.0}/app/services/inline_image_occurrences.py +0 -0
  282. {metalist-0.22.0 → metalist-0.24.0}/app/services/input_errors.py +0 -0
  283. {metalist-0.22.0 → metalist-0.24.0}/app/services/integrity.py +0 -0
  284. {metalist-0.22.0 → metalist-0.24.0}/app/services/latex_rendering.py +0 -0
  285. {metalist-0.22.0 → metalist-0.24.0}/app/services/link_title_retry.py +0 -0
  286. {metalist-0.22.0 → metalist-0.24.0}/app/services/link_titles.py +0 -0
  287. {metalist-0.22.0 → metalist-0.24.0}/app/services/login_rate_limit.py +0 -0
  288. {metalist-0.22.0 → metalist-0.24.0}/app/services/maintenance_mode.py +0 -0
  289. {metalist-0.22.0 → metalist-0.24.0}/app/services/markdown_rendering.py +0 -0
  290. {metalist-0.22.0 → metalist-0.24.0}/app/services/memory_breakdown.py +0 -0
  291. {metalist-0.22.0 → metalist-0.24.0}/app/services/memory_usage.py +0 -0
  292. {metalist-0.22.0 → metalist-0.24.0}/app/services/mermaid_note_rendering.py +0 -0
  293. {metalist-0.22.0 → metalist-0.24.0}/app/services/namespace_rename_jobs.py +0 -0
  294. {metalist-0.22.0 → metalist-0.24.0}/app/services/note_fullscreen.py +0 -0
  295. {metalist-0.22.0 → metalist-0.24.0}/app/services/note_image_tags.py +0 -0
  296. {metalist-0.22.0 → metalist-0.24.0}/app/services/note_ordering.py +0 -0
  297. {metalist-0.22.0 → metalist-0.24.0}/app/services/password_note_fields.py +0 -0
  298. {metalist-0.22.0 → metalist-0.24.0}/app/services/preference_values.py +0 -0
  299. {metalist-0.22.0 → metalist-0.24.0}/app/services/public_http.py +0 -0
  300. {metalist-0.22.0 → metalist-0.24.0}/app/services/reference_presentation.py +0 -0
  301. {metalist-0.22.0 → metalist-0.24.0}/app/services/reminders.py +0 -0
  302. {metalist-0.22.0 → metalist-0.24.0}/app/services/remote_image_proxy.py +0 -0
  303. {metalist-0.22.0 → metalist-0.24.0}/app/services/request_recovery.py +0 -0
  304. {metalist-0.22.0 → metalist-0.24.0}/app/services/reset_for_tests.py +0 -0
  305. {metalist-0.22.0 → metalist-0.24.0}/app/services/resource_limits.py +0 -0
  306. {metalist-0.22.0 → metalist-0.24.0}/app/services/runtime_generation.py +0 -0
  307. {metalist-0.22.0 → metalist-0.24.0}/app/services/runtime_hardening.py +0 -0
  308. {metalist-0.22.0 → metalist-0.24.0}/app/services/runtime_lock.py +0 -0
  309. {metalist-0.22.0 → metalist-0.24.0}/app/services/search_history.py +0 -0
  310. {metalist-0.22.0 → metalist-0.24.0}/app/services/search_history_storage.py +0 -0
  311. {metalist-0.22.0 → metalist-0.24.0}/app/services/selected_text_tag.py +0 -0
  312. {metalist-0.22.0 → metalist-0.24.0}/app/services/session_timeout_service.py +0 -0
  313. {metalist-0.22.0 → metalist-0.24.0}/app/services/shared_sets.py +0 -0
  314. {metalist-0.22.0 → metalist-0.24.0}/app/services/shell_session_service.py +0 -0
  315. {metalist-0.22.0 → metalist-0.24.0}/app/services/store.py +0 -0
  316. {metalist-0.22.0 → metalist-0.24.0}/app/services/structured_note_renderers.py +0 -0
  317. {metalist-0.22.0 → metalist-0.24.0}/app/services/sync.py +0 -0
  318. {metalist-0.22.0 → metalist-0.24.0}/app/services/tag_case.py +0 -0
  319. {metalist-0.22.0 → metalist-0.24.0}/app/services/tag_details.py +0 -0
  320. {metalist-0.22.0 → metalist-0.24.0}/app/services/tag_plural_variants.py +0 -0
  321. {metalist-0.22.0 → metalist-0.24.0}/app/services/tag_suggestion_reasons.py +0 -0
  322. {metalist-0.22.0 → metalist-0.24.0}/app/services/tag_suggestions.py +0 -0
  323. {metalist-0.22.0 → metalist-0.24.0}/app/services/tag_term_matching.py +0 -0
  324. {metalist-0.22.0 → metalist-0.24.0}/app/services/tokens.py +0 -0
  325. {metalist-0.22.0 → metalist-0.24.0}/app/services/undo_state.py +0 -0
  326. {metalist-0.22.0 → metalist-0.24.0}/app/services/update_installer.py +0 -0
  327. {metalist-0.22.0 → metalist-0.24.0}/app/services/view_cache.py +0 -0
  328. {metalist-0.22.0 → metalist-0.24.0}/app/services/view_diff.py +0 -0
  329. {metalist-0.22.0 → metalist-0.24.0}/app/services/view_state.py +0 -0
  330. {metalist-0.22.0 → metalist-0.24.0}/app/services/windows_process_control.py +0 -0
  331. {metalist-0.22.0 → metalist-0.24.0}/app/startup_console.py +0 -0
  332. {metalist-0.22.0 → metalist-0.24.0}/app/startup_environment.py +0 -0
  333. {metalist-0.22.0 → metalist-0.24.0}/app/startup_js_sanity.py +0 -0
  334. {metalist-0.22.0 → metalist-0.24.0}/app/startup_sanity.py +0 -0
  335. {metalist-0.22.0 → metalist-0.24.0}/app/startup_sanity_config.py +0 -0
  336. {metalist-0.22.0 → metalist-0.24.0}/app/startup_shockharness.py +0 -0
  337. {metalist-0.22.0 → metalist-0.24.0}/app/static/css/floating-notes.css +0 -0
  338. {metalist-0.22.0 → metalist-0.24.0}/app/static/css/forms.css +0 -0
  339. {metalist-0.22.0 → metalist-0.24.0}/app/static/img/favicon.ico +0 -0
  340. {metalist-0.22.0 → metalist-0.24.0}/app/static/img/metalist-logo-black-1024.png +0 -0
  341. {metalist-0.22.0 → metalist-0.24.0}/app/static/img/metalist-logo-black-512.png +0 -0
  342. {metalist-0.22.0 → metalist-0.24.0}/app/static/img/metalist-logo-black.svg +0 -0
  343. {metalist-0.22.0 → metalist-0.24.0}/app/static/img/metalist-logo-white-1024.png +0 -0
  344. {metalist-0.22.0 → metalist-0.24.0}/app/static/img/metalist-logo-white-512.png +0 -0
  345. {metalist-0.22.0 → metalist-0.24.0}/app/static/img/metalist-logo-white.svg +0 -0
  346. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/locked.js +0 -0
  347. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/main.js +0 -0
  348. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/activity-tracker.js +0 -0
  349. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/agent-menu-actions.js +0 -0
  350. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/agent-retrieval-settings.js +0 -0
  351. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/agent-web-settings.js +0 -0
  352. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/ai-agent-debug-view.js +0 -0
  353. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/ai-chat-api.js +0 -0
  354. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/ai-chat-message-placement.js +0 -0
  355. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/ai-chat-panel-controller.js +0 -0
  356. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/ai-chat-panel-service.js +0 -0
  357. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/ai-chat-refused-turns.js +0 -0
  358. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/ai-chat-size-limits.js +0 -0
  359. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/ai-thinking-level-service.js +0 -0
  360. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/bulk-elapsed-clock.js +0 -0
  361. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/bulk-proposal-ui.js +0 -0
  362. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/bulk-scope-question.js +0 -0
  363. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/cloud-privacy-policy.js +0 -0
  364. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/confirmation-card.js +0 -0
  365. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/confirmation-question.js +0 -0
  366. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/summary-batch-preview.js +0 -0
  367. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/api-error-diagnostics.js +0 -0
  368. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/api-failure-classification-service.js +0 -0
  369. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/app-notice-stack.js +0 -0
  370. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/app-update-service.js +0 -0
  371. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/application-state.js +0 -0
  372. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/async-result.js +0 -0
  373. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/backup-reminder-service.js +0 -0
  374. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/byte-sizes.js +0 -0
  375. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/client-state-api.js +0 -0
  376. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/client-state-migration.js +0 -0
  377. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/command-palette/activation-auth-policy.js +0 -0
  378. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/command-palette/backup-command-availability.js +0 -0
  379. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/command-palette/click-activation-service.js +0 -0
  380. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/command-palette/note-layout-preferences.js +0 -0
  381. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/command-palette/preferences-store.js +0 -0
  382. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/command-palette/usage-store.js +0 -0
  383. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/context-menu/context-menu-target-service.js +0 -0
  384. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/context-menu/input-caret-service.js +0 -0
  385. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/decimal-integer.js +0 -0
  386. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/disconnect-editing-state-service.js +0 -0
  387. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/dom-focus.js +0 -0
  388. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/dom-utils.js +0 -0
  389. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/editor-commands.js +0 -0
  390. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/editor-selection.js +0 -0
  391. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/editor-toolbar.js +0 -0
  392. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/elapsed-time.js +0 -0
  393. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/error-handler.js +0 -0
  394. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/error-overlay.js +0 -0
  395. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/excalidraw/excalidraw-actions.js +0 -0
  396. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/excalidraw/excalidraw-autosave.js +0 -0
  397. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/excalidraw/excalidraw-editor-service.js +0 -0
  398. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/excalidraw/excalidraw-editor-state.js +0 -0
  399. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/excalidraw/excalidraw-loader.js +0 -0
  400. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/excalidraw/excalidraw-preview-service.js +0 -0
  401. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/excalidraw/excalidraw-scene.js +0 -0
  402. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/expected-errors.js +0 -0
  403. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/half.js +0 -0
  404. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/html-escape.js +0 -0
  405. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/http-status.js +0 -0
  406. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/list-selection.js +0 -0
  407. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/local-date-text.js +0 -0
  408. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/location-flags.js +0 -0
  409. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/maintenance.js +0 -0
  410. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/alphabetize-root-notes-modal.js +0 -0
  411. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/base-modal.js +0 -0
  412. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/confirmation-modal.js +0 -0
  413. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/delete-namespace-validation.js +0 -0
  414. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/dictation-settings-modal.js +0 -0
  415. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/export-options-modal.js +0 -0
  416. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/link-title-retry-modal.js +0 -0
  417. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/namespace-loading-page.js +0 -0
  418. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/namespace-ports-profile.js +0 -0
  419. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/namespace-rename-validation.js +0 -0
  420. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/password-modal.js +0 -0
  421. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/prioritize-modal.js +0 -0
  422. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/random-password-modal.js +0 -0
  423. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/reminder-modal.js +0 -0
  424. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/reset-updated-at-modal.js +0 -0
  425. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/visual-cues-modal.js +0 -0
  426. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/actions/content-actions.js +0 -0
  427. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/actions/history-actions.js +0 -0
  428. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/actions/note-actions.js +0 -0
  429. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/actions/search-actions.js +0 -0
  430. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/actions/selection-actions.js +0 -0
  431. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/events/focus-events.js +0 -0
  432. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/events/inactivity-events.js +0 -0
  433. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/events/input-events.js +0 -0
  434. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/mode-logger.js +0 -0
  435. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/mode-manager-controller.js +0 -0
  436. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/add-style-service.js +0 -0
  437. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/animated-scroll-service.js +0 -0
  438. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/backlinks-navigation-service.js +0 -0
  439. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/clipboard-shortcut-policy-service.js +0 -0
  440. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/collapse-affordance-service.js +0 -0
  441. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/collapse-editing-policy-service.js +0 -0
  442. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/command-gate-service.js +0 -0
  443. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/deselect-selection-state-service.js +0 -0
  444. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/dictation-note-paste.js +0 -0
  445. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/dictation-paste-padding.js +0 -0
  446. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/differential-view-service.js +0 -0
  447. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/dropped-file-preview-service.js +0 -0
  448. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/edit-session-collapse-policy-service.js +0 -0
  449. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/edit-session-collapse-service.js +0 -0
  450. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/editing-image-size-service.js +0 -0
  451. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/embedded-image-service.js +0 -0
  452. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/export-service.js +0 -0
  453. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/export-title-service.js +0 -0
  454. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/file-drop-policy-service.js +0 -0
  455. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/file-image-preview-service.js +0 -0
  456. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/file-reference-service.js +0 -0
  457. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/filtered-refresh-selection-service.js +0 -0
  458. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/floating-note-dom.js +0 -0
  459. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/floating-note-layout.js +0 -0
  460. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/floating-note-service.js +0 -0
  461. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/footnote-navigation-service.js +0 -0
  462. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/history-selection-policy-service.js +0 -0
  463. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/history-shortcut-policy-service.js +0 -0
  464. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/html-paste-sanitizer-service.js +0 -0
  465. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/image-context-menu-action-service.js +0 -0
  466. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/image-file-insert-choice-modal-service.js +0 -0
  467. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/infinite-scroll-service.js +0 -0
  468. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/link-context-menu-action-service.js +0 -0
  469. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/link-target-service.js +0 -0
  470. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/link-title-prefetch-service.js +0 -0
  471. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/mermaid-render-service.js +0 -0
  472. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/note-click-target-service.js +0 -0
  473. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/note-clipboard-write-service.js +0 -0
  474. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/note-collapse-animation-service.js +0 -0
  475. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/note-context-menu-action-service.js +0 -0
  476. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/note-delete-shortcut-policy-service.js +0 -0
  477. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/note-drag-indicator-service.js +0 -0
  478. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/note-drag-service.js +0 -0
  479. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/note-fullscreen-service.js +0 -0
  480. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/note-reposition-animation-service.js +0 -0
  481. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/note-split-service.js +0 -0
  482. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/note-timestamp-hover-service.js +0 -0
  483. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/password-clipboard-service.js +0 -0
  484. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/paste-format-detection-service.js +0 -0
  485. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/paste-format-guess-service.js +0 -0
  486. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/paste-format-offer-service.js +0 -0
  487. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/paste-reference-here-service.js +0 -0
  488. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/polling-service.js +0 -0
  489. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/print-service.js +0 -0
  490. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/referenced-note-removal-service.js +0 -0
  491. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/remote-image-proxy-service.js +0 -0
  492. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/remove-formatting-service.js +0 -0
  493. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/right-press-focus-service.js +0 -0
  494. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/root-date-separator-service.js +0 -0
  495. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/root-note-creation-service.js +0 -0
  496. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/scroll-restoration-service.js +0 -0
  497. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/scroll-to-top-service.js +0 -0
  498. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/search-contexts-overlay-service.js +0 -0
  499. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/search-highlight-matching.js +0 -0
  500. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/search-input-service.js +0 -0
  501. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/search-interaction-service.js +0 -0
  502. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/search-redaction-reveal-service.js +0 -0
  503. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/search-suggestion-statistics-service.js +0 -0
  504. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/search-suggestion-window-labels-service.js +0 -0
  505. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/search-suggestion-windows-service.js +0 -0
  506. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/selected-formatting-removal-service.js +0 -0
  507. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/selected-text-tag-service.js +0 -0
  508. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/shell-output-service.js +0 -0
  509. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/tab-dom-cache-service.js +0 -0
  510. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/tab-drag-service.js +0 -0
  511. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/tab-duplication-service.js +0 -0
  512. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/tag-bar-service.js +0 -0
  513. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/tag-input-selection-service.js +0 -0
  514. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/tag-proposal-service.js +0 -0
  515. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/todo-toggle-editing-service.js +0 -0
  516. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/view-mode-search-shortcut-service.js +0 -0
  517. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/viewport-reference.js +0 -0
  518. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/not-found.js +0 -0
  519. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/note-html-sanitizer.js +0 -0
  520. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/password-generator.js +0 -0
  521. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/password-operation-response.js +0 -0
  522. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/password-policy.js +0 -0
  523. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/password-strength.js +0 -0
  524. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/reminder-store.js +0 -0
  525. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/reminder-surface-service.js +0 -0
  526. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/server-rendered-html.js +0 -0
  527. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/session-auth.js +0 -0
  528. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/startup-timing.js +0 -0
  529. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/tag-token.js +0 -0
  530. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/tcp-ports.js +0 -0
  531. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/time-units.js +0 -0
  532. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/url-tracking-cleaner.js +0 -0
  533. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/uuid.js +0 -0
  534. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/shockharness/contracts.d.ts +0 -0
  535. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/shockharness/contracts.js +0 -0
  536. /metalist-0.22.0/app/static/js/vendor/dompurify-3.4.16.LICENSE.txt → /metalist-0.24.0/app/static/js/vendor/dompurify-3.4.17.LICENSE.txt +0 -0
  537. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/excalidraw.css +0 -0
  538. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Assistant/Assistant-Bold.woff2 +0 -0
  539. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Assistant/Assistant-Medium.woff2 +0 -0
  540. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Assistant/Assistant-Regular.woff2 +0 -0
  541. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Assistant/Assistant-SemiBold.woff2 +0 -0
  542. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Cascadia/CascadiaCode-Regular.woff2 +0 -0
  543. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/ComicShanns/ComicShanns-Regular-279a7b317d12eb88de06167bd672b4b4.woff2 +0 -0
  544. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/ComicShanns/ComicShanns-Regular-6e066e8de2ac57ea9283adb9c24d7f0c.woff2 +0 -0
  545. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/ComicShanns/ComicShanns-Regular-dc6a8806fa96795d7b3be5026f989a17.woff2 +0 -0
  546. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/ComicShanns/ComicShanns-Regular-fcb0fc02dcbee4c9846b3e2508668039.woff2 +0 -0
  547. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-349fac6ca4700ffec595a7150a0d1e1d.woff2 +0 -0
  548. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-3f2c5db56cc93c5a6873b1361d730c16.woff2 +0 -0
  549. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-41b173a47b57366892116a575a43e2b6.woff2 +0 -0
  550. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-623ccf21b21ef6b3a0d87738f77eb071.woff2 +0 -0
  551. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2 +0 -0
  552. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-b9dcf9d2e50a1eaf42fc664b50a3fd0d.woff2 +0 -0
  553. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-be310b9bcd4f1a43f571c46df7809174.woff2 +0 -0
  554. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYE98RXi4EwSsbg.woff2 +0 -0
  555. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYEF8RXi4EwQ.woff2 +0 -0
  556. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTA3j6zbXWjgevT5.woff2 +0 -0
  557. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTQ3j6zbXWjgeg.woff2 +0 -0
  558. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTk3j6zbXWjgevT5.woff2 +0 -0
  559. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTo3j6zbXWjgevT5.woff2 +0 -0
  560. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTs3j6zbXWjgevT5.woff2 +0 -0
  561. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Virgil/Virgil-Regular.woff2 +0 -0
  562. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1.LICENSE.txt +0 -0
  563. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1.min.js +0 -0
  564. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/mermaid-11.16.1.LICENSE.txt +0 -0
  565. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/mermaid-11.16.1.min.js +0 -0
  566. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/zxcvbn-4.4.2.LICENSE.txt +0 -0
  567. {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/zxcvbn-4.4.2.js +0 -0
  568. {metalist-0.22.0 → metalist-0.24.0}/app/static/note-html-policy.json +0 -0
  569. {metalist-0.22.0 → metalist-0.24.0}/app/templates/_logo_mark.html +0 -0
  570. {metalist-0.22.0 → metalist-0.24.0}/app/templates/locked.html +0 -0
  571. {metalist-0.22.0 → metalist-0.24.0}/app/templates/maintenance.html +0 -0
  572. {metalist-0.22.0 → metalist-0.24.0}/app/templates/notes_list.html +0 -0
  573. {metalist-0.22.0 → metalist-0.24.0}/app/upload_limits.py +0 -0
  574. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/__init__.py +0 -0
  575. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/add_selected_text_tag.py +0 -0
  576. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/base.py +0 -0
  577. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/collapse.py +0 -0
  578. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/copy_note.py +0 -0
  579. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/create_child.py +0 -0
  580. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/create_file_preview_child.py +0 -0
  581. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/create_note.py +0 -0
  582. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/create_sibling.py +0 -0
  583. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/delete_subtree.py +0 -0
  584. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/delete_tag.py +0 -0
  585. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/expand.py +0 -0
  586. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/file_edit_session.py +0 -0
  587. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/indent.py +0 -0
  588. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/move.py +0 -0
  589. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/outdent.py +0 -0
  590. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/paste_child.py +0 -0
  591. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/paste_reference.py +0 -0
  592. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/paste_sibling.py +0 -0
  593. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/prefetch_link_titles.py +0 -0
  594. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/prioritize.py +0 -0
  595. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/redo.py +0 -0
  596. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/rename_tag.py +0 -0
  597. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/resize_image.py +0 -0
  598. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/run_shell.py +0 -0
  599. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/search_comment_autofill.py +0 -0
  600. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/set_collapse_bulk.py +0 -0
  601. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/split_note.py +0 -0
  602. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/toggle_todo_done.py +0 -0
  603. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/undo.py +0 -0
  604. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/unformat_content.py +0 -0
  605. {metalist-0.22.0 → metalist-0.24.0}/app/usecases/update_content.py +0 -0
  606. {metalist-0.22.0 → metalist-0.24.0}/app/utils/__init__.py +0 -0
  607. {metalist-0.22.0 → metalist-0.24.0}/app/utils/byte_sizes.py +0 -0
  608. {metalist-0.22.0 → metalist-0.24.0}/app/utils/encryption.py +0 -0
  609. {metalist-0.22.0 → metalist-0.24.0}/app/utils/not_found.py +0 -0
  610. {metalist-0.22.0 → metalist-0.24.0}/app/utils/sent_fields.py +0 -0
  611. {metalist-0.22.0 → metalist-0.24.0}/app/utils/tcp_ports.py +0 -0
  612. {metalist-0.22.0 → metalist-0.24.0}/app/utils/text_utils.py +0 -0
  613. {metalist-0.22.0 → metalist-0.24.0}/app/utils/time_units.py +0 -0
  614. {metalist-0.22.0 → metalist-0.24.0}/convert-from-legacy.py +0 -0
  615. {metalist-0.22.0 → metalist-0.24.0}/metalist.egg-info/dependency_links.txt +0 -0
  616. {metalist-0.22.0 → metalist-0.24.0}/metalist.egg-info/entry_points.txt +0 -0
  617. {metalist-0.22.0 → metalist-0.24.0}/metalist.egg-info/top_level.txt +0 -0
  618. {metalist-0.22.0 → metalist-0.24.0}/scripts/generate-lan-cert.sh +0 -0
  619. {metalist-0.22.0 → metalist-0.24.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: metalist
3
- Version: 0.22.0
3
+ Version: 0.24.0
4
4
  Summary: A minimalist single-user note-taking app with SSR, fast in-memory tree operations, and efficient sync.
5
5
  Project-URL: Homepage, https://metalist.app
6
6
  Project-URL: Repository, https://github.com/metalist-app/metalist
@@ -36,7 +36,7 @@ Provides-Extra: dev
36
36
  Requires-Dist: hypothesis==6.164.0; extra == "dev"
37
37
  Requires-Dist: pytest==9.1.1; extra == "dev"
38
38
  Requires-Dist: pytest-cov==7.1.0; extra == "dev"
39
- Requires-Dist: shockharness==0.17.0; extra == "dev"
39
+ Requires-Dist: shockharness==0.26.0; extra == "dev"
40
40
  Requires-Dist: mypy==2.4.0; extra == "dev"
41
41
 
42
42
  # MetaList
@@ -53,6 +53,31 @@ A minimalist single-user note-taking app focused on server-side rendering (SSR),
53
53
  - Multi-tab search contexts with server-persisted scroll/search state (survives browser restarts)
54
54
  - Manual namespace backups/restores to a user-selected backup folder with retention controls
55
55
 
56
+ ## Changes in 0.24.0
57
+
58
+ - **Super tags.** A tag can carry values: `jogging:miles=3:duration=30`, `drug:dosage=10mg`, `run:start=10:30pm`. Search by them with `jogging:miles>2`, `jogging:miles?` (notes missing it), `date>=2024-01`, or `jogging:miles=MAX` / `=MIN` for the largest or smallest among the notes found. Values compare as numbers (a unit is a label: `dosage>5mg` compares only mg, `dosage>5` every unit), dates, times (`10:30pm` = `22:30`) or text. A search reads values through tag rules too: with `jogging => exercise`, `exercise:miles>2` finds your runs. The tag bar and the search box suggest the property names and units you already use, and `MAX`/`MIN` after `=`. A plain `jogging` search still finds `jogging:miles=3`; children inherit the tag, never its values.
59
+ - Tag rules can test values: `jogging:miles>10 => long-run`, `task:due? => needs-date`. The tag a rule gives passes to the note's children; Edit Tag Relationships shows such a rule in the left column of the tag it gives, suggests names and units while you type one, and warns about a property no note has (a typo). Saving one re-tags only the notes it can concern.
60
+ - The AI can propose super tags with values a note states (`jogging:miles=3` for "ran 3 miles"), reusing your property names and units; accepting one adds its values to the note's tag.
61
+ - **Date range** (right-click menu, search box menu and command palette): show only notes created, or last updated, today, in the last 7 or 30 days, this year, or in a custom range. A chip in the search box names it; its `×`, a new search or leaving the tab ends it.
62
+ - File names are searchable: a quoted search (`"congratulation"`) and find (Cmd/Ctrl+F) match the names of files a note holds, and the AI sees them.
63
+ - ⌘+ / ⌘− with the pointer on a picture or diagram makes it bigger or smaller, viewing or editing.
64
+ - Right-clicking the search box past what you typed offers View, Sort by and Date range.
65
+
66
+ ## Changes in 0.23.0
67
+
68
+ - **Reference views.** Following a reference (a link, an embed's reference icon, Go to Source Note) or an AI answer's references slides the list to the left, and a gray chip takes the search box's place: **Source note** (its first line is the tooltip), **Reference** or **All references**. `←` or Escape goes back one level, `×` straight back to your search, each to the exact place you left; the list slides back to the right. With Reduce Motion it is a quick fade. The magnifier beside the chip starts a new search. Reference tabs keep their label and chip after a reload and in every window: no tab is named by a note ID any more.
69
+ - One reference icon, a page with an arrow coming into it, on embeds, links, the chip, the tab list and the right-click menu's **Go to Source Note**; All references has two pages. A collapsed embed shows its source's first line in its own formatting (a green heading stays a green heading), and embeds are a shade darker grey, deeper again for an embed inside an embed.
70
+ - Sort orders and Untagged show as chips inside the search box (`Created`, `Updated`, `A–Z`, `Size`, `Untagged`; the full name is the tooltip). New **Reverse Order** in Sort by works with any order: Z to A, oldest or smallest first, or your own order bottom to top. Typing a new search or leaving a tab ends its sort; a new tab starts unsorted; a reference view and back keeps it.
71
+ - Right-clicking the list offers **Paste Note as Reference at Top** (⌘R) beside Paste Note at Top.
72
+ - Backlinks (`↖`) are hidden for now, until they have a sign of their own.
73
+ - Coming back to a tab, or from a reference view, lands exactly where you were; a note just below the top could put you up to 80px further down.
74
+ - **Find in the list** (Cmd/Ctrl+F) finds text far below the loaded notes and inside folded ones; a folded match opens just for the find.
75
+ - Namespaces are called **vaults** on screen; `--vault` works like `--namespace`.
76
+ - Edit tag relationships: suggestions list tags linked to the focus tag first, a condition shows one part per line, and with no focus tag the `+` buttons are dimmed instead of stopping MetaList.
77
+ - A file link downloads only from its badge and name; a click beside it edits the note.
78
+ - Make Bigger, Make Smaller and Reset Size keep the caret on its side of the image.
79
+ - Logging out while a log entry was being written could close the log under it; the logout now waits.
80
+
56
81
  ## Changes in 0.22.0
57
82
 
58
83
  - Tag suggestions only narrow as you type, however many letters: `q`, `qu`, `que` keep their order, and a tag that already applies (a parent's, or implied by a rule) stays right after the tags with evidence instead of dropping to the bottom. Each letter after the first answers in a few milliseconds. Measured on a 107,000-note namespace, the wanted tag is in the top five more often after two and three letters (90% and 96%, up from 88% and 93%).
@@ -12,6 +12,31 @@ 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.24.0
16
+
17
+ - **Super tags.** A tag can carry values: `jogging:miles=3:duration=30`, `drug:dosage=10mg`, `run:start=10:30pm`. Search by them with `jogging:miles>2`, `jogging:miles?` (notes missing it), `date>=2024-01`, or `jogging:miles=MAX` / `=MIN` for the largest or smallest among the notes found. Values compare as numbers (a unit is a label: `dosage>5mg` compares only mg, `dosage>5` every unit), dates, times (`10:30pm` = `22:30`) or text. A search reads values through tag rules too: with `jogging => exercise`, `exercise:miles>2` finds your runs. The tag bar and the search box suggest the property names and units you already use, and `MAX`/`MIN` after `=`. A plain `jogging` search still finds `jogging:miles=3`; children inherit the tag, never its values.
18
+ - Tag rules can test values: `jogging:miles>10 => long-run`, `task:due? => needs-date`. The tag a rule gives passes to the note's children; Edit Tag Relationships shows such a rule in the left column of the tag it gives, suggests names and units while you type one, and warns about a property no note has (a typo). Saving one re-tags only the notes it can concern.
19
+ - The AI can propose super tags with values a note states (`jogging:miles=3` for "ran 3 miles"), reusing your property names and units; accepting one adds its values to the note's tag.
20
+ - **Date range** (right-click menu, search box menu and command palette): show only notes created, or last updated, today, in the last 7 or 30 days, this year, or in a custom range. A chip in the search box names it; its `×`, a new search or leaving the tab ends it.
21
+ - File names are searchable: a quoted search (`"congratulation"`) and find (Cmd/Ctrl+F) match the names of files a note holds, and the AI sees them.
22
+ - ⌘+ / ⌘− with the pointer on a picture or diagram makes it bigger or smaller, viewing or editing.
23
+ - Right-clicking the search box past what you typed offers View, Sort by and Date range.
24
+
25
+ ## Changes in 0.23.0
26
+
27
+ - **Reference views.** Following a reference (a link, an embed's reference icon, Go to Source Note) or an AI answer's references slides the list to the left, and a gray chip takes the search box's place: **Source note** (its first line is the tooltip), **Reference** or **All references**. `←` or Escape goes back one level, `×` straight back to your search, each to the exact place you left; the list slides back to the right. With Reduce Motion it is a quick fade. The magnifier beside the chip starts a new search. Reference tabs keep their label and chip after a reload and in every window: no tab is named by a note ID any more.
28
+ - One reference icon, a page with an arrow coming into it, on embeds, links, the chip, the tab list and the right-click menu's **Go to Source Note**; All references has two pages. A collapsed embed shows its source's first line in its own formatting (a green heading stays a green heading), and embeds are a shade darker grey, deeper again for an embed inside an embed.
29
+ - Sort orders and Untagged show as chips inside the search box (`Created`, `Updated`, `A–Z`, `Size`, `Untagged`; the full name is the tooltip). New **Reverse Order** in Sort by works with any order: Z to A, oldest or smallest first, or your own order bottom to top. Typing a new search or leaving a tab ends its sort; a new tab starts unsorted; a reference view and back keeps it.
30
+ - Right-clicking the list offers **Paste Note as Reference at Top** (⌘R) beside Paste Note at Top.
31
+ - Backlinks (`↖`) are hidden for now, until they have a sign of their own.
32
+ - Coming back to a tab, or from a reference view, lands exactly where you were; a note just below the top could put you up to 80px further down.
33
+ - **Find in the list** (Cmd/Ctrl+F) finds text far below the loaded notes and inside folded ones; a folded match opens just for the find.
34
+ - Namespaces are called **vaults** on screen; `--vault` works like `--namespace`.
35
+ - Edit tag relationships: suggestions list tags linked to the focus tag first, a condition shows one part per line, and with no focus tag the `+` buttons are dimmed instead of stopping MetaList.
36
+ - A file link downloads only from its badge and name; a click beside it edits the note.
37
+ - Make Bigger, Make Smaller and Reset Size keep the caret on its side of the image.
38
+ - Logging out while a log entry was being written could close the log under it; the logout now waits.
39
+
15
40
  ## Changes in 0.22.0
16
41
 
17
42
  - Tag suggestions only narrow as you type, however many letters: `q`, `qu`, `que` keep their order, and a tag that already applies (a parent's, or implied by a rule) stays right after the tags with evidence instead of dropping to the bottom. Each letter after the first answers in a few milliseconds. Measured on a 107,000-note namespace, the wanted tag is in the top five more often after two and three letters (90% and 96%, up from 88% and 93%).
@@ -56,18 +56,26 @@ class Viewport(TypedDict):
56
56
  scrollY: Nonnegative
57
57
  scrollAnchor: ScrollAnchor | None
58
58
 
59
+ # A root sort order, and the same order reversed (app/services/root_sorting.py).
60
+ SortMode = Literal[
61
+ 'normal', 'created', 'updated', 'alphabetical', 'content-volume',
62
+ 'normal-reversed', 'created-reversed', 'updated-reversed', 'alphabetical-reversed', 'content-volume-reversed',
63
+ ]
64
+
59
65
  @with_config(ConfigDict(strict=True))
60
66
  class Tab(TypedDict):
61
67
  searchQuery: Text
62
68
  scrollY: Nonnegative
63
69
  anchorRootId: Text | None
64
70
  scrollAnchor: ScrollAnchor | None
65
- sortMode: Literal['normal', 'created', 'updated', 'alphabetical', 'content-volume']
71
+ sortMode: SortMode
66
72
 
67
73
  @with_config(ConfigDict(strict=True))
68
74
  class ViewDiffRequest(TypedDict):
69
75
  clientId: Identifier
70
76
  editingNoteId: Text | None
77
+ # The note find opened to show a match folded away, for this view only (docs/ui/find.md).
78
+ findRevealNoteId: Text | None
71
79
  search: Text | None
72
80
  tabId: Identifier
73
81
  undoContext: UndoContext
@@ -77,16 +85,54 @@ class ViewDiffRequest(TypedDict):
77
85
  isUntaggedView: bool
78
86
  startAtListEnd: bool
79
87
 
88
+ # Find in the list (docs/ui/find.md): one step from a root position of the view.
89
+ @with_config(ConfigDict(strict=True))
90
+ class FindInListRequest(TypedDict):
91
+ tabId: Identifier
92
+ search: Text | None
93
+ isUntaggedView: bool
94
+ text: Annotated[str, Field(min_length=1, max_length=KIB)]
95
+ fromRootIndex: Nonnegative
96
+ direction: Literal['forward', 'backward']
97
+
98
+ @with_config(ConfigDict(strict=True))
99
+ class ReferenceOriginScope(TypedDict):
100
+ scopeTabId: Identifier
101
+ searchQuery: Text
102
+ sortMode: SortMode
103
+ isUntaggedView: bool
104
+
105
+ # A tab showing a reference view, opened from another tab (app/services/tab_state.py).
106
+ @with_config(ConfigDict(strict=True))
107
+ class ReferenceView(TypedDict):
108
+ fromTabId: Identifier
109
+ referenceQuery: Text
110
+ viewKind: Literal['source', 'backlinks', 'reference', 'references']
111
+ originScope: ReferenceOriginScope
112
+
80
113
  @with_config(ConfigDict(strict=True))
81
114
  class UpdateTabStateRequest(TypedDict):
82
115
  activeTabId: Identifier
83
116
  tabs: dict[Identifier, Tab]
84
117
  tabOrder: list[Identifier]
118
+ referenceViews: dict[Identifier, ReferenceView]
85
119
 
86
120
  @with_config(ConfigDict(strict=True))
87
121
  class UpdateTabSortModeRequest(TypedDict):
88
122
  tabId: Identifier
89
- sortMode: Literal['normal', 'created', 'updated', 'alphabetical', 'content-volume']
123
+ sortMode: SortMode
124
+ clientId: Identifier
125
+ undoContext: UndoContext
126
+
127
+ @with_config(ConfigDict(strict=True))
128
+ class UpdateTabDateFilterRequest(TypedDict):
129
+ tabId: Identifier
130
+ field: Literal["created", "updated"]
131
+ # "none" shows every date again.
132
+ rangeKind: Literal["none", "today", "last-7-days", "last-30-days", "this-year", "custom"]
133
+ # A custom range's ends (YYYY-MM-DD); "" for an open end, and for every other range.
134
+ fromDate: Text
135
+ toDate: Text
90
136
  clientId: Identifier
91
137
  undoContext: UndoContext
92
138
 
@@ -126,7 +172,7 @@ class TabSearchInteractionRequest(TypedDict):
126
172
  class DictationPasteRequest(TypedDict):
127
173
  """Text pasted into the search bar or the tag bar, and the field's current value."""
128
174
  text: Text
129
- target: Literal["search", "tags", "tag", "condition"]
175
+ target: Literal["search", "tags", "tag"]
130
176
  current_value: Text
131
177
  # The spoken phrases around a quoted phrase (Dictation Settings).
132
178
  quote_open: Identifier
@@ -498,6 +498,7 @@ def suggest_tags_for_note_with_ai(
498
498
  scope = resolve_view_scope_membership(
499
499
  search=payload.search,
500
500
  sort_mode=tab_state_store.get_sort_mode(tab_id=payload.tab_id),
501
+ date_filter=tab_state_store.get_date_filter(tab_id=payload.tab_id),
501
502
  is_untagged_view=payload.is_untagged_view,
502
503
  )
503
504
  if note_id not in scope.allowed_note_ids:
@@ -559,6 +560,7 @@ def _export_title_request(scope: ExportTitleScope, token: str) -> ExportTitleReq
559
560
  root_ids, allowed_note_ids = resolve_export_scope(
560
561
  search=search,
561
562
  sort_mode=tab_state_store.get_sort_mode(tab_id=scope.tab_id),
563
+ date_filter=tab_state_store.get_date_filter(tab_id=scope.tab_id),
562
564
  is_untagged_view=scope.is_untagged_view, root_note_id=note_id,
563
565
  )
564
566
  boundary = resolve_cloud_privacy_boundary(preferences=load_client_preferences(token=token), provider=scope.provider)
@@ -903,21 +905,26 @@ def stream_ai_chat(
903
905
  authoritative_sort_mode = tab_state_store.get_sort_mode(
904
906
  tab_id=payload.scope.scope_tab_id
905
907
  )
908
+ authoritative_date_filter = tab_state_store.get_date_filter(tab_id=payload.scope.scope_tab_id)
906
909
  active_search_query = authoritative_search_query
907
910
  active_sort_mode = authoritative_sort_mode
911
+ active_date_filter = authoritative_date_filter
908
912
  if payload.selected_note_id and payload.scope.active_tab_id != payload.scope.scope_tab_id:
909
913
  active_search_query = tab_state_store.get_search_query(tab_id=authoritative_active_tab_id)
910
914
  active_sort_mode = tab_state_store.get_sort_mode(tab_id=authoritative_active_tab_id)
915
+ active_date_filter = tab_state_store.get_date_filter(tab_id=authoritative_active_tab_id)
911
916
  frozen_scope = scoped_search_snapshot_factory.freeze(
912
917
  descriptor=payload.scope,
913
918
  authoritative_search_query=authoritative_search_query,
914
919
  authoritative_sort_mode=authoritative_sort_mode,
920
+ authoritative_date_filter=authoritative_date_filter,
915
921
  run_id=str(uuid4()),
916
922
  session_key=session_key,
917
923
  privacy_boundary=privacy_boundary,
918
924
  selected_note_id=payload.selected_note_id,
919
925
  authoritative_active_search_query=active_search_query,
920
926
  authoritative_active_sort_mode=active_sort_mode,
927
+ authoritative_active_date_filter=active_date_filter,
921
928
  )
922
929
  tagging_run = TaggingRun(token=token, snapshot=frozen_scope, privacy_boundary=privacy_boundary,
923
930
  preferences=preferences, sync_uuid=get_current_sync_uuid(),
@@ -1054,7 +1061,9 @@ def manage_bulk_proposals(payload: BulkManageRequest, token: Annotated[str, Depe
1054
1061
  raise HTTPException(status_code=HTTPStatus.CONFLICT, detail="Search context changed")
1055
1062
  async def execute():
1056
1063
  with bulk_operation_guard.acquire(token_service.get_session_key(token)):
1057
- note_ids = proposal_scope_ids(payload.scope)
1064
+ note_ids = proposal_scope_ids(
1065
+ payload.scope, date_filter=tab_state_store.get_date_filter(tab_id=payload.scope.scope_tab_id),
1066
+ )
1058
1067
  if payload.target == "namespace":
1059
1068
  note_ids = tuple(note_store.list_note_ids())
1060
1069
  changes, count, _ = prepare_proposal_changes(
@@ -1024,7 +1024,7 @@ def namespace_delete_job_status(
1024
1024
  exc = job_record_capture.captured_exception
1025
1025
  raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail=str(exc)) from exc
1026
1026
  if job_record is None:
1027
- raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail=f"Namespace deletion job not found: {job_id}")
1027
+ raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail=f"Vault deletion job not found: {job_id}")
1028
1028
  return job_record
1029
1029
 
1030
1030
 
@@ -1038,7 +1038,7 @@ def namespace_rename_job_status(job_id: str):
1038
1038
  exc = job_record_capture.captured_exception
1039
1039
  raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail=str(exc)) from exc
1040
1040
  if job_record is None:
1041
- raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail=f"Namespace rename job not found: {job_id}")
1041
+ raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail=f"Vault rename job not found: {job_id}")
1042
1042
  return job_record
1043
1043
 
1044
1044
 
@@ -301,7 +301,7 @@ def _normalize_selected_namespaces(*, selected_namespaces: list[str]) -> list[st
301
301
  raise TypeError("selected_namespaces must be a list")
302
302
  normalized_selected_namespaces = _order_namespaces(namespaces=selected_namespaces)
303
303
  if len(normalized_selected_namespaces) == 0:
304
- raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail="Select at least one namespace to back up")
304
+ raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail="Select at least one vault to back up")
305
305
  return normalized_selected_namespaces
306
306
 
307
307
 
@@ -310,7 +310,7 @@ def _require_existing_selected_namespaces(*, selected_namespaces: list[str]) ->
310
310
  for namespace in normalized_selected_namespaces:
311
311
  database_path = resolve_namespaced_database_path(namespace=namespace)
312
312
  if not database_path.is_file():
313
- raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail=f"Selected namespace has no database yet: {namespace}")
313
+ raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail=f"Selected vault has no database yet: {namespace}")
314
314
  return normalized_selected_namespaces
315
315
 
316
316
 
@@ -324,7 +324,7 @@ def _filter_deleted_selected_namespaces(*, selected_namespaces: list[str]) -> li
324
324
  if len(existing_selected_namespaces) == 0:
325
325
  raise HTTPException(
326
326
  status_code=HTTPStatus.BAD_REQUEST,
327
- detail="None of the selected backup namespaces still exist",
327
+ detail="None of the selected backup vaults still exist",
328
328
  )
329
329
  return existing_selected_namespaces
330
330
 
@@ -583,7 +583,7 @@ def _verify_target_namespace_password(*, target_namespace: str, password: str) -
583
583
  if not _target_auth_settings_have_password(settings=settings):
584
584
  return
585
585
  if password == "":
586
- raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail="Target namespace password is required")
586
+ raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail="Target vault password is required")
587
587
 
588
588
  assert settings is not None
589
589
  auth_salt = settings["auth_salt"]
@@ -610,7 +610,7 @@ def _verify_target_namespace_password(*, target_namespace: str, password: str) -
610
610
  parallelism,
611
611
  ).hex()
612
612
  if not secrets.compare_digest(candidate, auth_verifier):
613
- raise HTTPException(status_code=HTTPStatus.FORBIDDEN, detail="Target namespace password is incorrect")
613
+ raise HTTPException(status_code=HTTPStatus.FORBIDDEN, detail="Target vault password is incorrect")
614
614
 
615
615
 
616
616
  def _collect_import_profile_port_conflicts(
@@ -633,7 +633,7 @@ def _collect_import_profile_port_conflicts(
633
633
  continue
634
634
  conflict_namespace, conflict_service = occupied_ports[port]
635
635
  conflicts.append(
636
- f"{service} port {port} conflicts with {conflict_service} port reserved for namespace {conflict_namespace}"
636
+ f"{service} port {port} conflicts with {conflict_service} port reserved for vault {conflict_namespace}"
637
637
  )
638
638
  return conflicts
639
639
 
@@ -959,7 +959,7 @@ def restore_backup_preflight(
959
959
 
960
960
  folder_namespace, folder_filename = _parse_folder_backup_id(payload.backup_id)
961
961
  if folder_namespace != backup_namespace:
962
- raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail="folder backup namespace does not match payload")
962
+ raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail="folder backup vault does not match payload")
963
963
  if folder_filename != payload.backup_filename:
964
964
  raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail="folder backup filename does not match payload")
965
965
  settings = load_backup_settings(token=token)
@@ -1030,7 +1030,7 @@ def restore_backup(
1030
1030
 
1031
1031
  folder_namespace, folder_filename = _parse_folder_backup_id(payload.backup_id)
1032
1032
  if folder_namespace != backup_namespace:
1033
- raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail="folder backup namespace does not match payload")
1033
+ raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail="folder backup vault does not match payload")
1034
1034
  if folder_filename != payload.backup_filename:
1035
1035
  raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail="folder backup filename does not match payload")
1036
1036
  settings = load_backup_settings(token=token)
@@ -1101,7 +1101,7 @@ def import_backup(
1101
1101
  if target_exists and not payload.overwrite_existing_target:
1102
1102
  raise HTTPException(
1103
1103
  status_code=HTTPStatus.CONFLICT,
1104
- detail=f"Target namespace already exists: {target_namespace}",
1104
+ detail=f"Target vault already exists: {target_namespace}",
1105
1105
  )
1106
1106
  if target_exists:
1107
1107
  _verify_target_namespace_password(
@@ -1112,7 +1112,7 @@ def import_backup(
1112
1112
  target_database_path = resolve_namespaced_database_path(namespace=target_namespace)
1113
1113
  folder_namespace, folder_filename = _parse_folder_backup_id(payload.backup_id)
1114
1114
  if folder_namespace != backup_namespace:
1115
- raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail="folder backup namespace does not match payload")
1115
+ raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail="folder backup vault does not match payload")
1116
1116
  if folder_filename != payload.backup_filename:
1117
1117
  raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail="folder backup filename does not match payload")
1118
1118
  settings = load_backup_settings(token=token)
@@ -11,7 +11,9 @@ from pydantic import BaseModel
11
11
 
12
12
  from app.api.note_requests import (
13
13
  ViewDiffRequest,
14
+ FindInListRequest,
14
15
  UpdateTabStateRequest,
16
+ UpdateTabDateFilterRequest,
15
17
  UpdateTabSortModeRequest,
16
18
  CreateNewTabRequest,
17
19
  DeleteTabRequest,
@@ -62,7 +64,16 @@ from app.api.note_requests import (
62
64
  )
63
65
  from app.api.transactions import serialized_read_route, transactional_route
64
66
  from app.services.sync import touch_client
67
+ from app.services.root_date_filter import DATE_RANGE_NONE
68
+ from app.services.tag_properties import PROPERTY_SUGGESTIONS_IN_SEARCH
69
+ from app.services.tag_properties import PROPERTY_SUGGESTIONS_IN_TAG_BAR
70
+ from app.services.tag_properties import PropertySuggestion
71
+ from app.services.tag_properties import has_property_syntax
72
+ from app.services.tag_properties import is_property_term
73
+ from app.services.root_date_filter import RootDateFilter
74
+ from app.services.root_date_filter import make_root_date_filter
65
75
  from app.services.snapshot import build_view_state
76
+ from app.services.snapshot import find_in_view
66
77
  from app.services.snapshot import resolve_search_scope
67
78
  from app.services.snapshot import resolve_view_scope_membership
68
79
  from app.services.note_store import store as note_store
@@ -260,6 +271,13 @@ def _resolve_tab_sort_mode(tab_id: object) -> str:
260
271
  return sort_mode
261
272
 
262
273
 
274
+ def _resolve_tab_date_filter(tab_id: str) -> RootDateFilter | None:
275
+ """The tab's date range filter (None: every date), as its sort order is resolved."""
276
+ if not isinstance(tab_id, str) or tab_id == "":
277
+ raise TypeError("tabId must be a non-empty string")
278
+ return tab_state_store.get_date_filter(tab_id=tab_id)
279
+
280
+
263
281
  def _block_root_reorder_when_sorted(note_id: str, *, tab_id: object, new_parent_id: object) -> None:
264
282
  sort_mode = _resolve_tab_sort_mode(tab_id)
265
283
  if not is_root_reorder_locked(sort_mode):
@@ -300,6 +318,7 @@ def view_diff(payload: ViewDiffRequest):
300
318
  client_id = payload["clientId"]
301
319
  touch_client(client_id)
302
320
  editing_note_id = payload["editingNoteId"]
321
+ find_reveal_note_id = payload["findRevealNoteId"]
303
322
  search = payload["search"]
304
323
  tab_id = payload["tabId"]
305
324
  undo_context = payload["undoContext"]
@@ -341,6 +360,10 @@ def view_diff(payload: ViewDiffRequest):
341
360
  if not note_store.has_note(normalized_editing_note_id):
342
361
  normalized_editing_note_id = None
343
362
 
363
+ # Like editingNoteId, the note find opened can be gone by now (deleted, undone).
364
+ if find_reveal_note_id is not None and not note_store.has_note(find_reveal_note_id):
365
+ find_reveal_note_id = None
366
+
344
367
  # The server keeps each tab's warm view (what that browser tab displays),
345
368
  # so the browser sends only where it is. A tab with no warm view, or one
346
369
  # whose browser shows nothing for it, gets its initial window.
@@ -357,8 +380,10 @@ def view_diff(payload: ViewDiffRequest):
357
380
 
358
381
  state = build_view_state(
359
382
  editing_note_id=normalized_editing_note_id,
383
+ find_reveal_note_id=find_reveal_note_id,
360
384
  search=normalized_search,
361
385
  sort_mode=sort_mode,
386
+ date_filter=_resolve_tab_date_filter(tab_id),
362
387
  client_known_note_ids=client_known_note_ids,
363
388
  previous_root_ids=previous_root_ids,
364
389
  visible_top_root_id=visible_top_root_id,
@@ -414,17 +439,26 @@ def get_tab_state() -> Dict[str, object]:
414
439
  @router.post("/notes/tab-state")
415
440
  @transactional_route
416
441
  def update_tab_state(payload: UpdateTabStateRequest) -> Dict[str, object]:
417
- if "activeTabId" not in payload or "tabs" not in payload or "tabOrder" not in payload:
418
- raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail="activeTabId, tabs, and tabOrder are required")
442
+ if (
443
+ "activeTabId" not in payload or "tabs" not in payload or "tabOrder" not in payload
444
+ or "referenceViews" not in payload
445
+ ):
446
+ raise HTTPException(
447
+ status_code=HTTPStatus.BAD_REQUEST,
448
+ detail="activeTabId, tabs, tabOrder, and referenceViews are required",
449
+ )
419
450
  active_tab_id = payload["activeTabId"]
420
451
  tabs = payload["tabs"]
421
452
  tab_order = payload["tabOrder"]
453
+ reference_views = payload["referenceViews"]
422
454
  if not isinstance(tab_order, list):
423
455
  raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail="tabOrder must be a list")
424
456
  tab_order_list = [str(entry) for entry in tab_order]
425
457
  capture = CapturedExceptionContext(InputRejected, boundary='app/api/routes/notes.py:update_tab_state:capture')
426
458
  with capture:
427
- response = tab_state_store.update(active_tab_id=active_tab_id, tabs=tabs, tab_order=tab_order_list)
459
+ response = tab_state_store.update(
460
+ active_tab_id=active_tab_id, tabs=tabs, tab_order=tab_order_list, reference_views=reference_views,
461
+ )
428
462
  if capture.captured_exception is not None:
429
463
  raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail="Invalid or stale tab state") from capture.captured_exception
430
464
  return response
@@ -457,6 +491,23 @@ def update_tab_sort_mode(payload: UpdateTabSortModeRequest) -> Dict[str, object]
457
491
  return response
458
492
 
459
493
 
494
+ @router.post("/notes/tab-state/date-filter")
495
+ @transactional_route
496
+ def update_tab_date_filter(payload: UpdateTabDateFilterRequest) -> Dict[str, object]:
497
+ """Set or clear a tab's date range filter (root_date_filter.py). A range that is
498
+ not one (its start after its end, say) is answered as rejected input."""
499
+ date_filter: RootDateFilter | None = None
500
+ if payload["rangeKind"] != DATE_RANGE_NONE:
501
+ date_filter = make_root_date_filter(
502
+ field=payload["field"], range_kind=payload["rangeKind"],
503
+ from_date=payload["fromDate"], to_date=payload["toDate"],
504
+ )
505
+ response = tab_state_store.set_date_filter(tab_id=payload["tabId"], date_filter=date_filter)
506
+ if response["changed"] is True:
507
+ reset_undo_stack(payload["clientId"], payload["undoContext"])
508
+ return response
509
+
510
+
460
511
  @router.post("/notes/tab-state/new-tab")
461
512
  @transactional_route
462
513
  def create_new_tab(payload: CreateNewTabRequest) -> Dict[str, object]:
@@ -506,6 +557,15 @@ def search_suggestions(request: Request, payload: SearchSuggestionsRequest) -> D
506
557
  )
507
558
  window_days = tuple(raw_window_days)
508
559
  validate_tag_activity_windows(window_days)
560
+ # Typing a property term (exercise:mi, drug:dosage>5): its names or units.
561
+ typed_term = _typed_property_term(query)
562
+ if typed_term is not None:
563
+ return _property_suggestions_response(
564
+ search_index.suggest_property_completions(
565
+ typed=typed_term, place=PROPERTY_SUGGESTIONS_IN_SEARCH, limit=MAX_SEARCH_SUGGESTIONS,
566
+ ),
567
+ personalized=True,
568
+ )
509
569
  all_suggestions = search_index.suggest_all_tag_completions(query=query)
510
570
  suggestions = all_suggestions[:MAX_SEARCH_SUGGESTIONS]
511
571
  personalized_selections: list[TagActivityWindowSelection] = []
@@ -544,7 +604,31 @@ def search_suggestions(request: Request, payload: SearchSuggestionsRequest) -> D
544
604
  tag: list(search_suggestion_reasons(facts=facts, term=tag, recent_activity=recent_activity))
545
605
  for tag in suggestions
546
606
  },
607
+ "labels": {tag: tag for tag in suggestions},
608
+ }
609
+
610
+
611
+ def _typed_property_term(query: str) -> str | None:
612
+ """The property term being typed at the end of a search, without its - or +."""
613
+ if query == "" or query[-1].isspace():
614
+ return None
615
+ term = query.split()[-1].lstrip("+-")
616
+ if '"' in term or "'" in term or not is_property_term(term):
617
+ return None
618
+ return term
619
+
620
+
621
+ def _property_suggestions_response(suggestions: list[PropertySuggestion], *, personalized: bool) -> Dict[str, object]:
622
+ """Property names or units as the suggestion lists take them: the full replacement,
623
+ the part the list shows (miles= for jogging:miles=) and why."""
624
+ response: Dict[str, object] = {
625
+ "suggestions": [suggestion.replacement for suggestion in suggestions],
626
+ "reasons": {suggestion.replacement: list(suggestion.reasons) for suggestion in suggestions},
627
+ "labels": {suggestion.replacement: suggestion.label for suggestion in suggestions},
547
628
  }
629
+ if personalized:
630
+ response["personalizedSuggestions"] = []
631
+ return response
548
632
 
549
633
 
550
634
  @router.post("/notes/prioritize-tag-suggestions")
@@ -632,6 +716,40 @@ def get_memory_usage(request: Request) -> Dict[str, object]:
632
716
  return describe_memory_usage()
633
717
 
634
718
 
719
+ @router.post("/notes/find")
720
+ @transactional_route
721
+ def find_in_list(payload: FindInListRequest) -> Dict[str, object]:
722
+ """One step of find through the list a tab shows (docs/ui/find.md): the notes the
723
+ text occurs in, in list order, from a root position forward or before it backward."""
724
+ search = payload["search"]
725
+ if search is None or search.strip() == "":
726
+ search = ""
727
+ else:
728
+ # A search that does not parse is answered as rejected input, as the view does.
729
+ parse_search_query(search)
730
+ if payload["text"].strip() == "":
731
+ raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail="text must hold more than spaces")
732
+ window = find_in_view(
733
+ find_text=payload["text"], search=search, sort_mode=_resolve_tab_sort_mode(payload["tabId"]),
734
+ date_filter=_resolve_tab_date_filter(payload["tabId"]),
735
+ is_untagged_view=payload["isUntaggedView"], from_root_index=payload["fromRootIndex"],
736
+ direction=payload["direction"],
737
+ )
738
+ return {
739
+ "matches": [
740
+ {
741
+ "noteId": match.note_id, "rootId": match.root_id, "rootIndex": match.root_index,
742
+ "contentCount": match.content_count, "commentCount": match.comment_count,
743
+ "previewCount": match.preview_count, "isUnderFoldedNote": match.is_under_folded_note,
744
+ }
745
+ for match in window.matches
746
+ ],
747
+ "firstRootIndex": window.first_root_index,
748
+ "endRootIndex": window.end_root_index,
749
+ "rootCount": window.root_count,
750
+ }
751
+
752
+
635
753
  @router.get("/notes/memory-usage/breakdown")
636
754
  @serialized_read_route
637
755
  def get_memory_breakdown(request: Request) -> Dict[str, object]:
@@ -687,6 +805,15 @@ def tag_suggestions(payload: TagSuggestionsRequest) -> Dict[str, object]:
687
805
 
688
806
  _require_note_present(note_id, context="notes.tag-suggestions")
689
807
 
808
+ # Typing after a tag's colon (jogging:mi, drug:dosage=10m): property names or units.
809
+ if has_property_syntax(prefix):
810
+ return _property_suggestions_response(
811
+ search_index.suggest_property_completions(
812
+ typed=prefix, place=PROPERTY_SUGGESTIONS_IN_TAG_BAR, limit=MAX_TAG_SUGGESTIONS,
813
+ ),
814
+ personalized=False,
815
+ )
816
+
690
817
  suggestions = suggest_tags_with_reasons_for_note(
691
818
  note_id=note_id,
692
819
  anchors=anchors,
@@ -699,6 +826,7 @@ def tag_suggestions(payload: TagSuggestionsRequest) -> Dict[str, object]:
699
826
  return {
700
827
  "suggestions": [suggestion.tag for suggestion in suggestions],
701
828
  "reasons": {suggestion.tag: list(suggestion.reasons) for suggestion in suggestions},
829
+ "labels": {suggestion.tag: suggestion.tag for suggestion in suggestions},
702
830
  }
703
831
 
704
832
 
@@ -747,6 +875,7 @@ def export_summary(request: Request) -> Dict[str, object]:
747
875
  normalized_search = None
748
876
  counts = exported_credential_counts(
749
877
  search=normalized_search, sort_mode=_resolve_tab_sort_mode(tab_id),
878
+ date_filter=_resolve_tab_date_filter(tab_id),
750
879
  is_untagged_view=is_untagged_view == "true", root_note_id=note_id,
751
880
  )
752
881
  return {
@@ -806,6 +935,7 @@ def export_notes_html(request: Request) -> Response:
806
935
  document = build_notes_export_document(
807
936
  search=normalized_search,
808
937
  sort_mode=_resolve_tab_sort_mode(tab_id),
938
+ date_filter=_resolve_tab_date_filter(tab_id),
809
939
  is_untagged_view=is_untagged_view == "true",
810
940
  theme=normalized_theme,
811
941
  token=token,
@@ -867,6 +997,7 @@ def backlinks(request: Request, note_id: str) -> Dict[str, object]:
867
997
  search=normalized_search,
868
998
  editing_note_id=None,
869
999
  sort_mode="normal",
1000
+ date_filter=None,
870
1001
  ordered_root_ids=None,
871
1002
  )
872
1003
  source_note_ids = search_scope.allowed_note_ids
@@ -1067,6 +1198,7 @@ def _robot_scope_note_ids(body: dict) -> frozenset[str]:
1067
1198
  return resolve_view_scope_membership(
1068
1199
  search=body["search"],
1069
1200
  sort_mode=_resolve_tab_sort_mode(body["tabId"]),
1201
+ date_filter=_resolve_tab_date_filter(body["tabId"]),
1070
1202
  is_untagged_view=body["isUntaggedView"],
1071
1203
  ).allowed_note_ids
1072
1204