MetaList 0.26.0__tar.gz → 0.27.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 (1030) hide show
  1. metalist-0.27.0/PKG-INFO +339 -0
  2. metalist-0.27.0/README.md +291 -0
  3. metalist-0.27.0/app/api/byte_ranges.py +52 -0
  4. metalist-0.27.0/app/api/note_requests.py +580 -0
  5. metalist-0.27.0/app/api/routes/ai.py +1293 -0
  6. metalist-0.27.0/app/api/routes/auth.py +1213 -0
  7. metalist-0.27.0/app/api/routes/files.py +397 -0
  8. metalist-0.27.0/app/api/routes/imports.py +359 -0
  9. metalist-0.27.0/app/api/routes/notes.py +1988 -0
  10. metalist-0.27.0/app/api/routes/virtual_folders.py +178 -0
  11. metalist-0.27.0/app/api/streaming_upload.py +218 -0
  12. metalist-0.27.0/app/api/transactions.py +165 -0
  13. metalist-0.27.0/app/api/upload_limits.py +69 -0
  14. metalist-0.27.0/app/db/blob_store.py +394 -0
  15. metalist-0.27.0/app/db/editable_files_migration.py +49 -0
  16. metalist-0.27.0/app/db/file_first_pages_migration.py +45 -0
  17. metalist-0.27.0/app/db/file_schema.py +109 -0
  18. metalist-0.27.0/app/db/file_session.py +157 -0
  19. metalist-0.27.0/app/db/file_texts_migration.py +46 -0
  20. metalist-0.27.0/app/db/file_versions_migration.py +56 -0
  21. metalist-0.27.0/app/db/files_sql.py +647 -0
  22. metalist-0.27.0/app/db/legacy_file_schema.py +111 -0
  23. metalist-0.27.0/app/db/live_recovery.py +283 -0
  24. metalist-0.27.0/app/db/migrations.py +555 -0
  25. metalist-0.27.0/app/db/move_files_to_blobs.py +185 -0
  26. metalist-0.27.0/app/db/notes_sql.py +427 -0
  27. metalist-0.27.0/app/db/schema.py +315 -0
  28. metalist-0.27.0/app/db/session.py +239 -0
  29. metalist-0.27.0/app/db/settings_sql.py +441 -0
  30. metalist-0.27.0/app/db/version.py +3 -0
  31. metalist-0.27.0/app/encryption_audit.py +1406 -0
  32. metalist-0.27.0/app/exception_boundaries.py +205 -0
  33. metalist-0.27.0/app/https_proxy.py +205 -0
  34. metalist-0.27.0/app/main.py +868 -0
  35. metalist-0.27.0/app/security/rendered_html.py +211 -0
  36. metalist-0.27.0/app/security/streaming_blob.py +178 -0
  37. metalist-0.27.0/app/services/agent/agent_loop.py +607 -0
  38. metalist-0.27.0/app/services/agent/agent_tools.py +486 -0
  39. metalist-0.27.0/app/services/agent/anthropic_inference.py +652 -0
  40. metalist-0.27.0/app/services/agent/cloud_privacy.py +570 -0
  41. metalist-0.27.0/app/services/agent/context.py +555 -0
  42. metalist-0.27.0/app/services/agent/investigation.py +402 -0
  43. metalist-0.27.0/app/services/agent/note_aliases.py +80 -0
  44. metalist-0.27.0/app/services/agent/note_tag_suggestions.py +339 -0
  45. metalist-0.27.0/app/services/agent/openai_compatible_inference.py +474 -0
  46. metalist-0.27.0/app/services/agent/openai_inference.py +590 -0
  47. metalist-0.27.0/app/services/agent/provider_limits.py +312 -0
  48. metalist-0.27.0/app/services/agent/retrieval_settings.py +134 -0
  49. metalist-0.27.0/app/services/agent/runtime.py +1739 -0
  50. metalist-0.27.0/app/services/agent/saved_rate_limits.py +184 -0
  51. metalist-0.27.0/app/services/agent/scope.py +648 -0
  52. metalist-0.27.0/app/services/agent/scripted_inference.py +193 -0
  53. metalist-0.27.0/app/services/agent/skills/help-ai.md +188 -0
  54. metalist-0.27.0/app/services/agent/skills/help-data.md +59 -0
  55. metalist-0.27.0/app/services/agent/skills/help-formatting.md +222 -0
  56. metalist-0.27.0/app/services/agent/skills/help-menus.md +146 -0
  57. metalist-0.27.0/app/services/agent/skills/help-meta-tags.md +109 -0
  58. metalist-0.27.0/app/services/agent/skills/help-notes.md +137 -0
  59. metalist-0.27.0/app/services/agent/skills/help-privacy.md +170 -0
  60. metalist-0.27.0/app/services/agent/skills/help-references.md +137 -0
  61. metalist-0.27.0/app/services/agent/skills/help-releases.md +197 -0
  62. metalist-0.27.0/app/services/agent/skills/help-search-suggestions.md +88 -0
  63. metalist-0.27.0/app/services/agent/skills/help-search.md +324 -0
  64. metalist-0.27.0/app/services/agent/skills/help-tag-suggestions.md +78 -0
  65. metalist-0.27.0/app/services/agent/staged_summary.py +304 -0
  66. metalist-0.27.0/app/services/agent/structured_inference.py +699 -0
  67. metalist-0.27.0/app/services/agent/tagging_run.py +514 -0
  68. metalist-0.27.0/app/services/agent/token_estimation.py +119 -0
  69. metalist-0.27.0/app/services/ai_chat_rendering.py +908 -0
  70. metalist-0.27.0/app/services/ai_setup.py +111 -0
  71. metalist-0.27.0/app/services/auth_cache_state.py +62 -0
  72. metalist-0.27.0/app/services/auth_service.py +667 -0
  73. metalist-0.27.0/app/services/background_work.py +96 -0
  74. metalist-0.27.0/app/services/backup_service.py +1354 -0
  75. metalist-0.27.0/app/services/client_state_service.py +726 -0
  76. metalist-0.27.0/app/services/content_cache.py +425 -0
  77. metalist-0.27.0/app/services/content_formatting.py +2591 -0
  78. metalist-0.27.0/app/services/diagnostics.py +887 -0
  79. metalist-0.27.0/app/services/dictation_cleanup.py +584 -0
  80. metalist-0.27.0/app/services/disk_space.py +49 -0
  81. metalist-0.27.0/app/services/edit_previews.py +242 -0
  82. metalist-0.27.0/app/services/email_cards.py +34 -0
  83. metalist-0.27.0/app/services/email_search_text.py +42 -0
  84. metalist-0.27.0/app/services/embedded_references.py +2125 -0
  85. metalist-0.27.0/app/services/file_filter_types.py +20 -0
  86. metalist-0.27.0/app/services/file_kinds.py +63 -0
  87. metalist-0.27.0/app/services/file_registry.py +287 -0
  88. metalist-0.27.0/app/services/file_storage.py +1642 -0
  89. metalist-0.27.0/app/services/file_text_search.py +513 -0
  90. metalist-0.27.0/app/services/html_export.py +809 -0
  91. metalist-0.27.0/app/services/image_compression.py +200 -0
  92. metalist-0.27.0/app/services/import_uploads.py +241 -0
  93. metalist-0.27.0/app/services/native_folder_picker.py +125 -0
  94. metalist-0.27.0/app/services/note_fullscreen.py +201 -0
  95. metalist-0.27.0/app/services/note_gallery.py +210 -0
  96. metalist-0.27.0/app/services/note_store.py +1378 -0
  97. metalist-0.27.0/app/services/obsidian_import/file_groups.py +149 -0
  98. metalist-0.27.0/app/services/obsidian_import/import_folder.py +85 -0
  99. metalist-0.27.0/app/services/obsidian_import/notes.py +503 -0
  100. metalist-0.27.0/app/services/obsidian_import/vault.py +181 -0
  101. metalist-0.27.0/app/services/pdf_first_page_worker.py +67 -0
  102. metalist-0.27.0/app/services/pdf_first_pages.py +171 -0
  103. metalist-0.27.0/app/services/reference_suggestions.py +526 -0
  104. metalist-0.27.0/app/services/root_sorting.py +404 -0
  105. metalist-0.27.0/app/services/runtime_lock.py +82 -0
  106. metalist-0.27.0/app/services/search_embeds.py +40 -0
  107. metalist-0.27.0/app/services/search_index.py +2402 -0
  108. metalist-0.27.0/app/services/search_links.py +205 -0
  109. metalist-0.27.0/app/services/search_query.py +388 -0
  110. metalist-0.27.0/app/services/search_text.py +159 -0
  111. metalist-0.27.0/app/services/self_update.py +284 -0
  112. metalist-0.27.0/app/services/snapshot.py +1644 -0
  113. metalist-0.27.0/app/services/structured_note_renderers.py +508 -0
  114. metalist-0.27.0/app/services/tab_state.py +1073 -0
  115. metalist-0.27.0/app/services/tag_ontology.py +938 -0
  116. metalist-0.27.0/app/services/tag_suggestion_reasons.py +421 -0
  117. metalist-0.27.0/app/services/tag_suggestions.py +1704 -0
  118. metalist-0.27.0/app/services/tag_term_matching.py +539 -0
  119. metalist-0.27.0/app/services/tag_words_in_note.py +79 -0
  120. metalist-0.27.0/app/services/text_terms.py +50 -0
  121. metalist-0.27.0/app/services/update_backups.py +166 -0
  122. metalist-0.27.0/app/services/virtual_folders.py +316 -0
  123. metalist-0.27.0/app/startup_sanity.py +976 -0
  124. metalist-0.27.0/app/static/config/agent-menu-actions.json +505 -0
  125. metalist-0.27.0/app/static/config/command_palette_tags.json +348 -0
  126. metalist-0.27.0/app/static/css/file-viewer.css +210 -0
  127. metalist-0.27.0/app/static/css/floating-notes.css +46 -0
  128. metalist-0.27.0/app/static/css/forms.css +177 -0
  129. metalist-0.27.0/app/static/css/main.css +14148 -0
  130. metalist-0.27.0/app/static/css/reference-preview.css +19 -0
  131. metalist-0.27.0/app/static/css/skins/illuminated.css +770 -0
  132. metalist-0.27.0/app/static/fonts/eagle-lake/EagleLake-Regular.ttf +0 -0
  133. metalist-0.27.0/app/static/fonts/eagle-lake/OFL.txt +93 -0
  134. metalist-0.27.0/app/static/img/skins/illuminated/arrow-00-closed.webp +0 -0
  135. metalist-0.27.0/app/static/img/skins/illuminated/arrow-00-open.webp +0 -0
  136. metalist-0.27.0/app/static/img/skins/illuminated/arrow-01-closed.webp +0 -0
  137. metalist-0.27.0/app/static/img/skins/illuminated/arrow-01-open.webp +0 -0
  138. metalist-0.27.0/app/static/img/skins/illuminated/arrow-02-closed.webp +0 -0
  139. metalist-0.27.0/app/static/img/skins/illuminated/arrow-02-open.webp +0 -0
  140. metalist-0.27.0/app/static/img/skins/illuminated/arrow-03-closed.webp +0 -0
  141. metalist-0.27.0/app/static/img/skins/illuminated/arrow-03-open.webp +0 -0
  142. metalist-0.27.0/app/static/img/skins/illuminated/arrow-04-closed.webp +0 -0
  143. metalist-0.27.0/app/static/img/skins/illuminated/arrow-04-open.webp +0 -0
  144. metalist-0.27.0/app/static/img/skins/illuminated/arrow-05-closed.webp +0 -0
  145. metalist-0.27.0/app/static/img/skins/illuminated/arrow-05-open.webp +0 -0
  146. metalist-0.27.0/app/static/img/skins/illuminated/arrow-06-closed.webp +0 -0
  147. metalist-0.27.0/app/static/img/skins/illuminated/arrow-06-open.webp +0 -0
  148. metalist-0.27.0/app/static/img/skins/illuminated/arrow-07-closed.webp +0 -0
  149. metalist-0.27.0/app/static/img/skins/illuminated/arrow-07-open.webp +0 -0
  150. metalist-0.27.0/app/static/img/skins/illuminated/arrow-08-closed.webp +0 -0
  151. metalist-0.27.0/app/static/img/skins/illuminated/arrow-08-open.webp +0 -0
  152. metalist-0.27.0/app/static/img/skins/illuminated/arrow-09-closed.webp +0 -0
  153. metalist-0.27.0/app/static/img/skins/illuminated/arrow-09-open.webp +0 -0
  154. metalist-0.27.0/app/static/img/skins/illuminated/arrow-10-closed.webp +0 -0
  155. metalist-0.27.0/app/static/img/skins/illuminated/arrow-10-open.webp +0 -0
  156. metalist-0.27.0/app/static/img/skins/illuminated/arrow-11-closed.webp +0 -0
  157. metalist-0.27.0/app/static/img/skins/illuminated/arrow-11-open.webp +0 -0
  158. metalist-0.27.0/app/static/img/skins/illuminated/arrow-12-closed.webp +0 -0
  159. metalist-0.27.0/app/static/img/skins/illuminated/arrow-12-open.webp +0 -0
  160. metalist-0.27.0/app/static/img/skins/illuminated/arrow-13-closed.webp +0 -0
  161. metalist-0.27.0/app/static/img/skins/illuminated/arrow-13-open.webp +0 -0
  162. metalist-0.27.0/app/static/img/skins/illuminated/arrow-14-closed.webp +0 -0
  163. metalist-0.27.0/app/static/img/skins/illuminated/arrow-14-open.webp +0 -0
  164. metalist-0.27.0/app/static/img/skins/illuminated/arrow-15-closed.webp +0 -0
  165. metalist-0.27.0/app/static/img/skins/illuminated/arrow-15-open.webp +0 -0
  166. metalist-0.27.0/app/static/img/skins/illuminated/bezant.webp +0 -0
  167. metalist-0.27.0/app/static/img/skins/illuminated/birds.webp +0 -0
  168. metalist-0.27.0/app/static/img/skins/illuminated/corner-tr.webp +0 -0
  169. metalist-0.27.0/app/static/img/skins/illuminated/corner.webp +0 -0
  170. metalist-0.27.0/app/static/img/skins/illuminated/cross.webp +0 -0
  171. metalist-0.27.0/app/static/img/skins/illuminated/cursor-blank-hand.png +0 -0
  172. metalist-0.27.0/app/static/img/skins/illuminated/cursor-blank-quill.png +0 -0
  173. metalist-0.27.0/app/static/img/skins/illuminated/divider-center.webp +0 -0
  174. metalist-0.27.0/app/static/img/skins/illuminated/divider-left.webp +0 -0
  175. metalist-0.27.0/app/static/img/skins/illuminated/divider-right.webp +0 -0
  176. metalist-0.27.0/app/static/img/skins/illuminated/fold-leaf.svg +5 -0
  177. metalist-0.27.0/app/static/img/skins/illuminated/gold-stroke.webp +0 -0
  178. metalist-0.27.0/app/static/img/skins/illuminated/grapes.webp +0 -0
  179. metalist-0.27.0/app/static/img/skins/illuminated/icon-book.webp +0 -0
  180. metalist-0.27.0/app/static/img/skins/illuminated/icon-contexts.webp +0 -0
  181. metalist-0.27.0/app/static/img/skins/illuminated/initial-box.webp +0 -0
  182. metalist-0.27.0/app/static/img/skins/illuminated/initials.webp +0 -0
  183. metalist-0.27.0/app/static/img/skins/illuminated/lamb.webp +0 -0
  184. metalist-0.27.0/app/static/img/skins/illuminated/lilies.webp +0 -0
  185. metalist-0.27.0/app/static/img/skins/illuminated/ornament-01.webp +0 -0
  186. metalist-0.27.0/app/static/img/skins/illuminated/ornament-02.webp +0 -0
  187. metalist-0.27.0/app/static/img/skins/illuminated/ornament-03.webp +0 -0
  188. metalist-0.27.0/app/static/img/skins/illuminated/ornament-04.webp +0 -0
  189. metalist-0.27.0/app/static/img/skins/illuminated/ornament-05.webp +0 -0
  190. metalist-0.27.0/app/static/img/skins/illuminated/ornament-06.webp +0 -0
  191. metalist-0.27.0/app/static/img/skins/illuminated/ornament-07.webp +0 -0
  192. metalist-0.27.0/app/static/img/skins/illuminated/ornament-08.webp +0 -0
  193. metalist-0.27.0/app/static/img/skins/illuminated/ornament-09.webp +0 -0
  194. metalist-0.27.0/app/static/img/skins/illuminated/ornament-10.webp +0 -0
  195. metalist-0.27.0/app/static/img/skins/illuminated/ornament-11.webp +0 -0
  196. metalist-0.27.0/app/static/img/skins/illuminated/ornament-12.webp +0 -0
  197. metalist-0.27.0/app/static/img/skins/illuminated/panel.webp +0 -0
  198. metalist-0.27.0/app/static/img/skins/illuminated/parchment.webp +0 -0
  199. metalist-0.27.0/app/static/img/skins/illuminated/pointer-hand.png +0 -0
  200. metalist-0.27.0/app/static/img/skins/illuminated/pointer-quill.png +0 -0
  201. metalist-0.27.0/app/static/img/skins/illuminated/scribble.svg +1 -0
  202. metalist-0.27.0/app/static/img/skins/illuminated/search-bar.webp +0 -0
  203. metalist-0.27.0/app/static/img/skins/illuminated/torn-left.webp +0 -0
  204. metalist-0.27.0/app/static/img/skins/illuminated/torn-right.webp +0 -0
  205. metalist-0.27.0/app/static/img/skins/illuminated/vine-right.webp +0 -0
  206. metalist-0.27.0/app/static/img/skins/illuminated/vine.webp +0 -0
  207. metalist-0.27.0/app/static/js/main.js +115 -0
  208. metalist-0.27.0/app/static/js/modules/ai-chat/agent-retrieval-settings.js +88 -0
  209. metalist-0.27.0/app/static/js/modules/ai-chat/bulk-elapsed-clock.js +28 -0
  210. metalist-0.27.0/app/static/js/modules/ai-chat/bulk-proposal-ui.js +267 -0
  211. metalist-0.27.0/app/static/js/modules/ai-chat/bulk-scope-question.js +76 -0
  212. metalist-0.27.0/app/static/js/modules/ai-chat/proposal-menu.js +118 -0
  213. metalist-0.27.0/app/static/js/modules/api-client.js +1992 -0
  214. metalist-0.27.0/app/static/js/modules/auth.js +972 -0
  215. metalist-0.27.0/app/static/js/modules/client-state-migration.js +289 -0
  216. metalist-0.27.0/app/static/js/modules/command-palette/command-palette-controller.js +3143 -0
  217. metalist-0.27.0/app/static/js/modules/command-palette/endpoint-registry.js +760 -0
  218. metalist-0.27.0/app/static/js/modules/config.js +293 -0
  219. metalist-0.27.0/app/static/js/modules/context-menu/context-menu-registry.js +1127 -0
  220. metalist-0.27.0/app/static/js/modules/context-menu/context-menu-service.js +932 -0
  221. metalist-0.27.0/app/static/js/modules/dom-utils.js +249 -0
  222. metalist-0.27.0/app/static/js/modules/excalidraw/excalidraw-actions.js +105 -0
  223. metalist-0.27.0/app/static/js/modules/excalidraw/excalidraw-editor-service.js +447 -0
  224. metalist-0.27.0/app/static/js/modules/excalidraw/excalidraw-scene.js +209 -0
  225. metalist-0.27.0/app/static/js/modules/file-transfer-slots.js +42 -0
  226. metalist-0.27.0/app/static/js/modules/modals/ai-agent-settings-modal.js +602 -0
  227. metalist-0.27.0/app/static/js/modules/modals/base-modal.js +472 -0
  228. metalist-0.27.0/app/static/js/modules/modals/ontology-modal.js +2905 -0
  229. metalist-0.27.0/app/static/js/modules/mode-manager/actions/ui-actions.js +432 -0
  230. metalist-0.27.0/app/static/js/modules/mode-manager/events/context-menu-events.js +1738 -0
  231. metalist-0.27.0/app/static/js/modules/mode-manager/events/keyboard-events.js +4526 -0
  232. metalist-0.27.0/app/static/js/modules/mode-manager/events/mouse-events.js +3134 -0
  233. metalist-0.27.0/app/static/js/modules/mode-manager/services/differential-view-service.js +1302 -0
  234. metalist-0.27.0/app/static/js/modules/mode-manager/services/file-drop-policy-service.js +27 -0
  235. metalist-0.27.0/app/static/js/modules/mode-manager/services/file-filter-kinds.js +43 -0
  236. metalist-0.27.0/app/static/js/modules/mode-manager/services/file-filter-service.js +96 -0
  237. metalist-0.27.0/app/static/js/modules/mode-manager/services/file-image-preview-service.js +220 -0
  238. metalist-0.27.0/app/static/js/modules/mode-manager/services/file-size-pill-service.js +93 -0
  239. metalist-0.27.0/app/static/js/modules/mode-manager/services/folder-search-terms.js +34 -0
  240. metalist-0.27.0/app/static/js/modules/mode-manager/services/gallery-view-service.js +147 -0
  241. metalist-0.27.0/app/static/js/modules/mode-manager/services/image-context-menu-action-service.js +531 -0
  242. metalist-0.27.0/app/static/js/modules/mode-manager/services/polling-service.js +214 -0
  243. metalist-0.27.0/app/static/js/modules/mode-manager/services/reference-suggestions-service.js +563 -0
  244. metalist-0.27.0/app/static/js/modules/mode-manager/services/reference-text.js +34 -0
  245. metalist-0.27.0/app/static/js/modules/mode-manager/services/root-sort-service.js +162 -0
  246. metalist-0.27.0/app/static/js/modules/mode-manager/services/scroll-restoration-service.js +318 -0
  247. metalist-0.27.0/app/static/js/modules/mode-manager/services/search-context-label.js +13 -0
  248. metalist-0.27.0/app/static/js/modules/mode-manager/services/search-embed-service.js +86 -0
  249. metalist-0.27.0/app/static/js/modules/mode-manager/services/search-link-suggestions.js +33 -0
  250. metalist-0.27.0/app/static/js/modules/mode-manager/services/search-syntax-service.js +891 -0
  251. metalist-0.27.0/app/static/js/modules/mode-manager/services/tab-state-service.js +436 -0
  252. metalist-0.27.0/app/static/js/modules/mode-manager/services/tag-syntax-service.js +1164 -0
  253. metalist-0.27.0/app/static/js/modules/mode-manager/services/virtual-folders-service.js +695 -0
  254. metalist-0.27.0/app/static/js/modules/mode-manager/services/virtual-folders-state.js +24 -0
  255. metalist-0.27.0/app/static/js/modules/mode-manager/services/virtual-folders-width.js +159 -0
  256. metalist-0.27.0/app/static/js/modules/note-html-sanitizer.js +314 -0
  257. metalist-0.27.0/app/static/js/modules/phone/phone-mode.js +611 -0
  258. metalist-0.27.0/app/static/js/modules/skin-arrow-cards.js +44 -0
  259. metalist-0.27.0/app/static/js/modules/skin-initials.js +203 -0
  260. metalist-0.27.0/app/static/js/modules/skin-olde-vocabulary.js +76 -0
  261. metalist-0.27.0/app/static/js/modules/skin-olde-words.js +277 -0
  262. metalist-0.27.0/app/static/js/modules/skin-pointer.js +110 -0
  263. metalist-0.27.0/app/static/js/modules/tag-input-offer.js +29 -0
  264. metalist-0.27.0/app/static/js/modules/tag-input-suggestions.js +135 -0
  265. metalist-0.27.0/app/static/js/modules/theme-choices.js +23 -0
  266. metalist-0.27.0/app/static/js/modules/wizard/compressible-images.js +2 -0
  267. metalist-0.27.0/app/static/js/modules/wizard/dropped-import-view.js +18 -0
  268. metalist-0.27.0/app/static/js/modules/wizard/import-finished-message.js +6 -0
  269. metalist-0.27.0/app/static/js/modules/wizard/import-wizard-steps.js +1301 -0
  270. metalist-0.27.0/app/static/js/modules/wizard/wizard-modal.js +374 -0
  271. metalist-0.27.0/app/templates/base.html +24 -0
  272. metalist-0.27.0/app/templates/index.html +385 -0
  273. metalist-0.27.0/app/upload_limits.py +10 -0
  274. metalist-0.27.0/app/usecases/import_bookmarks.py +131 -0
  275. metalist-0.27.0/app/usecases/import_obsidian_vault.py +765 -0
  276. metalist-0.27.0/app/usecases/rename_tag.py +156 -0
  277. metalist-0.27.0/app/usecases/search_comment_autofill.py +160 -0
  278. metalist-0.27.0/app/usecases/search_context_tags.py +217 -0
  279. metalist-0.27.0/app/usecases/virtual_folders.py +139 -0
  280. metalist-0.27.0/app/utils/text_utils.py +252 -0
  281. metalist-0.27.0/app/version.py +3 -0
  282. metalist-0.27.0/main.py +825 -0
  283. metalist-0.27.0/metalist.egg-info/PKG-INFO +339 -0
  284. metalist-0.27.0/metalist.egg-info/SOURCES.txt +849 -0
  285. metalist-0.27.0/pyproject.toml +125 -0
  286. metalist-0.26.0/PKG-INFO +0 -368
  287. metalist-0.26.0/README.md +0 -320
  288. metalist-0.26.0/app/api/note_requests.py +0 -573
  289. metalist-0.26.0/app/api/routes/ai.py +0 -1284
  290. metalist-0.26.0/app/api/routes/auth.py +0 -1199
  291. metalist-0.26.0/app/api/routes/files.py +0 -373
  292. metalist-0.26.0/app/api/routes/imports.py +0 -358
  293. metalist-0.26.0/app/api/routes/legacy_import.py +0 -165
  294. metalist-0.26.0/app/api/routes/notes.py +0 -1992
  295. metalist-0.26.0/app/api/routes/virtual_folders.py +0 -154
  296. metalist-0.26.0/app/api/transactions.py +0 -165
  297. metalist-0.26.0/app/api/upload_limits.py +0 -91
  298. metalist-0.26.0/app/db/editable_files_migration.py +0 -52
  299. metalist-0.26.0/app/db/file_schema.py +0 -109
  300. metalist-0.26.0/app/db/file_session.py +0 -151
  301. metalist-0.26.0/app/db/file_texts_migration.py +0 -49
  302. metalist-0.26.0/app/db/file_versions_migration.py +0 -59
  303. metalist-0.26.0/app/db/files_sql.py +0 -522
  304. metalist-0.26.0/app/db/live_recovery.py +0 -278
  305. metalist-0.26.0/app/db/migrations.py +0 -491
  306. metalist-0.26.0/app/db/notes_sql.py +0 -470
  307. metalist-0.26.0/app/db/schema.py +0 -303
  308. metalist-0.26.0/app/db/session.py +0 -226
  309. metalist-0.26.0/app/db/settings_sql.py +0 -375
  310. metalist-0.26.0/app/db/version.py +0 -3
  311. metalist-0.26.0/app/encryption_audit.py +0 -1260
  312. metalist-0.26.0/app/exception_boundaries.py +0 -209
  313. metalist-0.26.0/app/https_proxy.py +0 -209
  314. metalist-0.26.0/app/main.py +0 -859
  315. metalist-0.26.0/app/security/rendered_html.py +0 -203
  316. metalist-0.26.0/app/services/agent/agent_loop.py +0 -603
  317. metalist-0.26.0/app/services/agent/agent_tools.py +0 -477
  318. metalist-0.26.0/app/services/agent/anthropic_inference.py +0 -628
  319. metalist-0.26.0/app/services/agent/cloud_privacy.py +0 -568
  320. metalist-0.26.0/app/services/agent/context.py +0 -548
  321. metalist-0.26.0/app/services/agent/investigation.py +0 -376
  322. metalist-0.26.0/app/services/agent/note_aliases.py +0 -77
  323. metalist-0.26.0/app/services/agent/note_tag_suggestions.py +0 -351
  324. metalist-0.26.0/app/services/agent/openai_compatible_inference.py +0 -436
  325. metalist-0.26.0/app/services/agent/openai_inference.py +0 -586
  326. metalist-0.26.0/app/services/agent/retrieval_settings.py +0 -130
  327. metalist-0.26.0/app/services/agent/runtime.py +0 -1722
  328. metalist-0.26.0/app/services/agent/scope.py +0 -605
  329. metalist-0.26.0/app/services/agent/skills/help-ai.md +0 -186
  330. metalist-0.26.0/app/services/agent/skills/help-data.md +0 -66
  331. metalist-0.26.0/app/services/agent/skills/help-formatting.md +0 -221
  332. metalist-0.26.0/app/services/agent/skills/help-menus.md +0 -145
  333. metalist-0.26.0/app/services/agent/skills/help-meta-tags.md +0 -107
  334. metalist-0.26.0/app/services/agent/skills/help-notes.md +0 -137
  335. metalist-0.26.0/app/services/agent/skills/help-privacy.md +0 -169
  336. metalist-0.26.0/app/services/agent/skills/help-references.md +0 -133
  337. metalist-0.26.0/app/services/agent/skills/help-releases.md +0 -210
  338. metalist-0.26.0/app/services/agent/skills/help-search-suggestions.md +0 -87
  339. metalist-0.26.0/app/services/agent/skills/help-search.md +0 -320
  340. metalist-0.26.0/app/services/agent/skills/help-tag-suggestions.md +0 -76
  341. metalist-0.26.0/app/services/agent/staged_summary.py +0 -207
  342. metalist-0.26.0/app/services/agent/structured_inference.py +0 -699
  343. metalist-0.26.0/app/services/agent/tagging_run.py +0 -514
  344. metalist-0.26.0/app/services/agent/token_estimation.py +0 -101
  345. metalist-0.26.0/app/services/ai_chat_rendering.py +0 -906
  346. metalist-0.26.0/app/services/ai_setup.py +0 -97
  347. metalist-0.26.0/app/services/auth_cache_state.py +0 -47
  348. metalist-0.26.0/app/services/auth_service.py +0 -666
  349. metalist-0.26.0/app/services/background_work.py +0 -95
  350. metalist-0.26.0/app/services/backup_service.py +0 -1182
  351. metalist-0.26.0/app/services/client_state_service.py +0 -643
  352. metalist-0.26.0/app/services/content_cache.py +0 -425
  353. metalist-0.26.0/app/services/content_formatting.py +0 -2547
  354. metalist-0.26.0/app/services/diagnostics.py +0 -752
  355. metalist-0.26.0/app/services/dictation_cleanup.py +0 -584
  356. metalist-0.26.0/app/services/edit_previews.py +0 -241
  357. metalist-0.26.0/app/services/email_cards.py +0 -31
  358. metalist-0.26.0/app/services/email_search_text.py +0 -39
  359. metalist-0.26.0/app/services/embedded_references.py +0 -1950
  360. metalist-0.26.0/app/services/file_kinds.py +0 -46
  361. metalist-0.26.0/app/services/file_registry.py +0 -251
  362. metalist-0.26.0/app/services/file_storage.py +0 -1343
  363. metalist-0.26.0/app/services/file_text_search.py +0 -502
  364. metalist-0.26.0/app/services/html_export.py +0 -805
  365. metalist-0.26.0/app/services/image_compression.py +0 -194
  366. metalist-0.26.0/app/services/import_uploads.py +0 -99
  367. metalist-0.26.0/app/services/legacy_metalist.py +0 -231
  368. metalist-0.26.0/app/services/legacy_metalist_conversion.py +0 -129
  369. metalist-0.26.0/app/services/native_folder_picker.py +0 -93
  370. metalist-0.26.0/app/services/note_fullscreen.py +0 -199
  371. metalist-0.26.0/app/services/note_store.py +0 -1374
  372. metalist-0.26.0/app/services/obsidian_import/file_groups.py +0 -165
  373. metalist-0.26.0/app/services/obsidian_import/notes.py +0 -497
  374. metalist-0.26.0/app/services/obsidian_import/vault.py +0 -202
  375. metalist-0.26.0/app/services/reference_suggestions.py +0 -526
  376. metalist-0.26.0/app/services/root_sorting.py +0 -341
  377. metalist-0.26.0/app/services/runtime_lock.py +0 -79
  378. metalist-0.26.0/app/services/search_index.py +0 -2338
  379. metalist-0.26.0/app/services/search_query.py +0 -339
  380. metalist-0.26.0/app/services/search_text.py +0 -154
  381. metalist-0.26.0/app/services/self_update.py +0 -272
  382. metalist-0.26.0/app/services/snapshot.py +0 -1534
  383. metalist-0.26.0/app/services/structured_note_renderers.py +0 -504
  384. metalist-0.26.0/app/services/tab_state.py +0 -920
  385. metalist-0.26.0/app/services/tag_ontology.py +0 -940
  386. metalist-0.26.0/app/services/tag_suggestion_reasons.py +0 -422
  387. metalist-0.26.0/app/services/tag_suggestions.py +0 -1586
  388. metalist-0.26.0/app/services/tag_term_matching.py +0 -533
  389. metalist-0.26.0/app/services/text_terms.py +0 -40
  390. metalist-0.26.0/app/services/update_backups.py +0 -165
  391. metalist-0.26.0/app/services/virtual_folders.py +0 -295
  392. metalist-0.26.0/app/startup_sanity.py +0 -973
  393. metalist-0.26.0/app/static/config/agent-menu-actions.json +0 -505
  394. metalist-0.26.0/app/static/config/command_palette_tags.json +0 -348
  395. metalist-0.26.0/app/static/css/file-viewer.css +0 -210
  396. metalist-0.26.0/app/static/css/floating-notes.css +0 -46
  397. metalist-0.26.0/app/static/css/forms.css +0 -177
  398. metalist-0.26.0/app/static/css/main.css +0 -13566
  399. metalist-0.26.0/app/static/css/reference-preview.css +0 -19
  400. metalist-0.26.0/app/static/js/main.js +0 -115
  401. metalist-0.26.0/app/static/js/modules/ai-chat/agent-retrieval-settings.js +0 -110
  402. metalist-0.26.0/app/static/js/modules/ai-chat/bulk-elapsed-clock.js +0 -23
  403. metalist-0.26.0/app/static/js/modules/ai-chat/bulk-proposal-ui.js +0 -286
  404. metalist-0.26.0/app/static/js/modules/ai-chat/bulk-scope-question.js +0 -84
  405. metalist-0.26.0/app/static/js/modules/ai-chat/proposal-menu.js +0 -186
  406. metalist-0.26.0/app/static/js/modules/ai-chat/summary-batch-preview.js +0 -142
  407. metalist-0.26.0/app/static/js/modules/api-client.js +0 -1969
  408. metalist-0.26.0/app/static/js/modules/auth.js +0 -947
  409. metalist-0.26.0/app/static/js/modules/client-state-migration.js +0 -284
  410. metalist-0.26.0/app/static/js/modules/command-palette/command-palette-controller.js +0 -3144
  411. metalist-0.26.0/app/static/js/modules/command-palette/endpoint-registry.js +0 -781
  412. metalist-0.26.0/app/static/js/modules/config.js +0 -295
  413. metalist-0.26.0/app/static/js/modules/context-menu/context-menu-registry.js +0 -1115
  414. metalist-0.26.0/app/static/js/modules/context-menu/context-menu-service.js +0 -939
  415. metalist-0.26.0/app/static/js/modules/dom-utils.js +0 -245
  416. metalist-0.26.0/app/static/js/modules/excalidraw/excalidraw-actions.js +0 -101
  417. metalist-0.26.0/app/static/js/modules/excalidraw/excalidraw-editor-service.js +0 -414
  418. metalist-0.26.0/app/static/js/modules/excalidraw/excalidraw-scene.js +0 -92
  419. metalist-0.26.0/app/static/js/modules/file-transfer-slots.js +0 -61
  420. metalist-0.26.0/app/static/js/modules/modals/ai-agent-settings-modal.js +0 -522
  421. metalist-0.26.0/app/static/js/modules/modals/base-modal.js +0 -470
  422. metalist-0.26.0/app/static/js/modules/modals/legacy-import-modal.js +0 -262
  423. metalist-0.26.0/app/static/js/modules/modals/ontology-modal.js +0 -2900
  424. metalist-0.26.0/app/static/js/modules/mode-manager/actions/ui-actions.js +0 -430
  425. metalist-0.26.0/app/static/js/modules/mode-manager/events/context-menu-events.js +0 -1726
  426. metalist-0.26.0/app/static/js/modules/mode-manager/events/keyboard-events.js +0 -4399
  427. metalist-0.26.0/app/static/js/modules/mode-manager/events/mouse-events.js +0 -2953
  428. metalist-0.26.0/app/static/js/modules/mode-manager/services/differential-view-service.js +0 -1279
  429. metalist-0.26.0/app/static/js/modules/mode-manager/services/file-drop-policy-service.js +0 -33
  430. metalist-0.26.0/app/static/js/modules/mode-manager/services/file-filter-kinds.js +0 -17
  431. metalist-0.26.0/app/static/js/modules/mode-manager/services/file-filter-service.js +0 -87
  432. metalist-0.26.0/app/static/js/modules/mode-manager/services/file-image-preview-service.js +0 -203
  433. metalist-0.26.0/app/static/js/modules/mode-manager/services/image-context-menu-action-service.js +0 -447
  434. metalist-0.26.0/app/static/js/modules/mode-manager/services/polling-service.js +0 -194
  435. metalist-0.26.0/app/static/js/modules/mode-manager/services/reference-suggestions-service.js +0 -515
  436. metalist-0.26.0/app/static/js/modules/mode-manager/services/reference-text.js +0 -20
  437. metalist-0.26.0/app/static/js/modules/mode-manager/services/root-sort-service.js +0 -157
  438. metalist-0.26.0/app/static/js/modules/mode-manager/services/scroll-restoration-service.js +0 -308
  439. metalist-0.26.0/app/static/js/modules/mode-manager/services/search-syntax-service.js +0 -827
  440. metalist-0.26.0/app/static/js/modules/mode-manager/services/tab-state-service.js +0 -393
  441. metalist-0.26.0/app/static/js/modules/mode-manager/services/tag-syntax-service.js +0 -1162
  442. metalist-0.26.0/app/static/js/modules/mode-manager/services/virtual-folders-service.js +0 -655
  443. metalist-0.26.0/app/static/js/modules/mode-manager/services/virtual-folders-state.js +0 -20
  444. metalist-0.26.0/app/static/js/modules/mode-manager/services/virtual-folders-width.js +0 -159
  445. metalist-0.26.0/app/static/js/modules/note-html-sanitizer.js +0 -312
  446. metalist-0.26.0/app/static/js/modules/phone/phone-mode.js +0 -610
  447. metalist-0.26.0/app/static/js/modules/wizard/import-wizard-steps.js +0 -1283
  448. metalist-0.26.0/app/static/js/modules/wizard/wizard-modal.js +0 -374
  449. metalist-0.26.0/app/templates/base.html +0 -23
  450. metalist-0.26.0/app/templates/index.html +0 -395
  451. metalist-0.26.0/app/upload_limits.py +0 -12
  452. metalist-0.26.0/app/usecases/import_bookmarks.py +0 -129
  453. metalist-0.26.0/app/usecases/import_obsidian_vault.py +0 -740
  454. metalist-0.26.0/app/usecases/rename_tag.py +0 -82
  455. metalist-0.26.0/app/usecases/search_comment_autofill.py +0 -159
  456. metalist-0.26.0/app/usecases/search_context_tags.py +0 -196
  457. metalist-0.26.0/app/usecases/virtual_folders.py +0 -134
  458. metalist-0.26.0/app/utils/text_utils.py +0 -228
  459. metalist-0.26.0/app/version.py +0 -3
  460. metalist-0.26.0/convert-from-legacy.py +0 -1167
  461. metalist-0.26.0/main.py +0 -809
  462. metalist-0.26.0/metalist.egg-info/PKG-INFO +0 -368
  463. metalist-0.26.0/metalist.egg-info/SOURCES.txt +0 -743
  464. metalist-0.26.0/pyproject.toml +0 -125
  465. {metalist-0.26.0 → metalist-0.27.0}/MANIFEST.in +0 -0
  466. {metalist-0.26.0 → metalist-0.27.0}/app/__init__.py +0 -0
  467. {metalist-0.26.0 → metalist-0.27.0}/app/api/__init__.py +0 -0
  468. {metalist-0.26.0 → metalist-0.27.0}/app/api/deps.py +0 -0
  469. {metalist-0.26.0 → metalist-0.27.0}/app/api/dev.py +0 -0
  470. {metalist-0.26.0 → metalist-0.27.0}/app/api/middleware/auth.py +0 -0
  471. {metalist-0.26.0 → metalist-0.27.0}/app/api/request_auth.py +0 -0
  472. {metalist-0.26.0 → metalist-0.27.0}/app/api/routes/app_updates.py +0 -0
  473. {metalist-0.26.0 → metalist-0.27.0}/app/api/routes/background_work.py +0 -0
  474. {metalist-0.26.0 → metalist-0.27.0}/app/api/routes/backups.py +0 -0
  475. {metalist-0.26.0 → metalist-0.27.0}/app/api/routes/ontology.py +0 -0
  476. {metalist-0.26.0 → metalist-0.27.0}/app/api/routes/reminders.py +0 -0
  477. {metalist-0.26.0 → metalist-0.27.0}/app/api/routes/remote_images.py +0 -0
  478. {metalist-0.26.0 → metalist-0.27.0}/app/api/routes/test.py +0 -0
  479. {metalist-0.26.0 → metalist-0.27.0}/app/config.py +0 -0
  480. {metalist-0.26.0 → metalist-0.27.0}/app/contracts.py +0 -0
  481. {metalist-0.26.0 → metalist-0.27.0}/app/data_directory.py +0 -0
  482. {metalist-0.26.0 → metalist-0.27.0}/app/db/__init__.py +0 -0
  483. {metalist-0.26.0 → metalist-0.27.0}/app/db/backup_settings_sql.py +0 -0
  484. {metalist-0.26.0 → metalist-0.27.0}/app/db/content_migrations_sql.py +0 -0
  485. {metalist-0.26.0 → metalist-0.27.0}/app/db/engine.py +0 -0
  486. {metalist-0.26.0 → metalist-0.27.0}/app/db/link_icons_sql.py +0 -0
  487. {metalist-0.26.0 → metalist-0.27.0}/app/db/link_titles_sql.py +0 -0
  488. {metalist-0.26.0 → metalist-0.27.0}/app/db/ontology_rules_sql.py +0 -0
  489. {metalist-0.26.0 → metalist-0.27.0}/app/db/raw_connection.py +0 -0
  490. {metalist-0.26.0 → metalist-0.27.0}/app/db/reminders_sql.py +0 -0
  491. {metalist-0.26.0 → metalist-0.27.0}/app/db/retire_sounds.py +0 -0
  492. {metalist-0.26.0 → metalist-0.27.0}/app/db/search_history_sql.py +0 -0
  493. {metalist-0.26.0 → metalist-0.27.0}/app/db/tab_state_sql.py +0 -0
  494. {metalist-0.26.0 → metalist-0.27.0}/app/launch_clock.py +0 -0
  495. {metalist-0.26.0 → metalist-0.27.0}/app/models/database.py +0 -0
  496. {metalist-0.26.0 → metalist-0.27.0}/app/models/utils.py +0 -0
  497. {metalist-0.26.0 → metalist-0.27.0}/app/network_settings.py +0 -0
  498. {metalist-0.26.0 → metalist-0.27.0}/app/presentation/__init__.py +0 -0
  499. {metalist-0.26.0 → metalist-0.27.0}/app/presentation/login_page.py +0 -0
  500. {metalist-0.26.0 → metalist-0.27.0}/app/presentation/render/__init__.py +0 -0
  501. {metalist-0.26.0 → metalist-0.27.0}/app/presentation/render/note_renderer.py +0 -0
  502. {metalist-0.26.0 → metalist-0.27.0}/app/presentation/templates.py +0 -0
  503. {metalist-0.26.0 → metalist-0.27.0}/app/process_memory.py +0 -0
  504. {metalist-0.26.0 → metalist-0.27.0}/app/security/authenticated_logging.py +0 -0
  505. {metalist-0.26.0 → metalist-0.27.0}/app/security/crypto_sizes.py +0 -0
  506. {metalist-0.26.0 → metalist-0.27.0}/app/security/encryption.py +0 -0
  507. {metalist-0.26.0 → metalist-0.27.0}/app/security/http_error_diagnostics.py +0 -0
  508. {metalist-0.26.0 → metalist-0.27.0}/app/security/http_headers.py +0 -0
  509. {metalist-0.26.0 → metalist-0.27.0}/app/security/note_html.py +0 -0
  510. {metalist-0.26.0 → metalist-0.27.0}/app/security/request_boundary.py +0 -0
  511. {metalist-0.26.0 → metalist-0.27.0}/app/security/request_hosts.py +0 -0
  512. {metalist-0.26.0 → metalist-0.27.0}/app/security/sensitive_cache.py +0 -0
  513. {metalist-0.26.0 → metalist-0.27.0}/app/security/sensitive_logging.py +0 -0
  514. {metalist-0.26.0 → metalist-0.27.0}/app/security/shell_execution.py +0 -0
  515. {metalist-0.26.0 → metalist-0.27.0}/app/security/validation_errors.py +0 -0
  516. {metalist-0.26.0 → metalist-0.27.0}/app/server_runtime.py +0 -0
  517. {metalist-0.26.0 → metalist-0.27.0}/app/services/__init__.py +0 -0
  518. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/__init__.py +0 -0
  519. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/action_log.py +0 -0
  520. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/ai_send.py +0 -0
  521. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/chat_compaction.py +0 -0
  522. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/citation_tokens.py +0 -0
  523. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/evidence_serialization.py +0 -0
  524. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/execution_errors.py +0 -0
  525. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/export_title_suggestions.py +0 -0
  526. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/failure_explanations.py +0 -0
  527. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/help_catalog.py +0 -0
  528. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/history.py +0 -0
  529. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/inference.py +0 -0
  530. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/judging.py +0 -0
  531. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/menu_actions.py +0 -0
  532. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/model_policy.py +0 -0
  533. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/openai_cost_tracking.py +0 -0
  534. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/openai_models.py +0 -0
  535. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/privacy_guard.py +0 -0
  536. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/prompt_settings.py +0 -0
  537. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/prompts/__init__.py +0 -0
  538. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/prompts/agent.md +0 -0
  539. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/prompts/conversation-summary.md +0 -0
  540. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/prompts/final-response.md +0 -0
  541. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/prompts/system.md +0 -0
  542. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/release_notes.py +0 -0
  543. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/request_tokens.py +0 -0
  544. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/skill_settings.py +0 -0
  545. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/skills/__init__.py +0 -0
  546. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/skills/help-dictation.md +0 -0
  547. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/skills/help-mouse.md +0 -0
  548. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/skills/help-ontology.md +0 -0
  549. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/skills/help-pasting.md +0 -0
  550. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/skills/help-reminders.md +0 -0
  551. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/skills/help-tags.md +0 -0
  552. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/skills/staged-summary.md +0 -0
  553. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/skills/tag-proposals.md +0 -0
  554. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/skills/web-browsing.md +0 -0
  555. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/strict_structured_outputs.py +0 -0
  556. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/summary_batch_store.py +0 -0
  557. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/tagging.py +0 -0
  558. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/tool_calling.py +0 -0
  559. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/trace.py +0 -0
  560. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/web_actions.py +0 -0
  561. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/web_capabilities.py +0 -0
  562. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/web_evidence.py +0 -0
  563. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/web_fetch.py +0 -0
  564. {metalist-0.26.0 → metalist-0.27.0}/app/services/agent/web_settings.py +0 -0
  565. {metalist-0.26.0 → metalist-0.27.0}/app/services/ai_catalog.py +0 -0
  566. {metalist-0.26.0 → metalist-0.27.0}/app/services/ai_chat.py +0 -0
  567. {metalist-0.26.0 → metalist-0.27.0}/app/services/ai_chat_stream.py +0 -0
  568. {metalist-0.26.0 → metalist-0.27.0}/app/services/ai_credentials.py +0 -0
  569. {metalist-0.26.0 → metalist-0.27.0}/app/services/app_update_worker.py +0 -0
  570. {metalist-0.26.0 → metalist-0.27.0}/app/services/app_updates.py +0 -0
  571. {metalist-0.26.0 → metalist-0.27.0}/app/services/auth.py +0 -0
  572. {metalist-0.26.0 → metalist-0.27.0}/app/services/backlink_index.py +0 -0
  573. {metalist-0.26.0 → metalist-0.27.0}/app/services/backlinks.py +0 -0
  574. {metalist-0.26.0 → metalist-0.27.0}/app/services/backup_settings_service.py +0 -0
  575. {metalist-0.26.0 → metalist-0.27.0}/app/services/bookmark_import.py +0 -0
  576. {metalist-0.26.0 → metalist-0.27.0}/app/services/bulk_operation.py +0 -0
  577. {metalist-0.26.0 → metalist-0.27.0}/app/services/chess_rendering.py +0 -0
  578. {metalist-0.26.0 → metalist-0.27.0}/app/services/code_rendering.py +0 -0
  579. {metalist-0.26.0 → metalist-0.27.0}/app/services/credential_display.py +0 -0
  580. {metalist-0.26.0 → metalist-0.27.0}/app/services/diff_rendering.py +0 -0
  581. {metalist-0.26.0 → metalist-0.27.0}/app/services/document_highlights.py +0 -0
  582. {metalist-0.26.0 → metalist-0.27.0}/app/services/document_text.py +0 -0
  583. {metalist-0.26.0 → metalist-0.27.0}/app/services/editing_image_sizes.py +0 -0
  584. {metalist-0.26.0 → metalist-0.27.0}/app/services/email_files.py +0 -0
  585. {metalist-0.26.0 → metalist-0.27.0}/app/services/encryption.py +0 -0
  586. {metalist-0.26.0 → metalist-0.27.0}/app/services/exception_capture.py +0 -0
  587. {metalist-0.26.0 → metalist-0.27.0}/app/services/file_edit_sessions.py +0 -0
  588. {metalist-0.26.0 → metalist-0.27.0}/app/services/file_text_snippets.py +0 -0
  589. {metalist-0.26.0 → metalist-0.27.0}/app/services/file_text_worker.py +0 -0
  590. {metalist-0.26.0 → metalist-0.27.0}/app/services/file_view.py +0 -0
  591. {metalist-0.26.0 → metalist-0.27.0}/app/services/find_text.py +0 -0
  592. {metalist-0.26.0 → metalist-0.27.0}/app/services/footnote_layout.py +0 -0
  593. {metalist-0.26.0 → metalist-0.27.0}/app/services/footnote_rendering.py +0 -0
  594. {metalist-0.26.0 → metalist-0.27.0}/app/services/hierarchy.py +0 -0
  595. {metalist-0.26.0 → metalist-0.27.0}/app/services/html_unformatting.py +0 -0
  596. {metalist-0.26.0 → metalist-0.27.0}/app/services/hydration_state.py +0 -0
  597. {metalist-0.26.0 → metalist-0.27.0}/app/services/image_size_formatting.py +0 -0
  598. {metalist-0.26.0 → metalist-0.27.0}/app/services/inline_image_dimensions.py +0 -0
  599. {metalist-0.26.0 → metalist-0.27.0}/app/services/inline_image_occurrences.py +0 -0
  600. {metalist-0.26.0 → metalist-0.27.0}/app/services/input_errors.py +0 -0
  601. {metalist-0.26.0 → metalist-0.27.0}/app/services/integrity.py +0 -0
  602. {metalist-0.26.0 → metalist-0.27.0}/app/services/latex_rendering.py +0 -0
  603. {metalist-0.26.0 → metalist-0.27.0}/app/services/link_icons.py +0 -0
  604. {metalist-0.26.0 → metalist-0.27.0}/app/services/link_title_retry.py +0 -0
  605. {metalist-0.26.0 → metalist-0.27.0}/app/services/link_titles.py +0 -0
  606. {metalist-0.26.0 → metalist-0.27.0}/app/services/login_rate_limit.py +0 -0
  607. {metalist-0.26.0 → metalist-0.27.0}/app/services/maintenance_mode.py +0 -0
  608. {metalist-0.26.0 → metalist-0.27.0}/app/services/markdown_rendering.py +0 -0
  609. {metalist-0.26.0 → metalist-0.27.0}/app/services/markdown_tasks.py +0 -0
  610. {metalist-0.26.0 → metalist-0.27.0}/app/services/memory_breakdown.py +0 -0
  611. {metalist-0.26.0 → metalist-0.27.0}/app/services/memory_usage.py +0 -0
  612. {metalist-0.26.0 → metalist-0.27.0}/app/services/mermaid_note_rendering.py +0 -0
  613. {metalist-0.26.0 → metalist-0.27.0}/app/services/meta_tag_renames.py +0 -0
  614. {metalist-0.26.0 → metalist-0.27.0}/app/services/namespace_deletion_jobs.py +0 -0
  615. {metalist-0.26.0 → metalist-0.27.0}/app/services/namespace_deletion_worker.py +0 -0
  616. {metalist-0.26.0 → metalist-0.27.0}/app/services/namespace_rename_jobs.py +0 -0
  617. {metalist-0.26.0 → metalist-0.27.0}/app/services/namespace_rename_worker.py +0 -0
  618. {metalist-0.26.0 → metalist-0.27.0}/app/services/namespace_runtime_guard.py +0 -0
  619. {metalist-0.26.0 → metalist-0.27.0}/app/services/namespace_switcher.py +0 -0
  620. {metalist-0.26.0 → metalist-0.27.0}/app/services/note_datetime.py +0 -0
  621. {metalist-0.26.0 → metalist-0.27.0}/app/services/note_image_tags.py +0 -0
  622. {metalist-0.26.0 → metalist-0.27.0}/app/services/note_ordering.py +0 -0
  623. {metalist-0.26.0 → metalist-0.27.0}/app/services/obsidian_import/__init__.py +0 -0
  624. {metalist-0.26.0 → metalist-0.27.0}/app/services/obsidian_import/blocks.py +0 -0
  625. {metalist-0.26.0 → metalist-0.27.0}/app/services/obsidian_import/content.py +0 -0
  626. {metalist-0.26.0 → metalist-0.27.0}/app/services/obsidian_import/links.py +0 -0
  627. {metalist-0.26.0 → metalist-0.27.0}/app/services/obsidian_import/resolve.py +0 -0
  628. {metalist-0.26.0 → metalist-0.27.0}/app/services/obsidian_import/sources.py +0 -0
  629. {metalist-0.26.0 → metalist-0.27.0}/app/services/obsidian_import/tree.py +0 -0
  630. {metalist-0.26.0 → metalist-0.27.0}/app/services/ontology_rules_store.py +0 -0
  631. {metalist-0.26.0 → metalist-0.27.0}/app/services/password_note_fields.py +0 -0
  632. {metalist-0.26.0 → metalist-0.27.0}/app/services/plain_text.py +0 -0
  633. {metalist-0.26.0 → metalist-0.27.0}/app/services/preference_values.py +0 -0
  634. {metalist-0.26.0 → metalist-0.27.0}/app/services/public_http.py +0 -0
  635. {metalist-0.26.0 → metalist-0.27.0}/app/services/quoted_values.py +0 -0
  636. {metalist-0.26.0 → metalist-0.27.0}/app/services/reference_presentation.py +0 -0
  637. {metalist-0.26.0 → metalist-0.27.0}/app/services/reminders.py +0 -0
  638. {metalist-0.26.0 → metalist-0.27.0}/app/services/remote_image_proxy.py +0 -0
  639. {metalist-0.26.0 → metalist-0.27.0}/app/services/request_recovery.py +0 -0
  640. {metalist-0.26.0 → metalist-0.27.0}/app/services/reset_for_tests.py +0 -0
  641. {metalist-0.26.0 → metalist-0.27.0}/app/services/resource_limits.py +0 -0
  642. {metalist-0.26.0 → metalist-0.27.0}/app/services/root_date_filter.py +0 -0
  643. {metalist-0.26.0 → metalist-0.27.0}/app/services/runtime_generation.py +0 -0
  644. {metalist-0.26.0 → metalist-0.27.0}/app/services/runtime_hardening.py +0 -0
  645. {metalist-0.26.0 → metalist-0.27.0}/app/services/search_history.py +0 -0
  646. {metalist-0.26.0 → metalist-0.27.0}/app/services/search_history_storage.py +0 -0
  647. {metalist-0.26.0 → metalist-0.27.0}/app/services/selected_text_tag.py +0 -0
  648. {metalist-0.26.0 → metalist-0.27.0}/app/services/server_code.py +0 -0
  649. {metalist-0.26.0 → metalist-0.27.0}/app/services/session_timeout_service.py +0 -0
  650. {metalist-0.26.0 → metalist-0.27.0}/app/services/shared_sets.py +0 -0
  651. {metalist-0.26.0 → metalist-0.27.0}/app/services/shell_session_service.py +0 -0
  652. {metalist-0.26.0 → metalist-0.27.0}/app/services/status_icons.py +0 -0
  653. {metalist-0.26.0 → metalist-0.27.0}/app/services/store.py +0 -0
  654. {metalist-0.26.0 → metalist-0.27.0}/app/services/subtree_stats.py +0 -0
  655. {metalist-0.26.0 → metalist-0.27.0}/app/services/sync.py +0 -0
  656. {metalist-0.26.0 → metalist-0.27.0}/app/services/synced_folders.py +0 -0
  657. {metalist-0.26.0 → metalist-0.27.0}/app/services/tag_case.py +0 -0
  658. {metalist-0.26.0 → metalist-0.27.0}/app/services/tag_characters.py +0 -0
  659. {metalist-0.26.0 → metalist-0.27.0}/app/services/tag_details.py +0 -0
  660. {metalist-0.26.0 → metalist-0.27.0}/app/services/tag_plural_variants.py +0 -0
  661. {metalist-0.26.0 → metalist-0.27.0}/app/services/tag_properties.py +0 -0
  662. {metalist-0.26.0 → metalist-0.27.0}/app/services/tag_rename.py +0 -0
  663. {metalist-0.26.0 → metalist-0.27.0}/app/services/tokens.py +0 -0
  664. {metalist-0.26.0 → metalist-0.27.0}/app/services/undo_state.py +0 -0
  665. {metalist-0.26.0 → metalist-0.27.0}/app/services/unused_files.py +0 -0
  666. {metalist-0.26.0 → metalist-0.27.0}/app/services/update_installer.py +0 -0
  667. {metalist-0.26.0 → metalist-0.27.0}/app/services/update_preflight.py +0 -0
  668. {metalist-0.26.0 → metalist-0.27.0}/app/services/view_cache.py +0 -0
  669. {metalist-0.26.0 → metalist-0.27.0}/app/services/view_diff.py +0 -0
  670. {metalist-0.26.0 → metalist-0.27.0}/app/services/view_state.py +0 -0
  671. {metalist-0.26.0 → metalist-0.27.0}/app/services/windows_process_control.py +0 -0
  672. {metalist-0.26.0 → metalist-0.27.0}/app/startup_console.py +0 -0
  673. {metalist-0.26.0 → metalist-0.27.0}/app/startup_environment.py +0 -0
  674. {metalist-0.26.0 → metalist-0.27.0}/app/startup_js_sanity.py +0 -0
  675. {metalist-0.26.0 → metalist-0.27.0}/app/startup_sanity_config.py +0 -0
  676. {metalist-0.26.0 → metalist-0.27.0}/app/startup_shockharness.py +0 -0
  677. {metalist-0.26.0 → metalist-0.27.0}/app/static/config/tag-characters.json +0 -0
  678. {metalist-0.26.0 → metalist-0.27.0}/app/static/img/apple-touch-icon.png +0 -0
  679. {metalist-0.26.0 → metalist-0.27.0}/app/static/img/favicon.ico +0 -0
  680. {metalist-0.26.0 → metalist-0.27.0}/app/static/img/favicon.svg +0 -0
  681. {metalist-0.26.0 → metalist-0.27.0}/app/static/img/icon-192.png +0 -0
  682. {metalist-0.26.0 → metalist-0.27.0}/app/static/img/icon-512.png +0 -0
  683. {metalist-0.26.0 → metalist-0.27.0}/app/static/img/icon-maskable-512.png +0 -0
  684. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/locked.js +0 -0
  685. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/activity-tracker.js +0 -0
  686. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/ai-chat/agent-menu-actions.js +0 -0
  687. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/ai-chat/agent-web-settings.js +0 -0
  688. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/ai-chat/ai-agent-debug-view.js +0 -0
  689. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/ai-chat/ai-chat-api.js +0 -0
  690. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/ai-chat/ai-chat-history-meter.js +0 -0
  691. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/ai-chat/ai-chat-message-placement.js +0 -0
  692. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/ai-chat/ai-chat-panel-controller.js +0 -0
  693. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/ai-chat/ai-chat-panel-service.js +0 -0
  694. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/ai-chat/ai-chat-refused-turns.js +0 -0
  695. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/ai-chat/ai-chat-size-limits.js +0 -0
  696. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/ai-chat/ai-chat-summaries.js +0 -0
  697. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/ai-chat/ai-model-names.js +0 -0
  698. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/ai-chat/ai-providers.js +0 -0
  699. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/ai-chat/ai-thinking-level-service.js +0 -0
  700. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/ai-chat/cloud-privacy-policy.js +0 -0
  701. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/ai-chat/confirmation-card.js +0 -0
  702. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/ai-chat/confirmation-question.js +0 -0
  703. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/api-error-diagnostics.js +0 -0
  704. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/api-failure-classification-service.js +0 -0
  705. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/app-notice-stack.js +0 -0
  706. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/app-update-service.js +0 -0
  707. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/application-state.js +0 -0
  708. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/async-result.js +0 -0
  709. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/backup-reminder-schedule.js +0 -0
  710. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/backup-reminder-service.js +0 -0
  711. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/byte-sizes.js +0 -0
  712. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/client-state-api.js +0 -0
  713. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/command-palette/activation-auth-policy.js +0 -0
  714. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/command-palette/backup-command-availability.js +0 -0
  715. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/command-palette/click-activation-service.js +0 -0
  716. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/command-palette/note-layout-preferences.js +0 -0
  717. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/command-palette/preferences-store.js +0 -0
  718. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/command-palette/tag-config-loader.js +0 -0
  719. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/command-palette/usage-store.js +0 -0
  720. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/context-menu/context-menu-target-service.js +0 -0
  721. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/context-menu/input-caret-service.js +0 -0
  722. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/decimal-integer.js +0 -0
  723. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/disconnect-editing-state-service.js +0 -0
  724. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/dom-focus.js +0 -0
  725. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/editor-commands.js +0 -0
  726. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/editor-selection.js +0 -0
  727. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/editor-toolbar.js +0 -0
  728. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/elapsed-time.js +0 -0
  729. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/error-handler.js +0 -0
  730. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/error-overlay.js +0 -0
  731. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/excalidraw/excalidraw-autosave.js +0 -0
  732. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/excalidraw/excalidraw-editor-state.js +0 -0
  733. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/excalidraw/excalidraw-loader.js +0 -0
  734. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/excalidraw/excalidraw-preview-service.js +0 -0
  735. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/excalidraw/excalidraw-status-shown.js +0 -0
  736. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/expected-errors.js +0 -0
  737. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/floating-messages.js +0 -0
  738. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/half.js +0 -0
  739. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/html-escape.js +0 -0
  740. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/http-status.js +0 -0
  741. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/import-sources.js +0 -0
  742. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/list-selection.js +0 -0
  743. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/local-date-text.js +0 -0
  744. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/location-flags.js +0 -0
  745. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/login-namespace-picker.js +0 -0
  746. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/maintenance.js +0 -0
  747. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/modals/action-row.js +0 -0
  748. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/modals/alphabetize-root-notes-modal.js +0 -0
  749. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/modals/backup-restore-modal.js +0 -0
  750. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/modals/backup-result-modal.js +0 -0
  751. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/modals/backup-settings-modal.js +0 -0
  752. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/modals/confirmation-modal.js +0 -0
  753. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/modals/date-range-modal.js +0 -0
  754. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/modals/delete-folder-modal.js +0 -0
  755. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/modals/delete-namespace-modal.js +0 -0
  756. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/modals/delete-namespace-validation.js +0 -0
  757. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/modals/dictation-settings-modal.js +0 -0
  758. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/modals/error-dialog.js +0 -0
  759. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/modals/export-options-modal.js +0 -0
  760. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/modals/field-message.js +0 -0
  761. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/modals/file-rename-modal.js +0 -0
  762. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/modals/folder-name-modal.js +0 -0
  763. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/modals/help-modal.js +0 -0
  764. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/modals/link-title-retry-modal.js +0 -0
  765. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/modals/memory-usage-modal.js +0 -0
  766. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/modals/namespace-loading-page.js +0 -0
  767. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/modals/namespace-modals.js +0 -0
  768. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/modals/namespace-ports-profile.js +0 -0
  769. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/modals/namespace-rename-validation.js +0 -0
  770. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/modals/note-layout-appearance-modal.js +0 -0
  771. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/modals/password-modal.js +0 -0
  772. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/modals/prioritize-modal.js +0 -0
  773. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/modals/random-password-modal.js +0 -0
  774. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/modals/recent-messages-modal.js +0 -0
  775. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/modals/reminder-modal.js +0 -0
  776. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/modals/reset-updated-at-modal.js +0 -0
  777. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/modals/search-suggestion-statistics-modal.js +0 -0
  778. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/modals/session-timeout-modal.js +0 -0
  779. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/modals/version-info-modal.js +0 -0
  780. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/modals/visual-cues-modal.js +0 -0
  781. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/actions/content-actions.js +0 -0
  782. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/actions/history-actions.js +0 -0
  783. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/actions/note-actions.js +0 -0
  784. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/actions/search-actions.js +0 -0
  785. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/actions/selection-actions.js +0 -0
  786. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/events/focus-events.js +0 -0
  787. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/events/inactivity-events.js +0 -0
  788. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/events/input-events.js +0 -0
  789. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/events/search-events.js +0 -0
  790. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/mode-context.js +0 -0
  791. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/mode-logger.js +0 -0
  792. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/mode-manager-controller.js +0 -0
  793. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/add-style-service.js +0 -0
  794. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/animated-scroll-service.js +0 -0
  795. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/background-work-cards.js +0 -0
  796. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/background-work-text.js +0 -0
  797. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/backlinks-navigation-service.js +0 -0
  798. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/bookmarks-drop-choice-modal-service.js +0 -0
  799. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/clipboard-shortcut-policy-service.js +0 -0
  800. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/collapse-affordance-service.js +0 -0
  801. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/collapse-editing-policy-service.js +0 -0
  802. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/command-gate-service.js +0 -0
  803. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/context-menu-target-service.js +0 -0
  804. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/date-range-filter-service.js +0 -0
  805. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/date-range-kinds.js +0 -0
  806. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/deselect-selection-state-service.js +0 -0
  807. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/dialog-copy-service.js +0 -0
  808. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/dictation-note-paste.js +0 -0
  809. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/dictation-paste-padding.js +0 -0
  810. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/dictation-paste-service.js +0 -0
  811. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/dropped-folders.js +0 -0
  812. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/edit-preview-service.js +0 -0
  813. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/edit-session-collapse-policy-service.js +0 -0
  814. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/edit-session-collapse-service.js +0 -0
  815. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/editing-image-size-service.js +0 -0
  816. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/embedded-image-service.js +0 -0
  817. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/export-service.js +0 -0
  818. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/export-title-service.js +0 -0
  819. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/file-reference-service.js +0 -0
  820. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/file-rename-service.js +0 -0
  821. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/file-viewer-service.js +0 -0
  822. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/filtered-refresh-selection-service.js +0 -0
  823. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/find-in-list-service.js +0 -0
  824. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/floating-card-placement.js +0 -0
  825. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/floating-note-dom.js +0 -0
  826. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/floating-note-layout.js +0 -0
  827. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/floating-note-service.js +0 -0
  828. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/fold-arrow-alignment-service.js +0 -0
  829. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/footnote-navigation-service.js +0 -0
  830. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/formatted-paste-format-service.js +0 -0
  831. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/history-selection-policy-service.js +0 -0
  832. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/history-shortcut-policy-service.js +0 -0
  833. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/html-paste-sanitizer-service.js +0 -0
  834. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/image-file-insert-choice-modal-service.js +0 -0
  835. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/infinite-scroll-service.js +0 -0
  836. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/insert-format-plan.js +0 -0
  837. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/insert-format-service.js +0 -0
  838. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/link-context-menu-action-service.js +0 -0
  839. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/link-target-service.js +0 -0
  840. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/link-title-prefetch-service.js +0 -0
  841. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/media-player-service.js +0 -0
  842. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/mermaid-render-service.js +0 -0
  843. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/note-click-target-service.js +0 -0
  844. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/note-clipboard-write-service.js +0 -0
  845. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/note-collapse-animation-service.js +0 -0
  846. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/note-context-menu-action-service.js +0 -0
  847. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/note-delete-shortcut-policy-service.js +0 -0
  848. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/note-drag-indicator-service.js +0 -0
  849. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/note-drag-service.js +0 -0
  850. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/note-fullscreen-service.js +0 -0
  851. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/note-reposition-animation-service.js +0 -0
  852. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/note-split-service.js +0 -0
  853. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/note-timestamp-hover-service.js +0 -0
  854. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/password-clipboard-service.js +0 -0
  855. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/paste-format-detection-service.js +0 -0
  856. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/paste-format-guess-service.js +0 -0
  857. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/paste-format-offer-service.js +0 -0
  858. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/print-service.js +0 -0
  859. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/reference-caret-preview-service.js +0 -0
  860. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/reference-hover-preview-service.js +0 -0
  861. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/reference-insert-point-service.js +0 -0
  862. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/reference-preview-card-service.js +0 -0
  863. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/reference-source-navigation-service.js +0 -0
  864. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/reference-view-transition-service.js +0 -0
  865. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/referenced-note-removal-service.js +0 -0
  866. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/remote-image-proxy-service.js +0 -0
  867. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/remove-formatting-service.js +0 -0
  868. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/right-press-focus-service.js +0 -0
  869. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/root-date-separator-service.js +0 -0
  870. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/root-note-creation-service.js +0 -0
  871. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/root-sort-indicator-service.js +0 -0
  872. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/scroll-anchor-service.js +0 -0
  873. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/scroll-to-top-service.js +0 -0
  874. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/search-contexts-overlay-service.js +0 -0
  875. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/search-debounce-service.js +0 -0
  876. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/search-highlight-matching.js +0 -0
  877. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/search-highlight-service.js +0 -0
  878. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/search-input-chip-service.js +0 -0
  879. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/search-input-service.js +0 -0
  880. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/search-interaction-service.js +0 -0
  881. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/search-redaction-reveal-service.js +0 -0
  882. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/search-suggestion-statistics-service.js +0 -0
  883. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/search-suggestion-window-labels-service.js +0 -0
  884. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/search-suggestion-windows-service.js +0 -0
  885. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/search-suggestions-service.js +0 -0
  886. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/selected-formatting-removal-service.js +0 -0
  887. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/selected-text-tag-service.js +0 -0
  888. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/shell-output-service.js +0 -0
  889. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/tab-context-actions.js +0 -0
  890. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/tab-dom-cache-service.js +0 -0
  891. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/tab-drag-service.js +0 -0
  892. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/tab-duplication-service.js +0 -0
  893. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/tag-bar-service.js +0 -0
  894. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/tag-input-selection-service.js +0 -0
  895. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/tag-proposal-service.js +0 -0
  896. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/tag-suggestions-service.js +0 -0
  897. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/text-drop-choice-modal-service.js +0 -0
  898. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/todo-toggle-editing-service.js +0 -0
  899. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/type-ahead-service.js +0 -0
  900. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/untagged-view-indicator-service.js +0 -0
  901. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/uuid-double-click-service.js +0 -0
  902. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/value-buttons-service.js +0 -0
  903. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/view-mode-search-shortcut-service.js +0 -0
  904. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/viewport-hold-service.js +0 -0
  905. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/mode-manager/services/viewport-reference.js +0 -0
  906. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/new-vault-setup.js +0 -0
  907. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/not-found.js +0 -0
  908. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/passphrase.js +0 -0
  909. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/password-generator.js +0 -0
  910. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/password-operation-response.js +0 -0
  911. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/password-policy.js +0 -0
  912. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/password-strength.js +0 -0
  913. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/phone/phone-search-terms.js +0 -0
  914. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/quoted-values.js +0 -0
  915. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/reminder-store.js +0 -0
  916. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/reminder-surface-service.js +0 -0
  917. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/restore-session-end.js +0 -0
  918. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/server-rendered-html.js +0 -0
  919. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/session-auth.js +0 -0
  920. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/startup-timing.js +0 -0
  921. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/tag-characters-data.js +0 -0
  922. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/tag-characters.js +0 -0
  923. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/tag-token.js +0 -0
  924. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/tcp-ports.js +0 -0
  925. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/time-units.js +0 -0
  926. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/trim-reminder-schedule.js +0 -0
  927. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/trim-reminder-service.js +0 -0
  928. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/url-tracking-cleaner.js +0 -0
  929. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/uuid.js +0 -0
  930. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/wizard/bookmarks-file.js +0 -0
  931. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/wizard/new-vault-steps.js +0 -0
  932. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/modules/wizard/setup-wizards.js +0 -0
  933. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/namespace-deleted.js +0 -0
  934. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/namespace-renamed.js +0 -0
  935. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/shockharness/contracts.d.ts +0 -0
  936. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/shockharness/contracts.js +0 -0
  937. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/vendor/dompurify-3.4.17.LICENSE.txt +0 -0
  938. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/vendor/dompurify-3.4.17.min.js +0 -0
  939. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/vendor/eff-large-wordlist-2016-07-18.LICENSE.txt +0 -0
  940. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/vendor/eff-large-wordlist-2016-07-18.txt +0 -0
  941. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/vendor/excalidraw-0.18.1-assets/excalidraw.css +0 -0
  942. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Assistant/Assistant-Bold.woff2 +0 -0
  943. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Assistant/Assistant-Medium.woff2 +0 -0
  944. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Assistant/Assistant-Regular.woff2 +0 -0
  945. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Assistant/Assistant-SemiBold.woff2 +0 -0
  946. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Cascadia/CascadiaCode-Regular.woff2 +0 -0
  947. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/ComicShanns/ComicShanns-Regular-279a7b317d12eb88de06167bd672b4b4.woff2 +0 -0
  948. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/ComicShanns/ComicShanns-Regular-6e066e8de2ac57ea9283adb9c24d7f0c.woff2 +0 -0
  949. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/ComicShanns/ComicShanns-Regular-dc6a8806fa96795d7b3be5026f989a17.woff2 +0 -0
  950. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/ComicShanns/ComicShanns-Regular-fcb0fc02dcbee4c9846b3e2508668039.woff2 +0 -0
  951. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-349fac6ca4700ffec595a7150a0d1e1d.woff2 +0 -0
  952. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-3f2c5db56cc93c5a6873b1361d730c16.woff2 +0 -0
  953. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-41b173a47b57366892116a575a43e2b6.woff2 +0 -0
  954. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-623ccf21b21ef6b3a0d87738f77eb071.woff2 +0 -0
  955. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2 +0 -0
  956. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-b9dcf9d2e50a1eaf42fc664b50a3fd0d.woff2 +0 -0
  957. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-be310b9bcd4f1a43f571c46df7809174.woff2 +0 -0
  958. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYE98RXi4EwSsbg.woff2 +0 -0
  959. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYEF8RXi4EwQ.woff2 +0 -0
  960. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTA3j6zbXWjgevT5.woff2 +0 -0
  961. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTQ3j6zbXWjgeg.woff2 +0 -0
  962. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTk3j6zbXWjgevT5.woff2 +0 -0
  963. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTo3j6zbXWjgevT5.woff2 +0 -0
  964. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTs3j6zbXWjgevT5.woff2 +0 -0
  965. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Virgil/Virgil-Regular.woff2 +0 -0
  966. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/vendor/excalidraw-0.18.1.LICENSE.txt +0 -0
  967. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/vendor/excalidraw-0.18.1.min.js +0 -0
  968. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/vendor/mermaid-11.16.1.LICENSE.txt +0 -0
  969. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/vendor/mermaid-11.16.1.min.js +0 -0
  970. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/vendor/zxcvbn-4.4.2.LICENSE.txt +0 -0
  971. {metalist-0.26.0 → metalist-0.27.0}/app/static/js/vendor/zxcvbn-4.4.2.js +0 -0
  972. {metalist-0.26.0 → metalist-0.27.0}/app/static/manifest.json +0 -0
  973. {metalist-0.26.0 → metalist-0.27.0}/app/static/note-html-policy.json +0 -0
  974. {metalist-0.26.0 → metalist-0.27.0}/app/templates/_logo_mark.html +0 -0
  975. {metalist-0.26.0 → metalist-0.27.0}/app/templates/locked.html +0 -0
  976. {metalist-0.26.0 → metalist-0.27.0}/app/templates/maintenance.html +0 -0
  977. {metalist-0.26.0 → metalist-0.27.0}/app/templates/namespace_deleted.html +0 -0
  978. {metalist-0.26.0 → metalist-0.27.0}/app/templates/namespace_renamed.html +0 -0
  979. {metalist-0.26.0 → metalist-0.27.0}/app/templates/notes_list.html +0 -0
  980. {metalist-0.26.0 → metalist-0.27.0}/app/usecases/__init__.py +0 -0
  981. {metalist-0.26.0 → metalist-0.27.0}/app/usecases/add_selected_text_tag.py +0 -0
  982. {metalist-0.26.0 → metalist-0.27.0}/app/usecases/alphabetize_root_notes.py +0 -0
  983. {metalist-0.26.0 → metalist-0.27.0}/app/usecases/base.py +0 -0
  984. {metalist-0.26.0 → metalist-0.27.0}/app/usecases/bulk_tag_proposals.py +0 -0
  985. {metalist-0.26.0 → metalist-0.27.0}/app/usecases/collapse.py +0 -0
  986. {metalist-0.26.0 → metalist-0.27.0}/app/usecases/copy_note.py +0 -0
  987. {metalist-0.26.0 → metalist-0.27.0}/app/usecases/create_child.py +0 -0
  988. {metalist-0.26.0 → metalist-0.27.0}/app/usecases/create_note.py +0 -0
  989. {metalist-0.26.0 → metalist-0.27.0}/app/usecases/create_sibling.py +0 -0
  990. {metalist-0.26.0 → metalist-0.27.0}/app/usecases/delete_notes_in_view.py +0 -0
  991. {metalist-0.26.0 → metalist-0.27.0}/app/usecases/delete_subtree.py +0 -0
  992. {metalist-0.26.0 → metalist-0.27.0}/app/usecases/delete_tag.py +0 -0
  993. {metalist-0.26.0 → metalist-0.27.0}/app/usecases/expand.py +0 -0
  994. {metalist-0.26.0 → metalist-0.27.0}/app/usecases/file_edit_session.py +0 -0
  995. {metalist-0.26.0 → metalist-0.27.0}/app/usecases/indent.py +0 -0
  996. {metalist-0.26.0 → metalist-0.27.0}/app/usecases/move.py +0 -0
  997. {metalist-0.26.0 → metalist-0.27.0}/app/usecases/move_to_top.py +0 -0
  998. {metalist-0.26.0 → metalist-0.27.0}/app/usecases/outdent.py +0 -0
  999. {metalist-0.26.0 → metalist-0.27.0}/app/usecases/paste_child.py +0 -0
  1000. {metalist-0.26.0 → metalist-0.27.0}/app/usecases/paste_sibling.py +0 -0
  1001. {metalist-0.26.0 → metalist-0.27.0}/app/usecases/prefetch_link_titles.py +0 -0
  1002. {metalist-0.26.0 → metalist-0.27.0}/app/usecases/prioritize.py +0 -0
  1003. {metalist-0.26.0 → metalist-0.27.0}/app/usecases/redo.py +0 -0
  1004. {metalist-0.26.0 → metalist-0.27.0}/app/usecases/reset_updated_at.py +0 -0
  1005. {metalist-0.26.0 → metalist-0.27.0}/app/usecases/resize_image.py +0 -0
  1006. {metalist-0.26.0 → metalist-0.27.0}/app/usecases/run_shell.py +0 -0
  1007. {metalist-0.26.0 → metalist-0.27.0}/app/usecases/set_collapse_bulk.py +0 -0
  1008. {metalist-0.26.0 → metalist-0.27.0}/app/usecases/set_collapse_in_context.py +0 -0
  1009. {metalist-0.26.0 → metalist-0.27.0}/app/usecases/split_note.py +0 -0
  1010. {metalist-0.26.0 → metalist-0.27.0}/app/usecases/tag_proposals.py +0 -0
  1011. {metalist-0.26.0 → metalist-0.27.0}/app/usecases/toggle_markdown_task.py +0 -0
  1012. {metalist-0.26.0 → metalist-0.27.0}/app/usecases/toggle_todo_done.py +0 -0
  1013. {metalist-0.26.0 → metalist-0.27.0}/app/usecases/undo.py +0 -0
  1014. {metalist-0.26.0 → metalist-0.27.0}/app/usecases/unformat_content.py +0 -0
  1015. {metalist-0.26.0 → metalist-0.27.0}/app/usecases/update_content.py +0 -0
  1016. {metalist-0.26.0 → metalist-0.27.0}/app/utils/__init__.py +0 -0
  1017. {metalist-0.26.0 → metalist-0.27.0}/app/utils/byte_sizes.py +0 -0
  1018. {metalist-0.26.0 → metalist-0.27.0}/app/utils/encryption.py +0 -0
  1019. {metalist-0.26.0 → metalist-0.27.0}/app/utils/file_names.py +0 -0
  1020. {metalist-0.26.0 → metalist-0.27.0}/app/utils/not_found.py +0 -0
  1021. {metalist-0.26.0 → metalist-0.27.0}/app/utils/sampling.py +0 -0
  1022. {metalist-0.26.0 → metalist-0.27.0}/app/utils/sent_fields.py +0 -0
  1023. {metalist-0.26.0 → metalist-0.27.0}/app/utils/tcp_ports.py +0 -0
  1024. {metalist-0.26.0 → metalist-0.27.0}/app/utils/time_units.py +0 -0
  1025. {metalist-0.26.0 → metalist-0.27.0}/metalist.egg-info/dependency_links.txt +0 -0
  1026. {metalist-0.26.0 → metalist-0.27.0}/metalist.egg-info/entry_points.txt +0 -0
  1027. {metalist-0.26.0 → metalist-0.27.0}/metalist.egg-info/requires.txt +0 -0
  1028. {metalist-0.26.0 → metalist-0.27.0}/metalist.egg-info/top_level.txt +0 -0
  1029. {metalist-0.26.0 → metalist-0.27.0}/scripts/generate-lan-cert.sh +0 -0
  1030. {metalist-0.26.0 → metalist-0.27.0}/setup.cfg +0 -0
@@ -0,0 +1,339 @@
1
+ Metadata-Version: 2.4
2
+ Name: metalist
3
+ Version: 0.27.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
+ Project-URL: Changelog, https://github.com/metalist-app/metalist/blob/main/CHANGELOG.md
9
+ Requires-Python: <3.15,>=3.11
10
+ Description-Content-Type: text/markdown
11
+ Requires-Dist: anthropic==1.12.1
12
+ Requires-Dist: argon2-cffi==25.1.0
13
+ Requires-Dist: cryptography==50.0.0
14
+ Requires-Dist: fastapi==0.141.1
15
+ Requires-Dist: httpcore==1.0.9
16
+ Requires-Dist: httpx==0.28.1
17
+ Requires-Dist: instructor==1.15.4
18
+ Requires-Dist: latex2mathml==3.81.0
19
+ Requires-Dist: loguru==0.7.3
20
+ Requires-Dist: Mako==1.4.2
21
+ Requires-Dist: mammoth==1.13.0
22
+ Requires-Dist: nh3==0.3.6
23
+ Requires-Dist: olefile==0.47
24
+ Requires-Dist: openai==2.54.0
25
+ Requires-Dist: pillow==13.0.0
26
+ Requires-Dist: pydantic==2.13.4
27
+ Requires-Dist: pygments==2.20.0
28
+ Requires-Dist: pypdf==6.21.4
29
+ Requires-Dist: pypdfium2==5.14.0
30
+ Requires-Dist: python-dotenv==1.2.2
31
+ Requires-Dist: python-multipart==0.0.32
32
+ Requires-Dist: PyYAML==6.0.3
33
+ Requires-Dist: resvg_py==0.5.0
34
+ Requires-Dist: rich==14.3.4
35
+ Requires-Dist: starlette==1.3.1
36
+ Requires-Dist: tqdm==4.70.0
37
+ Requires-Dist: tree-sitter==0.25.2
38
+ Requires-Dist: tree-sitter-javascript==0.25.0
39
+ Requires-Dist: typing_extensions==4.16.0
40
+ Requires-Dist: uvicorn==0.52.0
41
+ Requires-Dist: zxcvbn==4.5.0
42
+ Provides-Extra: dev
43
+ Requires-Dist: hypothesis==6.164.0; extra == "dev"
44
+ Requires-Dist: pytest==9.1.1; extra == "dev"
45
+ Requires-Dist: pytest-cov==7.1.0; extra == "dev"
46
+ Requires-Dist: shockharness==0.26.0; extra == "dev"
47
+ Requires-Dist: mypy==2.4.0; extra == "dev"
48
+
49
+ # MetaList
50
+
51
+ A minimalist single-user note-taking app focused on server-side rendering (SSR), fast in-memory tree operations, and efficient sync/diff updates.
52
+
53
+ ## Features
54
+ - Rich text editing (ContentEditable) with image support
55
+ - Drag-and-drop note reordering
56
+ - Real-time content saving
57
+ - Keyboard shortcuts / cheatsheet (press `?` in the app)
58
+ - Linked-list ordering model for efficient reorders
59
+ - Optional password protection + encryption at rest (AES-GCM)
60
+ - Multi-tab search contexts with server-persisted scroll/search state (survives browser restarts)
61
+ - Manual namespace backups/restores to a user-selected backup folder with retention controls
62
+
63
+ ## Changes
64
+
65
+ What changed in each release: [CHANGELOG.md](https://github.com/metalist-app/metalist/blob/main/CHANGELOG.md).
66
+
67
+ ## Technology Stack
68
+
69
+ ### Backend
70
+ - FastAPI
71
+ - SQLite (via stdlib `sqlite3`) with a guard-aware wrapper (`SafeSession`)
72
+ - Mako templates for SSR
73
+
74
+ ### Frontend
75
+ - Vanilla JavaScript (no framework)
76
+ - HTML5 Drag and Drop API
77
+ - ContentEditable for rich text editing
78
+ - CSS custom properties for theming
79
+
80
+ ### Testing
81
+ - Python/unit tests plus manual regression passes
82
+
83
+ ## Architecture (High Level)
84
+ - Server renders the base page via Mako templates.
85
+ - The browser client drives interaction via `/api2` JSON endpoints.
86
+ - 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.
87
+
88
+ ## Security Boundary
89
+
90
+ Password protection encrypts namespace data at rest. While a namespace is
91
+ unlocked, the server must hold its data-encryption key and decrypted working
92
+ data in process memory, and the browser holds the decrypted content currently
93
+ rendered in the page. A sufficiently privileged local process, debugger,
94
+ administrator, browser extension, or process-memory dump can therefore expose
95
+ an unlocked namespace.
96
+
97
+ Explicit logout removes the live key and purges decrypted runtime stores, but
98
+ it cannot guarantee forensic overwriting of memory previously allocated by the
99
+ Python or browser runtimes. Protect the host account and operating system, and
100
+ see the detailed [security architecture and threat model](docs/security/README.md).
101
+
102
+ ## Development
103
+
104
+ ### Setup
105
+ For a published one-off run with uv:
106
+ ```bash
107
+ uvx metalist
108
+ ```
109
+
110
+ For a persistent uv tool install:
111
+ ```bash
112
+ uv tool install metalist
113
+ metalist
114
+ ```
115
+
116
+ 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.
117
+
118
+ 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.
119
+
120
+ You can also update and restart MetaList with one cross-platform command:
121
+ ```bash
122
+ metalist update
123
+ ```
124
+ 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.
125
+
126
+ 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.
127
+
128
+ Backups are saved to `~/MetaList/namespaces/<namespace>/backups/<namespace>-<timestamp>.metalist-backup.tar.gz`; the updater prints each verified path. Existing backups remain unchanged. Each vault keeps its newest 3 of these safety backups: once the updated MetaList has restarted, older ones are removed. If any backup fails, the update aborts with the current installation intact; run `metalist` to restart the stopped servers after resolving the failure.
129
+
130
+ 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.
131
+
132
+ 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.
133
+
134
+ ```bash
135
+ python3 -m venv .venv
136
+ source .venv/bin/activate
137
+ python -m pip install --require-hashes -r requirements/ci.txt
138
+ python -m pip install --no-deps --no-build-isolation -e ".[dev]"
139
+
140
+ npm install
141
+ ```
142
+
143
+ 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.
144
+
145
+ ### Run
146
+
147
+ 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.
148
+ The installed entrypoint starts or restarts every known namespace, prints their URLs, and exits:
149
+ ```bash
150
+ metalist
151
+ ```
152
+ 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.
153
+
154
+ Shell execution is disabled by default. To enable `@shell` for every namespace
155
+ started by the top-level orchestrator, use either:
156
+
157
+ ```bash
158
+ metalist --enable-shell
159
+ python main.py --enable-shell
160
+ ```
161
+
162
+ This flag is propagated to every namespace child process. The top-level process
163
+ prints a conspicuous shell-enabled banner before its namespace launch results.
164
+ Use `python main.py work --enable-shell` for one foreground namespace. Shell
165
+ routes remain restricted to loopback clients using a loopback request host,
166
+ even when the rest of MetaList is intentionally exposed to a LAN.
167
+
168
+ `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.
169
+ 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.
170
+
171
+ Database selection:
172
+ - No explicit namespace on a single-namespace launch: `~/MetaList/namespaces/default/default.metalist.db`
173
+ - `--namespace work` or `METALIST_NAMESPACE=work`: `~/MetaList/namespaces/work/work.metalist.db`
174
+ - Files sit beside the notes database: `namespaces/work/files/catalog.db` names them and `namespaces/work/files/blobs/` holds one file per stored item
175
+ - Remembered launch ports are stored as plaintext metadata inside each namespace's main `*.metalist.db`
176
+ - 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
177
+ - 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`
178
+ - The Backup Settings modal targets one user-selected backup folder and can include multiple namespaces in a single run
179
+ - 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.
180
+
181
+ Useful env flags:
182
+ - `CRASH_SERVER_ON_FAIL=1` (default): fail-fast on validation errors
183
+ - `API_PREFIX=/api2`: override API prefix (client assumes `/api2` by default)
184
+ - `METALIST_NAMESPACE=work`: select `~/MetaList/namespaces/work/work.metalist.db`
185
+ - `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
186
+ - `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
187
+ - `METALIST_PORT=8000` (default): bind the main app to a different port
188
+ - `METALIST_HTTPS_PORT=8443`: override the HTTPS port when TLS is enabled
189
+ - `METALIST_TLS_CERT=/path/to/fullchain.pem` + `METALIST_TLS_KEY=/path/to/privkey.pem`: override TLS paths
190
+ - `METALIST_AUTO_GENERATE_TLS=0`: disable automatic creation of the default self-signed TLS pair
191
+ - default TLS paths: `~/MetaList/certs/metalist-cert.pem` and `~/MetaList/certs/metalist-key.pem`
192
+ - `METALIST_FORWARDED_ALLOW_IPS=127.0.0.1,::1` (default): trust proxy headers only from those reverse-proxy IPs
193
+ - `--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
194
+
195
+ ### Remote Access / HTTPS
196
+ 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:
197
+ ```bash
198
+ METALIST_HOST=192.168.1.20 metalist
199
+ ```
200
+ 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.
201
+
202
+ Starting with 0.7.1, an explicit `METALIST_HOST` or `METALIST_ALLOWED_HOSTS`
203
+ configuration is saved in `~/MetaList/network-settings.json` (under
204
+ `METALIST_DATA_DIRECTORY` when overridden). Subsequent source launches, plain
205
+ `metalist` launches, and updates reuse it. Environment values override and update
206
+ the corresponding saved settings. This file stores only the bind address and
207
+ allowed hosts; namespace ports remain in their launch profiles, and shell access
208
+ still requires `--enable-shell` on each launch. Invalid settings stop startup
209
+ with an error. Fresh installations continue to bind to localhost by default.
210
+ To switch back to local-only access, run `METALIST_HOST=127.0.0.1 metalist` once.
211
+ Older installed versions do not read this file; keep supplying their LAN settings
212
+ until upgrading to 0.7.1 or later.
213
+
214
+ To keep `@shell` available on the host laptop while allowing another laptop to
215
+ use normal MetaList features, bind both interfaces and explicitly allow the LAN
216
+ address:
217
+
218
+ ```bash
219
+ METALIST_HOST=0.0.0.0 \
220
+ METALIST_ALLOWED_HOSTS=10.0.0.31 \
221
+ metalist --enable-shell
222
+ ```
223
+
224
+ Use `http://127.0.0.1:<namespace-http-port>` on the host laptop when running
225
+ `@shell`. Other devices may use `https://10.0.0.31:<namespace-https-port>`, but
226
+ their shell start/status requests receive `403`.
227
+
228
+ Namespaced launch example:
229
+ ```bash
230
+ metalist --namespace work --port 8001
231
+ ```
232
+ This starts a separate process backed by `~/MetaList/namespaces/work/work.metalist.db` on `http://127.0.0.1:8001`.
233
+ 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.
234
+
235
+ 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:
236
+ ```bash
237
+ metalist work
238
+ ```
239
+ 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.
240
+
241
+ Equivalent explicit launch, if you want it:
242
+ ```bash
243
+ METALIST_HOST=0.0.0.0 \
244
+ METALIST_ALLOWED_HOSTS=192.168.1.20 \
245
+ METALIST_PORT=8000 \
246
+ METALIST_HTTPS_PORT=8443 \
247
+ metalist
248
+ ```
249
+ From the other machine, open `https://<laptop-ip>:8443`.
250
+
251
+ If you already have a real certificate and key, use the same dual-listener flow:
252
+ ```bash
253
+ METALIST_HOST=0.0.0.0 \
254
+ METALIST_ALLOWED_HOSTS=192.168.1.20 \
255
+ METALIST_PORT=8000 \
256
+ METALIST_HTTPS_PORT=8443 \
257
+ METALIST_TLS_CERT=/path/to/fullchain.pem \
258
+ METALIST_TLS_KEY=/path/to/privkey.pem \
259
+ metalist
260
+ ```
261
+
262
+ If you want to rotate or regenerate the default self-signed pair manually, the helper script is still available:
263
+ ```bash
264
+ generate-lan-cert.sh
265
+ ```
266
+
267
+ When HTTPS is enabled:
268
+ - remote HTTP requests to `http://<laptop-ip>:8000` are redirected to HTTPS
269
+ - localhost HTTP requests still stay on plain `http://127.0.0.1:8000` so the laptop can keep using the non-TLS port
270
+
271
+ If TLS is terminated by a reverse proxy on the same machine instead, keep MetaList on loopback and let the proxy forward to it:
272
+ ```bash
273
+ METALIST_HOST=127.0.0.1 \
274
+ METALIST_ALLOWED_HOSTS=notes.example.com \
275
+ METALIST_PORT=8000 \
276
+ METALIST_FORWARDED_ALLOW_IPS=127.0.0.1,::1 \
277
+ metalist
278
+ ```
279
+
280
+ The reverse proxy must preserve the browser-facing `Host` header and set
281
+ `X-Forwarded-Proto`. MetaList never trusts `X-Forwarded-Host`; forwarded
282
+ scheme/client metadata is accepted only from `METALIST_FORWARDED_ALLOW_IPS`.
283
+ Do not widen that list beyond the actual proxy addresses.
284
+
285
+ 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.
286
+
287
+ 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.
288
+
289
+ ### Publishing
290
+ For the real user-facing install flow:
291
+ ```bash
292
+ uvx metalist
293
+ # or:
294
+ uv tool install metalist
295
+ metalist
296
+ ```
297
+
298
+ This repo now packages itself under the PyPI distribution name `metalist`. Current releases support Python 3.11 through 3.14.
299
+
300
+ Recommended release path:
301
+ 1. In the existing PyPI project `metalist`, configure GitHub Trusted Publishing for `metalist-app/metalist` and the workflow file `.github/workflows/publish-pypi.yml`.
302
+ 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.
303
+ 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.
304
+ 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`.
305
+
306
+ ### Run Tests
307
+
308
+ Python/unit test examples:
309
+ ```bash
310
+ source .venv/bin/activate
311
+ .venv/bin/pytest
312
+ node --test tests/unit/*.mjs
313
+ .venv/bin/python -c "from pathlib import Path; import main; main._run_startup_sanity_gates(repo_root=Path.cwd())"
314
+ ```
315
+
316
+ Source-checkout development launches can enable the mandatory Python and
317
+ JavaScript sanity gates with an ignored repository-root `.env` file:
318
+
319
+ ```dotenv
320
+ METALIST_ENVIRONMENT=development
321
+ ```
322
+
323
+ `main.py` prints the resolved environment at startup. An explicit process
324
+ environment value takes precedence over `.env`; only `development` and
325
+ `production` are accepted. When the variable and `.env` file are absent,
326
+ MetaList runs in production mode and skips the source sanity gates.
327
+
328
+ `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.
329
+
330
+ ### Diagrams
331
+ Render Mermaid diagrams to PNGs:
332
+ ```bash
333
+ npm run render-diagrams
334
+ ```
335
+
336
+
337
+ ## Maintenance and recovery
338
+
339
+ 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.
@@ -0,0 +1,291 @@
1
+ # MetaList
2
+
3
+ A minimalist single-user note-taking app focused on server-side rendering (SSR), fast in-memory tree operations, and efficient sync/diff updates.
4
+
5
+ ## Features
6
+ - Rich text editing (ContentEditable) with image support
7
+ - Drag-and-drop note reordering
8
+ - Real-time content saving
9
+ - Keyboard shortcuts / cheatsheet (press `?` in the app)
10
+ - Linked-list ordering model for efficient reorders
11
+ - Optional password protection + encryption at rest (AES-GCM)
12
+ - Multi-tab search contexts with server-persisted scroll/search state (survives browser restarts)
13
+ - Manual namespace backups/restores to a user-selected backup folder with retention controls
14
+
15
+ ## Changes
16
+
17
+ What changed in each release: [CHANGELOG.md](https://github.com/metalist-app/metalist/blob/main/CHANGELOG.md).
18
+
19
+ ## Technology Stack
20
+
21
+ ### Backend
22
+ - FastAPI
23
+ - SQLite (via stdlib `sqlite3`) with a guard-aware wrapper (`SafeSession`)
24
+ - Mako templates for SSR
25
+
26
+ ### Frontend
27
+ - Vanilla JavaScript (no framework)
28
+ - HTML5 Drag and Drop API
29
+ - ContentEditable for rich text editing
30
+ - CSS custom properties for theming
31
+
32
+ ### Testing
33
+ - Python/unit tests plus manual regression passes
34
+
35
+ ## Architecture (High Level)
36
+ - Server renders the base page via Mako templates.
37
+ - The browser client drives interaction via `/api2` JSON endpoints.
38
+ - 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.
39
+
40
+ ## Security Boundary
41
+
42
+ Password protection encrypts namespace data at rest. While a namespace is
43
+ unlocked, the server must hold its data-encryption key and decrypted working
44
+ data in process memory, and the browser holds the decrypted content currently
45
+ rendered in the page. A sufficiently privileged local process, debugger,
46
+ administrator, browser extension, or process-memory dump can therefore expose
47
+ an unlocked namespace.
48
+
49
+ Explicit logout removes the live key and purges decrypted runtime stores, but
50
+ it cannot guarantee forensic overwriting of memory previously allocated by the
51
+ Python or browser runtimes. Protect the host account and operating system, and
52
+ see the detailed [security architecture and threat model](docs/security/README.md).
53
+
54
+ ## Development
55
+
56
+ ### Setup
57
+ For a published one-off run with uv:
58
+ ```bash
59
+ uvx metalist
60
+ ```
61
+
62
+ For a persistent uv tool install:
63
+ ```bash
64
+ uv tool install metalist
65
+ metalist
66
+ ```
67
+
68
+ 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.
69
+
70
+ 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.
71
+
72
+ You can also update and restart MetaList with one cross-platform command:
73
+ ```bash
74
+ metalist update
75
+ ```
76
+ 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.
77
+
78
+ 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.
79
+
80
+ Backups are saved to `~/MetaList/namespaces/<namespace>/backups/<namespace>-<timestamp>.metalist-backup.tar.gz`; the updater prints each verified path. Existing backups remain unchanged. Each vault keeps its newest 3 of these safety backups: once the updated MetaList has restarted, older ones are removed. If any backup fails, the update aborts with the current installation intact; run `metalist` to restart the stopped servers after resolving the failure.
81
+
82
+ 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.
83
+
84
+ 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.
85
+
86
+ ```bash
87
+ python3 -m venv .venv
88
+ source .venv/bin/activate
89
+ python -m pip install --require-hashes -r requirements/ci.txt
90
+ python -m pip install --no-deps --no-build-isolation -e ".[dev]"
91
+
92
+ npm install
93
+ ```
94
+
95
+ 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.
96
+
97
+ ### Run
98
+
99
+ 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.
100
+ The installed entrypoint starts or restarts every known namespace, prints their URLs, and exits:
101
+ ```bash
102
+ metalist
103
+ ```
104
+ 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.
105
+
106
+ Shell execution is disabled by default. To enable `@shell` for every namespace
107
+ started by the top-level orchestrator, use either:
108
+
109
+ ```bash
110
+ metalist --enable-shell
111
+ python main.py --enable-shell
112
+ ```
113
+
114
+ This flag is propagated to every namespace child process. The top-level process
115
+ prints a conspicuous shell-enabled banner before its namespace launch results.
116
+ Use `python main.py work --enable-shell` for one foreground namespace. Shell
117
+ routes remain restricted to loopback clients using a loopback request host,
118
+ even when the rest of MetaList is intentionally exposed to a LAN.
119
+
120
+ `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.
121
+ 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.
122
+
123
+ Database selection:
124
+ - No explicit namespace on a single-namespace launch: `~/MetaList/namespaces/default/default.metalist.db`
125
+ - `--namespace work` or `METALIST_NAMESPACE=work`: `~/MetaList/namespaces/work/work.metalist.db`
126
+ - Files sit beside the notes database: `namespaces/work/files/catalog.db` names them and `namespaces/work/files/blobs/` holds one file per stored item
127
+ - Remembered launch ports are stored as plaintext metadata inside each namespace's main `*.metalist.db`
128
+ - 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
129
+ - 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`
130
+ - The Backup Settings modal targets one user-selected backup folder and can include multiple namespaces in a single run
131
+ - 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.
132
+
133
+ Useful env flags:
134
+ - `CRASH_SERVER_ON_FAIL=1` (default): fail-fast on validation errors
135
+ - `API_PREFIX=/api2`: override API prefix (client assumes `/api2` by default)
136
+ - `METALIST_NAMESPACE=work`: select `~/MetaList/namespaces/work/work.metalist.db`
137
+ - `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
138
+ - `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
139
+ - `METALIST_PORT=8000` (default): bind the main app to a different port
140
+ - `METALIST_HTTPS_PORT=8443`: override the HTTPS port when TLS is enabled
141
+ - `METALIST_TLS_CERT=/path/to/fullchain.pem` + `METALIST_TLS_KEY=/path/to/privkey.pem`: override TLS paths
142
+ - `METALIST_AUTO_GENERATE_TLS=0`: disable automatic creation of the default self-signed TLS pair
143
+ - default TLS paths: `~/MetaList/certs/metalist-cert.pem` and `~/MetaList/certs/metalist-key.pem`
144
+ - `METALIST_FORWARDED_ALLOW_IPS=127.0.0.1,::1` (default): trust proxy headers only from those reverse-proxy IPs
145
+ - `--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
146
+
147
+ ### Remote Access / HTTPS
148
+ 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:
149
+ ```bash
150
+ METALIST_HOST=192.168.1.20 metalist
151
+ ```
152
+ 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.
153
+
154
+ Starting with 0.7.1, an explicit `METALIST_HOST` or `METALIST_ALLOWED_HOSTS`
155
+ configuration is saved in `~/MetaList/network-settings.json` (under
156
+ `METALIST_DATA_DIRECTORY` when overridden). Subsequent source launches, plain
157
+ `metalist` launches, and updates reuse it. Environment values override and update
158
+ the corresponding saved settings. This file stores only the bind address and
159
+ allowed hosts; namespace ports remain in their launch profiles, and shell access
160
+ still requires `--enable-shell` on each launch. Invalid settings stop startup
161
+ with an error. Fresh installations continue to bind to localhost by default.
162
+ To switch back to local-only access, run `METALIST_HOST=127.0.0.1 metalist` once.
163
+ Older installed versions do not read this file; keep supplying their LAN settings
164
+ until upgrading to 0.7.1 or later.
165
+
166
+ To keep `@shell` available on the host laptop while allowing another laptop to
167
+ use normal MetaList features, bind both interfaces and explicitly allow the LAN
168
+ address:
169
+
170
+ ```bash
171
+ METALIST_HOST=0.0.0.0 \
172
+ METALIST_ALLOWED_HOSTS=10.0.0.31 \
173
+ metalist --enable-shell
174
+ ```
175
+
176
+ Use `http://127.0.0.1:<namespace-http-port>` on the host laptop when running
177
+ `@shell`. Other devices may use `https://10.0.0.31:<namespace-https-port>`, but
178
+ their shell start/status requests receive `403`.
179
+
180
+ Namespaced launch example:
181
+ ```bash
182
+ metalist --namespace work --port 8001
183
+ ```
184
+ This starts a separate process backed by `~/MetaList/namespaces/work/work.metalist.db` on `http://127.0.0.1:8001`.
185
+ 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.
186
+
187
+ 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:
188
+ ```bash
189
+ metalist work
190
+ ```
191
+ 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.
192
+
193
+ Equivalent explicit launch, if you want it:
194
+ ```bash
195
+ METALIST_HOST=0.0.0.0 \
196
+ METALIST_ALLOWED_HOSTS=192.168.1.20 \
197
+ METALIST_PORT=8000 \
198
+ METALIST_HTTPS_PORT=8443 \
199
+ metalist
200
+ ```
201
+ From the other machine, open `https://<laptop-ip>:8443`.
202
+
203
+ If you already have a real certificate and key, use the same dual-listener flow:
204
+ ```bash
205
+ METALIST_HOST=0.0.0.0 \
206
+ METALIST_ALLOWED_HOSTS=192.168.1.20 \
207
+ METALIST_PORT=8000 \
208
+ METALIST_HTTPS_PORT=8443 \
209
+ METALIST_TLS_CERT=/path/to/fullchain.pem \
210
+ METALIST_TLS_KEY=/path/to/privkey.pem \
211
+ metalist
212
+ ```
213
+
214
+ If you want to rotate or regenerate the default self-signed pair manually, the helper script is still available:
215
+ ```bash
216
+ generate-lan-cert.sh
217
+ ```
218
+
219
+ When HTTPS is enabled:
220
+ - remote HTTP requests to `http://<laptop-ip>:8000` are redirected to HTTPS
221
+ - localhost HTTP requests still stay on plain `http://127.0.0.1:8000` so the laptop can keep using the non-TLS port
222
+
223
+ If TLS is terminated by a reverse proxy on the same machine instead, keep MetaList on loopback and let the proxy forward to it:
224
+ ```bash
225
+ METALIST_HOST=127.0.0.1 \
226
+ METALIST_ALLOWED_HOSTS=notes.example.com \
227
+ METALIST_PORT=8000 \
228
+ METALIST_FORWARDED_ALLOW_IPS=127.0.0.1,::1 \
229
+ metalist
230
+ ```
231
+
232
+ The reverse proxy must preserve the browser-facing `Host` header and set
233
+ `X-Forwarded-Proto`. MetaList never trusts `X-Forwarded-Host`; forwarded
234
+ scheme/client metadata is accepted only from `METALIST_FORWARDED_ALLOW_IPS`.
235
+ Do not widen that list beyond the actual proxy addresses.
236
+
237
+ 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.
238
+
239
+ 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.
240
+
241
+ ### Publishing
242
+ For the real user-facing install flow:
243
+ ```bash
244
+ uvx metalist
245
+ # or:
246
+ uv tool install metalist
247
+ metalist
248
+ ```
249
+
250
+ This repo now packages itself under the PyPI distribution name `metalist`. Current releases support Python 3.11 through 3.14.
251
+
252
+ Recommended release path:
253
+ 1. In the existing PyPI project `metalist`, configure GitHub Trusted Publishing for `metalist-app/metalist` and the workflow file `.github/workflows/publish-pypi.yml`.
254
+ 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.
255
+ 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.
256
+ 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`.
257
+
258
+ ### Run Tests
259
+
260
+ Python/unit test examples:
261
+ ```bash
262
+ source .venv/bin/activate
263
+ .venv/bin/pytest
264
+ node --test tests/unit/*.mjs
265
+ .venv/bin/python -c "from pathlib import Path; import main; main._run_startup_sanity_gates(repo_root=Path.cwd())"
266
+ ```
267
+
268
+ Source-checkout development launches can enable the mandatory Python and
269
+ JavaScript sanity gates with an ignored repository-root `.env` file:
270
+
271
+ ```dotenv
272
+ METALIST_ENVIRONMENT=development
273
+ ```
274
+
275
+ `main.py` prints the resolved environment at startup. An explicit process
276
+ environment value takes precedence over `.env`; only `development` and
277
+ `production` are accepted. When the variable and `.env` file are absent,
278
+ MetaList runs in production mode and skips the source sanity gates.
279
+
280
+ `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.
281
+
282
+ ### Diagrams
283
+ Render Mermaid diagrams to PNGs:
284
+ ```bash
285
+ npm run render-diagrams
286
+ ```
287
+
288
+
289
+ ## Maintenance and recovery
290
+
291
+ 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.