MetaList 0.4.0__tar.gz → 0.4.1__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 (449) hide show
  1. {metalist-0.4.0 → metalist-0.4.1}/PKG-INFO +10 -4
  2. {metalist-0.4.0 → metalist-0.4.1}/README.md +8 -3
  3. {metalist-0.4.0 → metalist-0.4.1}/app/api/routes/ai.py +2 -1
  4. {metalist-0.4.0 → metalist-0.4.1}/app/api/routes/auth.py +0 -4
  5. {metalist-0.4.0 → metalist-0.4.1}/app/db/migrations.py +58 -2
  6. {metalist-0.4.0 → metalist-0.4.1}/app/db/schema.py +0 -15
  7. {metalist-0.4.0 → metalist-0.4.1}/app/db/version.py +1 -1
  8. {metalist-0.4.0 → metalist-0.4.1}/app/encryption_audit.py +5 -6
  9. {metalist-0.4.0 → metalist-0.4.1}/app/main.py +0 -4
  10. {metalist-0.4.0 → metalist-0.4.1}/app/presentation/render/note_renderer.py +1 -2
  11. {metalist-0.4.0 → metalist-0.4.1}/app/server_runtime.py +46 -5
  12. {metalist-0.4.0 → metalist-0.4.1}/app/services/agent/actions.py +2 -1
  13. {metalist-0.4.0 → metalist-0.4.1}/app/services/agent/scope.py +2 -1
  14. metalist-0.4.1/app/services/agent/skills/scoped-investigation.md +27 -0
  15. metalist-0.4.1/app/services/agent/skills/search-notes.md +25 -0
  16. {metalist-0.4.0 → metalist-0.4.1}/app/services/auth_service.py +0 -11
  17. {metalist-0.4.0 → metalist-0.4.1}/app/services/embedded_references.py +1 -11
  18. {metalist-0.4.0 → metalist-0.4.1}/app/services/managed_ollama_runtime.py +2 -2
  19. {metalist-0.4.0 → metalist-0.4.1}/app/services/namespace_rename_worker.py +2 -2
  20. {metalist-0.4.0 → metalist-0.4.1}/app/services/namespace_switcher.py +3 -2
  21. {metalist-0.4.0 → metalist-0.4.1}/app/services/runtime_lock.py +0 -3
  22. {metalist-0.4.0 → metalist-0.4.1}/app/services/self_update.py +25 -0
  23. {metalist-0.4.0 → metalist-0.4.1}/app/services/snapshot.py +1 -2
  24. {metalist-0.4.0 → metalist-0.4.1}/app/services/tag_suggestions.py +3 -2
  25. {metalist-0.4.0 → metalist-0.4.1}/app/services/tag_term_matching.py +21 -5
  26. {metalist-0.4.0 → metalist-0.4.1}/app/services/test_reset.py +0 -3
  27. {metalist-0.4.0 → metalist-0.4.1}/app/services/undo_state.py +2 -25
  28. metalist-0.4.1/app/services/update_backups.py +162 -0
  29. {metalist-0.4.0 → metalist-0.4.1}/app/static/css/main.css +0 -154
  30. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/command-palette/command-palette-controller.js +0 -6
  31. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/command-palette/endpoint-registry.js +0 -6
  32. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/context-menu/context-menu-registry.js +0 -5
  33. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/actions/ui-actions.js +6 -2
  34. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/events/context-menu-events.js +0 -14
  35. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/events/mouse-events.js +0 -2
  36. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/note-html-sanitizer.js +1 -3
  37. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/password-generator.js +6 -6
  38. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/copy_note.py +1 -2
  39. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/paste_child.py +0 -2
  40. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/paste_sibling.py +0 -2
  41. {metalist-0.4.0 → metalist-0.4.1}/app/version.py +1 -1
  42. {metalist-0.4.0 → metalist-0.4.1}/metalist.egg-info/PKG-INFO +10 -4
  43. {metalist-0.4.0 → metalist-0.4.1}/metalist.egg-info/SOURCES.txt +3 -18
  44. {metalist-0.4.0 → metalist-0.4.1}/metalist.egg-info/requires.txt +1 -0
  45. {metalist-0.4.0 → metalist-0.4.1}/pyproject.toml +2 -0
  46. metalist-0.4.0/app/api/routes/embedded_documents.py +0 -87
  47. metalist-0.4.0/app/services/diagram_rendering.py +0 -96
  48. metalist-0.4.0/app/services/diagram_schema.py +0 -128
  49. metalist-0.4.0/app/services/diagram_theme.py +0 -159
  50. metalist-0.4.0/app/services/diagram_vector.py +0 -209
  51. metalist-0.4.0/app/services/document_references.py +0 -51
  52. metalist-0.4.0/app/services/embedded_documents.py +0 -222
  53. metalist-0.4.0/app/static/js/modules/embedded-documents/diagram-canvas.js +0 -76
  54. metalist-0.4.0/app/static/js/modules/embedded-documents/diagram-document.js +0 -237
  55. metalist-0.4.0/app/static/js/modules/embedded-documents/diagram-editor.js +0 -475
  56. metalist-0.4.0/app/static/js/modules/embedded-documents/diagram-model.js +0 -130
  57. metalist-0.4.0/app/static/js/modules/embedded-documents/diagram-scene.js +0 -88
  58. metalist-0.4.0/app/static/js/modules/embedded-documents/diagram-text-editor.js +0 -76
  59. metalist-0.4.0/app/static/js/modules/embedded-documents/diagram-theme.js +0 -118
  60. metalist-0.4.0/app/static/js/modules/embedded-documents/document-api.js +0 -30
  61. metalist-0.4.0/app/static/js/modules/embedded-documents/serialization.js +0 -12
  62. metalist-0.4.0/app/static/js/modules/embedded-documents/widget-ui.js +0 -194
  63. metalist-0.4.0/app/usecases/embedded_documents.py +0 -55
  64. {metalist-0.4.0 → metalist-0.4.1}/MANIFEST.in +0 -0
  65. {metalist-0.4.0 → metalist-0.4.1}/app/__init__.py +0 -0
  66. {metalist-0.4.0 → metalist-0.4.1}/app/api/__init__.py +0 -0
  67. {metalist-0.4.0 → metalist-0.4.1}/app/api/deps.py +0 -0
  68. {metalist-0.4.0 → metalist-0.4.1}/app/api/dev.py +0 -0
  69. {metalist-0.4.0 → metalist-0.4.1}/app/api/middleware/auth.py +0 -0
  70. {metalist-0.4.0 → metalist-0.4.1}/app/api/request_auth.py +0 -0
  71. {metalist-0.4.0 → metalist-0.4.1}/app/api/routes/backups.py +0 -0
  72. {metalist-0.4.0 → metalist-0.4.1}/app/api/routes/files.py +0 -0
  73. {metalist-0.4.0 → metalist-0.4.1}/app/api/routes/notes.py +0 -0
  74. {metalist-0.4.0 → metalist-0.4.1}/app/api/routes/ontology.py +0 -0
  75. {metalist-0.4.0 → metalist-0.4.1}/app/api/routes/reminders.py +0 -0
  76. {metalist-0.4.0 → metalist-0.4.1}/app/api/routes/remote_images.py +0 -0
  77. {metalist-0.4.0 → metalist-0.4.1}/app/api/routes/sounds.py +0 -0
  78. {metalist-0.4.0 → metalist-0.4.1}/app/api/routes/test.py +0 -0
  79. {metalist-0.4.0 → metalist-0.4.1}/app/api/transactions.py +0 -0
  80. {metalist-0.4.0 → metalist-0.4.1}/app/config.py +0 -0
  81. {metalist-0.4.0 → metalist-0.4.1}/app/db/__init__.py +0 -0
  82. {metalist-0.4.0 → metalist-0.4.1}/app/db/backup_settings_sql.py +0 -0
  83. {metalist-0.4.0 → metalist-0.4.1}/app/db/engine.py +0 -0
  84. {metalist-0.4.0 → metalist-0.4.1}/app/db/file_schema.py +0 -0
  85. {metalist-0.4.0 → metalist-0.4.1}/app/db/file_session.py +0 -0
  86. {metalist-0.4.0 → metalist-0.4.1}/app/db/files_sql.py +0 -0
  87. {metalist-0.4.0 → metalist-0.4.1}/app/db/link_titles_sql.py +0 -0
  88. {metalist-0.4.0 → metalist-0.4.1}/app/db/notes_sql.py +0 -0
  89. {metalist-0.4.0 → metalist-0.4.1}/app/db/ontology_rules_sql.py +0 -0
  90. {metalist-0.4.0 → metalist-0.4.1}/app/db/reminders_sql.py +0 -0
  91. {metalist-0.4.0 → metalist-0.4.1}/app/db/search_history_sql.py +0 -0
  92. {metalist-0.4.0 → metalist-0.4.1}/app/db/session.py +0 -0
  93. {metalist-0.4.0 → metalist-0.4.1}/app/db/settings_sql.py +0 -0
  94. {metalist-0.4.0 → metalist-0.4.1}/app/db/sounds_sql.py +0 -0
  95. {metalist-0.4.0 → metalist-0.4.1}/app/db/tab_state_sql.py +0 -0
  96. {metalist-0.4.0 → metalist-0.4.1}/app/models/commands.py +0 -0
  97. {metalist-0.4.0 → metalist-0.4.1}/app/models/database.py +0 -0
  98. {metalist-0.4.0 → metalist-0.4.1}/app/models/entities.py +0 -0
  99. {metalist-0.4.0 → metalist-0.4.1}/app/models/enums.py +0 -0
  100. {metalist-0.4.0 → metalist-0.4.1}/app/models/linked_list.py +0 -0
  101. {metalist-0.4.0 → metalist-0.4.1}/app/models/list_operations.py +0 -0
  102. {metalist-0.4.0 → metalist-0.4.1}/app/models/list_traversal.py +0 -0
  103. {metalist-0.4.0 → metalist-0.4.1}/app/models/note_crud.py +0 -0
  104. {metalist-0.4.0 → metalist-0.4.1}/app/models/utils.py +0 -0
  105. {metalist-0.4.0 → metalist-0.4.1}/app/presentation/__init__.py +0 -0
  106. {metalist-0.4.0 → metalist-0.4.1}/app/presentation/render/__init__.py +0 -0
  107. {metalist-0.4.0 → metalist-0.4.1}/app/presentation/templates.py +0 -0
  108. {metalist-0.4.0 → metalist-0.4.1}/app/security/authenticated_logging.py +0 -0
  109. {metalist-0.4.0 → metalist-0.4.1}/app/security/encryption.py +0 -0
  110. {metalist-0.4.0 → metalist-0.4.1}/app/security/http_headers.py +0 -0
  111. {metalist-0.4.0 → metalist-0.4.1}/app/security/note_html.py +0 -0
  112. {metalist-0.4.0 → metalist-0.4.1}/app/security/request_boundary.py +0 -0
  113. {metalist-0.4.0 → metalist-0.4.1}/app/security/sensitive_logging.py +0 -0
  114. {metalist-0.4.0 → metalist-0.4.1}/app/security/shell_execution.py +0 -0
  115. {metalist-0.4.0 → metalist-0.4.1}/app/security/validation_errors.py +0 -0
  116. {metalist-0.4.0 → metalist-0.4.1}/app/services/__init__.py +0 -0
  117. {metalist-0.4.0 → metalist-0.4.1}/app/services/agent/__init__.py +0 -0
  118. {metalist-0.4.0 → metalist-0.4.1}/app/services/agent/cloud_privacy.py +0 -0
  119. {metalist-0.4.0 → metalist-0.4.1}/app/services/agent/context.py +0 -0
  120. {metalist-0.4.0 → metalist-0.4.1}/app/services/agent/evidence_serialization.py +0 -0
  121. {metalist-0.4.0 → metalist-0.4.1}/app/services/agent/inference.py +0 -0
  122. {metalist-0.4.0 → metalist-0.4.1}/app/services/agent/investigation.py +0 -0
  123. {metalist-0.4.0 → metalist-0.4.1}/app/services/agent/model_policy.py +0 -0
  124. {metalist-0.4.0 → metalist-0.4.1}/app/services/agent/ollama_inference.py +0 -0
  125. {metalist-0.4.0 → metalist-0.4.1}/app/services/agent/openai_cost_tracking.py +0 -0
  126. {metalist-0.4.0 → metalist-0.4.1}/app/services/agent/openai_inference.py +0 -0
  127. {metalist-0.4.0 → metalist-0.4.1}/app/services/agent/permissions.py +0 -0
  128. {metalist-0.4.0 → metalist-0.4.1}/app/services/agent/prompt_settings.py +0 -0
  129. {metalist-0.4.0 → metalist-0.4.1}/app/services/agent/prompts/__init__.py +0 -0
  130. {metalist-0.4.0 → metalist-0.4.1}/app/services/agent/prompts/final-response.md +0 -0
  131. {metalist-0.4.0 → metalist-0.4.1}/app/services/agent/prompts/system.md +0 -0
  132. {metalist-0.4.0 → metalist-0.4.1}/app/services/agent/prompts/tool-result.md +0 -0
  133. {metalist-0.4.0 → metalist-0.4.1}/app/services/agent/retrieval_settings.py +0 -0
  134. {metalist-0.4.0 → metalist-0.4.1}/app/services/agent/runtime.py +0 -0
  135. {metalist-0.4.0 → metalist-0.4.1}/app/services/agent/skill_settings.py +0 -0
  136. {metalist-0.4.0 → metalist-0.4.1}/app/services/agent/skills/__init__.py +0 -0
  137. {metalist-0.4.0 → metalist-0.4.1}/app/services/agent/tagging.py +0 -0
  138. {metalist-0.4.0 → metalist-0.4.1}/app/services/agent/tagging_run.py +0 -0
  139. {metalist-0.4.0 → metalist-0.4.1}/app/services/agent/token_estimation.py +0 -0
  140. {metalist-0.4.0 → metalist-0.4.1}/app/services/agent/tools.py +0 -0
  141. {metalist-0.4.0 → metalist-0.4.1}/app/services/agent/trace.py +0 -0
  142. {metalist-0.4.0 → metalist-0.4.1}/app/services/ai_chat.py +0 -0
  143. {metalist-0.4.0 → metalist-0.4.1}/app/services/ai_chat_rendering.py +0 -0
  144. {metalist-0.4.0 → metalist-0.4.1}/app/services/auth.py +0 -0
  145. {metalist-0.4.0 → metalist-0.4.1}/app/services/auth_cache_state.py +0 -0
  146. {metalist-0.4.0 → metalist-0.4.1}/app/services/backlink_index.py +0 -0
  147. {metalist-0.4.0 → metalist-0.4.1}/app/services/backlinks.py +0 -0
  148. {metalist-0.4.0 → metalist-0.4.1}/app/services/backup_service.py +0 -0
  149. {metalist-0.4.0 → metalist-0.4.1}/app/services/backup_settings_service.py +0 -0
  150. {metalist-0.4.0 → metalist-0.4.1}/app/services/base_service.py +0 -0
  151. {metalist-0.4.0 → metalist-0.4.1}/app/services/bulk_operation.py +0 -0
  152. {metalist-0.4.0 → metalist-0.4.1}/app/services/client_state_service.py +0 -0
  153. {metalist-0.4.0 → metalist-0.4.1}/app/services/content_cache.py +0 -0
  154. {metalist-0.4.0 → metalist-0.4.1}/app/services/content_formatting.py +0 -0
  155. {metalist-0.4.0 → metalist-0.4.1}/app/services/dependencies.py +0 -0
  156. {metalist-0.4.0 → metalist-0.4.1}/app/services/diagnostics.py +0 -0
  157. {metalist-0.4.0 → metalist-0.4.1}/app/services/encryption.py +0 -0
  158. {metalist-0.4.0 → metalist-0.4.1}/app/services/exception_capture.py +0 -0
  159. {metalist-0.4.0 → metalist-0.4.1}/app/services/file_registry.py +0 -0
  160. {metalist-0.4.0 → metalist-0.4.1}/app/services/file_storage.py +0 -0
  161. {metalist-0.4.0 → metalist-0.4.1}/app/services/footnote_layout.py +0 -0
  162. {metalist-0.4.0 → metalist-0.4.1}/app/services/footnote_rendering.py +0 -0
  163. {metalist-0.4.0 → metalist-0.4.1}/app/services/html_export.py +0 -0
  164. {metalist-0.4.0 → metalist-0.4.1}/app/services/html_unformatting.py +0 -0
  165. {metalist-0.4.0 → metalist-0.4.1}/app/services/hydration_state.py +0 -0
  166. {metalist-0.4.0 → metalist-0.4.1}/app/services/image_size_formatting.py +0 -0
  167. {metalist-0.4.0 → metalist-0.4.1}/app/services/inline_image_occurrences.py +0 -0
  168. {metalist-0.4.0 → metalist-0.4.1}/app/services/integrity.py +0 -0
  169. {metalist-0.4.0 → metalist-0.4.1}/app/services/latex_rendering.py +0 -0
  170. {metalist-0.4.0 → metalist-0.4.1}/app/services/link_titles.py +0 -0
  171. {metalist-0.4.0 → metalist-0.4.1}/app/services/login_rate_limit.py +0 -0
  172. {metalist-0.4.0 → metalist-0.4.1}/app/services/maintenance_mode.py +0 -0
  173. {metalist-0.4.0 → metalist-0.4.1}/app/services/markdown_rendering.py +0 -0
  174. {metalist-0.4.0 → metalist-0.4.1}/app/services/namespace_deletion_jobs.py +0 -0
  175. {metalist-0.4.0 → metalist-0.4.1}/app/services/namespace_deletion_worker.py +0 -0
  176. {metalist-0.4.0 → metalist-0.4.1}/app/services/namespace_rename_jobs.py +0 -0
  177. {metalist-0.4.0 → metalist-0.4.1}/app/services/namespace_runtime_guard.py +0 -0
  178. {metalist-0.4.0 → metalist-0.4.1}/app/services/note_fullscreen.py +0 -0
  179. {metalist-0.4.0 → metalist-0.4.1}/app/services/note_image_tags.py +0 -0
  180. {metalist-0.4.0 → metalist-0.4.1}/app/services/note_service.py +0 -0
  181. {metalist-0.4.0 → metalist-0.4.1}/app/services/note_store.py +0 -0
  182. {metalist-0.4.0 → metalist-0.4.1}/app/services/ollama_provider.py +0 -0
  183. {metalist-0.4.0 → metalist-0.4.1}/app/services/ontology_rules_store.py +0 -0
  184. {metalist-0.4.0 → metalist-0.4.1}/app/services/openai_credentials.py +0 -0
  185. {metalist-0.4.0 → metalist-0.4.1}/app/services/query_service.py +0 -0
  186. {metalist-0.4.0 → metalist-0.4.1}/app/services/reference_presentation.py +0 -0
  187. {metalist-0.4.0 → metalist-0.4.1}/app/services/reminders.py +0 -0
  188. {metalist-0.4.0 → metalist-0.4.1}/app/services/remote_image_proxy.py +0 -0
  189. {metalist-0.4.0 → metalist-0.4.1}/app/services/root_sorting.py +0 -0
  190. {metalist-0.4.0 → metalist-0.4.1}/app/services/runtime_hardening.py +0 -0
  191. {metalist-0.4.0 → metalist-0.4.1}/app/services/search_history.py +0 -0
  192. {metalist-0.4.0 → metalist-0.4.1}/app/services/search_history_storage.py +0 -0
  193. {metalist-0.4.0 → metalist-0.4.1}/app/services/search_index.py +0 -0
  194. {metalist-0.4.0 → metalist-0.4.1}/app/services/search_query.py +0 -0
  195. {metalist-0.4.0 → metalist-0.4.1}/app/services/search_text.py +0 -0
  196. {metalist-0.4.0 → metalist-0.4.1}/app/services/selected_text_tag.py +0 -0
  197. {metalist-0.4.0 → metalist-0.4.1}/app/services/session_timeout_service.py +0 -0
  198. {metalist-0.4.0 → metalist-0.4.1}/app/services/shell_session_service.py +0 -0
  199. {metalist-0.4.0 → metalist-0.4.1}/app/services/sound_storage.py +0 -0
  200. {metalist-0.4.0 → metalist-0.4.1}/app/services/store.py +0 -0
  201. {metalist-0.4.0 → metalist-0.4.1}/app/services/sync.py +0 -0
  202. {metalist-0.4.0 → metalist-0.4.1}/app/services/sync_state.py +0 -0
  203. {metalist-0.4.0 → metalist-0.4.1}/app/services/tab_state.py +0 -0
  204. {metalist-0.4.0 → metalist-0.4.1}/app/services/tag_case.py +0 -0
  205. {metalist-0.4.0 → metalist-0.4.1}/app/services/tag_ontology.py +0 -0
  206. {metalist-0.4.0 → metalist-0.4.1}/app/services/tag_rename.py +0 -0
  207. {metalist-0.4.0 → metalist-0.4.1}/app/services/tokens.py +0 -0
  208. {metalist-0.4.0 → metalist-0.4.1}/app/services/transaction_manager.py +0 -0
  209. {metalist-0.4.0 → metalist-0.4.1}/app/services/undo_service.py +0 -0
  210. {metalist-0.4.0 → metalist-0.4.1}/app/services/view_cache.py +0 -0
  211. {metalist-0.4.0 → metalist-0.4.1}/app/services/view_diff.py +0 -0
  212. {metalist-0.4.0 → metalist-0.4.1}/app/services/view_state.py +0 -0
  213. {metalist-0.4.0 → metalist-0.4.1}/app/services/windows_process_control.py +0 -0
  214. {metalist-0.4.0 → metalist-0.4.1}/app/startup_environment.py +0 -0
  215. {metalist-0.4.0 → metalist-0.4.1}/app/startup_js_sanity.py +0 -0
  216. {metalist-0.4.0 → metalist-0.4.1}/app/startup_sanity.py +0 -0
  217. {metalist-0.4.0 → metalist-0.4.1}/app/startup_sanity_config.py +0 -0
  218. {metalist-0.4.0 → metalist-0.4.1}/app/static/config/command_palette_tags.json +0 -0
  219. {metalist-0.4.0 → metalist-0.4.1}/app/static/css/forms.css +0 -0
  220. {metalist-0.4.0 → metalist-0.4.1}/app/static/img/favicon.ico +0 -0
  221. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/locked.js +0 -0
  222. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/main.js +0 -0
  223. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/activity-tracker.js +0 -0
  224. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/ai-chat/agent-prompt-service.js +0 -0
  225. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/ai-chat/agent-retrieval-settings.js +0 -0
  226. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/ai-chat/ai-agent-debug-view.js +0 -0
  227. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/ai-chat/ai-chat-api.js +0 -0
  228. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/ai-chat/ai-chat-panel-controller.js +0 -0
  229. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/ai-chat/ai-chat-panel-service.js +0 -0
  230. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/ai-chat/ai-thinking-level-service.js +0 -0
  231. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/ai-chat/bulk-elapsed-clock.js +0 -0
  232. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/ai-chat/bulk-proposal-ui.js +0 -0
  233. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/ai-chat/cloud-privacy-policy.js +0 -0
  234. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/ai-chat/proposal-menu.js +0 -0
  235. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/api-client.js +0 -0
  236. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/api-failure-classification-service.js +0 -0
  237. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/async-result.js +0 -0
  238. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/auth.js +0 -0
  239. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/client-state-api.js +0 -0
  240. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/client-state-migration.js +0 -0
  241. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/command-palette/activation-auth-policy.js +0 -0
  242. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/command-palette/backup-command-availability.js +0 -0
  243. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/command-palette/click-activation-service.js +0 -0
  244. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/command-palette/note-layout-preferences.js +0 -0
  245. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/command-palette/preferences-store.js +0 -0
  246. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/command-palette/tag-config-loader.js +0 -0
  247. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/command-palette/usage-store.js +0 -0
  248. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/config.js +0 -0
  249. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/connectivity-monitor.js +0 -0
  250. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/context-menu/context-menu-service.js +0 -0
  251. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/context-menu/context-menu-target-service.js +0 -0
  252. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/context-menu/input-caret-service.js +0 -0
  253. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/disconnect-editing-state-service.js +0 -0
  254. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/dom-utils-fixed.js +0 -0
  255. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/dom-utils.js +0 -0
  256. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/editor-commands.js +0 -0
  257. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/editor-selection.js +0 -0
  258. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/editor-toolbar.js +0 -0
  259. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/elapsed-time.js +0 -0
  260. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/error-handler.js +0 -0
  261. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/error-overlay.js +0 -0
  262. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/location-flags.js +0 -0
  263. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/login-namespace-picker.js +0 -0
  264. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/modals/agent-prompt-editor-modal.js +0 -0
  265. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/modals/ai-agent-settings-modal.js +0 -0
  266. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/modals/alphabetize-root-notes-modal.js +0 -0
  267. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/modals/backup-restore-modal.js +0 -0
  268. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/modals/backup-result-modal.js +0 -0
  269. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/modals/backup-retention-modal.js +0 -0
  270. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/modals/backup-settings-modal.js +0 -0
  271. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/modals/base-modal.js +0 -0
  272. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/modals/confirmation-modal.js +0 -0
  273. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/modals/delete-namespace-modal.js +0 -0
  274. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/modals/delete-namespace-validation.js +0 -0
  275. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/modals/help-modal.js +0 -0
  276. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/modals/namespace-loading-page.js +0 -0
  277. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/modals/namespace-modals.js +0 -0
  278. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/modals/namespace-ports-profile.js +0 -0
  279. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/modals/namespace-rename-validation.js +0 -0
  280. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/modals/note-layout-appearance-modal.js +0 -0
  281. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/modals/ontology-modal.js +0 -0
  282. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/modals/password-modal.js +0 -0
  283. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/modals/prioritize-modal.js +0 -0
  284. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/modals/random-password-modal.js +0 -0
  285. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/modals/reminder-modal.js +0 -0
  286. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/modals/reset-updated-at-modal.js +0 -0
  287. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/modals/search-suggestion-statistics-modal.js +0 -0
  288. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/modals/session-timeout-modal.js +0 -0
  289. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/modals/sound-manager-modal.js +0 -0
  290. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/modals/version-info-modal.js +0 -0
  291. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/actions/content-actions.js +0 -0
  292. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/actions/history-actions.js +0 -0
  293. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/actions/note-actions.js +0 -0
  294. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/actions/search-actions.js +0 -0
  295. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/actions/selection-actions.js +0 -0
  296. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/events/focus-events.js +0 -0
  297. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/events/inactivity-events.js +0 -0
  298. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/events/input-events.js +0 -0
  299. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/events/keyboard-events.js +0 -0
  300. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/events/search-events.js +0 -0
  301. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/mode-context.js +0 -0
  302. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/mode-logger.js +0 -0
  303. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/mode-manager-controller.js +0 -0
  304. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/add-style-service.js +0 -0
  305. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/animated-scroll-service.js +0 -0
  306. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/backlinks-navigation-service.js +0 -0
  307. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/backlinks-panel-service.js +0 -0
  308. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/clipboard-shortcut-policy-service.js +0 -0
  309. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/collapse-affordance-service.js +0 -0
  310. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/collapse-editing-policy-service.js +0 -0
  311. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/command-gate-service.js +0 -0
  312. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/context-menu-target-service.js +0 -0
  313. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/deselect-selection-state-service.js +0 -0
  314. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/differential-view-service.js +0 -0
  315. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/edit-session-collapse-policy-service.js +0 -0
  316. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/edit-session-collapse-service.js +0 -0
  317. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/embedded-image-service.js +0 -0
  318. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/file-drop-policy-service.js +0 -0
  319. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/file-image-preview-service.js +0 -0
  320. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/file-reference-service.js +0 -0
  321. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/filtered-refresh-selection-service.js +0 -0
  322. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/footnote-navigation-service.js +0 -0
  323. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/history-selection-policy-service.js +0 -0
  324. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/history-shortcut-policy-service.js +0 -0
  325. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/html-paste-sanitizer-service.js +0 -0
  326. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/image-context-menu-action-service.js +0 -0
  327. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/image-file-insert-choice-modal-service.js +0 -0
  328. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/infinite-scroll-service.js +0 -0
  329. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/link-context-menu-action-service.js +0 -0
  330. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/markdown-render-service.js +0 -0
  331. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/mermaid-render-service.js +0 -0
  332. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/note-click-target-service.js +0 -0
  333. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/note-clipboard-write-service.js +0 -0
  334. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/note-collapse-animation-service.js +0 -0
  335. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/note-context-menu-action-service.js +0 -0
  336. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/note-delete-shortcut-policy-service.js +0 -0
  337. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/note-drag-service.js +0 -0
  338. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/note-fullscreen-service.js +0 -0
  339. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/note-reposition-animation-service.js +0 -0
  340. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/note-split-service.js +0 -0
  341. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/note-timestamp-hover-service.js +0 -0
  342. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/password-clipboard-service.js +0 -0
  343. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/polling-service.js +0 -0
  344. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/reference-source-navigation-service.js +0 -0
  345. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/remote-image-proxy-service.js +0 -0
  346. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/remove-formatting-service.js +0 -0
  347. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/root-date-separator-service.js +0 -0
  348. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/root-sort-indicator-service.js +0 -0
  349. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/root-sort-service.js +0 -0
  350. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/scroll-anchor-service.js +0 -0
  351. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/scroll-restoration-service.js +0 -0
  352. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/scroll-to-top-service.js +0 -0
  353. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/search-contexts-overlay-service.js +0 -0
  354. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/search-debounce-service.js +0 -0
  355. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/search-input-service.js +0 -0
  356. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/search-interaction-service.js +0 -0
  357. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/search-redaction-reveal-service.js +0 -0
  358. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/search-suggestion-statistics-service.js +0 -0
  359. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/search-suggestion-window-labels-service.js +0 -0
  360. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/search-suggestion-windows-service.js +0 -0
  361. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/search-suggestions-service.js +0 -0
  362. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/search-syntax-service.js +0 -0
  363. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/selected-formatting-removal-service.js +0 -0
  364. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/selected-text-tag-service.js +0 -0
  365. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/shell-output-service.js +0 -0
  366. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/tab-dom-cache-service.js +0 -0
  367. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/tab-drag-service.js +0 -0
  368. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/tab-duplication-service.js +0 -0
  369. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/tab-state-service.js +0 -0
  370. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/tag-bar-service.js +0 -0
  371. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/tag-proposal-service.js +0 -0
  372. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/tag-suggestions-service.js +0 -0
  373. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/tag-syntax-service.js +0 -0
  374. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/todo-toggle-editing-service.js +0 -0
  375. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/untagged-view-indicator-service.js +0 -0
  376. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/mode-manager/services/view-mode-search-shortcut-service.js +0 -0
  377. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/password-operation-response.js +0 -0
  378. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/password-policy.js +0 -0
  379. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/password-strength.js +0 -0
  380. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/reminder-store.js +0 -0
  381. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/reminder-surface-service.js +0 -0
  382. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/selection-markers.js +0 -0
  383. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/session-auth.js +0 -0
  384. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/sound-service.js +0 -0
  385. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/tag-token.js +0 -0
  386. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/modules/uuid.js +0 -0
  387. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/namespace-deleted.js +0 -0
  388. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/namespace-renamed.js +0 -0
  389. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/vendor/dompurify-3.4.12.LICENSE.txt +0 -0
  390. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/vendor/dompurify-3.4.12.min.js +0 -0
  391. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/vendor/markdown-it.min.js +0 -0
  392. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/vendor/mermaid-11.9.0.LICENSE.txt +0 -0
  393. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/vendor/mermaid-11.9.0.min.js +0 -0
  394. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/vendor/zxcvbn-4.4.2.LICENSE.txt +0 -0
  395. {metalist-0.4.0 → metalist-0.4.1}/app/static/js/vendor/zxcvbn-4.4.2.js +0 -0
  396. {metalist-0.4.0 → metalist-0.4.1}/app/static/note-html-policy.json +0 -0
  397. {metalist-0.4.0 → metalist-0.4.1}/app/static/video/login-startup.mp4 +0 -0
  398. {metalist-0.4.0 → metalist-0.4.1}/app/templates/base.html +0 -0
  399. {metalist-0.4.0 → metalist-0.4.1}/app/templates/index.html +0 -0
  400. {metalist-0.4.0 → metalist-0.4.1}/app/templates/locked.html +0 -0
  401. {metalist-0.4.0 → metalist-0.4.1}/app/templates/maintenance.html +0 -0
  402. {metalist-0.4.0 → metalist-0.4.1}/app/templates/namespace_deleted.html +0 -0
  403. {metalist-0.4.0 → metalist-0.4.1}/app/templates/namespace_renamed.html +0 -0
  404. {metalist-0.4.0 → metalist-0.4.1}/app/templates/notes_list.html +0 -0
  405. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/__init__.py +0 -0
  406. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/add_selected_text_tag.py +0 -0
  407. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/alphabetize_root_notes.py +0 -0
  408. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/base.py +0 -0
  409. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/bulk_tag_proposals.py +0 -0
  410. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/collapse.py +0 -0
  411. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/create_child.py +0 -0
  412. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/create_note.py +0 -0
  413. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/create_sibling.py +0 -0
  414. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/delete_subtree.py +0 -0
  415. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/delete_tag.py +0 -0
  416. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/expand.py +0 -0
  417. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/indent.py +0 -0
  418. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/lock.py +0 -0
  419. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/move.py +0 -0
  420. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/move_to_top.py +0 -0
  421. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/outdent.py +0 -0
  422. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/prioritize.py +0 -0
  423. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/redo.py +0 -0
  424. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/rename_tag.py +0 -0
  425. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/reset_updated_at.py +0 -0
  426. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/resize_image.py +0 -0
  427. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/run_shell.py +0 -0
  428. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/search_comment_autofill.py +0 -0
  429. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/search_context_tags.py +0 -0
  430. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/set_collapse_bulk.py +0 -0
  431. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/set_collapse_in_context.py +0 -0
  432. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/split_note.py +0 -0
  433. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/tag_proposals.py +0 -0
  434. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/toggle_reference_mode.py +0 -0
  435. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/toggle_todo_done.py +0 -0
  436. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/undo.py +0 -0
  437. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/unformat_content.py +0 -0
  438. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/update_content.py +0 -0
  439. {metalist-0.4.0 → metalist-0.4.1}/app/usecases/view.py +0 -0
  440. {metalist-0.4.0 → metalist-0.4.1}/app/utils/__init__.py +0 -0
  441. {metalist-0.4.0 → metalist-0.4.1}/app/utils/encryption.py +0 -0
  442. {metalist-0.4.0 → metalist-0.4.1}/app/utils/text_utils.py +0 -0
  443. {metalist-0.4.0 → metalist-0.4.1}/convert-from-legacy.py +0 -0
  444. {metalist-0.4.0 → metalist-0.4.1}/main.py +0 -0
  445. {metalist-0.4.0 → metalist-0.4.1}/metalist.egg-info/dependency_links.txt +0 -0
  446. {metalist-0.4.0 → metalist-0.4.1}/metalist.egg-info/entry_points.txt +0 -0
  447. {metalist-0.4.0 → metalist-0.4.1}/metalist.egg-info/top_level.txt +0 -0
  448. {metalist-0.4.0 → metalist-0.4.1}/scripts/generate-lan-cert.sh +0 -0
  449. {metalist-0.4.0 → metalist-0.4.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: metalist
3
- Version: 0.4.0
3
+ Version: 0.4.1
4
4
  Summary: A minimalist single-user note-taking app with SSR, fast in-memory tree operations, and efficient sync.
5
5
  Project-URL: Homepage, https://github.com/evolvingstuff/metalist
6
6
  Project-URL: Repository, https://github.com/evolvingstuff/metalist
@@ -27,6 +27,7 @@ Requires-Dist: starlette==1.3.1
27
27
  Requires-Dist: tqdm==4.70.0
28
28
  Requires-Dist: tree-sitter==0.25.2
29
29
  Requires-Dist: tree-sitter-javascript==0.25.0
30
+ Requires-Dist: typing_extensions==4.16.0
30
31
  Requires-Dist: uvicorn==0.52.0
31
32
  Requires-Dist: zxcvbn==4.5.0
32
33
  Provides-Extra: dev
@@ -101,7 +102,11 @@ After the first installation, update and restart MetaList with one cross-platfor
101
102
  ```bash
102
103
  metalist update
103
104
  ```
104
- The updater checks the installed version against the latest PyPI release first. If MetaList is already current, it reports the installed version and leaves all running namespaces untouched. When an update is available, it stops running namespaces, hands off to an external PowerShell process on Windows or `/bin/sh` on macOS/Linux so the installed environment can unlock, installs the exact version reported by PyPI with a forced cache refresh, launches MetaList again, and reports the installed version (for example, `MetaList updated to v0.4.0.`).
105
+ The updater checks the installed version against the latest PyPI release first. If MetaList is already current, it reports the installed version and leaves all running namespaces untouched. When an update is available, it checks the installer prerequisites, stops running namespaces, and creates and verifies a new backup of every namespace before installation can begin. Each archive includes the complete notes/settings database, the attachments/sounds database when present, and any legacy search-history database. Locked namespaces are backed up with their encrypted data and key metadata intact, without requiring a password.
106
+
107
+ Backups are saved to `~/MetaList/namespaces/<namespace>/backups/<namespace>-<timestamp>.metalist-backup.tar.gz`; the updater prints each verified path. Existing backups remain unchanged and are not pruned. If any backup fails, the update aborts with the current installation intact; run `metalist` to restart the stopped servers after resolving the failure.
108
+
109
+ Only after all backups pass does the updater hand off to an external PowerShell process on Windows or `/bin/sh` on macOS/Linux so the installed environment can unlock. It installs the exact version reported by PyPI with a forced cache refresh, launches MetaList again, and reports the installed version (for example, `MetaList updated to v0.4.1.`). This protection requires an installed version containing the backup safeguard and applies to `metalist update`; direct pip/uv install commands do not run it.
105
110
 
106
111
  For pip, users can run `pip install metalist`. For a non-editable local install from this checkout, use `uv pip install .` or `pip install .` instead of the editable command below.
107
112
 
@@ -269,8 +274,9 @@ This repo now packages itself under the PyPI distribution name `metalist`. Curre
269
274
 
270
275
  Recommended release path:
271
276
  1. In the existing PyPI project `metalist`, configure GitHub Trusted Publishing for `evolvingstuff/metalist` and the workflow file `.github/workflows/publish-pypi.yml`.
272
- 2. Push a tag such as `v0.3.5`.
273
- 3. After the GitHub Actions workflow completes, users can run it with `uvx metalist`, install it persistently with `uv tool install metalist`, or install it with `pip install metalist`.
277
+ 2. Push the candidate commit to a branch and wait for the `Publish to PyPI` validation workflow to pass for that exact commit. GitHub-hosted Windows, macOS, and Linux runners install the built wheel and test application startup outside the source checkout on Python 3.10 through 3.13. You do not need those operating systems locally. Archive verification also checks runtime files, including agent Markdown resources, against both the wheel and source distribution.
278
+ 3. Only after every required check passes, create and push the release tag for that same commit. Any intervening change requires a new validation run before tagging. Branch and pull-request runs validate without publishing.
279
+ 4. The tag workflow repeats validation and publishes the same artifacts tested by its full matrix. Manual publication also requires all checks to pass. Users can then run it with `uvx metalist`, install it persistently with `uv tool install metalist`, or install it with `pip install metalist`.
274
280
 
275
281
  If `--input` is omitted, a file picker opens (when `tkinter` is available).
276
282
  Notes tagged with `@implies` are converted into ontology rules and are not imported as notes. Legacy rules that are invalid under the current ontology grammar are reported and skipped while valid rules continue importing.
@@ -65,7 +65,11 @@ After the first installation, update and restart MetaList with one cross-platfor
65
65
  ```bash
66
66
  metalist update
67
67
  ```
68
- The updater checks the installed version against the latest PyPI release first. If MetaList is already current, it reports the installed version and leaves all running namespaces untouched. When an update is available, it stops running namespaces, hands off to an external PowerShell process on Windows or `/bin/sh` on macOS/Linux so the installed environment can unlock, installs the exact version reported by PyPI with a forced cache refresh, launches MetaList again, and reports the installed version (for example, `MetaList updated to v0.4.0.`).
68
+ The updater checks the installed version against the latest PyPI release first. If MetaList is already current, it reports the installed version and leaves all running namespaces untouched. When an update is available, it checks the installer prerequisites, stops running namespaces, and creates and verifies a new backup of every namespace before installation can begin. Each archive includes the complete notes/settings database, the attachments/sounds database when present, and any legacy search-history database. Locked namespaces are backed up with their encrypted data and key metadata intact, without requiring a password.
69
+
70
+ Backups are saved to `~/MetaList/namespaces/<namespace>/backups/<namespace>-<timestamp>.metalist-backup.tar.gz`; the updater prints each verified path. Existing backups remain unchanged and are not pruned. If any backup fails, the update aborts with the current installation intact; run `metalist` to restart the stopped servers after resolving the failure.
71
+
72
+ Only after all backups pass does the updater hand off to an external PowerShell process on Windows or `/bin/sh` on macOS/Linux so the installed environment can unlock. It installs the exact version reported by PyPI with a forced cache refresh, launches MetaList again, and reports the installed version (for example, `MetaList updated to v0.4.1.`). This protection requires an installed version containing the backup safeguard and applies to `metalist update`; direct pip/uv install commands do not run it.
69
73
 
70
74
  For pip, users can run `pip install metalist`. For a non-editable local install from this checkout, use `uv pip install .` or `pip install .` instead of the editable command below.
71
75
 
@@ -233,8 +237,9 @@ This repo now packages itself under the PyPI distribution name `metalist`. Curre
233
237
 
234
238
  Recommended release path:
235
239
  1. In the existing PyPI project `metalist`, configure GitHub Trusted Publishing for `evolvingstuff/metalist` and the workflow file `.github/workflows/publish-pypi.yml`.
236
- 2. Push a tag such as `v0.3.5`.
237
- 3. After the GitHub Actions workflow completes, users can run it with `uvx metalist`, install it persistently with `uv tool install metalist`, or install it with `pip install metalist`.
240
+ 2. Push the candidate commit to a branch and wait for the `Publish to PyPI` validation workflow to pass for that exact commit. GitHub-hosted Windows, macOS, and Linux runners install the built wheel and test application startup outside the source checkout on Python 3.10 through 3.13. You do not need those operating systems locally. Archive verification also checks runtime files, including agent Markdown resources, against both the wheel and source distribution.
241
+ 3. Only after every required check passes, create and push the release tag for that same commit. Any intervening change requires a new validation run before tagging. Branch and pull-request runs validate without publishing.
242
+ 4. The tag workflow repeats validation and publishes the same artifacts tested by its full matrix. Manual publication also requires all checks to pass. Users can then run it with `uvx metalist`, install it persistently with `uv tool install metalist`, or install it with `pip install metalist`.
238
243
 
239
244
  If `--input` is omitted, a file picker opens (when `tkinter` is available).
240
245
  Notes tagged with `@implies` are converted into ontology rules and are not imported as notes. Legacy rules that are invalid under the current ontology grammar are reported and skipped while valid rules continue importing.
@@ -7,12 +7,13 @@ import json
7
7
  import math
8
8
  import time
9
9
  from collections.abc import AsyncIterator
10
- from typing import Annotated, Any, Literal, Self
10
+ from typing import Annotated, Any, Literal
11
11
  from uuid import uuid4
12
12
 
13
13
  from fastapi import APIRouter, Depends, HTTPException, Response
14
14
  from fastapi.responses import StreamingResponse
15
15
  from pydantic import BaseModel, ConfigDict, Field, SecretStr, field_validator, model_validator
16
+ from typing_extensions import Self
16
17
 
17
18
  from app.api.request_auth import require_request_auth_token
18
19
  from app.api.transactions import transactional_route
@@ -60,7 +60,6 @@ from app.services import auth_cache_state
60
60
  from app.services.ontology_rules_store import ensure_rules_decrypted_and_compiled
61
61
  from app.services.link_titles import link_title_store
62
62
  from app.services.reminders import reminder_store
63
- from app.services.embedded_documents import document_store
64
63
  from app.services.search_history import search_history_store
65
64
  from app.services.sound_storage import sound_store
66
65
  from app.services.runtime_lock import purge_decrypted_runtime_state
@@ -347,7 +346,6 @@ def _reset_runtime_state_after_restore() -> bool:
347
346
  tab_state_store.reset()
348
347
  link_title_store.reset()
349
348
  reminder_store.reset()
350
- document_store.reset()
351
349
  search_history_store.reset()
352
350
  sound_store.reset()
353
351
  clear_all_locks()
@@ -378,7 +376,6 @@ def _reset_runtime_state_after_restore() -> bool:
378
376
  tab_state_store.bootstrap(connection=connection)
379
377
  link_title_store.bootstrap(connection=connection)
380
378
  reminder_store.bootstrap(connection=connection)
381
- document_store.bootstrap(connection=connection)
382
379
  if not password_required or database_version == CURRENT_DATABASE_VERSION:
383
380
  search_history_store.bootstrap(connection=connection)
384
381
  else:
@@ -520,7 +517,6 @@ def login(
520
517
  tab_state_store.ensure_decrypted(token="")
521
518
  link_title_store.ensure_decrypted(token="")
522
519
  reminder_store.ensure_decrypted(token="")
523
- document_store.ensure_decrypted(token="")
524
520
  search_history_store.ensure_decrypted(token="")
525
521
 
526
522
  ai_chat_store.reset()
@@ -5,10 +5,10 @@ from __future__ import annotations
5
5
  from collections.abc import Callable
6
6
  from dataclasses import dataclass
7
7
  import sqlite3
8
+ import re
8
9
 
9
10
  from app.db.version import CURRENT_DATABASE_VERSION
10
11
  from app.db.schema import create_namespace_content_migrations_table
11
- from app.db.schema import create_embedded_documents_table
12
12
  from app.services.encryption import EncryptionService
13
13
 
14
14
 
@@ -309,10 +309,65 @@ def _migration_6_to_7(
309
309
  encryption_enabled: bool,
310
310
  encryption_service: EncryptionService | None,
311
311
  ) -> int:
312
- create_embedded_documents_table(connection)
312
+ # Retain the historical step so upgrades remain ordered and transactional.
313
+ connection.execute(
314
+ "CREATE TABLE IF NOT EXISTS embedded_documents ("
315
+ "id TEXT PRIMARY KEY, payload TEXT NOT NULL, nonce BLOB, tag BLOB)"
316
+ )
313
317
  return 0
314
318
 
315
319
 
320
+ def _remove_retired_document_references(
321
+ *, connection: sqlite3.Connection, document_ids: set[str],
322
+ encryption_enabled: bool, encryption_service: EncryptionService | None,
323
+ ) -> int:
324
+ if encryption_enabled and (encryption_service is None or encryption_service.dek is None):
325
+ raise RuntimeError("Database migration 7→8 requires the namespace DEK")
326
+ token_pattern = re.compile(r"!?\[\[([0-9a-fA-F-]{36})\]\]")
327
+ rewritten_count = 0
328
+ rows = connection.execute("SELECT id, content, encryption_nonce, encryption_tag FROM notes").fetchall()
329
+ for note_id, content, nonce, tag in rows:
330
+ if (nonce is None) != (tag is None):
331
+ raise RuntimeError("Note has incomplete encryption metadata during migration 7→8")
332
+ plaintext = content
333
+ if nonce is not None:
334
+ if encryption_service is None or encryption_service.dek is None:
335
+ raise RuntimeError("Encrypted note requires the namespace DEK during migration 7→8")
336
+ plaintext = encryption_service.decrypt_from_storage(content, nonce, tag)
337
+ cleaned = token_pattern.sub(
338
+ lambda match: "" if match.group(1).lower() in document_ids else match.group(0),
339
+ plaintext,
340
+ )
341
+ if cleaned == plaintext:
342
+ continue
343
+ fields = (cleaned, None, None)
344
+ if encryption_enabled:
345
+ assert encryption_service is not None
346
+ fields = encryption_service.encrypt_for_storage(cleaned)
347
+ connection.execute(
348
+ "UPDATE notes SET content = ?, encryption_nonce = ?, encryption_tag = ? WHERE id = ?",
349
+ (*fields, note_id),
350
+ )
351
+ rewritten_count += 1
352
+ return rewritten_count
353
+
354
+
355
+ def _migration_7_to_8(
356
+ *, connection: sqlite3.Connection, encryption_enabled: bool,
357
+ encryption_service: EncryptionService | None,
358
+ ) -> int:
359
+ """Remove retired diagrams and their placements from the installed live DB only."""
360
+ document_ids = {row[0] for row in connection.execute("SELECT id FROM embedded_documents")}
361
+ rewritten_count = 0
362
+ if document_ids:
363
+ rewritten_count = _remove_retired_document_references(
364
+ connection=connection, document_ids=document_ids,
365
+ encryption_enabled=encryption_enabled, encryption_service=encryption_service,
366
+ )
367
+ connection.execute("DROP TABLE embedded_documents")
368
+ return rewritten_count
369
+
370
+
316
371
  _MIGRATIONS: dict[
317
372
  int,
318
373
  Callable[..., int],
@@ -324,6 +379,7 @@ _MIGRATIONS: dict[
324
379
  4: _migration_4_to_5,
325
380
  5: _migration_5_to_6,
326
381
  6: _migration_6_to_7,
382
+ 7: _migration_7_to_8,
327
383
  }
328
384
 
329
385
 
@@ -14,15 +14,6 @@ SEARCH_HISTORY_TABLE = "search_interaction_history"
14
14
  NAMESPACE_LAUNCH_PROFILE_TABLE = "namespace_launch_profile"
15
15
  NAMESPACE_CONTENT_MIGRATIONS_TABLE = "namespace_content_migrations"
16
16
 
17
- _CREATE_EMBEDDED_DOCUMENTS_TABLE = """
18
- CREATE TABLE IF NOT EXISTS embedded_documents (
19
- id TEXT PRIMARY KEY,
20
- payload TEXT NOT NULL,
21
- nonce BLOB,
22
- tag BLOB
23
- );
24
- """
25
-
26
17
  _CREATE_NOTES_TABLE = f"""
27
18
  CREATE TABLE IF NOT EXISTS {NOTES_TABLE} (
28
19
  id TEXT PRIMARY KEY,
@@ -190,11 +181,6 @@ def create_namespace_content_migrations_table(connection: Connection) -> None:
190
181
  connection.execute(_CREATE_NAMESPACE_CONTENT_MIGRATIONS_TABLE)
191
182
 
192
183
 
193
- def create_embedded_documents_table(connection: Connection) -> None:
194
- """Create the v7 editable-document table in the live namespace database."""
195
- connection.execute(_CREATE_EMBEDDED_DOCUMENTS_TABLE)
196
-
197
-
198
184
  def _ensure_columns(connection: Connection, table: str, columns: dict[str, str]) -> None:
199
185
  existing = {
200
186
  row[1]
@@ -217,7 +203,6 @@ def initialize_schema(connection: Connection) -> None:
217
203
  connection.execute(_CREATE_TAB_STATE_TABLE)
218
204
  connection.execute(_CREATE_LINK_TITLES_TABLE)
219
205
  connection.execute(_CREATE_REMINDERS_TABLE)
220
- create_embedded_documents_table(connection)
221
206
  connection.execute(_CREATE_SEARCH_HISTORY_TABLE)
222
207
  connection.execute(_CREATE_NAMESPACE_LAUNCH_PROFILE_TABLE)
223
208
  connection.execute(_CREATE_NAMESPACE_CONTENT_MIGRATIONS_TABLE)
@@ -1,3 +1,3 @@
1
1
  """Database schema version constants without runtime configuration imports."""
2
2
 
3
- CURRENT_DATABASE_VERSION = 7
3
+ CURRENT_DATABASE_VERSION = 8
@@ -285,7 +285,6 @@ _MAIN_SCHEMA_BEFORE_CONTENT_MIGRATIONS = {
285
285
  "next_check_after", "failure_count", "created_at", "updated_at",
286
286
  }
287
287
  ),
288
- "embedded_documents": frozenset({"id", "payload", "nonce", "tag"}),
289
288
  "reminders": frozenset(
290
289
  {
291
290
  "id", "payload_json", "payload_encryption_nonce", "payload_encryption_tag",
@@ -424,6 +423,7 @@ _MIGRATION_DEFERRED_PLAINTEXT_FIELDS_BY_DATABASE_VERSION = {
424
423
  4: frozenset({("notes", "proposed_tags")}),
425
424
  5: frozenset({("notes", "proposed_tags")}),
426
425
  6: frozenset(),
426
+ 7: frozenset(),
427
427
  }
428
428
 
429
429
 
@@ -453,12 +453,11 @@ def _main_schema_for_database_version(
453
453
  if database_version < 0 or database_version > CURRENT_DATABASE_VERSION:
454
454
  raise ValueError("database_version is outside the supported audit range")
455
455
  resolved_schema = expected_schema
456
- # Audit precedes live schema initialization. Only pre-v7 namespaces may
457
- # legitimately lack this table; if present, all columns/payloads are audited.
458
- if database_version < 7 and "embedded_documents" not in actual_tables:
456
+ # Read-only audits must still validate retired payloads before the live 7→8 migration.
457
+ if database_version < 8 and (database_version == 7 or "embedded_documents" in actual_tables):
459
458
  resolved_schema = {
460
- table: columns for table, columns in resolved_schema.items()
461
- if table != "embedded_documents"
459
+ **resolved_schema,
460
+ "embedded_documents": frozenset({"id", "payload", "nonce", "tag"}),
462
461
  }
463
462
  if database_version < 6 and _PROPOSED_TAG_COLUMNS.isdisjoint(actual_notes_columns):
464
463
  note_columns = resolved_schema["notes"]
@@ -28,7 +28,6 @@ from app.services.ontology_rules_store import bootstrap_ontology_rules_store
28
28
  from app.services.tab_state import tab_state_store
29
29
  from app.services.link_titles import link_title_store
30
30
  from app.services.reminders import reminder_store
31
- from app.services.embedded_documents import document_store
32
31
  from app.services.search_history import search_history_store
33
32
  from app.services.sound_storage import sound_store
34
33
  from app.services.runtime_hardening import apply_runtime_hardening
@@ -58,7 +57,6 @@ from app.api.routes.sounds import router as api2_sounds_router
58
57
  from app.api.routes.ontology import router as api2_ontology_router
59
58
  from app.api.routes.backups import router as api2_backup_router
60
59
  from app.api.routes.reminders import router as api2_reminders_router
61
- from app.api.routes.embedded_documents import router as api2_documents_router
62
60
  from app.api.routes.remote_images import router as api2_remote_images_router
63
61
  from app.api.routes.ai import router as api2_ai_router
64
62
  from app.api.routes.test import router as api2_test_router
@@ -198,7 +196,6 @@ with begin_writer() as connection:
198
196
  tab_state_store.bootstrap(connection=connection)
199
197
  link_title_store.bootstrap(connection=connection)
200
198
  reminder_store.bootstrap(connection=connection)
201
- document_store.bootstrap(connection=connection)
202
199
  if not bool(settings["encryption_enabled"]) or database_version >= CURRENT_DATABASE_VERSION:
203
200
  search_history_store.bootstrap(connection=connection)
204
201
  else:
@@ -323,7 +320,6 @@ app.include_router(api2_files_router, prefix=API_PREFIX)
323
320
  app.include_router(api2_sounds_router, prefix=API_PREFIX)
324
321
  app.include_router(api2_ontology_router, prefix=API_PREFIX)
325
322
  app.include_router(api2_reminders_router, prefix=API_PREFIX)
326
- app.include_router(api2_documents_router, prefix=API_PREFIX)
327
323
  app.include_router(api2_remote_images_router, prefix=API_PREFIX)
328
324
  app.include_router(api2_ai_router, prefix=API_PREFIX)
329
325
  if TEST_MODE:
@@ -8,7 +8,6 @@ Acts as the single source of truth for note rendering across the application.
8
8
  import re
9
9
  import logging
10
10
 
11
- from app.services.document_references import render_editable_documents
12
11
  from app.services.content_formatting import format_note_content_for_view
13
12
  from app.services.content_formatting import has_scoped_footnotes
14
13
  from app.services.content_formatting import extract_plain_text_from_note_html
@@ -150,7 +149,7 @@ def render_collapsed_read_only_mode(note) -> str:
150
149
 
151
150
 
152
151
  def render_editing_mode(note) -> str:
153
- return render_editable_documents(note.content)
152
+ return note.content
154
153
 
155
154
 
156
155
  def render_redacted_mode(note) -> str:
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import argparse
4
4
  from collections.abc import Mapping, MutableMapping, Sequence
5
5
  from dataclasses import dataclass
6
- from datetime import UTC, datetime, timedelta
6
+ from datetime import datetime, timedelta, timezone
7
7
  import ipaddress
8
8
  import os
9
9
  from pathlib import Path
@@ -180,7 +180,7 @@ def _coerce_optional_db_port(*, value: object) -> int | None:
180
180
 
181
181
 
182
182
  def _utc_timestamp() -> str:
183
- return datetime.now(UTC).isoformat()
183
+ return datetime.now(timezone.utc).isoformat()
184
184
 
185
185
 
186
186
  def _connect_namespace_database(
@@ -305,7 +305,34 @@ def load_namespace_launch_profile(*, namespace: str) -> NamespaceLaunchProfile |
305
305
  return profile
306
306
 
307
307
 
308
- def load_all_namespace_launch_profiles() -> list[NamespaceLaunchProfile]:
308
+ def _read_namespace_launch_profile(
309
+ *,
310
+ database_path: Path,
311
+ namespace: str,
312
+ ) -> NamespaceLaunchProfile | None:
313
+ database_uri = f"{database_path.resolve().as_uri()}?mode=ro"
314
+ connection = sqlite3.connect(database_uri, uri=True, check_same_thread=False)
315
+ try:
316
+ connection.execute("PRAGMA query_only = ON")
317
+ profile_table = connection.execute(
318
+ "SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?",
319
+ (NAMESPACE_LAUNCH_PROFILE_TABLE,),
320
+ ).fetchone()
321
+ if profile_table is None:
322
+ return None
323
+ _assert_launch_profile_rows_belong_to_namespace(
324
+ connection=connection,
325
+ namespace=namespace,
326
+ )
327
+ return _fetch_launch_profile_from_connection(
328
+ connection=connection,
329
+ namespace=namespace,
330
+ )
331
+ finally:
332
+ connection.close()
333
+
334
+
335
+ def _load_all_namespace_launch_profiles(*, read_only: bool) -> list[NamespaceLaunchProfile]:
309
336
  namespaces_directory = resolve_namespaces_directory()
310
337
  if not namespaces_directory.exists():
311
338
  return []
@@ -330,13 +357,27 @@ def load_all_namespace_launch_profiles() -> list[NamespaceLaunchProfile]:
330
357
  f"Namespace {normalized_namespace} directory exists but database is missing: "
331
358
  f"{database_path}"
332
359
  )
333
- profile = load_namespace_launch_profile(namespace=normalized_namespace)
360
+ if read_only:
361
+ profile = _read_namespace_launch_profile(
362
+ database_path=database_path,
363
+ namespace=normalized_namespace,
364
+ )
365
+ else:
366
+ profile = load_namespace_launch_profile(namespace=normalized_namespace)
334
367
  if profile is None:
335
368
  continue
336
369
  profiles.append(profile)
337
370
  return profiles
338
371
 
339
372
 
373
+ def load_all_namespace_launch_profiles() -> list[NamespaceLaunchProfile]:
374
+ return _load_all_namespace_launch_profiles(read_only=False)
375
+
376
+
377
+ def load_all_namespace_launch_profiles_read_only() -> list[NamespaceLaunchProfile]:
378
+ return _load_all_namespace_launch_profiles(read_only=True)
379
+
380
+
340
381
  def save_namespace_launch_profile(
341
382
  *,
342
383
  namespace: str,
@@ -896,7 +937,7 @@ def ensure_default_tls_pair(*, environ: Mapping[str, str]) -> tuple[str, str] |
896
937
  subject = issuer = x509.Name(
897
938
  [x509.NameAttribute(NameOID.COMMON_NAME, common_name)]
898
939
  )
899
- now = datetime.now(UTC)
940
+ now = datetime.now(timezone.utc)
900
941
  certificate = (
901
942
  x509.CertificateBuilder()
902
943
  .subject_name(subject)
@@ -7,9 +7,10 @@ from collections.abc import Iterator
7
7
  from contextlib import contextmanager
8
8
  from contextvars import ContextVar
9
9
  from dataclasses import dataclass
10
- from typing import Annotated, Literal, Self, Union
10
+ from typing import Annotated, Literal, Union
11
11
 
12
12
  from pydantic import BaseModel, ConfigDict, Field, TypeAdapter, field_validator, model_validator
13
+ from typing_extensions import Self
13
14
 
14
15
  from app.services.search_query import parse_search_query
15
16
 
@@ -6,9 +6,10 @@ from collections.abc import Callable
6
6
  from dataclasses import dataclass
7
7
  from datetime import datetime, timezone
8
8
  from types import MappingProxyType
9
- from typing import Literal, Mapping, Self
9
+ from typing import Literal, Mapping
10
10
 
11
11
  from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
12
+ from typing_extensions import Self
12
13
 
13
14
  from app.services.agent.cloud_privacy import CloudPrivacyBoundary
14
15
  from app.services.agent.cloud_privacy import CloudPrivacyEvaluator
@@ -0,0 +1,27 @@
1
+ # Investigate Current Scope
2
+
3
+ This skill is active because the user explicitly asked for evidence from saved
4
+ notes in the frozen current MetaList scope.
5
+
6
+ The runtime supplies one authoritative evidence payload. It contains complete
7
+ root-note trees in the same order visible to the user. Every included note has
8
+ its full agent-visible content; there is no per-note truncation. If the complete
9
+ scope exceeds the configured token limit, the runtime keeps the longest leading
10
+ prefix of complete result trees that fits and reports the included and omitted
11
+ counts. Never imply that a truncated scope is exhaustive.
12
+
13
+ Treat each nested object as a note. Child notes inherit their ancestors' context,
14
+ but only explicit tags are serialized on each note. Privacy-redacted content is
15
+ not present. Do not invent omitted content.
16
+
17
+ Answer the current user request directly from relevant nodes in the payload.
18
+ Shared scope terms do not make every node relevant. Exclude material that does
19
+ not directly help answer the exact request.
20
+
21
+ For every factual claim derived from a note, cite the exact supporting note as
22
+ `[[note_id]]`. Copy the ID from the same object whose `content_text` supports
23
+ the claim. Do not cite an enclosing root merely because the supporting child is
24
+ inside it. Do not emit duplicate adjacent citations.
25
+
26
+ Write the final response in Markdown. LaTeX and Mermaid are available when they
27
+ materially help.
@@ -0,0 +1,25 @@
1
+ # Search Notes
2
+
3
+ This skill is active because the agent selected `search_notes`. Produce one
4
+ focused MetaList query through the structured schema supplied by the inference
5
+ layer. There are no result pages.
6
+
7
+ The final user message is the current request. Use earlier conversation only when
8
+ the current request explicitly depends on it. Never carry an unrelated earlier
9
+ topic into a new query as either a positive or negative term.
10
+
11
+ MetaList search syntax:
12
+
13
+ - Unquoted terms match tags. `foo bar` requires both tags.
14
+ - Quoted phrases match exact note text. `"lorem ipsum"` requires that phrase.
15
+ - A leading minus excludes a tag or phrase.
16
+ - Uppercase `OR` separates clauses.
17
+ - Every clause must contain at least one positive term.
18
+
19
+ For a broad topical request, cover tag and text forms in the first query:
20
+ `foo OR "foo"` or `foo bar OR "foo bar"`. Prefer the narrowest query supported
21
+ by the request.
22
+
23
+ The tool returns one ordered, token-bounded payload containing full content for
24
+ matching notes. It reports how many trailing result trees were omitted. Do not
25
+ request another page. If omission materially limits the answer, say so.
@@ -54,7 +54,6 @@ from app.services.sound_storage import decrypt_all_sounds_for_plaintext
54
54
  from app.services.sound_storage import encrypt_all_sounds_for_active_dek
55
55
  from app.services.link_titles import rewrite_persisted_link_titles
56
56
  from app.services.reminders import reminder_store
57
- from app.services.embedded_documents import document_store
58
57
  from app.utils.text_utils import strip_html
59
58
  from app.services.encryption import EncryptionService
60
59
  from app.services.maintenance_mode import maintenance_service
@@ -529,11 +528,6 @@ class AuthService:
529
528
  encryption_service=self.encryption,
530
529
  force_plaintext=False,
531
530
  )
532
- document_store.rewrite_storage(
533
- connection=connection,
534
- encryption_service=self.encryption,
535
- force_plaintext=False,
536
- )
537
531
  finally:
538
532
  maintenance_service.exit_maintenance()
539
533
 
@@ -848,11 +842,6 @@ class AuthService:
848
842
  encryption_service=self.encryption,
849
843
  force_plaintext=True,
850
844
  )
851
- document_store.rewrite_storage(
852
- connection=connection,
853
- encryption_service=self.encryption,
854
- force_plaintext=True,
855
- )
856
845
  clear_password_settings(connection)
857
846
  self.encryption.clear_keys()
858
847
  finally:
@@ -6,7 +6,6 @@ from dataclasses import dataclass
6
6
  from html.parser import HTMLParser
7
7
  from typing import Callable, FrozenSet, List, Optional, Tuple
8
8
 
9
- from app.services.embedded_documents import document_store, render_document
10
9
  from app.services.content_formatting import find_consumed_content_wrapper_keys
11
10
  from app.services.content_formatting import find_global_credential_tag
12
11
  from app.services.content_formatting import format_note_content_for_view
@@ -342,11 +341,7 @@ def collapsed_preview_source_has_media(content_html: str) -> bool:
342
341
  preview_source_html = extract_collapsed_preview_source_html(content_html)
343
342
  if preview_source_html == "":
344
343
  return False
345
- if _fragment_has_media_tag(preview_source_html):
346
- return True
347
- # Editable documents store UUID tokens, but render as visual previews.
348
- return any(document_store.has(token.note_id)
349
- for token in collect_reference_tokens_from_html(preview_source_html))
344
+ return _fragment_has_media_tag(preview_source_html)
350
345
 
351
346
 
352
347
  def collapsed_preview_source_has_image_file_embed(
@@ -551,11 +546,6 @@ def _render_reference_block(
551
546
  redact_passwords: bool,
552
547
  render_note_embeds_as_links: bool,
553
548
  ) -> str:
554
- if document_store.has(reference_note_id):
555
- prefix = ""
556
- if is_embed:
557
- prefix = "!"
558
- return render_document(reference_note_id, token=prefix + "[[" + reference_note_id + "]]", static_export=static_export)
559
549
  mode = "link"
560
550
  if is_embed:
561
551
  mode = "embed"
@@ -4,7 +4,7 @@ from __future__ import annotations
4
4
 
5
5
  from collections.abc import Mapping
6
6
  from dataclasses import asdict, dataclass
7
- from datetime import UTC, datetime
7
+ from datetime import datetime, timezone
8
8
  import json
9
9
  import os
10
10
  from pathlib import Path
@@ -283,7 +283,7 @@ class ManagedOllamaRuntime:
283
283
  executable=executable,
284
284
  pid=process.pid,
285
285
  port=self.config.port,
286
- started_at=datetime.now(UTC).isoformat(),
286
+ started_at=datetime.now(timezone.utc).isoformat(),
287
287
  version=version,
288
288
  )
289
289
  self._write_state(state=state)
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import argparse
4
- from datetime import UTC, datetime
4
+ from datetime import datetime, timezone
5
5
  import os
6
6
  from pathlib import Path
7
7
  import sqlite3
@@ -77,7 +77,7 @@ def _rewrite_launch_profile_namespace(
77
77
  SET namespace = ?, updated_at = ?
78
78
  WHERE namespace = ?
79
79
  """,
80
- (target_namespace, datetime.now(UTC).isoformat(), source_namespace),
80
+ (target_namespace, datetime.now(timezone.utc).isoformat(), source_namespace),
81
81
  )
82
82
  connection.commit()
83
83
  finally:
@@ -17,6 +17,7 @@ from urllib.parse import urlencode, urlsplit, urlunsplit
17
17
  import app.server_runtime as server_runtime
18
18
  from app.server_runtime import NamespaceLaunchProfile
19
19
  from app.server_runtime import load_all_namespace_launch_profiles
20
+ from app.server_runtime import load_all_namespace_launch_profiles_read_only
20
21
  from app.server_runtime import resolve_api_prefix
21
22
  from app.server_runtime import resolve_backend_connect_host
22
23
  from app.server_runtime import resolve_local_browser_host
@@ -402,9 +403,9 @@ def open_or_launch_all_namespaces(
402
403
 
403
404
 
404
405
  def stop_all_namespace_processes_for_update() -> int:
405
- profiles = _load_saved_profiles_by_namespace()
406
+ profiles = load_all_namespace_launch_profiles_read_only()
406
407
  reserved_ports: set[int] = set()
407
- for profile in profiles.values():
408
+ for profile in profiles:
408
409
  for _, port in _profile_service_ports(profile=profile):
409
410
  reserved_ports.add(port)
410
411