MetaList 0.20.0__tar.gz → 0.22.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 (991) hide show
  1. metalist-0.22.0/PKG-INFO +531 -0
  2. metalist-0.22.0/README.md +490 -0
  3. metalist-0.22.0/app/__init__.py +9 -0
  4. metalist-0.22.0/app/api/middleware/auth.py +134 -0
  5. metalist-0.22.0/app/api/note_requests.py +436 -0
  6. metalist-0.22.0/app/api/request_auth.py +76 -0
  7. metalist-0.22.0/app/api/routes/ai.py +1074 -0
  8. metalist-0.22.0/app/api/routes/app_updates.py +56 -0
  9. metalist-0.22.0/app/api/routes/auth.py +1176 -0
  10. metalist-0.22.0/app/api/routes/backups.py +1176 -0
  11. metalist-0.22.0/app/api/routes/files.py +245 -0
  12. metalist-0.22.0/app/api/routes/notes.py +1627 -0
  13. metalist-0.22.0/app/api/routes/ontology.py +494 -0
  14. metalist-0.22.0/app/api/routes/reminders.py +271 -0
  15. metalist-0.22.0/app/api/routes/remote_images.py +92 -0
  16. metalist-0.22.0/app/api/routes/test.py +17 -0
  17. metalist-0.22.0/app/api/transactions.py +155 -0
  18. metalist-0.22.0/app/api/upload_limits.py +88 -0
  19. metalist-0.22.0/app/config.py +141 -0
  20. metalist-0.22.0/app/contracts.py +258 -0
  21. metalist-0.22.0/app/db/backup_settings_sql.py +67 -0
  22. metalist-0.22.0/app/db/content_migrations_sql.py +50 -0
  23. metalist-0.22.0/app/db/editable_files_migration.py +52 -0
  24. metalist-0.22.0/app/db/engine.py +105 -0
  25. metalist-0.22.0/app/db/file_session.py +151 -0
  26. metalist-0.22.0/app/db/files_sql.py +353 -0
  27. metalist-0.22.0/app/db/link_titles_sql.py +222 -0
  28. metalist-0.22.0/app/db/live_recovery.py +278 -0
  29. metalist-0.22.0/app/db/migrations.py +435 -0
  30. metalist-0.22.0/app/db/notes_sql.py +470 -0
  31. metalist-0.22.0/app/db/ontology_rules_sql.py +150 -0
  32. metalist-0.22.0/app/db/raw_connection.py +22 -0
  33. metalist-0.22.0/app/db/reminders_sql.py +116 -0
  34. metalist-0.22.0/app/db/retire_sounds.py +70 -0
  35. metalist-0.22.0/app/db/schema.py +257 -0
  36. metalist-0.22.0/app/db/session.py +226 -0
  37. metalist-0.22.0/app/db/settings_sql.py +336 -0
  38. metalist-0.22.0/app/db/tab_state_sql.py +94 -0
  39. metalist-0.22.0/app/encryption_audit.py +1165 -0
  40. metalist-0.22.0/app/exception_boundaries.py +179 -0
  41. metalist-0.22.0/app/https_proxy.py +209 -0
  42. metalist-0.22.0/app/launch_clock.py +10 -0
  43. metalist-0.22.0/app/main.py +839 -0
  44. metalist-0.22.0/app/models/database.py +234 -0
  45. metalist-0.22.0/app/models/utils.py +296 -0
  46. metalist-0.22.0/app/network_settings.py +62 -0
  47. metalist-0.22.0/app/presentation/login_page.py +24 -0
  48. metalist-0.22.0/app/presentation/render/note_renderer.py +75 -0
  49. metalist-0.22.0/app/process_memory.py +225 -0
  50. metalist-0.22.0/app/security/authenticated_logging.py +181 -0
  51. metalist-0.22.0/app/security/crypto_sizes.py +10 -0
  52. metalist-0.22.0/app/security/note_html.py +375 -0
  53. metalist-0.22.0/app/security/rendered_html.py +188 -0
  54. metalist-0.22.0/app/security/request_boundary.py +190 -0
  55. metalist-0.22.0/app/security/request_hosts.py +88 -0
  56. metalist-0.22.0/app/security/sensitive_cache.py +116 -0
  57. metalist-0.22.0/app/server_runtime.py +1053 -0
  58. metalist-0.22.0/app/services/agent/agent_loop.py +592 -0
  59. metalist-0.22.0/app/services/agent/agent_tools.py +477 -0
  60. metalist-0.22.0/app/services/agent/ai_send.py +75 -0
  61. metalist-0.22.0/app/services/agent/cloud_privacy.py +503 -0
  62. metalist-0.22.0/app/services/agent/context.py +548 -0
  63. metalist-0.22.0/app/services/agent/evidence_serialization.py +188 -0
  64. metalist-0.22.0/app/services/agent/export_title_suggestions.py +198 -0
  65. metalist-0.22.0/app/services/agent/failure_explanations.py +173 -0
  66. metalist-0.22.0/app/services/agent/help_catalog.py +27 -0
  67. metalist-0.22.0/app/services/agent/history.py +125 -0
  68. metalist-0.22.0/app/services/agent/menu_actions.py +69 -0
  69. metalist-0.22.0/app/services/agent/note_aliases.py +77 -0
  70. metalist-0.22.0/app/services/agent/note_tag_suggestions.py +319 -0
  71. metalist-0.22.0/app/services/agent/openai_cost_tracking.py +190 -0
  72. metalist-0.22.0/app/services/agent/openai_inference.py +586 -0
  73. metalist-0.22.0/app/services/agent/openai_models.py +25 -0
  74. metalist-0.22.0/app/services/agent/privacy_guard.py +81 -0
  75. metalist-0.22.0/app/services/agent/retrieval_settings.py +133 -0
  76. metalist-0.22.0/app/services/agent/runtime.py +1734 -0
  77. metalist-0.22.0/app/services/agent/scope.py +587 -0
  78. metalist-0.22.0/app/services/agent/skills/help-ai.md +149 -0
  79. metalist-0.22.0/app/services/agent/skills/help-data.md +54 -0
  80. metalist-0.22.0/app/services/agent/skills/help-formatting.md +230 -0
  81. metalist-0.22.0/app/services/agent/skills/help-menus.md +119 -0
  82. metalist-0.22.0/app/services/agent/skills/help-mouse.md +57 -0
  83. metalist-0.22.0/app/services/agent/skills/help-notes.md +124 -0
  84. metalist-0.22.0/app/services/agent/skills/help-ontology.md +166 -0
  85. metalist-0.22.0/app/services/agent/skills/help-privacy.md +161 -0
  86. metalist-0.22.0/app/services/agent/skills/help-references.md +121 -0
  87. metalist-0.22.0/app/services/agent/skills/help-releases.md +189 -0
  88. metalist-0.22.0/app/services/agent/skills/help-search.md +295 -0
  89. metalist-0.22.0/app/services/agent/skills/help-tags.md +223 -0
  90. metalist-0.22.0/app/services/agent/staged_summary.py +207 -0
  91. metalist-0.22.0/app/services/agent/structured_inference.py +683 -0
  92. metalist-0.22.0/app/services/agent/summary_batch_store.py +114 -0
  93. metalist-0.22.0/app/services/agent/tagging.py +214 -0
  94. metalist-0.22.0/app/services/agent/tagging_run.py +507 -0
  95. metalist-0.22.0/app/services/agent/token_estimation.py +101 -0
  96. metalist-0.22.0/app/services/agent/tool_calling.py +149 -0
  97. metalist-0.22.0/app/services/agent/trace.py +256 -0
  98. metalist-0.22.0/app/services/agent/web_capabilities.py +180 -0
  99. metalist-0.22.0/app/services/agent/web_evidence.py +360 -0
  100. metalist-0.22.0/app/services/agent/web_fetch.py +649 -0
  101. metalist-0.22.0/app/services/agent/web_settings.py +41 -0
  102. metalist-0.22.0/app/services/ai_chat.py +449 -0
  103. metalist-0.22.0/app/services/ai_chat_rendering.py +900 -0
  104. metalist-0.22.0/app/services/ai_chat_stream.py +230 -0
  105. metalist-0.22.0/app/services/ai_setup.py +87 -0
  106. metalist-0.22.0/app/services/app_update_worker.py +47 -0
  107. metalist-0.22.0/app/services/app_updates.py +204 -0
  108. metalist-0.22.0/app/services/auth_cache_state.py +32 -0
  109. metalist-0.22.0/app/services/auth_service.py +653 -0
  110. metalist-0.22.0/app/services/backup_service.py +1107 -0
  111. metalist-0.22.0/app/services/backup_settings_service.py +167 -0
  112. metalist-0.22.0/app/services/bulk_operation.py +106 -0
  113. metalist-0.22.0/app/services/chess_rendering.py +184 -0
  114. metalist-0.22.0/app/services/client_state_service.py +576 -0
  115. metalist-0.22.0/app/services/content_cache.py +369 -0
  116. metalist-0.22.0/app/services/content_formatting.py +2141 -0
  117. metalist-0.22.0/app/services/diagnostics.py +752 -0
  118. metalist-0.22.0/app/services/dictation_cleanup.py +483 -0
  119. metalist-0.22.0/app/services/editing_image_sizes.py +95 -0
  120. metalist-0.22.0/app/services/embedded_references.py +1521 -0
  121. metalist-0.22.0/app/services/encryption.py +365 -0
  122. metalist-0.22.0/app/services/file_edit_sessions.py +83 -0
  123. metalist-0.22.0/app/services/file_registry.py +92 -0
  124. metalist-0.22.0/app/services/file_storage.py +1050 -0
  125. metalist-0.22.0/app/services/footnote_rendering.py +207 -0
  126. metalist-0.22.0/app/services/html_export.py +757 -0
  127. metalist-0.22.0/app/services/html_unformatting.py +408 -0
  128. metalist-0.22.0/app/services/hydration_state.py +187 -0
  129. metalist-0.22.0/app/services/image_size_formatting.py +328 -0
  130. metalist-0.22.0/app/services/inline_image_dimensions.py +246 -0
  131. metalist-0.22.0/app/services/inline_image_occurrences.py +32 -0
  132. metalist-0.22.0/app/services/integrity.py +92 -0
  133. metalist-0.22.0/app/services/latex_rendering.py +285 -0
  134. metalist-0.22.0/app/services/link_title_retry.py +169 -0
  135. metalist-0.22.0/app/services/link_titles.py +1613 -0
  136. metalist-0.22.0/app/services/login_rate_limit.py +86 -0
  137. metalist-0.22.0/app/services/maintenance_mode.py +56 -0
  138. metalist-0.22.0/app/services/markdown_rendering.py +745 -0
  139. metalist-0.22.0/app/services/memory_breakdown.py +212 -0
  140. metalist-0.22.0/app/services/memory_usage.py +34 -0
  141. metalist-0.22.0/app/services/namespace_deletion_jobs.py +121 -0
  142. metalist-0.22.0/app/services/namespace_deletion_worker.py +177 -0
  143. metalist-0.22.0/app/services/namespace_rename_jobs.py +117 -0
  144. metalist-0.22.0/app/services/namespace_rename_worker.py +162 -0
  145. metalist-0.22.0/app/services/namespace_runtime_guard.py +141 -0
  146. metalist-0.22.0/app/services/namespace_switcher.py +2175 -0
  147. metalist-0.22.0/app/services/note_fullscreen.py +96 -0
  148. metalist-0.22.0/app/services/note_store.py +1393 -0
  149. metalist-0.22.0/app/services/ontology_rules_store.py +602 -0
  150. metalist-0.22.0/app/services/openai_credentials.py +191 -0
  151. metalist-0.22.0/app/services/preference_values.py +13 -0
  152. metalist-0.22.0/app/services/public_http.py +207 -0
  153. metalist-0.22.0/app/services/reference_presentation.py +29 -0
  154. metalist-0.22.0/app/services/reminders.py +1409 -0
  155. metalist-0.22.0/app/services/remote_image_proxy.py +320 -0
  156. metalist-0.22.0/app/services/request_recovery.py +106 -0
  157. metalist-0.22.0/app/services/reset_for_tests.py +51 -0
  158. metalist-0.22.0/app/services/resource_limits.py +61 -0
  159. metalist-0.22.0/app/services/root_sorting.py +313 -0
  160. metalist-0.22.0/app/services/runtime_generation.py +39 -0
  161. metalist-0.22.0/app/services/runtime_lock.py +79 -0
  162. metalist-0.22.0/app/services/search_history.py +852 -0
  163. metalist-0.22.0/app/services/search_history_storage.py +156 -0
  164. metalist-0.22.0/app/services/search_index.py +1372 -0
  165. metalist-0.22.0/app/services/search_query.py +247 -0
  166. metalist-0.22.0/app/services/search_text.py +141 -0
  167. metalist-0.22.0/app/services/selected_text_tag.py +134 -0
  168. metalist-0.22.0/app/services/self_update.py +272 -0
  169. metalist-0.22.0/app/services/session_timeout_service.py +77 -0
  170. metalist-0.22.0/app/services/shared_sets.py +105 -0
  171. metalist-0.22.0/app/services/shell_session_service.py +356 -0
  172. metalist-0.22.0/app/services/snapshot.py +1069 -0
  173. metalist-0.22.0/app/services/store.py +126 -0
  174. metalist-0.22.0/app/services/structured_note_renderers.py +488 -0
  175. metalist-0.22.0/app/services/sync.py +161 -0
  176. metalist-0.22.0/app/services/tab_state.py +578 -0
  177. metalist-0.22.0/app/services/tag_case.py +58 -0
  178. metalist-0.22.0/app/services/tag_ontology.py +680 -0
  179. metalist-0.22.0/app/services/tag_plural_variants.py +112 -0
  180. metalist-0.22.0/app/services/tag_rename.py +290 -0
  181. metalist-0.22.0/app/services/tag_suggestion_reasons.py +381 -0
  182. metalist-0.22.0/app/services/tag_suggestions.py +1313 -0
  183. metalist-0.22.0/app/services/tag_term_matching.py +525 -0
  184. metalist-0.22.0/app/services/tokens.py +322 -0
  185. metalist-0.22.0/app/services/undo_state.py +1199 -0
  186. metalist-0.22.0/app/services/update_backups.py +165 -0
  187. metalist-0.22.0/app/services/update_installer.py +265 -0
  188. metalist-0.22.0/app/services/update_preflight.py +137 -0
  189. metalist-0.22.0/app/services/view_cache.py +99 -0
  190. metalist-0.22.0/app/services/view_diff.py +110 -0
  191. metalist-0.22.0/app/services/view_state.py +16 -0
  192. metalist-0.22.0/app/services/windows_process_control.py +208 -0
  193. metalist-0.22.0/app/startup_console.py +116 -0
  194. metalist-0.22.0/app/startup_js_sanity.py +687 -0
  195. metalist-0.22.0/app/startup_sanity.py +966 -0
  196. metalist-0.22.0/app/startup_sanity_config.py +134 -0
  197. metalist-0.22.0/app/startup_shockharness.py +173 -0
  198. metalist-0.22.0/app/static/config/agent-menu-actions.json +361 -0
  199. metalist-0.22.0/app/static/config/command_palette_tags.json +236 -0
  200. metalist-0.22.0/app/static/css/floating-notes.css +46 -0
  201. metalist-0.22.0/app/static/css/main.css +9857 -0
  202. metalist-0.22.0/app/static/img/metalist-logo-black-1024.png +0 -0
  203. metalist-0.22.0/app/static/img/metalist-logo-black-512.png +0 -0
  204. metalist-0.22.0/app/static/img/metalist-logo-black.svg +9 -0
  205. metalist-0.22.0/app/static/img/metalist-logo-white-1024.png +0 -0
  206. metalist-0.22.0/app/static/img/metalist-logo-white-512.png +0 -0
  207. metalist-0.22.0/app/static/img/metalist-logo-white.svg +9 -0
  208. metalist-0.22.0/app/static/js/locked.js +40 -0
  209. metalist-0.22.0/app/static/js/main.js +106 -0
  210. metalist-0.22.0/app/static/js/modules/ai-chat/agent-menu-actions.js +51 -0
  211. metalist-0.22.0/app/static/js/modules/ai-chat/agent-retrieval-settings.js +116 -0
  212. metalist-0.22.0/app/static/js/modules/ai-chat/ai-agent-debug-view.js +293 -0
  213. metalist-0.22.0/app/static/js/modules/ai-chat/ai-chat-api.js +496 -0
  214. metalist-0.22.0/app/static/js/modules/ai-chat/ai-chat-panel-controller.js +1913 -0
  215. metalist-0.22.0/app/static/js/modules/ai-chat/ai-chat-panel-service.js +296 -0
  216. metalist-0.22.0/app/static/js/modules/ai-chat/ai-chat-refused-turns.js +66 -0
  217. metalist-0.22.0/app/static/js/modules/ai-chat/ai-chat-size-limits.js +11 -0
  218. metalist-0.22.0/app/static/js/modules/ai-chat/bulk-elapsed-clock.js +23 -0
  219. metalist-0.22.0/app/static/js/modules/ai-chat/bulk-proposal-ui.js +300 -0
  220. metalist-0.22.0/app/static/js/modules/ai-chat/proposal-menu.js +86 -0
  221. metalist-0.22.0/app/static/js/modules/ai-chat/summary-batch-preview.js +142 -0
  222. metalist-0.22.0/app/static/js/modules/api-client.js +1535 -0
  223. metalist-0.22.0/app/static/js/modules/api-error-diagnostics.js +22 -0
  224. metalist-0.22.0/app/static/js/modules/api-failure-classification-service.js +85 -0
  225. metalist-0.22.0/app/static/js/modules/app-notice-stack.js +16 -0
  226. metalist-0.22.0/app/static/js/modules/app-update-service.js +110 -0
  227. metalist-0.22.0/app/static/js/modules/auth.js +827 -0
  228. metalist-0.22.0/app/static/js/modules/backup-reminder-schedule.js +71 -0
  229. metalist-0.22.0/app/static/js/modules/backup-reminder-service.js +213 -0
  230. metalist-0.22.0/app/static/js/modules/byte-sizes.js +5 -0
  231. metalist-0.22.0/app/static/js/modules/client-state-api.js +86 -0
  232. metalist-0.22.0/app/static/js/modules/client-state-migration.js +284 -0
  233. metalist-0.22.0/app/static/js/modules/command-palette/command-palette-controller.js +2507 -0
  234. metalist-0.22.0/app/static/js/modules/command-palette/endpoint-registry.js +537 -0
  235. metalist-0.22.0/app/static/js/modules/command-palette/preferences-store.js +110 -0
  236. metalist-0.22.0/app/static/js/modules/command-palette/tag-config-loader.js +186 -0
  237. metalist-0.22.0/app/static/js/modules/command-palette/usage-store.js +78 -0
  238. metalist-0.22.0/app/static/js/modules/config.js +238 -0
  239. metalist-0.22.0/app/static/js/modules/context-menu/context-menu-registry.js +894 -0
  240. metalist-0.22.0/app/static/js/modules/context-menu/context-menu-service.js +899 -0
  241. metalist-0.22.0/app/static/js/modules/context-menu/input-caret-service.js +141 -0
  242. metalist-0.22.0/app/static/js/modules/decimal-integer.js +8 -0
  243. metalist-0.22.0/app/static/js/modules/dom-focus.js +2 -0
  244. metalist-0.22.0/app/static/js/modules/dom-utils.js +245 -0
  245. metalist-0.22.0/app/static/js/modules/editor-selection.js +119 -0
  246. metalist-0.22.0/app/static/js/modules/editor-toolbar.js +204 -0
  247. metalist-0.22.0/app/static/js/modules/elapsed-time.js +20 -0
  248. metalist-0.22.0/app/static/js/modules/error-handler.js +292 -0
  249. metalist-0.22.0/app/static/js/modules/excalidraw/excalidraw-actions.js +101 -0
  250. metalist-0.22.0/app/static/js/modules/excalidraw/excalidraw-autosave.js +159 -0
  251. metalist-0.22.0/app/static/js/modules/excalidraw/excalidraw-editor-service.js +392 -0
  252. metalist-0.22.0/app/static/js/modules/excalidraw/excalidraw-loader.js +50 -0
  253. metalist-0.22.0/app/static/js/modules/excalidraw/excalidraw-preview-service.js +194 -0
  254. metalist-0.22.0/app/static/js/modules/excalidraw/excalidraw-scene.js +92 -0
  255. metalist-0.22.0/app/static/js/modules/expected-errors.js +47 -0
  256. metalist-0.22.0/app/static/js/modules/half.js +8 -0
  257. metalist-0.22.0/app/static/js/modules/html-escape.js +16 -0
  258. metalist-0.22.0/app/static/js/modules/http-status.js +40 -0
  259. metalist-0.22.0/app/static/js/modules/list-selection.js +6 -0
  260. metalist-0.22.0/app/static/js/modules/local-date-text.js +33 -0
  261. metalist-0.22.0/app/static/js/modules/maintenance.js +19 -0
  262. metalist-0.22.0/app/static/js/modules/modals/ai-agent-settings-modal.js +596 -0
  263. metalist-0.22.0/app/static/js/modules/modals/alphabetize-root-notes-modal.js +163 -0
  264. metalist-0.22.0/app/static/js/modules/modals/backup-restore-modal.js +953 -0
  265. metalist-0.22.0/app/static/js/modules/modals/backup-result-modal.js +233 -0
  266. metalist-0.22.0/app/static/js/modules/modals/backup-settings-modal.js +547 -0
  267. metalist-0.22.0/app/static/js/modules/modals/base-modal.js +399 -0
  268. metalist-0.22.0/app/static/js/modules/modals/confirmation-modal.js +136 -0
  269. metalist-0.22.0/app/static/js/modules/modals/delete-namespace-modal.js +562 -0
  270. metalist-0.22.0/app/static/js/modules/modals/dictation-settings-modal.js +132 -0
  271. metalist-0.22.0/app/static/js/modules/modals/export-options-modal.js +318 -0
  272. metalist-0.22.0/app/static/js/modules/modals/help-modal.js +162 -0
  273. metalist-0.22.0/app/static/js/modules/modals/link-title-retry-modal.js +297 -0
  274. metalist-0.22.0/app/static/js/modules/modals/memory-usage-modal.js +322 -0
  275. metalist-0.22.0/app/static/js/modules/modals/namespace-loading-page.js +99 -0
  276. metalist-0.22.0/app/static/js/modules/modals/namespace-modals.js +1190 -0
  277. metalist-0.22.0/app/static/js/modules/modals/note-layout-appearance-modal.js +175 -0
  278. metalist-0.22.0/app/static/js/modules/modals/ontology-modal.js +2839 -0
  279. metalist-0.22.0/app/static/js/modules/modals/password-modal.js +856 -0
  280. metalist-0.22.0/app/static/js/modules/modals/prioritize-modal.js +522 -0
  281. metalist-0.22.0/app/static/js/modules/modals/random-password-modal.js +453 -0
  282. metalist-0.22.0/app/static/js/modules/modals/reminder-modal.js +1292 -0
  283. metalist-0.22.0/app/static/js/modules/modals/reset-updated-at-modal.js +153 -0
  284. metalist-0.22.0/app/static/js/modules/modals/search-suggestion-statistics-modal.js +447 -0
  285. metalist-0.22.0/app/static/js/modules/modals/session-timeout-modal.js +334 -0
  286. metalist-0.22.0/app/static/js/modules/modals/version-info-modal.js +308 -0
  287. metalist-0.22.0/app/static/js/modules/mode-manager/actions/history-actions.js +292 -0
  288. metalist-0.22.0/app/static/js/modules/mode-manager/actions/note-actions.js +1315 -0
  289. metalist-0.22.0/app/static/js/modules/mode-manager/actions/selection-actions.js +309 -0
  290. metalist-0.22.0/app/static/js/modules/mode-manager/actions/ui-actions.js +411 -0
  291. metalist-0.22.0/app/static/js/modules/mode-manager/events/context-menu-events.js +1557 -0
  292. metalist-0.22.0/app/static/js/modules/mode-manager/events/focus-events.js +94 -0
  293. metalist-0.22.0/app/static/js/modules/mode-manager/events/input-events.js +199 -0
  294. metalist-0.22.0/app/static/js/modules/mode-manager/events/keyboard-events.js +3890 -0
  295. metalist-0.22.0/app/static/js/modules/mode-manager/events/mouse-events.js +2721 -0
  296. metalist-0.22.0/app/static/js/modules/mode-manager/events/search-events.js +221 -0
  297. metalist-0.22.0/app/static/js/modules/mode-manager/mode-context.js +1830 -0
  298. metalist-0.22.0/app/static/js/modules/mode-manager/mode-logger.js +53 -0
  299. metalist-0.22.0/app/static/js/modules/mode-manager/mode-manager-controller.js +124 -0
  300. metalist-0.22.0/app/static/js/modules/mode-manager/services/add-style-service.js +197 -0
  301. metalist-0.22.0/app/static/js/modules/mode-manager/services/animated-scroll-service.js +75 -0
  302. metalist-0.22.0/app/static/js/modules/mode-manager/services/clipboard-shortcut-policy-service.js +96 -0
  303. metalist-0.22.0/app/static/js/modules/mode-manager/services/collapse-affordance-service.js +238 -0
  304. metalist-0.22.0/app/static/js/modules/mode-manager/services/dictation-note-paste.js +50 -0
  305. metalist-0.22.0/app/static/js/modules/mode-manager/services/dictation-paste-service.js +246 -0
  306. metalist-0.22.0/app/static/js/modules/mode-manager/services/differential-view-service.js +1278 -0
  307. metalist-0.22.0/app/static/js/modules/mode-manager/services/dropped-file-preview-service.js +49 -0
  308. metalist-0.22.0/app/static/js/modules/mode-manager/services/editing-image-size-service.js +97 -0
  309. metalist-0.22.0/app/static/js/modules/mode-manager/services/embedded-image-service.js +361 -0
  310. metalist-0.22.0/app/static/js/modules/mode-manager/services/file-reference-service.js +473 -0
  311. metalist-0.22.0/app/static/js/modules/mode-manager/services/floating-note-dom.js +80 -0
  312. metalist-0.22.0/app/static/js/modules/mode-manager/services/floating-note-layout.js +32 -0
  313. metalist-0.22.0/app/static/js/modules/mode-manager/services/floating-note-service.js +262 -0
  314. metalist-0.22.0/app/static/js/modules/mode-manager/services/html-paste-sanitizer-service.js +1876 -0
  315. metalist-0.22.0/app/static/js/modules/mode-manager/services/image-context-menu-action-service.js +447 -0
  316. metalist-0.22.0/app/static/js/modules/mode-manager/services/image-file-insert-choice-modal-service.js +179 -0
  317. metalist-0.22.0/app/static/js/modules/mode-manager/services/infinite-scroll-service.js +203 -0
  318. metalist-0.22.0/app/static/js/modules/mode-manager/services/link-target-service.js +51 -0
  319. metalist-0.22.0/app/static/js/modules/mode-manager/services/mermaid-render-service.js +298 -0
  320. metalist-0.22.0/app/static/js/modules/mode-manager/services/note-clipboard-write-service.js +293 -0
  321. metalist-0.22.0/app/static/js/modules/mode-manager/services/note-collapse-animation-service.js +203 -0
  322. metalist-0.22.0/app/static/js/modules/mode-manager/services/note-drag-indicator-service.js +119 -0
  323. metalist-0.22.0/app/static/js/modules/mode-manager/services/note-drag-service.js +170 -0
  324. metalist-0.22.0/app/static/js/modules/mode-manager/services/note-fullscreen-service.js +116 -0
  325. metalist-0.22.0/app/static/js/modules/mode-manager/services/note-reposition-animation-service.js +119 -0
  326. metalist-0.22.0/app/static/js/modules/mode-manager/services/note-split-service.js +57 -0
  327. metalist-0.22.0/app/static/js/modules/mode-manager/services/paste-format-detection-service.js +462 -0
  328. metalist-0.22.0/app/static/js/modules/mode-manager/services/paste-format-guess-service.js +350 -0
  329. metalist-0.22.0/app/static/js/modules/mode-manager/services/paste-format-offer-service.js +182 -0
  330. metalist-0.22.0/app/static/js/modules/mode-manager/services/paste-reference-here-service.js +117 -0
  331. metalist-0.22.0/app/static/js/modules/mode-manager/services/polling-service.js +188 -0
  332. metalist-0.22.0/app/static/js/modules/mode-manager/services/print-service.js +87 -0
  333. metalist-0.22.0/app/static/js/modules/mode-manager/services/reference-source-navigation-service.js +309 -0
  334. metalist-0.22.0/app/static/js/modules/mode-manager/services/referenced-note-removal-service.js +78 -0
  335. metalist-0.22.0/app/static/js/modules/mode-manager/services/remove-formatting-service.js +503 -0
  336. metalist-0.22.0/app/static/js/modules/mode-manager/services/right-press-focus-service.js +60 -0
  337. metalist-0.22.0/app/static/js/modules/mode-manager/services/root-note-creation-service.js +37 -0
  338. metalist-0.22.0/app/static/js/modules/mode-manager/services/scroll-anchor-service.js +200 -0
  339. metalist-0.22.0/app/static/js/modules/mode-manager/services/scroll-restoration-service.js +308 -0
  340. metalist-0.22.0/app/static/js/modules/mode-manager/services/scroll-to-top-service.js +154 -0
  341. metalist-0.22.0/app/static/js/modules/mode-manager/services/search-contexts-overlay-service.js +345 -0
  342. metalist-0.22.0/app/static/js/modules/mode-manager/services/search-highlight-matching.js +69 -0
  343. metalist-0.22.0/app/static/js/modules/mode-manager/services/search-highlight-service.js +176 -0
  344. metalist-0.22.0/app/static/js/modules/mode-manager/services/search-interaction-service.js +133 -0
  345. metalist-0.22.0/app/static/js/modules/mode-manager/services/search-redaction-reveal-service.js +267 -0
  346. metalist-0.22.0/app/static/js/modules/mode-manager/services/search-suggestion-statistics-service.js +81 -0
  347. metalist-0.22.0/app/static/js/modules/mode-manager/services/search-suggestion-windows-service.js +79 -0
  348. metalist-0.22.0/app/static/js/modules/mode-manager/services/search-suggestions-service.js +595 -0
  349. metalist-0.22.0/app/static/js/modules/mode-manager/services/search-syntax-service.js +442 -0
  350. metalist-0.22.0/app/static/js/modules/mode-manager/services/selected-text-tag-service.js +67 -0
  351. metalist-0.22.0/app/static/js/modules/mode-manager/services/shell-output-service.js +309 -0
  352. metalist-0.22.0/app/static/js/modules/mode-manager/services/tab-dom-cache-service.js +142 -0
  353. metalist-0.22.0/app/static/js/modules/mode-manager/services/tab-state-service.js +318 -0
  354. metalist-0.22.0/app/static/js/modules/mode-manager/services/tag-bar-service.js +577 -0
  355. metalist-0.22.0/app/static/js/modules/mode-manager/services/tag-input-selection-service.js +28 -0
  356. metalist-0.22.0/app/static/js/modules/mode-manager/services/tag-proposal-service.js +359 -0
  357. metalist-0.22.0/app/static/js/modules/mode-manager/services/tag-suggestions-service.js +440 -0
  358. metalist-0.22.0/app/static/js/modules/mode-manager/services/tag-syntax-service.js +842 -0
  359. metalist-0.22.0/app/static/js/modules/mode-manager/services/viewport-hold-service.js +1067 -0
  360. metalist-0.22.0/app/static/js/modules/mode-manager/services/viewport-reference.js +55 -0
  361. metalist-0.22.0/app/static/js/modules/not-found.js +3 -0
  362. metalist-0.22.0/app/static/js/modules/note-html-sanitizer.js +312 -0
  363. metalist-0.22.0/app/static/js/modules/password-generator.js +79 -0
  364. metalist-0.22.0/app/static/js/modules/password-operation-response.js +32 -0
  365. metalist-0.22.0/app/static/js/modules/password-policy.js +38 -0
  366. metalist-0.22.0/app/static/js/modules/password-strength.js +86 -0
  367. metalist-0.22.0/app/static/js/modules/reminder-surface-service.js +1290 -0
  368. metalist-0.22.0/app/static/js/modules/server-rendered-html.js +12 -0
  369. metalist-0.22.0/app/static/js/modules/startup-timing.js +66 -0
  370. metalist-0.22.0/app/static/js/modules/tcp-ports.js +10 -0
  371. metalist-0.22.0/app/static/js/modules/time-units.js +10 -0
  372. metalist-0.22.0/app/static/js/modules/url-tracking-cleaner.js +273 -0
  373. metalist-0.22.0/app/static/js/modules/uuid.js +41 -0
  374. metalist-0.22.0/app/static/js/shockharness/contracts.d.ts +31 -0
  375. metalist-0.22.0/app/static/js/shockharness/contracts.js +249 -0
  376. metalist-0.22.0/app/templates/index.html +321 -0
  377. metalist-0.22.0/app/upload_limits.py +12 -0
  378. metalist-0.22.0/app/usecases/add_selected_text_tag.py +103 -0
  379. metalist-0.22.0/app/usecases/alphabetize_root_notes.py +197 -0
  380. metalist-0.22.0/app/usecases/base.py +10 -0
  381. metalist-0.22.0/app/usecases/bulk_tag_proposals.py +96 -0
  382. metalist-0.22.0/app/usecases/collapse.py +89 -0
  383. metalist-0.22.0/app/usecases/copy_note.py +94 -0
  384. metalist-0.22.0/app/usecases/create_child.py +53 -0
  385. metalist-0.22.0/app/usecases/create_file_preview_child.py +65 -0
  386. metalist-0.22.0/app/usecases/create_note.py +184 -0
  387. metalist-0.22.0/app/usecases/create_sibling.py +63 -0
  388. metalist-0.22.0/app/usecases/delete_subtree.py +169 -0
  389. metalist-0.22.0/app/usecases/expand.py +40 -0
  390. metalist-0.22.0/app/usecases/file_edit_session.py +98 -0
  391. metalist-0.22.0/app/usecases/indent.py +83 -0
  392. metalist-0.22.0/app/usecases/move.py +106 -0
  393. metalist-0.22.0/app/usecases/move_to_top.py +173 -0
  394. metalist-0.22.0/app/usecases/outdent.py +88 -0
  395. metalist-0.22.0/app/usecases/paste_child.py +63 -0
  396. metalist-0.22.0/app/usecases/paste_reference.py +78 -0
  397. metalist-0.22.0/app/usecases/paste_sibling.py +347 -0
  398. metalist-0.22.0/app/usecases/prefetch_link_titles.py +21 -0
  399. metalist-0.22.0/app/usecases/prioritize.py +285 -0
  400. metalist-0.22.0/app/usecases/redo.py +30 -0
  401. metalist-0.22.0/app/usecases/reset_updated_at.py +124 -0
  402. metalist-0.22.0/app/usecases/resize_image.py +85 -0
  403. metalist-0.22.0/app/usecases/run_shell.py +75 -0
  404. metalist-0.22.0/app/usecases/search_comment_autofill.py +133 -0
  405. metalist-0.22.0/app/usecases/set_collapse_bulk.py +52 -0
  406. metalist-0.22.0/app/usecases/set_collapse_in_context.py +199 -0
  407. metalist-0.22.0/app/usecases/split_note.py +91 -0
  408. metalist-0.22.0/app/usecases/tag_proposals.py +383 -0
  409. metalist-0.22.0/app/usecases/toggle_todo_done.py +46 -0
  410. metalist-0.22.0/app/usecases/undo.py +30 -0
  411. metalist-0.22.0/app/usecases/unformat_content.py +56 -0
  412. metalist-0.22.0/app/usecases/update_content.py +180 -0
  413. metalist-0.22.0/app/utils/byte_sizes.py +5 -0
  414. metalist-0.22.0/app/utils/encryption.py +216 -0
  415. metalist-0.22.0/app/utils/not_found.py +4 -0
  416. metalist-0.22.0/app/utils/sent_fields.py +13 -0
  417. metalist-0.22.0/app/utils/tcp_ports.py +13 -0
  418. metalist-0.22.0/app/utils/text_utils.py +228 -0
  419. metalist-0.22.0/app/utils/time_units.py +9 -0
  420. metalist-0.22.0/app/version.py +3 -0
  421. metalist-0.22.0/main.py +809 -0
  422. metalist-0.22.0/metalist.egg-info/PKG-INFO +531 -0
  423. metalist-0.22.0/metalist.egg-info/SOURCES.txt +605 -0
  424. metalist-0.22.0/metalist.egg-info/requires.txt +32 -0
  425. metalist-0.22.0/pyproject.toml +101 -0
  426. metalist-0.20.0/PKG-INFO +0 -508
  427. metalist-0.20.0/README.md +0 -469
  428. metalist-0.20.0/app/api/middleware/auth.py +0 -109
  429. metalist-0.20.0/app/api/note_requests.py +0 -423
  430. metalist-0.20.0/app/api/request_auth.py +0 -72
  431. metalist-0.20.0/app/api/routes/ai.py +0 -1035
  432. metalist-0.20.0/app/api/routes/app_updates.py +0 -55
  433. metalist-0.20.0/app/api/routes/auth.py +0 -1201
  434. metalist-0.20.0/app/api/routes/backups.py +0 -1155
  435. metalist-0.20.0/app/api/routes/files.py +0 -244
  436. metalist-0.20.0/app/api/routes/notes.py +0 -1590
  437. metalist-0.20.0/app/api/routes/ontology.py +0 -480
  438. metalist-0.20.0/app/api/routes/reminders.py +0 -267
  439. metalist-0.20.0/app/api/routes/remote_images.py +0 -89
  440. metalist-0.20.0/app/api/routes/test.py +0 -17
  441. metalist-0.20.0/app/api/transactions.py +0 -132
  442. metalist-0.20.0/app/api/upload_limits.py +0 -85
  443. metalist-0.20.0/app/config.py +0 -128
  444. metalist-0.20.0/app/db/backup_settings_sql.py +0 -70
  445. metalist-0.20.0/app/db/editable_files_migration.py +0 -50
  446. metalist-0.20.0/app/db/engine.py +0 -109
  447. metalist-0.20.0/app/db/file_session.py +0 -150
  448. metalist-0.20.0/app/db/files_sql.py +0 -361
  449. metalist-0.20.0/app/db/link_titles_sql.py +0 -225
  450. metalist-0.20.0/app/db/live_recovery.py +0 -266
  451. metalist-0.20.0/app/db/migrations.py +0 -435
  452. metalist-0.20.0/app/db/notes_sql.py +0 -516
  453. metalist-0.20.0/app/db/ontology_rules_sql.py +0 -153
  454. metalist-0.20.0/app/db/reminders_sql.py +0 -119
  455. metalist-0.20.0/app/db/retire_sounds.py +0 -67
  456. metalist-0.20.0/app/db/schema.py +0 -254
  457. metalist-0.20.0/app/db/session.py +0 -242
  458. metalist-0.20.0/app/db/settings_sql.py +0 -339
  459. metalist-0.20.0/app/db/tab_state_sql.py +0 -97
  460. metalist-0.20.0/app/encryption_audit.py +0 -1118
  461. metalist-0.20.0/app/exception_boundaries.py +0 -178
  462. metalist-0.20.0/app/https_proxy.py +0 -181
  463. metalist-0.20.0/app/main.py +0 -768
  464. metalist-0.20.0/app/models/commands.py +0 -7
  465. metalist-0.20.0/app/models/database.py +0 -268
  466. metalist-0.20.0/app/models/entities.py +0 -19
  467. metalist-0.20.0/app/models/enums.py +0 -5
  468. metalist-0.20.0/app/models/linked_list.py +0 -67
  469. metalist-0.20.0/app/models/list_operations.py +0 -262
  470. metalist-0.20.0/app/models/list_traversal.py +0 -202
  471. metalist-0.20.0/app/models/note_crud.py +0 -292
  472. metalist-0.20.0/app/models/utils.py +0 -661
  473. metalist-0.20.0/app/network_settings.py +0 -61
  474. metalist-0.20.0/app/presentation/login_page.py +0 -23
  475. metalist-0.20.0/app/presentation/render/note_renderer.py +0 -499
  476. metalist-0.20.0/app/security/authenticated_logging.py +0 -179
  477. metalist-0.20.0/app/security/note_html.py +0 -352
  478. metalist-0.20.0/app/security/request_boundary.py +0 -177
  479. metalist-0.20.0/app/security/request_hosts.py +0 -83
  480. metalist-0.20.0/app/security/sensitive_cache.py +0 -116
  481. metalist-0.20.0/app/server_runtime.py +0 -1077
  482. metalist-0.20.0/app/services/agent/agent_loop.py +0 -586
  483. metalist-0.20.0/app/services/agent/agent_tools.py +0 -474
  484. metalist-0.20.0/app/services/agent/cloud_privacy.py +0 -375
  485. metalist-0.20.0/app/services/agent/context.py +0 -545
  486. metalist-0.20.0/app/services/agent/evidence_serialization.py +0 -184
  487. metalist-0.20.0/app/services/agent/export_title_suggestions.py +0 -187
  488. metalist-0.20.0/app/services/agent/failure_explanations.py +0 -172
  489. metalist-0.20.0/app/services/agent/help_catalog.py +0 -25
  490. metalist-0.20.0/app/services/agent/history.py +0 -124
  491. metalist-0.20.0/app/services/agent/menu_actions.py +0 -63
  492. metalist-0.20.0/app/services/agent/note_aliases.py +0 -77
  493. metalist-0.20.0/app/services/agent/note_tag_suggestions.py +0 -318
  494. metalist-0.20.0/app/services/agent/openai_cost_tracking.py +0 -188
  495. metalist-0.20.0/app/services/agent/openai_inference.py +0 -585
  496. metalist-0.20.0/app/services/agent/retrieval_settings.py +0 -134
  497. metalist-0.20.0/app/services/agent/runtime.py +0 -1715
  498. metalist-0.20.0/app/services/agent/scope.py +0 -541
  499. metalist-0.20.0/app/services/agent/skills/help-ai.md +0 -148
  500. metalist-0.20.0/app/services/agent/skills/help-data.md +0 -49
  501. metalist-0.20.0/app/services/agent/skills/help-formatting.md +0 -233
  502. metalist-0.20.0/app/services/agent/skills/help-menus.md +0 -118
  503. metalist-0.20.0/app/services/agent/skills/help-notes.md +0 -217
  504. metalist-0.20.0/app/services/agent/skills/help-privacy.md +0 -146
  505. metalist-0.20.0/app/services/agent/skills/help-references.md +0 -120
  506. metalist-0.20.0/app/services/agent/skills/help-releases.md +0 -168
  507. metalist-0.20.0/app/services/agent/skills/help-search.md +0 -235
  508. metalist-0.20.0/app/services/agent/skills/help-tags.md +0 -372
  509. metalist-0.20.0/app/services/agent/staged_summary.py +0 -223
  510. metalist-0.20.0/app/services/agent/structured_inference.py +0 -652
  511. metalist-0.20.0/app/services/agent/summary_batch_store.py +0 -110
  512. metalist-0.20.0/app/services/agent/tagging.py +0 -205
  513. metalist-0.20.0/app/services/agent/tagging_run.py +0 -489
  514. metalist-0.20.0/app/services/agent/token_estimation.py +0 -91
  515. metalist-0.20.0/app/services/agent/tool_calling.py +0 -147
  516. metalist-0.20.0/app/services/agent/trace.py +0 -246
  517. metalist-0.20.0/app/services/agent/web_capabilities.py +0 -172
  518. metalist-0.20.0/app/services/agent/web_evidence.py +0 -389
  519. metalist-0.20.0/app/services/agent/web_fetch.py +0 -613
  520. metalist-0.20.0/app/services/agent/web_settings.py +0 -40
  521. metalist-0.20.0/app/services/ai_chat.py +0 -426
  522. metalist-0.20.0/app/services/ai_chat_rendering.py +0 -886
  523. metalist-0.20.0/app/services/ai_chat_stream.py +0 -231
  524. metalist-0.20.0/app/services/ai_setup.py +0 -84
  525. metalist-0.20.0/app/services/app_update_worker.py +0 -42
  526. metalist-0.20.0/app/services/app_updates.py +0 -193
  527. metalist-0.20.0/app/services/auth_cache_state.py +0 -32
  528. metalist-0.20.0/app/services/auth_service.py +0 -653
  529. metalist-0.20.0/app/services/backup_service.py +0 -1121
  530. metalist-0.20.0/app/services/backup_settings_service.py +0 -173
  531. metalist-0.20.0/app/services/bulk_operation.py +0 -104
  532. metalist-0.20.0/app/services/chess_rendering.py +0 -173
  533. metalist-0.20.0/app/services/client_state_service.py +0 -525
  534. metalist-0.20.0/app/services/content_cache.py +0 -436
  535. metalist-0.20.0/app/services/content_formatting.py +0 -2139
  536. metalist-0.20.0/app/services/diagnostics.py +0 -747
  537. metalist-0.20.0/app/services/dictation_cleanup.py +0 -469
  538. metalist-0.20.0/app/services/embedded_references.py +0 -1335
  539. metalist-0.20.0/app/services/encryption.py +0 -400
  540. metalist-0.20.0/app/services/file_edit_sessions.py +0 -81
  541. metalist-0.20.0/app/services/file_registry.py +0 -90
  542. metalist-0.20.0/app/services/file_storage.py +0 -1055
  543. metalist-0.20.0/app/services/footnote_rendering.py +0 -203
  544. metalist-0.20.0/app/services/html_export.py +0 -652
  545. metalist-0.20.0/app/services/html_unformatting.py +0 -406
  546. metalist-0.20.0/app/services/hydration_state.py +0 -141
  547. metalist-0.20.0/app/services/image_size_formatting.py +0 -325
  548. metalist-0.20.0/app/services/inline_image_dimensions.py +0 -140
  549. metalist-0.20.0/app/services/inline_image_occurrences.py +0 -31
  550. metalist-0.20.0/app/services/integrity.py +0 -151
  551. metalist-0.20.0/app/services/latex_rendering.py +0 -278
  552. metalist-0.20.0/app/services/link_title_retry.py +0 -169
  553. metalist-0.20.0/app/services/link_titles.py +0 -1572
  554. metalist-0.20.0/app/services/login_rate_limit.py +0 -86
  555. metalist-0.20.0/app/services/maintenance_mode.py +0 -63
  556. metalist-0.20.0/app/services/markdown_rendering.py +0 -736
  557. metalist-0.20.0/app/services/namespace_deletion_jobs.py +0 -120
  558. metalist-0.20.0/app/services/namespace_deletion_worker.py +0 -173
  559. metalist-0.20.0/app/services/namespace_rename_jobs.py +0 -116
  560. metalist-0.20.0/app/services/namespace_rename_worker.py +0 -158
  561. metalist-0.20.0/app/services/namespace_runtime_guard.py +0 -143
  562. metalist-0.20.0/app/services/namespace_switcher.py +0 -1999
  563. metalist-0.20.0/app/services/note_fullscreen.py +0 -107
  564. metalist-0.20.0/app/services/note_store.py +0 -1329
  565. metalist-0.20.0/app/services/ontology_rules_store.py +0 -600
  566. metalist-0.20.0/app/services/openai_credentials.py +0 -184
  567. metalist-0.20.0/app/services/public_http.py +0 -201
  568. metalist-0.20.0/app/services/reference_presentation.py +0 -39
  569. metalist-0.20.0/app/services/reminders.py +0 -1376
  570. metalist-0.20.0/app/services/remote_image_proxy.py +0 -298
  571. metalist-0.20.0/app/services/request_recovery.py +0 -100
  572. metalist-0.20.0/app/services/resource_limits.py +0 -46
  573. metalist-0.20.0/app/services/root_sorting.py +0 -296
  574. metalist-0.20.0/app/services/runtime_generation.py +0 -39
  575. metalist-0.20.0/app/services/runtime_lock.py +0 -81
  576. metalist-0.20.0/app/services/search_history.py +0 -906
  577. metalist-0.20.0/app/services/search_history_storage.py +0 -153
  578. metalist-0.20.0/app/services/search_index.py +0 -1238
  579. metalist-0.20.0/app/services/search_query.py +0 -207
  580. metalist-0.20.0/app/services/search_text.py +0 -141
  581. metalist-0.20.0/app/services/selected_text_tag.py +0 -131
  582. metalist-0.20.0/app/services/self_update.py +0 -272
  583. metalist-0.20.0/app/services/session_timeout_service.py +0 -77
  584. metalist-0.20.0/app/services/shell_session_service.py +0 -344
  585. metalist-0.20.0/app/services/snapshot.py +0 -1080
  586. metalist-0.20.0/app/services/store.py +0 -165
  587. metalist-0.20.0/app/services/structured_note_renderers.py +0 -481
  588. metalist-0.20.0/app/services/sync.py +0 -161
  589. metalist-0.20.0/app/services/sync_state.py +0 -154
  590. metalist-0.20.0/app/services/tab_state.py +0 -583
  591. metalist-0.20.0/app/services/tag_case.py +0 -58
  592. metalist-0.20.0/app/services/tag_ontology.py +0 -665
  593. metalist-0.20.0/app/services/tag_rename.py +0 -289
  594. metalist-0.20.0/app/services/tag_suggestion_reasons.py +0 -390
  595. metalist-0.20.0/app/services/tag_suggestions.py +0 -1382
  596. metalist-0.20.0/app/services/tag_term_matching.py +0 -510
  597. metalist-0.20.0/app/services/test_reset.py +0 -50
  598. metalist-0.20.0/app/services/tokens.py +0 -322
  599. metalist-0.20.0/app/services/undo_state.py +0 -1317
  600. metalist-0.20.0/app/services/update_backups.py +0 -162
  601. metalist-0.20.0/app/services/update_installer.py +0 -260
  602. metalist-0.20.0/app/services/update_preflight.py +0 -132
  603. metalist-0.20.0/app/services/view_cache.py +0 -99
  604. metalist-0.20.0/app/services/view_diff.py +0 -103
  605. metalist-0.20.0/app/services/view_state.py +0 -19
  606. metalist-0.20.0/app/services/windows_process_control.py +0 -201
  607. metalist-0.20.0/app/startup_console.py +0 -100
  608. metalist-0.20.0/app/startup_js_sanity.py +0 -676
  609. metalist-0.20.0/app/startup_sanity.py +0 -958
  610. metalist-0.20.0/app/startup_sanity_config.py +0 -131
  611. metalist-0.20.0/app/static/config/agent-menu-actions.json +0 -356
  612. metalist-0.20.0/app/static/config/command_palette_tags.json +0 -236
  613. metalist-0.20.0/app/static/css/floating-notes.css +0 -44
  614. metalist-0.20.0/app/static/css/main.css +0 -9641
  615. metalist-0.20.0/app/static/js/locked.js +0 -36
  616. metalist-0.20.0/app/static/js/main.js +0 -105
  617. metalist-0.20.0/app/static/js/modules/ai-chat/agent-menu-actions.js +0 -43
  618. metalist-0.20.0/app/static/js/modules/ai-chat/agent-retrieval-settings.js +0 -111
  619. metalist-0.20.0/app/static/js/modules/ai-chat/ai-agent-debug-view.js +0 -287
  620. metalist-0.20.0/app/static/js/modules/ai-chat/ai-chat-api.js +0 -474
  621. metalist-0.20.0/app/static/js/modules/ai-chat/ai-chat-panel-controller.js +0 -1875
  622. metalist-0.20.0/app/static/js/modules/ai-chat/ai-chat-panel-service.js +0 -293
  623. metalist-0.20.0/app/static/js/modules/ai-chat/bulk-elapsed-clock.js +0 -21
  624. metalist-0.20.0/app/static/js/modules/ai-chat/bulk-proposal-ui.js +0 -296
  625. metalist-0.20.0/app/static/js/modules/ai-chat/proposal-menu.js +0 -86
  626. metalist-0.20.0/app/static/js/modules/ai-chat/summary-batch-preview.js +0 -133
  627. metalist-0.20.0/app/static/js/modules/api-client.js +0 -1564
  628. metalist-0.20.0/app/static/js/modules/api-error-diagnostics.js +0 -20
  629. metalist-0.20.0/app/static/js/modules/api-failure-classification-service.js +0 -83
  630. metalist-0.20.0/app/static/js/modules/app-update-service.js +0 -106
  631. metalist-0.20.0/app/static/js/modules/auth.js +0 -822
  632. metalist-0.20.0/app/static/js/modules/client-state-api.js +0 -85
  633. metalist-0.20.0/app/static/js/modules/client-state-migration.js +0 -284
  634. metalist-0.20.0/app/static/js/modules/command-palette/command-palette-controller.js +0 -2535
  635. metalist-0.20.0/app/static/js/modules/command-palette/endpoint-registry.js +0 -533
  636. metalist-0.20.0/app/static/js/modules/command-palette/preferences-store.js +0 -178
  637. metalist-0.20.0/app/static/js/modules/command-palette/tag-config-loader.js +0 -183
  638. metalist-0.20.0/app/static/js/modules/command-palette/usage-store.js +0 -78
  639. metalist-0.20.0/app/static/js/modules/config.js +0 -230
  640. metalist-0.20.0/app/static/js/modules/connectivity-monitor.js +0 -98
  641. metalist-0.20.0/app/static/js/modules/context-menu/context-menu-registry.js +0 -885
  642. metalist-0.20.0/app/static/js/modules/context-menu/context-menu-service.js +0 -883
  643. metalist-0.20.0/app/static/js/modules/context-menu/input-caret-service.js +0 -139
  644. metalist-0.20.0/app/static/js/modules/dom-utils-fixed.js +0 -292
  645. metalist-0.20.0/app/static/js/modules/dom-utils.js +0 -338
  646. metalist-0.20.0/app/static/js/modules/editor-selection.js +0 -119
  647. metalist-0.20.0/app/static/js/modules/editor-toolbar.js +0 -208
  648. metalist-0.20.0/app/static/js/modules/elapsed-time.js +0 -18
  649. metalist-0.20.0/app/static/js/modules/error-handler.js +0 -278
  650. metalist-0.20.0/app/static/js/modules/excalidraw/excalidraw-actions.js +0 -98
  651. metalist-0.20.0/app/static/js/modules/excalidraw/excalidraw-autosave.js +0 -159
  652. metalist-0.20.0/app/static/js/modules/excalidraw/excalidraw-editor-service.js +0 -388
  653. metalist-0.20.0/app/static/js/modules/excalidraw/excalidraw-loader.js +0 -50
  654. metalist-0.20.0/app/static/js/modules/excalidraw/excalidraw-preview-service.js +0 -192
  655. metalist-0.20.0/app/static/js/modules/excalidraw/excalidraw-scene.js +0 -89
  656. metalist-0.20.0/app/static/js/modules/expected-errors.js +0 -52
  657. metalist-0.20.0/app/static/js/modules/maintenance.js +0 -16
  658. metalist-0.20.0/app/static/js/modules/modals/ai-agent-settings-modal.js +0 -606
  659. metalist-0.20.0/app/static/js/modules/modals/alphabetize-root-notes-modal.js +0 -177
  660. metalist-0.20.0/app/static/js/modules/modals/backup-restore-modal.js +0 -956
  661. metalist-0.20.0/app/static/js/modules/modals/backup-result-modal.js +0 -246
  662. metalist-0.20.0/app/static/js/modules/modals/backup-retention-modal.js +0 -303
  663. metalist-0.20.0/app/static/js/modules/modals/backup-settings-modal.js +0 -560
  664. metalist-0.20.0/app/static/js/modules/modals/base-modal.js +0 -395
  665. metalist-0.20.0/app/static/js/modules/modals/confirmation-modal.js +0 -147
  666. metalist-0.20.0/app/static/js/modules/modals/delete-namespace-modal.js +0 -576
  667. metalist-0.20.0/app/static/js/modules/modals/dictation-settings-modal.js +0 -130
  668. metalist-0.20.0/app/static/js/modules/modals/export-options-modal.js +0 -314
  669. metalist-0.20.0/app/static/js/modules/modals/help-modal.js +0 -165
  670. metalist-0.20.0/app/static/js/modules/modals/link-title-retry-modal.js +0 -308
  671. metalist-0.20.0/app/static/js/modules/modals/namespace-loading-page.js +0 -109
  672. metalist-0.20.0/app/static/js/modules/modals/namespace-modals.js +0 -1198
  673. metalist-0.20.0/app/static/js/modules/modals/note-layout-appearance-modal.js +0 -186
  674. metalist-0.20.0/app/static/js/modules/modals/ontology-modal.js +0 -2863
  675. metalist-0.20.0/app/static/js/modules/modals/password-modal.js +0 -844
  676. metalist-0.20.0/app/static/js/modules/modals/prioritize-modal.js +0 -535
  677. metalist-0.20.0/app/static/js/modules/modals/random-password-modal.js +0 -451
  678. metalist-0.20.0/app/static/js/modules/modals/reminder-modal.js +0 -1256
  679. metalist-0.20.0/app/static/js/modules/modals/reset-updated-at-modal.js +0 -167
  680. metalist-0.20.0/app/static/js/modules/modals/search-suggestion-statistics-modal.js +0 -458
  681. metalist-0.20.0/app/static/js/modules/modals/session-timeout-modal.js +0 -343
  682. metalist-0.20.0/app/static/js/modules/modals/tag-suggestion-settings-modal.js +0 -122
  683. metalist-0.20.0/app/static/js/modules/modals/version-info-modal.js +0 -317
  684. metalist-0.20.0/app/static/js/modules/mode-manager/actions/history-actions.js +0 -278
  685. metalist-0.20.0/app/static/js/modules/mode-manager/actions/note-actions.js +0 -1288
  686. metalist-0.20.0/app/static/js/modules/mode-manager/actions/selection-actions.js +0 -309
  687. metalist-0.20.0/app/static/js/modules/mode-manager/actions/ui-actions.js +0 -400
  688. metalist-0.20.0/app/static/js/modules/mode-manager/events/context-menu-events.js +0 -1466
  689. metalist-0.20.0/app/static/js/modules/mode-manager/events/focus-events.js +0 -94
  690. metalist-0.20.0/app/static/js/modules/mode-manager/events/input-events.js +0 -195
  691. metalist-0.20.0/app/static/js/modules/mode-manager/events/keyboard-events.js +0 -4137
  692. metalist-0.20.0/app/static/js/modules/mode-manager/events/mouse-events.js +0 -2606
  693. metalist-0.20.0/app/static/js/modules/mode-manager/events/search-events.js +0 -215
  694. metalist-0.20.0/app/static/js/modules/mode-manager/mode-context.js +0 -1944
  695. metalist-0.20.0/app/static/js/modules/mode-manager/mode-logger.js +0 -57
  696. metalist-0.20.0/app/static/js/modules/mode-manager/mode-manager-controller.js +0 -126
  697. metalist-0.20.0/app/static/js/modules/mode-manager/services/add-style-service.js +0 -195
  698. metalist-0.20.0/app/static/js/modules/mode-manager/services/animated-scroll-service.js +0 -87
  699. metalist-0.20.0/app/static/js/modules/mode-manager/services/backlinks-panel-service.js +0 -221
  700. metalist-0.20.0/app/static/js/modules/mode-manager/services/clipboard-shortcut-policy-service.js +0 -127
  701. metalist-0.20.0/app/static/js/modules/mode-manager/services/collapse-affordance-service.js +0 -280
  702. metalist-0.20.0/app/static/js/modules/mode-manager/services/dictation-note-paste.js +0 -48
  703. metalist-0.20.0/app/static/js/modules/mode-manager/services/dictation-paste-service.js +0 -245
  704. metalist-0.20.0/app/static/js/modules/mode-manager/services/differential-view-service.js +0 -1279
  705. metalist-0.20.0/app/static/js/modules/mode-manager/services/dropped-file-preview-service.js +0 -47
  706. metalist-0.20.0/app/static/js/modules/mode-manager/services/embedded-image-service.js +0 -333
  707. metalist-0.20.0/app/static/js/modules/mode-manager/services/file-reference-service.js +0 -442
  708. metalist-0.20.0/app/static/js/modules/mode-manager/services/floating-note-dom.js +0 -74
  709. metalist-0.20.0/app/static/js/modules/mode-manager/services/floating-note-layout.js +0 -28
  710. metalist-0.20.0/app/static/js/modules/mode-manager/services/floating-note-service.js +0 -250
  711. metalist-0.20.0/app/static/js/modules/mode-manager/services/html-paste-sanitizer-service.js +0 -1855
  712. metalist-0.20.0/app/static/js/modules/mode-manager/services/image-context-menu-action-service.js +0 -446
  713. metalist-0.20.0/app/static/js/modules/mode-manager/services/image-file-insert-choice-modal-service.js +0 -179
  714. metalist-0.20.0/app/static/js/modules/mode-manager/services/infinite-scroll-service.js +0 -211
  715. metalist-0.20.0/app/static/js/modules/mode-manager/services/markdown-render-service.js +0 -163
  716. metalist-0.20.0/app/static/js/modules/mode-manager/services/mermaid-render-service.js +0 -281
  717. metalist-0.20.0/app/static/js/modules/mode-manager/services/note-clipboard-write-service.js +0 -286
  718. metalist-0.20.0/app/static/js/modules/mode-manager/services/note-collapse-animation-service.js +0 -203
  719. metalist-0.20.0/app/static/js/modules/mode-manager/services/note-drag-indicator-service.js +0 -117
  720. metalist-0.20.0/app/static/js/modules/mode-manager/services/note-drag-service.js +0 -170
  721. metalist-0.20.0/app/static/js/modules/mode-manager/services/note-fullscreen-service.js +0 -115
  722. metalist-0.20.0/app/static/js/modules/mode-manager/services/note-reposition-animation-service.js +0 -364
  723. metalist-0.20.0/app/static/js/modules/mode-manager/services/note-split-service.js +0 -52
  724. metalist-0.20.0/app/static/js/modules/mode-manager/services/paste-format-detection-service.js +0 -441
  725. metalist-0.20.0/app/static/js/modules/mode-manager/services/paste-format-guess-service.js +0 -317
  726. metalist-0.20.0/app/static/js/modules/mode-manager/services/paste-format-offer-service.js +0 -185
  727. metalist-0.20.0/app/static/js/modules/mode-manager/services/polling-service.js +0 -203
  728. metalist-0.20.0/app/static/js/modules/mode-manager/services/print-service.js +0 -82
  729. metalist-0.20.0/app/static/js/modules/mode-manager/services/reference-source-navigation-service.js +0 -308
  730. metalist-0.20.0/app/static/js/modules/mode-manager/services/remove-formatting-service.js +0 -502
  731. metalist-0.20.0/app/static/js/modules/mode-manager/services/root-note-creation-service.js +0 -34
  732. metalist-0.20.0/app/static/js/modules/mode-manager/services/scroll-anchor-service.js +0 -237
  733. metalist-0.20.0/app/static/js/modules/mode-manager/services/scroll-restoration-service.js +0 -346
  734. metalist-0.20.0/app/static/js/modules/mode-manager/services/scroll-to-top-service.js +0 -152
  735. metalist-0.20.0/app/static/js/modules/mode-manager/services/search-contexts-overlay-service.js +0 -343
  736. metalist-0.20.0/app/static/js/modules/mode-manager/services/search-interaction-service.js +0 -126
  737. metalist-0.20.0/app/static/js/modules/mode-manager/services/search-redaction-reveal-service.js +0 -300
  738. metalist-0.20.0/app/static/js/modules/mode-manager/services/search-suggestion-statistics-service.js +0 -78
  739. metalist-0.20.0/app/static/js/modules/mode-manager/services/search-suggestion-windows-service.js +0 -96
  740. metalist-0.20.0/app/static/js/modules/mode-manager/services/search-suggestions-service.js +0 -581
  741. metalist-0.20.0/app/static/js/modules/mode-manager/services/search-syntax-service.js +0 -433
  742. metalist-0.20.0/app/static/js/modules/mode-manager/services/selected-text-tag-service.js +0 -64
  743. metalist-0.20.0/app/static/js/modules/mode-manager/services/shell-output-service.js +0 -302
  744. metalist-0.20.0/app/static/js/modules/mode-manager/services/tab-dom-cache-service.js +0 -146
  745. metalist-0.20.0/app/static/js/modules/mode-manager/services/tab-state-service.js +0 -303
  746. metalist-0.20.0/app/static/js/modules/mode-manager/services/tag-bar-service.js +0 -585
  747. metalist-0.20.0/app/static/js/modules/mode-manager/services/tag-input-selection-service.js +0 -26
  748. metalist-0.20.0/app/static/js/modules/mode-manager/services/tag-proposal-service.js +0 -359
  749. metalist-0.20.0/app/static/js/modules/mode-manager/services/tag-suggestions-service.js +0 -419
  750. metalist-0.20.0/app/static/js/modules/mode-manager/services/tag-syntax-service.js +0 -832
  751. metalist-0.20.0/app/static/js/modules/mode-manager/services/viewport-hold-service.js +0 -827
  752. metalist-0.20.0/app/static/js/modules/note-html-sanitizer.js +0 -311
  753. metalist-0.20.0/app/static/js/modules/password-generator.js +0 -75
  754. metalist-0.20.0/app/static/js/modules/password-operation-response.js +0 -29
  755. metalist-0.20.0/app/static/js/modules/password-policy.js +0 -37
  756. metalist-0.20.0/app/static/js/modules/password-strength.js +0 -84
  757. metalist-0.20.0/app/static/js/modules/reminder-surface-service.js +0 -1298
  758. metalist-0.20.0/app/static/js/modules/selection-markers.js +0 -86
  759. metalist-0.20.0/app/static/js/modules/uuid.js +0 -19
  760. metalist-0.20.0/app/static/js/vendor/markdown-it-14.3.2.LICENSE.txt +0 -22
  761. metalist-0.20.0/app/static/js/vendor/markdown-it-14.3.2.min.js +0 -3
  762. metalist-0.20.0/app/templates/index.html +0 -322
  763. metalist-0.20.0/app/upload_limits.py +0 -11
  764. metalist-0.20.0/app/usecases/add_selected_text_tag.py +0 -105
  765. metalist-0.20.0/app/usecases/alphabetize_root_notes.py +0 -201
  766. metalist-0.20.0/app/usecases/base.py +0 -14
  767. metalist-0.20.0/app/usecases/bulk_tag_proposals.py +0 -87
  768. metalist-0.20.0/app/usecases/collapse.py +0 -66
  769. metalist-0.20.0/app/usecases/copy_note.py +0 -97
  770. metalist-0.20.0/app/usecases/create_child.py +0 -56
  771. metalist-0.20.0/app/usecases/create_file_preview_child.py +0 -68
  772. metalist-0.20.0/app/usecases/create_note.py +0 -187
  773. metalist-0.20.0/app/usecases/create_sibling.py +0 -66
  774. metalist-0.20.0/app/usecases/delete_subtree.py +0 -172
  775. metalist-0.20.0/app/usecases/expand.py +0 -43
  776. metalist-0.20.0/app/usecases/file_edit_session.py +0 -110
  777. metalist-0.20.0/app/usecases/indent.py +0 -86
  778. metalist-0.20.0/app/usecases/lock.py +0 -35
  779. metalist-0.20.0/app/usecases/move.py +0 -103
  780. metalist-0.20.0/app/usecases/move_to_top.py +0 -179
  781. metalist-0.20.0/app/usecases/outdent.py +0 -91
  782. metalist-0.20.0/app/usecases/paste_child.py +0 -46
  783. metalist-0.20.0/app/usecases/paste_sibling.py +0 -311
  784. metalist-0.20.0/app/usecases/prefetch_link_titles.py +0 -24
  785. metalist-0.20.0/app/usecases/prioritize.py +0 -281
  786. metalist-0.20.0/app/usecases/redo.py +0 -33
  787. metalist-0.20.0/app/usecases/reset_updated_at.py +0 -127
  788. metalist-0.20.0/app/usecases/resize_image.py +0 -83
  789. metalist-0.20.0/app/usecases/run_shell.py +0 -81
  790. metalist-0.20.0/app/usecases/search_comment_autofill.py +0 -130
  791. metalist-0.20.0/app/usecases/set_collapse_bulk.py +0 -55
  792. metalist-0.20.0/app/usecases/set_collapse_in_context.py +0 -215
  793. metalist-0.20.0/app/usecases/split_note.py +0 -92
  794. metalist-0.20.0/app/usecases/tag_proposals.py +0 -390
  795. metalist-0.20.0/app/usecases/toggle_reference_mode.py +0 -65
  796. metalist-0.20.0/app/usecases/toggle_todo_done.py +0 -49
  797. metalist-0.20.0/app/usecases/undo.py +0 -33
  798. metalist-0.20.0/app/usecases/unformat_content.py +0 -59
  799. metalist-0.20.0/app/usecases/update_content.py +0 -183
  800. metalist-0.20.0/app/usecases/view.py +0 -28
  801. metalist-0.20.0/app/utils/__init__.py +0 -0
  802. metalist-0.20.0/app/utils/encryption.py +0 -207
  803. metalist-0.20.0/app/utils/text_utils.py +0 -158
  804. metalist-0.20.0/app/version.py +0 -3
  805. metalist-0.20.0/main.py +0 -793
  806. metalist-0.20.0/metalist.egg-info/PKG-INFO +0 -508
  807. metalist-0.20.0/metalist.egg-info/SOURCES.txt +0 -564
  808. metalist-0.20.0/metalist.egg-info/requires.txt +0 -30
  809. metalist-0.20.0/pyproject.toml +0 -88
  810. {metalist-0.20.0 → metalist-0.22.0}/MANIFEST.in +0 -0
  811. {metalist-0.20.0/app → metalist-0.22.0/app/api}/__init__.py +0 -0
  812. {metalist-0.20.0 → metalist-0.22.0}/app/api/deps.py +0 -0
  813. {metalist-0.20.0 → metalist-0.22.0}/app/api/dev.py +0 -0
  814. {metalist-0.20.0 → metalist-0.22.0}/app/data_directory.py +0 -0
  815. {metalist-0.20.0 → metalist-0.22.0}/app/db/__init__.py +0 -0
  816. {metalist-0.20.0 → metalist-0.22.0}/app/db/file_schema.py +0 -0
  817. {metalist-0.20.0 → metalist-0.22.0}/app/db/search_history_sql.py +0 -0
  818. {metalist-0.20.0 → metalist-0.22.0}/app/db/version.py +0 -0
  819. {metalist-0.20.0/app/api → metalist-0.22.0/app/presentation}/__init__.py +0 -0
  820. {metalist-0.20.0/app/presentation → metalist-0.22.0/app/presentation/render}/__init__.py +0 -0
  821. {metalist-0.20.0 → metalist-0.22.0}/app/presentation/templates.py +0 -0
  822. {metalist-0.20.0 → metalist-0.22.0}/app/security/encryption.py +0 -0
  823. {metalist-0.20.0 → metalist-0.22.0}/app/security/http_error_diagnostics.py +0 -0
  824. {metalist-0.20.0 → metalist-0.22.0}/app/security/http_headers.py +0 -0
  825. {metalist-0.20.0 → metalist-0.22.0}/app/security/sensitive_logging.py +0 -0
  826. {metalist-0.20.0 → metalist-0.22.0}/app/security/shell_execution.py +0 -0
  827. {metalist-0.20.0 → metalist-0.22.0}/app/security/validation_errors.py +0 -0
  828. {metalist-0.20.0 → metalist-0.22.0}/app/services/__init__.py +0 -0
  829. {metalist-0.20.0 → metalist-0.22.0}/app/services/agent/__init__.py +0 -0
  830. {metalist-0.20.0 → metalist-0.22.0}/app/services/agent/action_log.py +0 -0
  831. {metalist-0.20.0 → metalist-0.22.0}/app/services/agent/citation_tokens.py +0 -0
  832. {metalist-0.20.0 → metalist-0.22.0}/app/services/agent/execution_errors.py +0 -0
  833. {metalist-0.20.0 → metalist-0.22.0}/app/services/agent/inference.py +0 -0
  834. {metalist-0.20.0 → metalist-0.22.0}/app/services/agent/investigation.py +0 -0
  835. {metalist-0.20.0 → metalist-0.22.0}/app/services/agent/judging.py +0 -0
  836. {metalist-0.20.0 → metalist-0.22.0}/app/services/agent/model_policy.py +0 -0
  837. {metalist-0.20.0 → metalist-0.22.0}/app/services/agent/prompt_settings.py +0 -0
  838. {metalist-0.20.0 → metalist-0.22.0}/app/services/agent/prompts/__init__.py +0 -0
  839. {metalist-0.20.0 → metalist-0.22.0}/app/services/agent/prompts/agent.md +0 -0
  840. {metalist-0.20.0 → metalist-0.22.0}/app/services/agent/prompts/final-response.md +0 -0
  841. {metalist-0.20.0 → metalist-0.22.0}/app/services/agent/prompts/system.md +0 -0
  842. {metalist-0.20.0 → metalist-0.22.0}/app/services/agent/release_notes.py +0 -0
  843. {metalist-0.20.0 → metalist-0.22.0}/app/services/agent/skill_settings.py +0 -0
  844. {metalist-0.20.0 → metalist-0.22.0}/app/services/agent/skills/__init__.py +0 -0
  845. {metalist-0.20.0 → metalist-0.22.0}/app/services/agent/skills/help-dictation.md +0 -0
  846. {metalist-0.20.0 → metalist-0.22.0}/app/services/agent/skills/help-reminders.md +0 -0
  847. {metalist-0.20.0 → metalist-0.22.0}/app/services/agent/skills/staged-summary.md +0 -0
  848. {metalist-0.20.0 → metalist-0.22.0}/app/services/agent/skills/tag-proposals.md +0 -0
  849. {metalist-0.20.0 → metalist-0.22.0}/app/services/agent/skills/web-browsing.md +0 -0
  850. {metalist-0.20.0 → metalist-0.22.0}/app/services/agent/strict_structured_outputs.py +0 -0
  851. {metalist-0.20.0 → metalist-0.22.0}/app/services/agent/web_actions.py +0 -0
  852. {metalist-0.20.0 → metalist-0.22.0}/app/services/auth.py +0 -0
  853. {metalist-0.20.0 → metalist-0.22.0}/app/services/backlink_index.py +0 -0
  854. {metalist-0.20.0 → metalist-0.22.0}/app/services/backlinks.py +0 -0
  855. {metalist-0.20.0 → metalist-0.22.0}/app/services/code_rendering.py +0 -0
  856. {metalist-0.20.0 → metalist-0.22.0}/app/services/diff_rendering.py +0 -0
  857. {metalist-0.20.0 → metalist-0.22.0}/app/services/exception_capture.py +0 -0
  858. {metalist-0.20.0 → metalist-0.22.0}/app/services/file_text_preview.py +0 -0
  859. {metalist-0.20.0 → metalist-0.22.0}/app/services/footnote_layout.py +0 -0
  860. {metalist-0.20.0 → metalist-0.22.0}/app/services/hierarchy.py +0 -0
  861. {metalist-0.20.0 → metalist-0.22.0}/app/services/input_errors.py +0 -0
  862. {metalist-0.20.0 → metalist-0.22.0}/app/services/mermaid_note_rendering.py +0 -0
  863. {metalist-0.20.0 → metalist-0.22.0}/app/services/note_image_tags.py +0 -0
  864. {metalist-0.20.0 → metalist-0.22.0}/app/services/note_ordering.py +0 -0
  865. {metalist-0.20.0 → metalist-0.22.0}/app/services/password_note_fields.py +0 -0
  866. {metalist-0.20.0 → metalist-0.22.0}/app/services/runtime_hardening.py +0 -0
  867. {metalist-0.20.0 → metalist-0.22.0}/app/services/tag_details.py +0 -0
  868. {metalist-0.20.0 → metalist-0.22.0}/app/startup_environment.py +0 -0
  869. {metalist-0.20.0 → metalist-0.22.0}/app/static/css/forms.css +0 -0
  870. {metalist-0.20.0 → metalist-0.22.0}/app/static/img/favicon.ico +0 -0
  871. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/activity-tracker.js +0 -0
  872. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/ai-chat/agent-web-settings.js +0 -0
  873. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/ai-chat/ai-chat-message-placement.js +0 -0
  874. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/ai-chat/ai-thinking-level-service.js +0 -0
  875. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/ai-chat/bulk-scope-question.js +0 -0
  876. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/ai-chat/cloud-privacy-policy.js +0 -0
  877. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/ai-chat/confirmation-card.js +0 -0
  878. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/ai-chat/confirmation-question.js +0 -0
  879. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/application-state.js +0 -0
  880. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/async-result.js +0 -0
  881. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/command-palette/activation-auth-policy.js +0 -0
  882. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/command-palette/backup-command-availability.js +0 -0
  883. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/command-palette/click-activation-service.js +0 -0
  884. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/command-palette/note-layout-preferences.js +0 -0
  885. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/context-menu/context-menu-target-service.js +0 -0
  886. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/disconnect-editing-state-service.js +0 -0
  887. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/editor-commands.js +0 -0
  888. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/error-overlay.js +0 -0
  889. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/excalidraw/excalidraw-editor-state.js +0 -0
  890. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/location-flags.js +0 -0
  891. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/login-namespace-picker.js +0 -0
  892. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/modals/delete-namespace-validation.js +0 -0
  893. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/modals/namespace-ports-profile.js +0 -0
  894. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/modals/namespace-rename-validation.js +0 -0
  895. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/modals/visual-cues-modal.js +0 -0
  896. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/actions/content-actions.js +0 -0
  897. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/actions/search-actions.js +0 -0
  898. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/events/inactivity-events.js +0 -0
  899. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/services/backlinks-navigation-service.js +0 -0
  900. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/services/collapse-editing-policy-service.js +0 -0
  901. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/services/command-gate-service.js +0 -0
  902. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/services/context-menu-target-service.js +0 -0
  903. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/services/deselect-selection-state-service.js +0 -0
  904. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/services/dictation-paste-padding.js +0 -0
  905. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/services/edit-session-collapse-policy-service.js +0 -0
  906. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/services/edit-session-collapse-service.js +0 -0
  907. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/services/export-service.js +0 -0
  908. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/services/export-title-service.js +0 -0
  909. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/services/file-drop-policy-service.js +0 -0
  910. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/services/file-image-preview-service.js +0 -0
  911. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/services/filtered-refresh-selection-service.js +0 -0
  912. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/services/footnote-navigation-service.js +0 -0
  913. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/services/history-selection-policy-service.js +0 -0
  914. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/services/history-shortcut-policy-service.js +0 -0
  915. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/services/link-context-menu-action-service.js +0 -0
  916. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/services/link-title-prefetch-service.js +0 -0
  917. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/services/note-click-target-service.js +0 -0
  918. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/services/note-context-menu-action-service.js +0 -0
  919. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/services/note-delete-shortcut-policy-service.js +0 -0
  920. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/services/note-timestamp-hover-service.js +0 -0
  921. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/services/password-clipboard-service.js +0 -0
  922. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/services/remote-image-proxy-service.js +0 -0
  923. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/services/root-date-separator-service.js +0 -0
  924. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/services/root-sort-indicator-service.js +0 -0
  925. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/services/root-sort-service.js +0 -0
  926. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/services/search-debounce-service.js +0 -0
  927. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/services/search-input-service.js +0 -0
  928. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/services/search-suggestion-window-labels-service.js +0 -0
  929. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/services/selected-formatting-removal-service.js +0 -0
  930. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/services/tab-drag-service.js +0 -0
  931. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/services/tab-duplication-service.js +0 -0
  932. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/services/todo-toggle-editing-service.js +0 -0
  933. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/services/untagged-view-indicator-service.js +0 -0
  934. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/mode-manager/services/view-mode-search-shortcut-service.js +0 -0
  935. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/reminder-store.js +0 -0
  936. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/session-auth.js +0 -0
  937. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/modules/tag-token.js +0 -0
  938. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/namespace-deleted.js +0 -0
  939. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/namespace-renamed.js +0 -0
  940. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/vendor/dompurify-3.4.16.LICENSE.txt +0 -0
  941. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/vendor/dompurify-3.4.16.min.js +0 -0
  942. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/vendor/excalidraw-0.18.1-assets/excalidraw.css +0 -0
  943. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Assistant/Assistant-Bold.woff2 +0 -0
  944. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Assistant/Assistant-Medium.woff2 +0 -0
  945. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Assistant/Assistant-Regular.woff2 +0 -0
  946. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Assistant/Assistant-SemiBold.woff2 +0 -0
  947. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Cascadia/CascadiaCode-Regular.woff2 +0 -0
  948. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/ComicShanns/ComicShanns-Regular-279a7b317d12eb88de06167bd672b4b4.woff2 +0 -0
  949. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/ComicShanns/ComicShanns-Regular-6e066e8de2ac57ea9283adb9c24d7f0c.woff2 +0 -0
  950. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/ComicShanns/ComicShanns-Regular-dc6a8806fa96795d7b3be5026f989a17.woff2 +0 -0
  951. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/ComicShanns/ComicShanns-Regular-fcb0fc02dcbee4c9846b3e2508668039.woff2 +0 -0
  952. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-349fac6ca4700ffec595a7150a0d1e1d.woff2 +0 -0
  953. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-3f2c5db56cc93c5a6873b1361d730c16.woff2 +0 -0
  954. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-41b173a47b57366892116a575a43e2b6.woff2 +0 -0
  955. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-623ccf21b21ef6b3a0d87738f77eb071.woff2 +0 -0
  956. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2 +0 -0
  957. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-b9dcf9d2e50a1eaf42fc664b50a3fd0d.woff2 +0 -0
  958. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-be310b9bcd4f1a43f571c46df7809174.woff2 +0 -0
  959. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYE98RXi4EwSsbg.woff2 +0 -0
  960. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYEF8RXi4EwQ.woff2 +0 -0
  961. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTA3j6zbXWjgevT5.woff2 +0 -0
  962. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTQ3j6zbXWjgeg.woff2 +0 -0
  963. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTk3j6zbXWjgevT5.woff2 +0 -0
  964. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTo3j6zbXWjgevT5.woff2 +0 -0
  965. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTs3j6zbXWjgevT5.woff2 +0 -0
  966. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Virgil/Virgil-Regular.woff2 +0 -0
  967. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/vendor/excalidraw-0.18.1.LICENSE.txt +0 -0
  968. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/vendor/excalidraw-0.18.1.min.js +0 -0
  969. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/vendor/mermaid-11.16.1.LICENSE.txt +0 -0
  970. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/vendor/mermaid-11.16.1.min.js +0 -0
  971. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/vendor/zxcvbn-4.4.2.LICENSE.txt +0 -0
  972. {metalist-0.20.0 → metalist-0.22.0}/app/static/js/vendor/zxcvbn-4.4.2.js +0 -0
  973. {metalist-0.20.0 → metalist-0.22.0}/app/static/note-html-policy.json +0 -0
  974. {metalist-0.20.0 → metalist-0.22.0}/app/templates/_logo_mark.html +0 -0
  975. {metalist-0.20.0 → metalist-0.22.0}/app/templates/base.html +0 -0
  976. {metalist-0.20.0 → metalist-0.22.0}/app/templates/locked.html +0 -0
  977. {metalist-0.20.0 → metalist-0.22.0}/app/templates/maintenance.html +0 -0
  978. {metalist-0.20.0 → metalist-0.22.0}/app/templates/namespace_deleted.html +0 -0
  979. {metalist-0.20.0 → metalist-0.22.0}/app/templates/namespace_renamed.html +0 -0
  980. {metalist-0.20.0 → metalist-0.22.0}/app/templates/notes_list.html +0 -0
  981. {metalist-0.20.0 → metalist-0.22.0}/app/usecases/__init__.py +0 -0
  982. {metalist-0.20.0 → metalist-0.22.0}/app/usecases/delete_tag.py +0 -0
  983. {metalist-0.20.0 → metalist-0.22.0}/app/usecases/rename_tag.py +0 -0
  984. {metalist-0.20.0 → metalist-0.22.0}/app/usecases/search_context_tags.py +0 -0
  985. {metalist-0.20.0/app/presentation/render → metalist-0.22.0/app/utils}/__init__.py +0 -0
  986. {metalist-0.20.0 → metalist-0.22.0}/convert-from-legacy.py +0 -0
  987. {metalist-0.20.0 → metalist-0.22.0}/metalist.egg-info/dependency_links.txt +0 -0
  988. {metalist-0.20.0 → metalist-0.22.0}/metalist.egg-info/entry_points.txt +0 -0
  989. {metalist-0.20.0 → metalist-0.22.0}/metalist.egg-info/top_level.txt +0 -0
  990. {metalist-0.20.0 → metalist-0.22.0}/scripts/generate-lan-cert.sh +0 -0
  991. {metalist-0.20.0 → metalist-0.22.0}/setup.cfg +0 -0
@@ -0,0 +1,531 @@
1
+ Metadata-Version: 2.4
2
+ Name: metalist
3
+ Version: 0.22.0
4
+ Summary: A minimalist single-user note-taking app with SSR, fast in-memory tree operations, and efficient sync.
5
+ Project-URL: Homepage, https://metalist.app
6
+ Project-URL: Repository, https://github.com/metalist-app/metalist
7
+ Project-URL: Issues, https://github.com/metalist-app/metalist/issues
8
+ Requires-Python: <3.15,>=3.11
9
+ Description-Content-Type: text/markdown
10
+ Requires-Dist: argon2-cffi==25.1.0
11
+ Requires-Dist: cryptography==50.0.0
12
+ Requires-Dist: fastapi==0.141.1
13
+ Requires-Dist: httpcore==1.0.9
14
+ Requires-Dist: httpx==0.28.1
15
+ Requires-Dist: instructor==1.15.4
16
+ Requires-Dist: latex2mathml==3.81.0
17
+ Requires-Dist: loguru==0.7.3
18
+ Requires-Dist: Mako==1.3.12
19
+ Requires-Dist: nh3==0.3.6
20
+ Requires-Dist: openai==2.54.0
21
+ Requires-Dist: pillow==13.0.0
22
+ Requires-Dist: pydantic==2.13.4
23
+ Requires-Dist: pygments==2.20.0
24
+ Requires-Dist: pypdf==6.21.1
25
+ Requires-Dist: python-dotenv==1.2.2
26
+ Requires-Dist: python-multipart==0.0.32
27
+ Requires-Dist: rich==14.3.4
28
+ Requires-Dist: starlette==1.3.1
29
+ Requires-Dist: tqdm==4.70.0
30
+ Requires-Dist: tree-sitter==0.25.2
31
+ Requires-Dist: tree-sitter-javascript==0.25.0
32
+ Requires-Dist: typing_extensions==4.16.0
33
+ Requires-Dist: uvicorn==0.52.0
34
+ Requires-Dist: zxcvbn==4.5.0
35
+ Provides-Extra: dev
36
+ Requires-Dist: hypothesis==6.164.0; extra == "dev"
37
+ Requires-Dist: pytest==9.1.1; extra == "dev"
38
+ Requires-Dist: pytest-cov==7.1.0; extra == "dev"
39
+ Requires-Dist: shockharness==0.17.0; extra == "dev"
40
+ Requires-Dist: mypy==2.4.0; extra == "dev"
41
+
42
+ # MetaList
43
+
44
+ A minimalist single-user note-taking app focused on server-side rendering (SSR), fast in-memory tree operations, and efficient sync/diff updates.
45
+
46
+ ## Features
47
+ - Rich text editing (ContentEditable) with image support
48
+ - Drag-and-drop note reordering
49
+ - Real-time content saving
50
+ - Keyboard shortcuts / cheatsheet (press `?` in the app)
51
+ - Linked-list ordering model for efficient reorders
52
+ - Optional password protection + encryption at rest (AES-GCM)
53
+ - Multi-tab search contexts with server-persisted scroll/search state (survives browser restarts)
54
+ - Manual namespace backups/restores to a user-selected backup folder with retention controls
55
+
56
+ ## Changes in 0.22.0
57
+
58
+ - 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%).
59
+ - With nothing typed, the tag bar and Suggest Tags with AI no longer offer another spelling of a tag the note has: no `eggs` beside `egg`, no `easter-eggs` beside `easter-egg`. Typing still offers every spelling that matches.
60
+ - Synonyms of the tags in the bar are never suggested (no `avocados` once `avocado` is there), and a tag a parent already has is not suggested until you type it, whatever else goes with it.
61
+ - The Tag Suggestions setting "Allow suggesting tags that already apply" is removed; a saved choice is dropped.
62
+
63
+ ## Changes in 0.21.0
64
+
65
+ - **Memory usage** (command palette): the server's memory now and at its peak (on a Mac as Activity Monitor counts it), the notes it holds decrypted, how long the last unlock took and where, and *Measure what holds it*, a breakdown of each part; Copy puts it all on the clipboard.
66
+ - Much lighter and faster for large namespaces (measured on about 107,500 notes): memory down from about 1.5 GB to about 640 MB, starting the servers from 4.6 to about 2 s (the launch ends with "Ready in"), unlocking from about 9 to about 6 s. Suggestions after typing a tag and a space now come in a few hundredths of a second instead of most of a second, and searches of tags alone are faster.
67
+ - Search highlights the quoted phrases it found. `@code` finds every `@code=<language>` note, suggestions offer the family and its members, and `@code=python` can be typed directly.
68
+ - **Backup reminder** (command palette): Off, Daily, Weekly (the default), Every 2 weeks or Monthly. When this namespace's newest backup is older than that, a card floats at the bottom right.
69
+ - References have one syntax, and embedded notes are drawn like the main tree. ⌘V pastes what is on the clipboard rather than the last copied note, a pasted note keeps each copied note's collapsed or expanded state, and a click on a short Markdown list item edits that item.
70
+ - Pasted web addresses lose their tracking parameters.
71
+ - AI privacy: the text actually sent is checked against the privacy settings, private search terms are never sent, proposed tags never count toward a whitelist, and changing the privacy settings stops a request already under way.
72
+ - Exported HTML is cleaned like the note view and carries its own security policy; code lines stay whole in full screen and in exports.
73
+ - Fixed: right-clicking selected images (just pasted, for example) failed instead of opening the image menu; a refused chat Send now stays on screen with its reason; Enter and the arrow keys act only on a suggestion list made for what was typed; the banner and zoom work while editing; clicking a diagram edits it and pictures can be dragged; a move that changes nothing does nothing; a save made while a password is being set (or a backup restored) waits for it to finish instead of failing, and the "Processing" page returns to MetaList on its own; reminder fixes.
74
+ - **MetaList now needs Python 3.11 or newer.** Python 3.10 reaches its end of life this month, and Pillow's fixes below no longer support it. An install on Python 3.10 needs a newer Python before it can update.
75
+ - Security: Pillow 13.0.0 (eight advisories in decoding crafted TIFF, GIF, PPM, EPS and PDF files, which MetaList meets in remote images and attachments), pypdf 6.21.1 (crafted PDFs that loop, use too much memory, or reach arbitrary image parsers), aiohttp 3.14.4 (GHSA-2g87-pp6c-29x5), certifi 2026.10.19 and uv 0.13.4. The source repository moved to [metalist-app/metalist](https://github.com/metalist-app/metalist).
76
+
77
+ ## Changes in 0.20.0
78
+
79
+ - **Suggest Tags with AI** for the note being edited: right-click the note, or its tag bar past the tags, and choose 🤖 Suggest Tags with AI (for a note with children: This Note, or This Note and Its Children). The proposals appear under the tag bar for `+`/`−`, tags not yet in use marked **new** and grouped on the right; adding them can be undone. It shows only when an AI is set up and may see the note.
80
+ - The robot count (🤖 N) next to a note: click it to open every collapsed note on the way to its proposals and edit the highest one that has some; right-click it to Accept All or Reject All, one undo step.
81
+ - **Print**: the note menu's Print ▸ Note / View, the background menu's Print View, or the palette's Print view, through the browser's print dialog (Save as PDF included). Always light, fully expanded, without arrows, using the page's full width with its own margins, so the browser prints no header or footer.
82
+ - Export as HTML and Print open one dialog: a title with a smart default (the note's first line, or MetaList with the view's search), which heads the page unless the first note already says it and names an exported file; 🤖 Suggest with AI for the title, asked only when you press it, which never sees private notes, usernames, passwords or the search; and, when some would show, an Include Unredacted Passwords / Usernames checkbox (unchecked: each shows `••••••••`, whatever its length).
83
+ - Exported HTML files show the view as it is shown (its search, sort order, Untagged view; notes a search leaves out are absent), start fully expanded with MetaList's collapse arrows working in the file, and copy usernames, included passwords and `@copyable` values on click. Collapsing no longer shifts the page sideways.
84
+ - `@username` notes are private like `@password`: never sent to the AI. Username, password and email rows show just their icon, named on hover, and the value.
85
+ - Text never runs out of its note: a word too long for the line (a token, a hash, a long URL) breaks at the note's edge, and code, `@json`, `@diff`, CSV and Markdown code blocks wrap. Images shrink to fit their note or embedded note, and `@size` scales them only up to that width.
86
+ - The light theme's header bar is black again, with white icons and count, and the AI chat header now lines up with the search bar.
87
+
88
+ ## Changes in 0.19.0
89
+
90
+ - Paste formats: pasting a fenced code block that names its language tags the note `@markdown`, and `@markdown` now colours that code like `@code=<language>` (with its label). Code copied from VS Code is tagged `@code=<its language>`, and cells copied from Excel, Google Sheets or Numbers become CSV text tagged `@csv`.
91
+ - Text that only looks like a format is offered, not applied: after pasting CSV-like, Markdown-like or code-like text, a small card says "Apply as CSV" / "Apply as Markdown" / "Apply as Python" (up to three close languages for code) with "Skip". The card moves nothing and never takes the keyboard; typing on, Escape or a click elsewhere closes it. It also appears when the paste makes a new note.
92
+ - Right-click a tag already in the tag bar or the search box for **About this tag**: whether the note names it, the notes it shares with your other tags, whether a parent or a rule already gives it, its synonyms and implications, how many notes have it ("Only on this note" hints at a typo); in the search box, what it finds and what leaving it out removes. Edit Tag Relationships now comes first in the tag menu, at a fixed place under the pointer.
93
+ - Tag suggestions: a web address in a note counts only by its site's name, so a YouTube link no longer suggests `HTTPS` or `V-neuron`; one letter alone no longer names a tag with longer words. A suggestion without evidence now says only what is true (what you typed matches, which part of its name the note has) instead of "Nothing in this note points to it".
94
+ - Fixed: accepting a Grammarly suggestion while editing could undo itself and end editing, when Grammarly drew its card in an element MetaList did not recognise.
95
+ - Removed the "Make pseudo-suggestions" test item from the note menu.
96
+
97
+ ## Changes in 0.18.0
98
+
99
+ - Right-click a tag suggestion, in the tag bar or the search bar, to see why it is suggested. The menu starts with **Why suggested**: the words of the note that name the tag (or a synonym), the tags it goes with and on how many notes, notes sharing this note's tags, whether it already applies through a parent or a rule, or that nothing in the note points to it; then how often the tag is used. Search suggestions also say how often you worked with a tag lately (when that put it first), what your search so far finds, or what leaving it out removes. The reasons are MetaList's own ranking, not the AI's, and appear instantly.
100
+ - Fixed: right-clicking a suggestion closed the list and opened the menu of the note underneath (or the browser's own menu). The list, your typed letters and the cursor now stay as they were, and `Escape` on an open right-click menu closes only the menu instead of also leaving edit mode.
101
+
102
+ ## Changes in 0.17.0
103
+
104
+ - A whole-view summary that fails or is stopped keeps the batches it finished; saying "try that again" continues it, running only the remaining batches with the original question.
105
+ - The AI remembers a failed request and the explanation you saw, so you can say "try that again" or ask why it failed. Every failure explanation now ends with where the run stopped: the step, how long it had been there, and the step before.
106
+ - Until OpenAI responds, the chat says "Waiting for OpenAI…" instead of "Thinking…". A request OpenAI never answers fails after 15 seconds at Off or Low thinking (60 s Medium, 120 s High) with a message to check the internet connection, instead of waiting up to 10 minutes.
107
+ - Questions that do not read your notes answer faster in large views: the view is no longer processed note by note up front. With diagnostic activity on, the first line shows how long preparing the view took, and each step shows how much note text it read.
108
+ - Summaries no longer fail because the AI left out its list of supporting notes (OpenAI now enforces the answer format), and a retry tells the model what was wrong.
109
+ - Fixed: pressing Stop ended in a fatal error; stray boxes and "cite" appeared around some citations; a step OpenAI never answered was described as "the reply was empty".
110
+
111
+ ## Changes in 0.16.0
112
+
113
+ - Right-clicking outside any note opens a fuller menu: Add/Paste Note at Top, Undo, Redo, Go to Top, Go to Bottom, Fully Expand/Collapse All, View (All or Untagged notes), Sort by, Show (Chat, Tabs, Tags in List), Theme (System, Light, Dark), New Tab, Open/Switch Namespace, Reminders, Export View as HTML and Log Out. The current choices are ticked.
114
+ - The note menu is grouped: Copy Note, Paste, Add, Move, Outline, Focus, Export, the editing actions, and Delete Note last. Keyboard shortcuts show on the right of both menus, and actions that cannot happen from that note are hidden.
115
+ - Move to Bottom (in Move, or ⇧⌘↓) puts a note after its last sibling, or after the view's last note (the last match in a search). The view stays put: the notes above keep their place and the ones below close the gap.
116
+ - A down arrow under the up arrow goes to the bottom of the list, even when the end is not loaded yet; each arrow is dimmed when you are already at its end. Both arrows, and Focus ▸ Full Screen (now also offered while editing), save the note and leave edit mode first.
117
+ - The right-click menu closes when the pointer moves well away from it, and keys pressed in full-screen view no longer reach the list behind it.
118
+
119
+ ## Changes in 0.15.0
120
+
121
+ - Pasting JSON, a chess position (FEN), a diff, a Mermaid diagram or a LaTeX block tags the note for it as you paste: the plain tag into an empty note, `((…))` around the paste in a note that already has text. ⌘Z right after the paste removes the tag with it; ⇧⌘V pastes without detection.
122
+ - New formats: `@code=python` (or any language) highlights code, `@diff` colours diffs, `@mermaid` draws a diagram without a Markdown fence, and `@chess` draws a FEN position as a board. JSON, code and diff blocks are more compact.
123
+ - Switching namespace stays in one tab: on the login screen the panel clears as you pick and the other namespace's login screen fades in under the same logo, with no white flash. In the app, Open/Switch namespace offers Open in This Tab or Open in New Tab.
124
+ - Tag suggestions: tags used elsewhere in the tree, or named in nearby notes, no longer get a boost; only the note's own text does. A new Tag Suggestions setting can also suggest tags that a parent or the rules already apply.
125
+ - Change password with no password opens Add password, and Open/Switch namespace with only one namespace opens Create namespace. The AI tag-proposal menu items now say they are about AI-proposed tags.
126
+ - Fixed: Add reminder did nothing (a missing title now says so); a password change could end on Session locked; right-clicking math or a Mermaid diagram showed the browser's menu; the Untagged notes × needed two clicks while editing a note; indented JSON and pie charts pasted into a note showed as invalid; a tiny scrollbar beside tall math; a white stripe and logo shift on the login screen with always-visible scrollbars.
127
+
128
+ ## Changes in 0.14.0
129
+
130
+ - A new login screen: one dark screen with the MetaList logo. The namespace, password and OK fade in together; once the password is accepted, the loading progress slides in with the current step and the seconds elapsed. When the first login after an update backs up and upgrades the namespace, a note under OK says so. The Session locked page has the same look, and there is no white flash between them.
131
+ - Web link titles: links to Reddit (including share links), YouTube, Vimeo, TikTok, Spotify and SoundCloud get their real titles. Lookups are paced per site, so a note full of links no longer trips a site's rate limit. Login, consent and site-name-only titles ("Sign in", "Reddit") show the link instead. The new command palette action Retry failed link titles asks every failed link again, with a progress dialog.
132
+ - Quoted search also matches link titles and the URLs hidden behind link labels, and the AI sees those URLs too. Pasting into a quoted search inserts the text as copied.
133
+ - `[[note id]]` is always a link, even in a note with a `[[ ]]` formatting tag.
134
+ - The startup output in the terminal is easier to read: the version, a check mark per check, and each namespace's URLs lined up.
135
+ - Fixed: clicking the AI chat's $ or eye button twice quickly crashed with "Redundant state change".
136
+
137
+ ## Changes in 0.13.0
138
+
139
+ - Dictation: text from speech-to-text tools such as Superwhisper, pasted into the search bar or any tag field, becomes your existing tags ("neural network" gives `neural-network`). Say "quote … end quote" for text, "minus" to exclude, "at" before meta tags such as `@todo`. In a note, the words after "start tags" go to its tag bar. The phrases are set in Dictation Settings, and one undo restores what was pasted.
140
+ - A quoted search with a space at its edge matches whole words: `" fat"` no longer finds "father".
141
+ - The AI keeps a record of what it did for each answer (notes read, searches, web pages opened), so questions like "did you search the web for that?" are answered from what actually happened.
142
+ - Dropping a `.txt`, `.md`, `.csv` or `.json` file stores it as before and adds its text as a child note, shown as Markdown, a table or formatted JSON. File pills show the extension (`.MD`, `.CSV`, …), and hovering a pill says that clicking downloads the file.
143
+ - Typing one letter in the tag bar now narrows the suggestions you were already shown instead of reordering them, so the tag you want is in the top five far more often.
144
+
145
+ ## Changes in 0.12.0
146
+
147
+ - AI chat is now a tool-using agent: in one answer it can look up MetaList help, read and search the notes in your view, open web pages, and open menus, instead of picking a single route up front. Answers cite notes and web pages with clickable references, including each item listed from a web page.
148
+ - Nothing changes without your Yes: tag operations ask first with the exact change, and web addresses that carry words from your notes ask before opening. Summaries that fit in one pass start without a dialog, and summaries never block other edits while they run.
149
+ - "How do I change…" questions open the menu that holds the setting; release notes are part of the help. AI prompts and skills are no longer editable, and a $ button shows or hides the spend estimate.
150
+ - The AI is told only that a note is private, never which privacy setting hides it, and failed AI steps are explained in the chat.
151
+ - Leaving edit mode keeps your place, with no highlight; a collapsed note you changed stays expanded. Clicking into a note keeps the clicked spot under the pointer, including in diagrams and formulas.
152
+ - Dragging a note shows a ghost, a drop line and a direction cursor; the note lands where you dropped it without the page scrolling.
153
+ - Searches that cannot be parsed are explained politely instead of failing.
154
+
155
+ ## Changes in 0.11.0
156
+
157
+ - Large namespaces stay fast while scrolling: only a band of root notes around the viewport is loaded, the server remembers what each tab shows so the browser no longer sends note hashes, and rendered notes are cached.
158
+ - Tag suggestions, searches with only exclusions (`-tag`), and the updated/content-volume sort orders respond much faster on large namespaces.
159
+ - Accepting or removing tag proposals in bulk, renaming or deleting a tag, and undoing a large delete no longer rebuild every note's inherited tags.
160
+ - Unlocking an encrypted namespace is faster, and the startup encryption audit no longer loads every attachment into memory.
161
+ - Fixed undo of deleting a note whose children have several children, and "accept all" failing on tag bars with leading or trailing spaces.
162
+ - Fixed crashes in the status check after returning to a tab and in scroll-position saving.
163
+
164
+ ## Changes in 0.10.0
165
+
166
+ - Excalidraw diagrams: add one from the note's right-click menu or the command palette, and double-click a diagram to edit it full screen. Diagrams autosave, show light and dark previews, resize like images, and each editing session is one undo step. The editor is bundled locally and needs no Node server.
167
+ - The dark theme uses neutral greys with a brighter accent, the light theme header is darker, and Note Layout & Appearance adds note corner and tag style settings.
168
+ - References to a note that starts with an image or diagram show its thumbnail. Collapsed notes, reference titles, and backlink previews show only the first line.
169
+ - Fixed a command palette crash on queries with no matches.
170
+ - The database schema moves to version 10. Password-protected namespaces migrate after unlock, with the usual automatic backup first.
171
+
172
+ ## Changes in 0.9.0
173
+
174
+ - AI chat can browse the web in disabled, contextual, or unrestricted mode, fetch multiple pages concurrently, and cite the specific pages used as evidence.
175
+ - Complete-scope summaries and tag suggestions can process every permitted note in bounded parallel batches after user approval, with visible per-batch progress and final synthesis.
176
+ - AI chat retains selected-note and tree context while enforcing redaction boundaries, and reference navigation uses temporary result collections without polluting search history.
177
+
178
+ ## Changes in 0.8.0
179
+
180
+ - Error diagnostics now record safe request IDs, exception types, and source locations through Loguru; full tracebacks are available only in authenticated encrypted logs.
181
+ - Releases run the full cross-platform matrix once on the `main` push. The tag publishes those exact tested distributions without rerunning the matrix.
182
+
183
+ ## Changes in 0.7.5
184
+
185
+ - Unexpected API 500 errors now show the exception class and MetaList source line in the browser, without exposing note contents, exception messages, or local filesystem paths.
186
+ - A local release command validates the exact cross-platform CI matrix, publishes only its tested artifacts, then verifies the public PyPI package in a clean installation.
187
+
188
+ ## Changes in 0.7.4
189
+
190
+ - Updates use a private, checksum-verified uv release on Windows, macOS, and Linux. The updater does not execute a user-installed uv, and it revalidates both the cached official archive and extracted executable before each use.
191
+ - The HTTPS listener retries one bodyless safe request after a transient backend reset, records final transport failures server-side, and never replays a mutation or request body.
192
+ - Release CI builds one distribution pair, starts independent platform/Python, installed-update, browser-smoke, and browser-soak gates in parallel, and caches only hash- or lockfile-verified dependencies.
193
+
194
+ ## Changes in 0.7.3
195
+
196
+ - Windows updates use a private verified uv release when an older installer is vulnerable to the reported PE-resource access-denied failure. A standalone repair ZIP can bootstrap installations whose existing updater cannot update itself.
197
+ - Release candidates now run the complete test and installed-package matrix on Windows, macOS, and Linux across Python 3.10–3.14. Real Chrome and Firefox exercise repeated cold loads and encrypted login on every operating system; Windows also checks Edge over verified LAN HTTPS and the repair path from a published older release.
198
+
199
+ ## Changes in 0.7.2
200
+
201
+ - Login, hydration, and workspace requests share one initialized browser-tab identity. Losing the `sessionStorage` copy while opening the workspace no longer causes the reported missing-tab-ID crash. The external trigger for that storage loss remains unconfirmed.
202
+ - AI chat preserves the edited note and includes its permitted tree, tags, and cached URL titles. Search redaction and cloud privacy restrictions apply to every node; blocked selections expose only their availability reason.
203
+ - Added on-demand AI help and menu actions, privacy previews, and Copy Response throughout assistant message bubbles. OpenAI is the supported inference provider.
204
+ - LLM regressions use current production prompts, default to five trials with cache-aware parallel scheduling, and can run only cases affected by prompt or skill changes.
205
+ - Improved Grammarly edit preservation and search suggestions that match the complete active clause.
206
+
207
+ ## Changes in 0.6.3
208
+
209
+ - Restored HTTPS connection reuse and aligned the pending accept queue with the existing worker capacity, so a browser’s six-connection startup burst is admitted.
210
+ - Every page load or refresh checks PyPI asynchronously. A newly discovered release shows a dismissible notice linking to Version Info; typing `update` in the menu also finds it.
211
+ - Managed uv installations can update from Version Info, using the existing preflight, verified immutable backups, and namespace restart flow. Source checkouts and unmanaged installations explain why in-app installation is unavailable.
212
+ - Release validation now transfers every installed startup asset through concurrent persistent HTTP/HTTPS connections on all supported platforms and Python versions. Actual Edge startup over LAN-style HTTPS is also required on Windows before publication.
213
+
214
+ ## Changes in 0.6.2
215
+
216
+ - Namespace startup allows two minutes, with progress every five seconds, instead of failing after 12 seconds on a busy machine. `METALIST_STARTUP_TIMEOUT_SECONDS` can increase the allowance. Failed children are stopped and reaped.
217
+ - Updates preserve the running Python interpreter and validate a disposable installation and namespace startup before stopping live servers. uv then installs the tested package/dependency versions from its cache without network access.
218
+ - Python 3.14 is supported. Command-line legacy imports also work when Python lacks Tk's native GUI component.
219
+ - Release validation now includes the real uv update, backups, and multi-namespace restart on Windows, macOS, and Linux across Python 3.10–3.14.
220
+
221
+ ## Changes in 0.6.1
222
+
223
+ - Removed the unused performance overlay, including its menu option and background state updates, fixing a fatal redundant-state error during note rearranging. Obsolete overlay preferences and command usage are discarded automatically.
224
+
225
+ ## Changes in 0.6.0
226
+
227
+ - Open notes and their children in multiple live, read-only floating windows. Drag and resize them, keep them visible across searches and tabs, and follow links or copy passwords. Saved changes refresh every half second.
228
+ - Double-click selects complete tags, including punctuation and prefixes, in search and tag bars.
229
+ - Choose sorting modes from the background right-click menu. Creation sorting uses the root note's creation time; last-updated sorting includes descendants and ignores reference display-form changes.
230
+ - Context menus have icons throughout. Full-screen notes have compact spacing, and both read-only views keep steady borders on hover.
231
+ - Fixed Version Info loading and state-transition errors during editing, focus changes, tab switching, and duplication.
232
+
233
+ ## Changes in 0.5.0
234
+
235
+ - Sound support is removed entirely; reminders retain their visual behavior. The live database migrates to schema 9, with encrypted namespaces migrating after unlock. Existing backups remain unchanged. See [sound removal](docs/ui/sounds.md).
236
+ - Remove Formatting supports arbitrary spans within pasted headings. Whole-note Cmd+U removes leading/trailing blank lines and retains at most one empty line between sections.
237
+ - This release includes the security, recovery, resource-limit, state-ownership, and performance work documented in the [implementation and coverage map](docs/testing/coverage-map.md).
238
+
239
+ ## Technology Stack
240
+
241
+ ### Backend
242
+ - FastAPI
243
+ - SQLite (via stdlib `sqlite3`) with a guard-aware wrapper (`SafeSession`)
244
+ - Mako templates for SSR
245
+
246
+ ### Frontend
247
+ - Vanilla JavaScript (no framework)
248
+ - HTML5 Drag and Drop API
249
+ - ContentEditable for rich text editing
250
+ - CSS custom properties for theming
251
+
252
+ ### Testing
253
+ - Python/unit tests plus manual regression passes
254
+
255
+ ## Architecture (High Level)
256
+ - Server renders the base page via Mako templates.
257
+ - The browser client drives interaction via `/api2` JSON endpoints.
258
+ - Passwordless notes load into memory at startup; encrypted notes load after login. Rendering/search and ordinary authentication use memory; a read guard restricts intentional SQLite access to explicit windows.
259
+
260
+ ## Security Boundary
261
+
262
+ Password protection encrypts namespace data at rest. While a namespace is
263
+ unlocked, the server must hold its data-encryption key and decrypted working
264
+ data in process memory, and the browser holds the decrypted content currently
265
+ rendered in the page. A sufficiently privileged local process, debugger,
266
+ administrator, browser extension, or process-memory dump can therefore expose
267
+ an unlocked namespace.
268
+
269
+ Explicit logout removes the live key and purges decrypted runtime stores, but
270
+ it cannot guarantee forensic overwriting of memory previously allocated by the
271
+ Python or browser runtimes. Protect the host account and operating system, and
272
+ see the detailed [security architecture and threat model](docs/security/README.md).
273
+
274
+ ## Development
275
+
276
+ ### Setup
277
+ For a published one-off run with uv:
278
+ ```bash
279
+ uvx metalist
280
+ ```
281
+
282
+ For a persistent uv tool install:
283
+ ```bash
284
+ uv tool install metalist
285
+ metalist
286
+ ```
287
+
288
+ For a persistent uv installation, you can update from inside MetaList: type **update** in the menu, open **Version Info**, and choose **Update to …** when a newer release is available. Each browser load or refresh asks the server to check PyPI asynchronously. A reminder-style notice links to Version Info the first time a newer version is discovered; the announced version is remembered in that namespace's client preferences. A slow or failed check does not block the app. Version Info can retry a failed check.
289
+
290
+ The in-app updater checks the selected release, creates verified backups, and restarts every namespace. Keep Version Info open to follow progress and reload when ready; closing and reopening it in the same page resumes progress. Signing in again may be necessary. Source checkouts and unmanaged installations still check for releases, but show why in-app installation is unavailable. Update job records and logs live under `~/MetaList/update-jobs/` (or the configured data directory). If installation/restart fails after servers stop, inspect the updater output and run `metalist` on the server to restart it; there is no automatic rollback.
291
+
292
+ You can also update and restart MetaList with one cross-platform command:
293
+ ```bash
294
+ metalist update
295
+ ```
296
+ 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 installer prerequisites and uses uv to install the candidate into a disposable tool environment with the current base Python interpreter. It checks dependencies and starts a temporary namespace to verify HTTP readiness, version, and runtime assets. A failed preflight leaves the current installation and running namespaces unchanged. After preflight succeeds, it 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 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.
297
+
298
+ MetaList downloads its own checksum-verified uv 0.12.17 archive for the current operating system, architecture, and Linux C library. The verified archive and extracted executable are stored in the operating system's user cache; every update verifies the archive against its pinned upstream SHA-256 and the executable against the verified archive before use. That same executable performs both preflight and final installation. MetaList does not execute or replace the user's global uv. Download, verification, platform-selection, or version failures occur before any namespace is stopped. Already-installed releases retain their own updater code; the standalone repair launcher described in [recovery](docs/security/recovery.md#windows-updater-pe-resource-failure) supplies this managed installer to an older Windows updater.
299
+
300
+ 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.
301
+
302
+ 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 delegates installation to uv, pinning the current base interpreter and the exact tested package/dependency versions, using the cache populated during preflight with network access disabled. It then launches MetaList again, and reports the installed version (for example, `MetaList updated to v0.5.0.`). This protection requires an installed version containing the backup safeguard and applies to `metalist update` and the in-app update action; direct pip/uv install commands do not run it.
303
+
304
+ 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.
305
+
306
+ ```bash
307
+ python3 -m venv .venv
308
+ source .venv/bin/activate
309
+ python -m pip install --require-hashes -r requirements/ci.txt
310
+ python -m pip install --no-deps --no-build-isolation -e ".[dev]"
311
+
312
+ npm install
313
+ ```
314
+
315
+ On Windows, create the same `.venv` with `python -m venv .venv` and activate it with `.venv\Scripts\Activate.ps1` in PowerShell. Run the same `python -m pip` commands after activation. Node dependencies are developer tooling; the application itself does not require Node.
316
+
317
+ ### Run
318
+
319
+ Persistent data defaults to `~/MetaList`. Set `METALIST_DATA_DIRECTORY` to an absolute directory path before launch to use a separate data root, including namespaces, backups, certificates, logs, and runtime jobs. This is used by release tests to keep their disposable data separate from real notes.
320
+ The installed entrypoint starts or restarts every known namespace, prints their URLs, and exits:
321
+ ```bash
322
+ metalist
323
+ ```
324
+ For source-checkout compatibility, `python main.py` performs the same orchestration. Use `metalist work`, `python main.py --namespace work`, or `python main.py work` when you want one foreground namespace process.
325
+
326
+ Shell execution is disabled by default. To enable `@shell` for every namespace
327
+ started by the top-level orchestrator, use either:
328
+
329
+ ```bash
330
+ metalist --enable-shell
331
+ python main.py --enable-shell
332
+ ```
333
+
334
+ This flag is propagated to every namespace child process. The top-level process
335
+ prints a conspicuous shell-enabled banner before its namespace launch results.
336
+ Use `python main.py work --enable-shell` for one foreground namespace. Shell
337
+ routes remain restricted to loopback clients using a loopback request host,
338
+ even when the rest of MetaList is intentionally exposed to a LAN.
339
+
340
+ `metalist` and explicit single-namespace source runs bind to loopback at `127.0.0.1:8000` by default. This keeps a normal laptop launch off LAN and public interfaces unless remote access is explicitly configured.
341
+ On first startup, MetaList also auto-generates a self-signed TLS pair at `~/MetaList/certs/metalist-cert.pem` and `~/MetaList/certs/metalist-key.pem`, then enables HTTPS on the same bind host at port `8443`. If you already have real PEM files, point `METALIST_TLS_CERT` and `METALIST_TLS_KEY` at them instead. Set `METALIST_AUTO_GENERATE_TLS=0` only if you explicitly want HTTP-only startup.
342
+
343
+ Database selection:
344
+ - No explicit namespace on a single-namespace launch: `~/MetaList/namespaces/default/default.metalist.db`
345
+ - `--namespace work` or `METALIST_NAMESPACE=work`: `~/MetaList/namespaces/work/work.metalist.db`
346
+ - The related files DB is derived automatically, so `namespaces/work/work.metalist.db` uses `namespaces/work/work.metalist.files.db`
347
+ - Remembered launch ports are stored as plaintext metadata inside each namespace's main `*.metalist.db`
348
+ - Launch precedence is: explicit CLI flags > env vars > saved namespace profile; if a namespace has no saved profile, launch it once with explicit ports or configure ports from the UI
349
+ - Backups stay beside the namespace data under `~/MetaList/namespaces/work/backups/` and use one archive per snapshot with filenames like `work-<timestamp>.metalist-backup.tar.gz`
350
+ - The Backup Settings modal targets one user-selected backup folder and can include multiple namespaces in a single run
351
+ - Restoring `work` into `work` is the normal overwrite path; importing a backup under a different namespace name can create a new target namespace with automatically selected conflict-free ports.
352
+
353
+ Useful env flags:
354
+ - `CRASH_SERVER_ON_FAIL=1` (default): fail-fast on validation errors
355
+ - `API_PREFIX=/api2`: override API prefix (client assumes `/api2` by default)
356
+ - `METALIST_NAMESPACE=work`: select `~/MetaList/namespaces/work/work.metalist.db`
357
+ - `METALIST_HOST=127.0.0.1` (default): bind the main app to a specific interface; use a LAN IP or `0.0.0.0` only for intentional remote access
358
+ - `METALIST_ALLOWED_HOSTS=notes.example.com,192.168.1.20`: comma-separated public/LAN hostnames accepted in HTTP `Host` headers; loopback aliases and a specific non-wildcard `METALIST_HOST` are accepted automatically
359
+ - `METALIST_PORT=8000` (default): bind the main app to a different port
360
+ - `METALIST_HTTPS_PORT=8443`: override the HTTPS port when TLS is enabled
361
+ - `METALIST_TLS_CERT=/path/to/fullchain.pem` + `METALIST_TLS_KEY=/path/to/privkey.pem`: override TLS paths
362
+ - `METALIST_AUTO_GENERATE_TLS=0`: disable automatic creation of the default self-signed TLS pair
363
+ - default TLS paths: `~/MetaList/certs/metalist-cert.pem` and `~/MetaList/certs/metalist-key.pem`
364
+ - `METALIST_FORWARDED_ALLOW_IPS=127.0.0.1,::1` (default): trust proxy headers only from those reverse-proxy IPs
365
+ - `--enable-shell`: opt in to local `@shell` execution for this launch; shell routes require a loopback client and loopback request host, and the capability is never persisted in namespace data
366
+
367
+ ### Remote Access / HTTPS
368
+ LAN or VPN access must be enabled explicitly. Prefer binding the machine's specific LAN address, which also adds that address to the accepted-host set:
369
+ ```bash
370
+ METALIST_HOST=192.168.1.20 metalist
371
+ ```
372
+ On a fresh machine, that first launch also creates the default TLS cert pair automatically. Then open either `http://192.168.1.20:8000` or `https://192.168.1.20:8443` from the other machine.
373
+
374
+ Starting with 0.7.1, an explicit `METALIST_HOST` or `METALIST_ALLOWED_HOSTS`
375
+ configuration is saved in `~/MetaList/network-settings.json` (under
376
+ `METALIST_DATA_DIRECTORY` when overridden). Subsequent source launches, plain
377
+ `metalist` launches, and updates reuse it. Environment values override and update
378
+ the corresponding saved settings. This file stores only the bind address and
379
+ allowed hosts; namespace ports remain in their launch profiles, and shell access
380
+ still requires `--enable-shell` on each launch. Invalid settings stop startup
381
+ with an error. Fresh installations continue to bind to localhost by default.
382
+ To switch back to local-only access, run `METALIST_HOST=127.0.0.1 metalist` once.
383
+ Older installed versions do not read this file; keep supplying their LAN settings
384
+ until upgrading to 0.7.1 or later.
385
+
386
+ To keep `@shell` available on the host laptop while allowing another laptop to
387
+ use normal MetaList features, bind both interfaces and explicitly allow the LAN
388
+ address:
389
+
390
+ ```bash
391
+ METALIST_HOST=0.0.0.0 \
392
+ METALIST_ALLOWED_HOSTS=10.0.0.31 \
393
+ metalist --enable-shell
394
+ ```
395
+
396
+ Use `http://127.0.0.1:<namespace-http-port>` on the host laptop when running
397
+ `@shell`. Other devices may use `https://10.0.0.31:<namespace-https-port>`, but
398
+ their shell start/status requests receive `403`.
399
+
400
+ Namespaced launch example:
401
+ ```bash
402
+ metalist --namespace work --port 8001
403
+ ```
404
+ This starts a separate process backed by `~/MetaList/namespaces/work/work.metalist.db` on `http://127.0.0.1:8001`.
405
+ Its backup snapshots live under `~/MetaList/namespaces/work/backups/` with filenames like `work-<timestamp>.metalist-backup.tar.gz`. New backups are versioned `.tar.gz` workspace archives; legacy `.bak` backups remain restorable.
406
+
407
+ After you launch a namespace once with explicit ports, MetaList remembers them in that namespace's main DB, so later you can use the shorthand:
408
+ ```bash
409
+ metalist work
410
+ ```
411
+ and MetaList will reuse the saved HTTP / HTTPS ports for `work`. The same applies to the default namespace: `metalist` will reuse the saved default-namespace profile.
412
+
413
+ Equivalent explicit launch, if you want it:
414
+ ```bash
415
+ METALIST_HOST=0.0.0.0 \
416
+ METALIST_ALLOWED_HOSTS=192.168.1.20 \
417
+ METALIST_PORT=8000 \
418
+ METALIST_HTTPS_PORT=8443 \
419
+ metalist
420
+ ```
421
+ From the other machine, open `https://<laptop-ip>:8443`.
422
+
423
+ If you already have a real certificate and key, use the same dual-listener flow:
424
+ ```bash
425
+ METALIST_HOST=0.0.0.0 \
426
+ METALIST_ALLOWED_HOSTS=192.168.1.20 \
427
+ METALIST_PORT=8000 \
428
+ METALIST_HTTPS_PORT=8443 \
429
+ METALIST_TLS_CERT=/path/to/fullchain.pem \
430
+ METALIST_TLS_KEY=/path/to/privkey.pem \
431
+ metalist
432
+ ```
433
+
434
+ If you want to rotate or regenerate the default self-signed pair manually, the helper script is still available:
435
+ ```bash
436
+ generate-lan-cert.sh
437
+ ```
438
+
439
+ When HTTPS is enabled:
440
+ - remote HTTP requests to `http://<laptop-ip>:8000` are redirected to HTTPS
441
+ - localhost HTTP requests still stay on plain `http://127.0.0.1:8000` so the laptop can keep using the non-TLS port
442
+
443
+ If TLS is terminated by a reverse proxy on the same machine instead, keep MetaList on loopback and let the proxy forward to it:
444
+ ```bash
445
+ METALIST_HOST=127.0.0.1 \
446
+ METALIST_ALLOWED_HOSTS=notes.example.com \
447
+ METALIST_PORT=8000 \
448
+ METALIST_FORWARDED_ALLOW_IPS=127.0.0.1,::1 \
449
+ metalist
450
+ ```
451
+
452
+ The reverse proxy must preserve the browser-facing `Host` header and set
453
+ `X-Forwarded-Proto`. MetaList never trusts `X-Forwarded-Host`; forwarded
454
+ scheme/client metadata is accepted only from `METALIST_FORWARDED_ALLOW_IPS`.
455
+ Do not widen that list beyond the actual proxy addresses.
456
+
457
+ ### Legacy Import
458
+ `convert-from-legacy.py` replaces the SQLite database referenced by `app.config.DATABASE_URL`, clears its files sidecar, and imports notes from a legacy JSON export.
459
+
460
+ This is destructive. It deletes the existing notes DB and related files DB before rebuilding the namespace.
461
+
462
+ Example usage:
463
+ ```bash
464
+ convert-from-legacy.py --input /path/to/legacy-export.json
465
+ ```
466
+
467
+ Target a namespaced database during import:
468
+ ```bash
469
+ convert-from-legacy.py --namespace work --input /path/to/legacy-export.json
470
+ ```
471
+
472
+ If `--namespace`, `--port`, or `--https-port` are omitted, the import script prompts for them and saves the resulting launch profile inside the target namespace DB. That means a one-time import into `work` can immediately seed later shorthand launches like `metalist work`.
473
+
474
+ Namespace startup allows 120 seconds per child, reports progress every five seconds, and stops/reaps a failed child instead of leaving it running after reporting failure. Set `METALIST_STARTUP_TIMEOUT_SECONDS` to a positive number of seconds to allow more time on a heavily loaded machine. A crashed child still fails immediately. This is a startup allowance, not a guarantee that any machine will finish within two minutes.
475
+
476
+ The preflight is a disposable empty namespace; it cannot guarantee startup against every real database or prevent a later disk/process failure. If installation succeeds but real namespace startup fails, the new package remains installed: resolve the reported startup issue and run `metalist` again. No automatic code/database rollback is attempted, and backups remain unchanged.
477
+
478
+ ### Publishing
479
+ For the real user-facing install flow:
480
+ ```bash
481
+ uvx metalist
482
+ # or:
483
+ uv tool install metalist
484
+ metalist
485
+ ```
486
+
487
+ This repo now packages itself under the PyPI distribution name `metalist`. Current releases support Python 3.11 through 3.14.
488
+
489
+ Recommended release path:
490
+ 1. In the existing PyPI project `metalist`, configure GitHub Trusted Publishing for `metalist-app/metalist` and the workflow file `.github/workflows/publish-pypi.yml`.
491
+ 2. Develop and review the candidate on a feature branch with focused checks. Merge it into `main` and push `main` once. This runs the full `Publish to PyPI` validation matrix for that exact commit. GitHub-hosted Windows, macOS, and Linux runners install the built wheel and test application startup outside the source checkout on the supported Python endpoints, 3.11 and 3.14. Every installed-package matrix job also exercises the real `metalist update` path with uv, backups, interpreter preservation, and two-namespace restart against a local release index. The old-version fixture carries the candidate updater so this validates the mechanism being shipped; it does not retroactively fix older installed updaters. You do not need those operating systems locally. Archive verification checks runtime files, including agent Markdown resources, against both the wheel and source distribution.
492
+ 3. Wait for the exact-commit main release matrix to pass, then run `.venv/bin/python scripts/release.py X.Y.Z` to create and push the tag. Any intervening change requires a new main validation run before tagging.
493
+ 4. The tag job independently verifies every main-job conclusion and reuses the wheel and source distribution from that run for GitHub Trusted Publishing; it does not repeat the matrix. Manual dispatch cannot publish. The release driver compares PyPI hashes with the tested artifact and checks a clean public install. Users can then run it with `uvx metalist`, install it persistently with `uv tool install metalist`, or install it with `pip install metalist`.
494
+
495
+ If `--input` is omitted, a file picker opens (when `tkinter` and its native `_tkinter` component are available).
496
+ 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.
497
+
498
+ ### Run Tests
499
+
500
+ Python/unit test examples:
501
+ ```bash
502
+ source .venv/bin/activate
503
+ .venv/bin/pytest
504
+ node --test tests/unit/*.mjs
505
+ .venv/bin/python -c "from pathlib import Path; import main; main._run_startup_sanity_gates(repo_root=Path.cwd())"
506
+ ```
507
+
508
+ Source-checkout development launches can enable the mandatory Python and
509
+ JavaScript sanity gates with an ignored repository-root `.env` file:
510
+
511
+ ```dotenv
512
+ METALIST_ENVIRONMENT=development
513
+ ```
514
+
515
+ `main.py` prints the resolved environment at startup. An explicit process
516
+ environment value takes precedence over `.env`; only `development` and
517
+ `production` are accepted. When the variable and `.env` file are absent,
518
+ MetaList runs in production mode and skips the source sanity gates.
519
+
520
+ `TEST_MODE=1` and `POST /api2/test/reset` still exist for deterministic browser automation if we decide to add a new harness later, but Cypress is not part of the current workflow.
521
+
522
+ ### Diagrams
523
+ Render Mermaid diagrams to PNGs:
524
+ ```bash
525
+ npm run render-diagrams
526
+ ```
527
+
528
+
529
+ ## Maintenance and recovery
530
+
531
+ See the [dependency and release procedure](docs/security/supply-chain.md), [recovery runbook](docs/security/recovery.md), and [current test/implementation map](docs/testing/coverage-map.md). The dated [August code review](CODE_REVIEW.md) is historical.