MetaList 0.11.0__tar.gz → 0.13.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (556) hide show
  1. {metalist-0.11.0 → metalist-0.13.0}/PKG-INFO +19 -1
  2. {metalist-0.11.0 → metalist-0.13.0}/README.md +18 -0
  3. {metalist-0.11.0 → metalist-0.13.0}/app/api/note_requests.py +20 -0
  4. {metalist-0.11.0 → metalist-0.13.0}/app/api/routes/ai.py +11 -58
  5. {metalist-0.11.0 → metalist-0.13.0}/app/api/routes/notes.py +50 -6
  6. {metalist-0.11.0 → metalist-0.13.0}/app/api/transactions.py +3 -1
  7. {metalist-0.11.0 → metalist-0.13.0}/app/exception_boundaries.py +3 -1
  8. {metalist-0.11.0 → metalist-0.13.0}/app/main.py +8 -1
  9. {metalist-0.11.0 → metalist-0.13.0}/app/models/utils.py +4 -1
  10. metalist-0.13.0/app/services/agent/action_log.py +59 -0
  11. metalist-0.13.0/app/services/agent/agent_loop.py +571 -0
  12. metalist-0.13.0/app/services/agent/agent_tools.py +464 -0
  13. metalist-0.13.0/app/services/agent/citation_tokens.py +62 -0
  14. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/context.py +76 -259
  15. metalist-0.13.0/app/services/agent/execution_errors.py +7 -0
  16. metalist-0.13.0/app/services/agent/failure_explanations.py +164 -0
  17. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/help_catalog.py +3 -23
  18. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/history.py +19 -1
  19. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/inference.py +29 -0
  20. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/investigation.py +67 -0
  21. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/model_policy.py +1 -2
  22. metalist-0.13.0/app/services/agent/note_aliases.py +77 -0
  23. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/openai_inference.py +169 -1
  24. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/prompt_settings.py +8 -49
  25. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/prompts/__init__.py +1 -1
  26. metalist-0.13.0/app/services/agent/prompts/agent.md +132 -0
  27. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/prompts/final-response.md +3 -5
  28. metalist-0.13.0/app/services/agent/prompts/system.md +28 -0
  29. metalist-0.13.0/app/services/agent/release_notes.py +50 -0
  30. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/runtime.py +94 -1341
  31. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/scope.py +16 -1
  32. metalist-0.13.0/app/services/agent/skill_settings.py +130 -0
  33. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/skills/__init__.py +0 -2
  34. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/skills/help-ai.md +45 -22
  35. metalist-0.13.0/app/services/agent/skills/help-dictation.md +92 -0
  36. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/skills/help-formatting.md +1 -1
  37. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/skills/help-menus.md +5 -8
  38. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/skills/help-notes.md +18 -3
  39. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/skills/help-privacy.md +1 -1
  40. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/skills/help-references.md +3 -2
  41. metalist-0.13.0/app/services/agent/skills/help-releases.md +108 -0
  42. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/skills/help-search.md +10 -1
  43. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/skills/help-tags.md +3 -2
  44. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/structured_inference.py +34 -17
  45. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/tagging.py +0 -15
  46. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/tagging_run.py +49 -37
  47. metalist-0.13.0/app/services/agent/tool_calling.py +147 -0
  48. metalist-0.13.0/app/services/agent/web_actions.py +214 -0
  49. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/web_capabilities.py +21 -0
  50. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/web_evidence.py +22 -0
  51. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/web_fetch.py +16 -3
  52. {metalist-0.11.0 → metalist-0.13.0}/app/services/ai_chat.py +37 -0
  53. {metalist-0.11.0 → metalist-0.13.0}/app/services/ai_chat_stream.py +13 -3
  54. {metalist-0.11.0 → metalist-0.13.0}/app/services/bulk_operation.py +31 -7
  55. {metalist-0.11.0 → metalist-0.13.0}/app/services/client_state_service.py +19 -22
  56. {metalist-0.11.0 → metalist-0.13.0}/app/services/content_formatting.py +2 -1
  57. metalist-0.13.0/app/services/dictation_cleanup.py +469 -0
  58. {metalist-0.11.0 → metalist-0.13.0}/app/services/embedded_references.py +13 -2
  59. metalist-0.13.0/app/services/file_text_preview.py +83 -0
  60. {metalist-0.11.0 → metalist-0.13.0}/app/services/html_export.py +3 -2
  61. metalist-0.13.0/app/services/inline_image_dimensions.py +140 -0
  62. {metalist-0.11.0 → metalist-0.13.0}/app/services/integrity.py +3 -2
  63. {metalist-0.11.0 → metalist-0.13.0}/app/services/markdown_rendering.py +16 -1
  64. {metalist-0.11.0 → metalist-0.13.0}/app/services/root_sorting.py +5 -3
  65. {metalist-0.11.0 → metalist-0.13.0}/app/services/search_index.py +28 -21
  66. {metalist-0.11.0 → metalist-0.13.0}/app/services/search_query.py +10 -2
  67. {metalist-0.11.0 → metalist-0.13.0}/app/services/search_text.py +35 -0
  68. {metalist-0.11.0 → metalist-0.13.0}/app/services/snapshot.py +71 -10
  69. {metalist-0.11.0 → metalist-0.13.0}/app/services/tag_suggestions.py +104 -23
  70. {metalist-0.11.0 → metalist-0.13.0}/app/startup_sanity.py +28 -1
  71. {metalist-0.11.0 → metalist-0.13.0}/app/static/config/agent-menu-actions.json +15 -9
  72. {metalist-0.11.0 → metalist-0.13.0}/app/static/config/command_palette_tags.json +10 -6
  73. {metalist-0.11.0 → metalist-0.13.0}/app/static/css/main.css +181 -142
  74. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/main.js +2 -0
  75. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/ai-chat/ai-chat-api.js +0 -9
  76. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/ai-chat/ai-chat-panel-controller.js +80 -32
  77. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/ai-chat/ai-chat-panel-service.js +0 -66
  78. metalist-0.13.0/app/static/js/modules/ai-chat/confirmation-card.js +93 -0
  79. metalist-0.13.0/app/static/js/modules/ai-chat/confirmation-question.js +28 -0
  80. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/ai-chat/proposal-menu.js +11 -7
  81. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/api-client.js +15 -1
  82. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/auth.js +2 -0
  83. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/command-palette/command-palette-controller.js +104 -80
  84. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/command-palette/endpoint-registry.js +17 -10
  85. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/config.js +2 -1
  86. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/error-overlay.js +22 -1
  87. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/excalidraw/excalidraw-actions.js +5 -0
  88. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/excalidraw/excalidraw-preview-service.js +29 -0
  89. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/expected-errors.js +9 -0
  90. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/ai-agent-settings-modal.js +4 -0
  91. metalist-0.13.0/app/static/js/modules/modals/dictation-settings-modal.js +130 -0
  92. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/ontology-modal.js +20 -0
  93. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/prioritize-modal.js +3 -0
  94. metalist-0.13.0/app/static/js/modules/modals/visual-cues-modal.js +138 -0
  95. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/actions/content-actions.js +2 -11
  96. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/actions/note-actions.js +64 -20
  97. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/actions/selection-actions.js +71 -4
  98. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/actions/ui-actions.js +30 -3
  99. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/events/input-events.js +14 -1
  100. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/events/keyboard-events.js +56 -6
  101. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/events/mouse-events.js +253 -30
  102. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/events/search-events.js +7 -0
  103. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/mode-manager-controller.js +2 -1
  104. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/animated-scroll-service.js +4 -0
  105. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/collapse-editing-policy-service.js +8 -0
  106. metalist-0.13.0/app/static/js/modules/mode-manager/services/dictation-note-paste.js +48 -0
  107. metalist-0.13.0/app/static/js/modules/mode-manager/services/dictation-paste-padding.js +21 -0
  108. metalist-0.13.0/app/static/js/modules/mode-manager/services/dictation-paste-service.js +236 -0
  109. metalist-0.13.0/app/static/js/modules/mode-manager/services/dropped-file-preview-service.js +47 -0
  110. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/edit-session-collapse-policy-service.js +3 -1
  111. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/edit-session-collapse-service.js +9 -2
  112. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/file-image-preview-service.js +25 -0
  113. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/file-reference-service.js +3 -2
  114. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/mermaid-render-service.js +49 -0
  115. metalist-0.13.0/app/static/js/modules/mode-manager/services/note-drag-indicator-service.js +117 -0
  116. metalist-0.13.0/app/static/js/modules/mode-manager/services/root-note-creation-service.js +34 -0
  117. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/root-sort-service.js +24 -0
  118. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/scroll-restoration-service.js +28 -3
  119. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/search-syntax-service.js +28 -0
  120. metalist-0.13.0/app/static/js/modules/mode-manager/services/viewport-hold-service.js +755 -0
  121. metalist-0.13.0/app/static/js/vendor/dompurify-3.4.16.min.js +7 -0
  122. {metalist-0.11.0 → metalist-0.13.0}/app/templates/base.html +1 -1
  123. {metalist-0.11.0 → metalist-0.13.0}/app/templates/index.html +1 -0
  124. metalist-0.13.0/app/usecases/create_file_preview_child.py +68 -0
  125. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/prioritize.py +5 -4
  126. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/search_comment_autofill.py +4 -3
  127. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/search_context_tags.py +4 -3
  128. {metalist-0.11.0 → metalist-0.13.0}/app/version.py +1 -1
  129. {metalist-0.11.0 → metalist-0.13.0}/metalist.egg-info/PKG-INFO +19 -1
  130. {metalist-0.11.0 → metalist-0.13.0}/metalist.egg-info/SOURCES.txt +29 -11
  131. metalist-0.11.0/app/services/agent/actions.py +0 -292
  132. metalist-0.11.0/app/services/agent/markdown_validation.py +0 -35
  133. metalist-0.11.0/app/services/agent/permissions.py +0 -30
  134. metalist-0.11.0/app/services/agent/prompts/help-response.md +0 -25
  135. metalist-0.11.0/app/services/agent/prompts/system.md +0 -92
  136. metalist-0.11.0/app/services/agent/prompts/tool-result.md +0 -2
  137. metalist-0.11.0/app/services/agent/skill_settings.py +0 -219
  138. metalist-0.11.0/app/services/agent/skills/scoped-investigation.md +0 -27
  139. metalist-0.11.0/app/services/agent/tools.py +0 -323
  140. metalist-0.11.0/app/static/js/modules/ai-chat/agent-prompt-service.js +0 -257
  141. metalist-0.11.0/app/static/js/modules/modals/agent-prompt-editor-modal.js +0 -347
  142. metalist-0.11.0/app/static/js/modules/mode-manager/services/viewport-hold-service.js +0 -75
  143. metalist-0.11.0/app/static/js/vendor/dompurify-3.4.13.min.js +0 -3
  144. {metalist-0.11.0 → metalist-0.13.0}/MANIFEST.in +0 -0
  145. {metalist-0.11.0 → metalist-0.13.0}/app/__init__.py +0 -0
  146. {metalist-0.11.0 → metalist-0.13.0}/app/api/__init__.py +0 -0
  147. {metalist-0.11.0 → metalist-0.13.0}/app/api/deps.py +0 -0
  148. {metalist-0.11.0 → metalist-0.13.0}/app/api/dev.py +0 -0
  149. {metalist-0.11.0 → metalist-0.13.0}/app/api/middleware/auth.py +0 -0
  150. {metalist-0.11.0 → metalist-0.13.0}/app/api/request_auth.py +0 -0
  151. {metalist-0.11.0 → metalist-0.13.0}/app/api/routes/app_updates.py +0 -0
  152. {metalist-0.11.0 → metalist-0.13.0}/app/api/routes/auth.py +0 -0
  153. {metalist-0.11.0 → metalist-0.13.0}/app/api/routes/backups.py +0 -0
  154. {metalist-0.11.0 → metalist-0.13.0}/app/api/routes/files.py +0 -0
  155. {metalist-0.11.0 → metalist-0.13.0}/app/api/routes/ontology.py +0 -0
  156. {metalist-0.11.0 → metalist-0.13.0}/app/api/routes/reminders.py +0 -0
  157. {metalist-0.11.0 → metalist-0.13.0}/app/api/routes/remote_images.py +0 -0
  158. {metalist-0.11.0 → metalist-0.13.0}/app/api/routes/test.py +0 -0
  159. {metalist-0.11.0 → metalist-0.13.0}/app/api/upload_limits.py +0 -0
  160. {metalist-0.11.0 → metalist-0.13.0}/app/config.py +0 -0
  161. {metalist-0.11.0 → metalist-0.13.0}/app/data_directory.py +0 -0
  162. {metalist-0.11.0 → metalist-0.13.0}/app/db/__init__.py +0 -0
  163. {metalist-0.11.0 → metalist-0.13.0}/app/db/backup_settings_sql.py +0 -0
  164. {metalist-0.11.0 → metalist-0.13.0}/app/db/editable_files_migration.py +0 -0
  165. {metalist-0.11.0 → metalist-0.13.0}/app/db/engine.py +0 -0
  166. {metalist-0.11.0 → metalist-0.13.0}/app/db/file_schema.py +0 -0
  167. {metalist-0.11.0 → metalist-0.13.0}/app/db/file_session.py +0 -0
  168. {metalist-0.11.0 → metalist-0.13.0}/app/db/files_sql.py +0 -0
  169. {metalist-0.11.0 → metalist-0.13.0}/app/db/link_titles_sql.py +0 -0
  170. {metalist-0.11.0 → metalist-0.13.0}/app/db/live_recovery.py +0 -0
  171. {metalist-0.11.0 → metalist-0.13.0}/app/db/migrations.py +0 -0
  172. {metalist-0.11.0 → metalist-0.13.0}/app/db/notes_sql.py +0 -0
  173. {metalist-0.11.0 → metalist-0.13.0}/app/db/ontology_rules_sql.py +0 -0
  174. {metalist-0.11.0 → metalist-0.13.0}/app/db/reminders_sql.py +0 -0
  175. {metalist-0.11.0 → metalist-0.13.0}/app/db/retire_sounds.py +0 -0
  176. {metalist-0.11.0 → metalist-0.13.0}/app/db/schema.py +0 -0
  177. {metalist-0.11.0 → metalist-0.13.0}/app/db/search_history_sql.py +0 -0
  178. {metalist-0.11.0 → metalist-0.13.0}/app/db/session.py +0 -0
  179. {metalist-0.11.0 → metalist-0.13.0}/app/db/settings_sql.py +0 -0
  180. {metalist-0.11.0 → metalist-0.13.0}/app/db/tab_state_sql.py +0 -0
  181. {metalist-0.11.0 → metalist-0.13.0}/app/db/version.py +0 -0
  182. {metalist-0.11.0 → metalist-0.13.0}/app/encryption_audit.py +0 -0
  183. {metalist-0.11.0 → metalist-0.13.0}/app/https_proxy.py +0 -0
  184. {metalist-0.11.0 → metalist-0.13.0}/app/models/commands.py +0 -0
  185. {metalist-0.11.0 → metalist-0.13.0}/app/models/database.py +0 -0
  186. {metalist-0.11.0 → metalist-0.13.0}/app/models/entities.py +0 -0
  187. {metalist-0.11.0 → metalist-0.13.0}/app/models/enums.py +0 -0
  188. {metalist-0.11.0 → metalist-0.13.0}/app/models/linked_list.py +0 -0
  189. {metalist-0.11.0 → metalist-0.13.0}/app/models/list_operations.py +0 -0
  190. {metalist-0.11.0 → metalist-0.13.0}/app/models/list_traversal.py +0 -0
  191. {metalist-0.11.0 → metalist-0.13.0}/app/models/note_crud.py +0 -0
  192. {metalist-0.11.0 → metalist-0.13.0}/app/network_settings.py +0 -0
  193. {metalist-0.11.0 → metalist-0.13.0}/app/presentation/__init__.py +0 -0
  194. {metalist-0.11.0 → metalist-0.13.0}/app/presentation/render/__init__.py +0 -0
  195. {metalist-0.11.0 → metalist-0.13.0}/app/presentation/render/note_renderer.py +0 -0
  196. {metalist-0.11.0 → metalist-0.13.0}/app/presentation/templates.py +0 -0
  197. {metalist-0.11.0 → metalist-0.13.0}/app/security/authenticated_logging.py +0 -0
  198. {metalist-0.11.0 → metalist-0.13.0}/app/security/encryption.py +0 -0
  199. {metalist-0.11.0 → metalist-0.13.0}/app/security/http_error_diagnostics.py +0 -0
  200. {metalist-0.11.0 → metalist-0.13.0}/app/security/http_headers.py +0 -0
  201. {metalist-0.11.0 → metalist-0.13.0}/app/security/note_html.py +0 -0
  202. {metalist-0.11.0 → metalist-0.13.0}/app/security/request_boundary.py +0 -0
  203. {metalist-0.11.0 → metalist-0.13.0}/app/security/request_hosts.py +0 -0
  204. {metalist-0.11.0 → metalist-0.13.0}/app/security/sensitive_cache.py +0 -0
  205. {metalist-0.11.0 → metalist-0.13.0}/app/security/sensitive_logging.py +0 -0
  206. {metalist-0.11.0 → metalist-0.13.0}/app/security/shell_execution.py +0 -0
  207. {metalist-0.11.0 → metalist-0.13.0}/app/security/validation_errors.py +0 -0
  208. {metalist-0.11.0 → metalist-0.13.0}/app/server_runtime.py +0 -0
  209. {metalist-0.11.0 → metalist-0.13.0}/app/services/__init__.py +0 -0
  210. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/__init__.py +0 -0
  211. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/cloud_privacy.py +0 -0
  212. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/evidence_serialization.py +0 -0
  213. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/judging.py +0 -0
  214. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/menu_actions.py +0 -0
  215. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/openai_cost_tracking.py +0 -0
  216. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/retrieval_settings.py +0 -0
  217. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/skills/help-data.md +0 -0
  218. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/skills/help-reminders.md +0 -0
  219. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/skills/staged-summary.md +0 -0
  220. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/skills/tag-proposals.md +0 -0
  221. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/skills/web-browsing.md +0 -0
  222. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/staged_summary.py +0 -0
  223. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/token_estimation.py +0 -0
  224. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/trace.py +0 -0
  225. {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/web_settings.py +0 -0
  226. {metalist-0.11.0 → metalist-0.13.0}/app/services/ai_chat_rendering.py +0 -0
  227. {metalist-0.11.0 → metalist-0.13.0}/app/services/app_update_worker.py +0 -0
  228. {metalist-0.11.0 → metalist-0.13.0}/app/services/app_updates.py +0 -0
  229. {metalist-0.11.0 → metalist-0.13.0}/app/services/auth.py +0 -0
  230. {metalist-0.11.0 → metalist-0.13.0}/app/services/auth_cache_state.py +0 -0
  231. {metalist-0.11.0 → metalist-0.13.0}/app/services/auth_service.py +0 -0
  232. {metalist-0.11.0 → metalist-0.13.0}/app/services/backlink_index.py +0 -0
  233. {metalist-0.11.0 → metalist-0.13.0}/app/services/backlinks.py +0 -0
  234. {metalist-0.11.0 → metalist-0.13.0}/app/services/backup_service.py +0 -0
  235. {metalist-0.11.0 → metalist-0.13.0}/app/services/backup_settings_service.py +0 -0
  236. {metalist-0.11.0 → metalist-0.13.0}/app/services/content_cache.py +0 -0
  237. {metalist-0.11.0 → metalist-0.13.0}/app/services/diagnostics.py +0 -0
  238. {metalist-0.11.0 → metalist-0.13.0}/app/services/encryption.py +0 -0
  239. {metalist-0.11.0 → metalist-0.13.0}/app/services/exception_capture.py +0 -0
  240. {metalist-0.11.0 → metalist-0.13.0}/app/services/file_edit_sessions.py +0 -0
  241. {metalist-0.11.0 → metalist-0.13.0}/app/services/file_registry.py +0 -0
  242. {metalist-0.11.0 → metalist-0.13.0}/app/services/file_storage.py +0 -0
  243. {metalist-0.11.0 → metalist-0.13.0}/app/services/footnote_layout.py +0 -0
  244. {metalist-0.11.0 → metalist-0.13.0}/app/services/footnote_rendering.py +0 -0
  245. {metalist-0.11.0 → metalist-0.13.0}/app/services/hierarchy.py +0 -0
  246. {metalist-0.11.0 → metalist-0.13.0}/app/services/html_unformatting.py +0 -0
  247. {metalist-0.11.0 → metalist-0.13.0}/app/services/hydration_state.py +0 -0
  248. {metalist-0.11.0 → metalist-0.13.0}/app/services/image_size_formatting.py +0 -0
  249. {metalist-0.11.0 → metalist-0.13.0}/app/services/inline_image_occurrences.py +0 -0
  250. {metalist-0.11.0 → metalist-0.13.0}/app/services/input_errors.py +0 -0
  251. {metalist-0.11.0 → metalist-0.13.0}/app/services/latex_rendering.py +0 -0
  252. {metalist-0.11.0 → metalist-0.13.0}/app/services/link_titles.py +0 -0
  253. {metalist-0.11.0 → metalist-0.13.0}/app/services/login_rate_limit.py +0 -0
  254. {metalist-0.11.0 → metalist-0.13.0}/app/services/maintenance_mode.py +0 -0
  255. {metalist-0.11.0 → metalist-0.13.0}/app/services/namespace_deletion_jobs.py +0 -0
  256. {metalist-0.11.0 → metalist-0.13.0}/app/services/namespace_deletion_worker.py +0 -0
  257. {metalist-0.11.0 → metalist-0.13.0}/app/services/namespace_rename_jobs.py +0 -0
  258. {metalist-0.11.0 → metalist-0.13.0}/app/services/namespace_rename_worker.py +0 -0
  259. {metalist-0.11.0 → metalist-0.13.0}/app/services/namespace_runtime_guard.py +0 -0
  260. {metalist-0.11.0 → metalist-0.13.0}/app/services/namespace_switcher.py +0 -0
  261. {metalist-0.11.0 → metalist-0.13.0}/app/services/note_fullscreen.py +0 -0
  262. {metalist-0.11.0 → metalist-0.13.0}/app/services/note_image_tags.py +0 -0
  263. {metalist-0.11.0 → metalist-0.13.0}/app/services/note_ordering.py +0 -0
  264. {metalist-0.11.0 → metalist-0.13.0}/app/services/note_store.py +0 -0
  265. {metalist-0.11.0 → metalist-0.13.0}/app/services/ontology_rules_store.py +0 -0
  266. {metalist-0.11.0 → metalist-0.13.0}/app/services/openai_credentials.py +0 -0
  267. {metalist-0.11.0 → metalist-0.13.0}/app/services/password_note_fields.py +0 -0
  268. {metalist-0.11.0 → metalist-0.13.0}/app/services/public_http.py +0 -0
  269. {metalist-0.11.0 → metalist-0.13.0}/app/services/reference_presentation.py +0 -0
  270. {metalist-0.11.0 → metalist-0.13.0}/app/services/reminders.py +0 -0
  271. {metalist-0.11.0 → metalist-0.13.0}/app/services/remote_image_proxy.py +0 -0
  272. {metalist-0.11.0 → metalist-0.13.0}/app/services/request_recovery.py +0 -0
  273. {metalist-0.11.0 → metalist-0.13.0}/app/services/resource_limits.py +0 -0
  274. {metalist-0.11.0 → metalist-0.13.0}/app/services/runtime_generation.py +0 -0
  275. {metalist-0.11.0 → metalist-0.13.0}/app/services/runtime_hardening.py +0 -0
  276. {metalist-0.11.0 → metalist-0.13.0}/app/services/runtime_lock.py +0 -0
  277. {metalist-0.11.0 → metalist-0.13.0}/app/services/search_history.py +0 -0
  278. {metalist-0.11.0 → metalist-0.13.0}/app/services/search_history_storage.py +0 -0
  279. {metalist-0.11.0 → metalist-0.13.0}/app/services/selected_text_tag.py +0 -0
  280. {metalist-0.11.0 → metalist-0.13.0}/app/services/self_update.py +0 -0
  281. {metalist-0.11.0 → metalist-0.13.0}/app/services/session_timeout_service.py +0 -0
  282. {metalist-0.11.0 → metalist-0.13.0}/app/services/shell_session_service.py +0 -0
  283. {metalist-0.11.0 → metalist-0.13.0}/app/services/store.py +0 -0
  284. {metalist-0.11.0 → metalist-0.13.0}/app/services/structured_note_renderers.py +0 -0
  285. {metalist-0.11.0 → metalist-0.13.0}/app/services/sync.py +0 -0
  286. {metalist-0.11.0 → metalist-0.13.0}/app/services/sync_state.py +0 -0
  287. {metalist-0.11.0 → metalist-0.13.0}/app/services/tab_state.py +0 -0
  288. {metalist-0.11.0 → metalist-0.13.0}/app/services/tag_case.py +0 -0
  289. {metalist-0.11.0 → metalist-0.13.0}/app/services/tag_ontology.py +0 -0
  290. {metalist-0.11.0 → metalist-0.13.0}/app/services/tag_rename.py +0 -0
  291. {metalist-0.11.0 → metalist-0.13.0}/app/services/tag_term_matching.py +0 -0
  292. {metalist-0.11.0 → metalist-0.13.0}/app/services/test_reset.py +0 -0
  293. {metalist-0.11.0 → metalist-0.13.0}/app/services/tokens.py +0 -0
  294. {metalist-0.11.0 → metalist-0.13.0}/app/services/undo_state.py +0 -0
  295. {metalist-0.11.0 → metalist-0.13.0}/app/services/update_backups.py +0 -0
  296. {metalist-0.11.0 → metalist-0.13.0}/app/services/update_installer.py +0 -0
  297. {metalist-0.11.0 → metalist-0.13.0}/app/services/update_preflight.py +0 -0
  298. {metalist-0.11.0 → metalist-0.13.0}/app/services/view_cache.py +0 -0
  299. {metalist-0.11.0 → metalist-0.13.0}/app/services/view_diff.py +0 -0
  300. {metalist-0.11.0 → metalist-0.13.0}/app/services/view_state.py +0 -0
  301. {metalist-0.11.0 → metalist-0.13.0}/app/services/windows_process_control.py +0 -0
  302. {metalist-0.11.0 → metalist-0.13.0}/app/startup_environment.py +0 -0
  303. {metalist-0.11.0 → metalist-0.13.0}/app/startup_js_sanity.py +0 -0
  304. {metalist-0.11.0 → metalist-0.13.0}/app/startup_sanity_config.py +0 -0
  305. {metalist-0.11.0 → metalist-0.13.0}/app/static/css/floating-notes.css +0 -0
  306. {metalist-0.11.0 → metalist-0.13.0}/app/static/css/forms.css +0 -0
  307. {metalist-0.11.0 → metalist-0.13.0}/app/static/img/favicon.ico +0 -0
  308. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/locked.js +0 -0
  309. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/activity-tracker.js +0 -0
  310. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/ai-chat/agent-menu-actions.js +0 -0
  311. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/ai-chat/agent-retrieval-settings.js +0 -0
  312. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/ai-chat/agent-web-settings.js +0 -0
  313. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/ai-chat/ai-agent-debug-view.js +0 -0
  314. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/ai-chat/ai-chat-message-placement.js +0 -0
  315. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/ai-chat/ai-thinking-level-service.js +0 -0
  316. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/ai-chat/bulk-elapsed-clock.js +0 -0
  317. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/ai-chat/bulk-proposal-ui.js +0 -0
  318. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/ai-chat/bulk-scope-question.js +0 -0
  319. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/ai-chat/cloud-privacy-policy.js +0 -0
  320. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/ai-chat/summary-batch-preview.js +0 -0
  321. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/api-error-diagnostics.js +0 -0
  322. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/api-failure-classification-service.js +0 -0
  323. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/app-update-service.js +0 -0
  324. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/application-state.js +0 -0
  325. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/async-result.js +0 -0
  326. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/client-state-api.js +0 -0
  327. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/client-state-migration.js +0 -0
  328. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/command-palette/activation-auth-policy.js +0 -0
  329. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/command-palette/backup-command-availability.js +0 -0
  330. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/command-palette/click-activation-service.js +0 -0
  331. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/command-palette/note-layout-preferences.js +0 -0
  332. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/command-palette/preferences-store.js +0 -0
  333. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/command-palette/tag-config-loader.js +0 -0
  334. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/command-palette/usage-store.js +0 -0
  335. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/connectivity-monitor.js +0 -0
  336. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/context-menu/context-menu-registry.js +0 -0
  337. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/context-menu/context-menu-service.js +0 -0
  338. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/context-menu/context-menu-target-service.js +0 -0
  339. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/context-menu/input-caret-service.js +0 -0
  340. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/disconnect-editing-state-service.js +0 -0
  341. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/dom-utils-fixed.js +0 -0
  342. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/dom-utils.js +0 -0
  343. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/editor-commands.js +0 -0
  344. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/editor-selection.js +0 -0
  345. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/editor-toolbar.js +0 -0
  346. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/elapsed-time.js +0 -0
  347. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/error-handler.js +0 -0
  348. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/excalidraw/excalidraw-autosave.js +0 -0
  349. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/excalidraw/excalidraw-editor-service.js +0 -0
  350. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/excalidraw/excalidraw-editor-state.js +0 -0
  351. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/excalidraw/excalidraw-loader.js +0 -0
  352. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/excalidraw/excalidraw-scene.js +0 -0
  353. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/location-flags.js +0 -0
  354. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/login-namespace-picker.js +0 -0
  355. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/maintenance.js +0 -0
  356. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/alphabetize-root-notes-modal.js +0 -0
  357. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/backup-restore-modal.js +0 -0
  358. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/backup-result-modal.js +0 -0
  359. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/backup-retention-modal.js +0 -0
  360. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/backup-settings-modal.js +0 -0
  361. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/base-modal.js +0 -0
  362. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/confirmation-modal.js +0 -0
  363. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/delete-namespace-modal.js +0 -0
  364. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/delete-namespace-validation.js +0 -0
  365. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/help-modal.js +0 -0
  366. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/namespace-loading-page.js +0 -0
  367. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/namespace-modals.js +0 -0
  368. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/namespace-ports-profile.js +0 -0
  369. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/namespace-rename-validation.js +0 -0
  370. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/note-layout-appearance-modal.js +0 -0
  371. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/password-modal.js +0 -0
  372. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/random-password-modal.js +0 -0
  373. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/reminder-modal.js +0 -0
  374. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/reset-updated-at-modal.js +0 -0
  375. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/search-suggestion-statistics-modal.js +0 -0
  376. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/session-timeout-modal.js +0 -0
  377. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/version-info-modal.js +0 -0
  378. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/actions/history-actions.js +0 -0
  379. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/actions/search-actions.js +0 -0
  380. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/events/context-menu-events.js +0 -0
  381. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/events/focus-events.js +0 -0
  382. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/events/inactivity-events.js +0 -0
  383. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/mode-context.js +0 -0
  384. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/mode-logger.js +0 -0
  385. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/add-style-service.js +0 -0
  386. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/backlinks-navigation-service.js +0 -0
  387. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/backlinks-panel-service.js +0 -0
  388. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/clipboard-shortcut-policy-service.js +0 -0
  389. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/collapse-affordance-service.js +0 -0
  390. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/command-gate-service.js +0 -0
  391. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/context-menu-target-service.js +0 -0
  392. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/deselect-selection-state-service.js +0 -0
  393. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/differential-view-service.js +0 -0
  394. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/embedded-image-service.js +0 -0
  395. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/file-drop-policy-service.js +0 -0
  396. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/filtered-refresh-selection-service.js +0 -0
  397. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/floating-note-dom.js +0 -0
  398. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/floating-note-layout.js +0 -0
  399. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/floating-note-service.js +0 -0
  400. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/footnote-navigation-service.js +0 -0
  401. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/history-selection-policy-service.js +0 -0
  402. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/history-shortcut-policy-service.js +0 -0
  403. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/html-paste-sanitizer-service.js +0 -0
  404. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/image-context-menu-action-service.js +0 -0
  405. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/image-file-insert-choice-modal-service.js +0 -0
  406. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/infinite-scroll-service.js +0 -0
  407. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/link-context-menu-action-service.js +0 -0
  408. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/link-title-prefetch-service.js +0 -0
  409. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/markdown-render-service.js +0 -0
  410. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/note-click-target-service.js +0 -0
  411. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/note-clipboard-write-service.js +0 -0
  412. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/note-collapse-animation-service.js +0 -0
  413. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/note-context-menu-action-service.js +0 -0
  414. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/note-delete-shortcut-policy-service.js +0 -0
  415. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/note-drag-service.js +0 -0
  416. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/note-fullscreen-service.js +0 -0
  417. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/note-reposition-animation-service.js +0 -0
  418. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/note-split-service.js +0 -0
  419. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/note-timestamp-hover-service.js +0 -0
  420. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/password-clipboard-service.js +0 -0
  421. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/polling-service.js +0 -0
  422. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/reference-source-navigation-service.js +0 -0
  423. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/remote-image-proxy-service.js +0 -0
  424. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/remove-formatting-service.js +0 -0
  425. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/root-date-separator-service.js +0 -0
  426. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/root-sort-indicator-service.js +0 -0
  427. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/scroll-anchor-service.js +0 -0
  428. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/scroll-to-top-service.js +0 -0
  429. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/search-contexts-overlay-service.js +0 -0
  430. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/search-debounce-service.js +0 -0
  431. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/search-input-service.js +0 -0
  432. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/search-interaction-service.js +0 -0
  433. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/search-redaction-reveal-service.js +0 -0
  434. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/search-suggestion-statistics-service.js +0 -0
  435. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/search-suggestion-window-labels-service.js +0 -0
  436. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/search-suggestion-windows-service.js +0 -0
  437. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/search-suggestions-service.js +0 -0
  438. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/selected-formatting-removal-service.js +0 -0
  439. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/selected-text-tag-service.js +0 -0
  440. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/shell-output-service.js +0 -0
  441. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/tab-dom-cache-service.js +0 -0
  442. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/tab-drag-service.js +0 -0
  443. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/tab-duplication-service.js +0 -0
  444. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/tab-state-service.js +0 -0
  445. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/tag-bar-service.js +0 -0
  446. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/tag-input-selection-service.js +0 -0
  447. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/tag-proposal-service.js +0 -0
  448. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/tag-suggestions-service.js +0 -0
  449. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/tag-syntax-service.js +0 -0
  450. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/todo-toggle-editing-service.js +0 -0
  451. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/untagged-view-indicator-service.js +0 -0
  452. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/view-mode-search-shortcut-service.js +0 -0
  453. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/note-html-sanitizer.js +0 -0
  454. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/password-generator.js +0 -0
  455. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/password-operation-response.js +0 -0
  456. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/password-policy.js +0 -0
  457. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/password-strength.js +0 -0
  458. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/reminder-store.js +0 -0
  459. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/reminder-surface-service.js +0 -0
  460. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/selection-markers.js +0 -0
  461. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/session-auth.js +0 -0
  462. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/tag-token.js +0 -0
  463. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/uuid.js +0 -0
  464. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/namespace-deleted.js +0 -0
  465. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/namespace-renamed.js +0 -0
  466. /metalist-0.11.0/app/static/js/vendor/dompurify-3.4.13.LICENSE.txt → /metalist-0.13.0/app/static/js/vendor/dompurify-3.4.16.LICENSE.txt +0 -0
  467. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/excalidraw.css +0 -0
  468. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Assistant/Assistant-Bold.woff2 +0 -0
  469. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Assistant/Assistant-Medium.woff2 +0 -0
  470. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Assistant/Assistant-Regular.woff2 +0 -0
  471. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Assistant/Assistant-SemiBold.woff2 +0 -0
  472. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Cascadia/CascadiaCode-Regular.woff2 +0 -0
  473. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/ComicShanns/ComicShanns-Regular-279a7b317d12eb88de06167bd672b4b4.woff2 +0 -0
  474. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/ComicShanns/ComicShanns-Regular-6e066e8de2ac57ea9283adb9c24d7f0c.woff2 +0 -0
  475. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/ComicShanns/ComicShanns-Regular-dc6a8806fa96795d7b3be5026f989a17.woff2 +0 -0
  476. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/ComicShanns/ComicShanns-Regular-fcb0fc02dcbee4c9846b3e2508668039.woff2 +0 -0
  477. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-349fac6ca4700ffec595a7150a0d1e1d.woff2 +0 -0
  478. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-3f2c5db56cc93c5a6873b1361d730c16.woff2 +0 -0
  479. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-41b173a47b57366892116a575a43e2b6.woff2 +0 -0
  480. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-623ccf21b21ef6b3a0d87738f77eb071.woff2 +0 -0
  481. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2 +0 -0
  482. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-b9dcf9d2e50a1eaf42fc664b50a3fd0d.woff2 +0 -0
  483. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-be310b9bcd4f1a43f571c46df7809174.woff2 +0 -0
  484. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYE98RXi4EwSsbg.woff2 +0 -0
  485. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYEF8RXi4EwQ.woff2 +0 -0
  486. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTA3j6zbXWjgevT5.woff2 +0 -0
  487. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTQ3j6zbXWjgeg.woff2 +0 -0
  488. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTk3j6zbXWjgevT5.woff2 +0 -0
  489. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTo3j6zbXWjgevT5.woff2 +0 -0
  490. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTs3j6zbXWjgevT5.woff2 +0 -0
  491. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Virgil/Virgil-Regular.woff2 +0 -0
  492. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1.LICENSE.txt +0 -0
  493. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1.min.js +0 -0
  494. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/markdown-it-14.3.2.LICENSE.txt +0 -0
  495. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/markdown-it-14.3.2.min.js +0 -0
  496. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/mermaid-11.16.1.LICENSE.txt +0 -0
  497. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/mermaid-11.16.1.min.js +0 -0
  498. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/zxcvbn-4.4.2.LICENSE.txt +0 -0
  499. {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/zxcvbn-4.4.2.js +0 -0
  500. {metalist-0.11.0 → metalist-0.13.0}/app/static/note-html-policy.json +0 -0
  501. {metalist-0.11.0 → metalist-0.13.0}/app/static/video/login-startup.mp4 +0 -0
  502. {metalist-0.11.0 → metalist-0.13.0}/app/templates/locked.html +0 -0
  503. {metalist-0.11.0 → metalist-0.13.0}/app/templates/maintenance.html +0 -0
  504. {metalist-0.11.0 → metalist-0.13.0}/app/templates/namespace_deleted.html +0 -0
  505. {metalist-0.11.0 → metalist-0.13.0}/app/templates/namespace_renamed.html +0 -0
  506. {metalist-0.11.0 → metalist-0.13.0}/app/templates/notes_list.html +0 -0
  507. {metalist-0.11.0 → metalist-0.13.0}/app/upload_limits.py +0 -0
  508. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/__init__.py +0 -0
  509. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/add_selected_text_tag.py +0 -0
  510. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/alphabetize_root_notes.py +0 -0
  511. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/base.py +0 -0
  512. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/bulk_tag_proposals.py +0 -0
  513. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/collapse.py +0 -0
  514. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/copy_note.py +0 -0
  515. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/create_child.py +0 -0
  516. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/create_note.py +0 -0
  517. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/create_sibling.py +0 -0
  518. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/delete_subtree.py +0 -0
  519. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/delete_tag.py +0 -0
  520. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/expand.py +0 -0
  521. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/file_edit_session.py +0 -0
  522. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/indent.py +0 -0
  523. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/lock.py +0 -0
  524. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/move.py +0 -0
  525. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/move_to_top.py +0 -0
  526. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/outdent.py +0 -0
  527. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/paste_child.py +0 -0
  528. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/paste_sibling.py +0 -0
  529. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/prefetch_link_titles.py +0 -0
  530. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/redo.py +0 -0
  531. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/rename_tag.py +0 -0
  532. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/reset_updated_at.py +0 -0
  533. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/resize_image.py +0 -0
  534. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/run_shell.py +0 -0
  535. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/set_collapse_bulk.py +0 -0
  536. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/set_collapse_in_context.py +0 -0
  537. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/split_note.py +0 -0
  538. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/tag_proposals.py +0 -0
  539. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/toggle_reference_mode.py +0 -0
  540. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/toggle_todo_done.py +0 -0
  541. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/undo.py +0 -0
  542. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/unformat_content.py +0 -0
  543. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/update_content.py +0 -0
  544. {metalist-0.11.0 → metalist-0.13.0}/app/usecases/view.py +0 -0
  545. {metalist-0.11.0 → metalist-0.13.0}/app/utils/__init__.py +0 -0
  546. {metalist-0.11.0 → metalist-0.13.0}/app/utils/encryption.py +0 -0
  547. {metalist-0.11.0 → metalist-0.13.0}/app/utils/text_utils.py +0 -0
  548. {metalist-0.11.0 → metalist-0.13.0}/convert-from-legacy.py +0 -0
  549. {metalist-0.11.0 → metalist-0.13.0}/main.py +0 -0
  550. {metalist-0.11.0 → metalist-0.13.0}/metalist.egg-info/dependency_links.txt +0 -0
  551. {metalist-0.11.0 → metalist-0.13.0}/metalist.egg-info/entry_points.txt +0 -0
  552. {metalist-0.11.0 → metalist-0.13.0}/metalist.egg-info/requires.txt +0 -0
  553. {metalist-0.11.0 → metalist-0.13.0}/metalist.egg-info/top_level.txt +0 -0
  554. {metalist-0.11.0 → metalist-0.13.0}/pyproject.toml +0 -0
  555. {metalist-0.11.0 → metalist-0.13.0}/scripts/generate-lan-cert.sh +0 -0
  556. {metalist-0.11.0 → metalist-0.13.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: metalist
3
- Version: 0.11.0
3
+ Version: 0.13.0
4
4
  Summary: A minimalist single-user note-taking app with SSR, fast in-memory tree operations, and efficient sync.
5
5
  Project-URL: Homepage, https://github.com/evolvingstuff/metalist
6
6
  Project-URL: Repository, https://github.com/evolvingstuff/metalist
@@ -49,6 +49,24 @@ A minimalist single-user note-taking app focused on server-side rendering (SSR),
49
49
  - Multi-tab search contexts with server-persisted scroll/search state (survives browser restarts)
50
50
  - Manual namespace backups/restores to a user-selected backup folder with retention controls
51
51
 
52
+ ## Changes in 0.13.0
53
+
54
+ - Dictation: text from speech-to-text tools such as Superwhisper, pasted into the search bar or any tag field, becomes your existing tags ("neural network" gives `neural-network`). Say "quote … end quote" for text, "minus" to exclude, "at" before meta tags such as `@todo`. In a note, the words after "start tags" go to its tag bar. The phrases are set in Dictation Settings, and one undo restores what was pasted.
55
+ - A quoted search with a space at its edge matches whole words: `" fat"` no longer finds "father".
56
+ - The AI keeps a record of what it did for each answer (notes read, searches, web pages opened), so questions like "did you search the web for that?" are answered from what actually happened.
57
+ - Dropping a `.txt`, `.md`, `.csv` or `.json` file stores it as before and adds its text as a child note, shown as Markdown, a table or formatted JSON. File pills show the extension (`.MD`, `.CSV`, …), and hovering a pill says that clicking downloads the file.
58
+ - Typing one letter in the tag bar now narrows the suggestions you were already shown instead of reordering them, so the tag you want is in the top five far more often.
59
+
60
+ ## Changes in 0.12.0
61
+
62
+ - AI chat is now a tool-using agent: in one answer it can look up MetaList help, read and search the notes in your view, open web pages, and open menus, instead of picking a single route up front. Answers cite notes and web pages with clickable references, including each item listed from a web page.
63
+ - Nothing changes without your Yes: tag operations ask first with the exact change, and web addresses that carry words from your notes ask before opening. Summaries that fit in one pass start without a dialog, and summaries never block other edits while they run.
64
+ - "How do I change…" questions open the menu that holds the setting; release notes are part of the help. AI prompts and skills are no longer editable, and a $ button shows or hides the spend estimate.
65
+ - The AI is told only that a note is private, never which privacy setting hides it, and failed AI steps are explained in the chat.
66
+ - Leaving edit mode keeps your place, with no highlight; a collapsed note you changed stays expanded. Clicking into a note keeps the clicked spot under the pointer, including in diagrams and formulas.
67
+ - Dragging a note shows a ghost, a drop line and a direction cursor; the note lands where you dropped it without the page scrolling.
68
+ - Searches that cannot be parsed are explained politely instead of failing.
69
+
52
70
  ## Changes in 0.11.0
53
71
 
54
72
  - Large namespaces stay fast while scrolling: only a band of root notes around the viewport is loaded, the server remembers what each tab shows so the browser no longer sends note hashes, and rendered notes are cached.
@@ -12,6 +12,24 @@ A minimalist single-user note-taking app focused on server-side rendering (SSR),
12
12
  - Multi-tab search contexts with server-persisted scroll/search state (survives browser restarts)
13
13
  - Manual namespace backups/restores to a user-selected backup folder with retention controls
14
14
 
15
+ ## Changes in 0.13.0
16
+
17
+ - Dictation: text from speech-to-text tools such as Superwhisper, pasted into the search bar or any tag field, becomes your existing tags ("neural network" gives `neural-network`). Say "quote … end quote" for text, "minus" to exclude, "at" before meta tags such as `@todo`. In a note, the words after "start tags" go to its tag bar. The phrases are set in Dictation Settings, and one undo restores what was pasted.
18
+ - A quoted search with a space at its edge matches whole words: `" fat"` no longer finds "father".
19
+ - The AI keeps a record of what it did for each answer (notes read, searches, web pages opened), so questions like "did you search the web for that?" are answered from what actually happened.
20
+ - Dropping a `.txt`, `.md`, `.csv` or `.json` file stores it as before and adds its text as a child note, shown as Markdown, a table or formatted JSON. File pills show the extension (`.MD`, `.CSV`, …), and hovering a pill says that clicking downloads the file.
21
+ - Typing one letter in the tag bar now narrows the suggestions you were already shown instead of reordering them, so the tag you want is in the top five far more often.
22
+
23
+ ## Changes in 0.12.0
24
+
25
+ - AI chat is now a tool-using agent: in one answer it can look up MetaList help, read and search the notes in your view, open web pages, and open menus, instead of picking a single route up front. Answers cite notes and web pages with clickable references, including each item listed from a web page.
26
+ - Nothing changes without your Yes: tag operations ask first with the exact change, and web addresses that carry words from your notes ask before opening. Summaries that fit in one pass start without a dialog, and summaries never block other edits while they run.
27
+ - "How do I change…" questions open the menu that holds the setting; release notes are part of the help. AI prompts and skills are no longer editable, and a $ button shows or hides the spend estimate.
28
+ - The AI is told only that a note is private, never which privacy setting hides it, and failed AI steps are explained in the chat.
29
+ - Leaving edit mode keeps your place, with no highlight; a collapsed note you changed stays expanded. Clicking into a note keeps the clicked spot under the pointer, including in diagrams and formulas.
30
+ - Dragging a note shows a ghost, a drop line and a direction cursor; the note lands where you dropped it without the page scrolling.
31
+ - Searches that cannot be parsed are explained politely instead of failing.
32
+
15
33
  ## Changes in 0.11.0
16
34
 
17
35
  - Large namespaces stay fast while scrolling: only a band of root notes around the viewport is loaded, the server remembers what each tab shows so the browser no longer sends note hashes, and rendered notes are cached.
@@ -106,6 +106,18 @@ class SearchSuggestionInteractionRequest(TypedDict):
106
106
  class TabSearchInteractionRequest(TypedDict):
107
107
  searchQuery: Text
108
108
 
109
+ @with_config(ConfigDict(strict=True))
110
+ class DictationPasteRequest(TypedDict):
111
+ """Text pasted into the search bar or the tag bar, and the field's current value."""
112
+ text: Text
113
+ target: Literal["search", "tags", "tag", "condition"]
114
+ current_value: Text
115
+ # The spoken phrases around a quoted phrase (Dictation Settings).
116
+ quote_open: Identifier
117
+ quote_close: Identifier
118
+ # Spoken before a search term to exclude it (Dictation Settings).
119
+ negate_phrase: Identifier
120
+
109
121
  @with_config(ConfigDict(strict=True))
110
122
  class TagSuggestionsRequest(TypedDict):
111
123
  note_id: Identifier
@@ -136,6 +148,14 @@ class CreateChildRequest(TypedDict):
136
148
  undoContext: UndoContext
137
149
  viewport: Viewport
138
150
 
151
+ @with_config(ConfigDict(strict=True))
152
+ class CreateFilePreviewChildRequest(TypedDict):
153
+ fileId: Identifier
154
+ search_query: Text | None
155
+ clientId: Identifier
156
+ undoContext: UndoContext
157
+ viewport: Viewport
158
+
139
159
  @with_config(ConfigDict(strict=True))
140
160
  class UpdateNoteRequest(TypedDict):
141
161
  clientId: Identifier
@@ -33,21 +33,17 @@ from app.services.agent.openai_inference import OpenAIInferenceAdapter
33
33
  from app.services.agent.openai_inference import validate_openai_model
34
34
  from app.services.agent.openai_cost_tracking import OpenAICostSnapshot
35
35
  from app.services.agent.openai_cost_tracking import openai_cost_tracker
36
- from app.services.agent.permissions import AgentPermissionPolicy
37
36
  from app.services.agent.prompt_settings import AgentPromptSet
38
37
  from app.services.agent.skill_settings import AgentSkillSet
39
38
  from app.services.agent.retrieval_settings import AgentRetrievalSettings
40
39
  from app.services.agent.scope import ScopedSearchSnapshot
41
40
  from app.services.agent.prompt_settings import DEFAULT_AGENT_PROMPTS
42
- from app.services.agent.prompt_settings import resolve_agent_prompt_set
43
41
  from app.services.agent.retrieval_settings import resolve_agent_retrieval_settings
44
42
  from app.services.agent.scope import AgentScopeDescriptor
45
43
  from app.services.agent.scope import scoped_search_snapshot_factory
46
44
  from app.services.agent.runtime import AgentRuntime
47
45
  from app.services.agent.skill_settings import DEFAULT_AGENT_SKILLS
48
- from app.services.agent.skill_settings import resolve_agent_skill_set
49
46
  from app.services.agent.token_estimation import estimate_input_tokens
50
- from app.services.agent.tools import read_only_agent_tools
51
47
  from app.services.agent.trace import agent_trace_store
52
48
  from app.services.agent.menu_actions import MenuResult, menu_action_store
53
49
  from app.services.client_state_service import load_client_preferences
@@ -62,7 +58,7 @@ from app.services.agent.retrieval_settings import resolve_tagging_batch_tokens
62
58
  from app.services.agent.web_settings import AgentWebSettings
63
59
  from app.services.agent.web_settings import resolve_agent_web_settings
64
60
  from app.services.agent.web_evidence import web_evidence_store
65
- from app.services.agent.tagging import TAGGING_PROMPT_KEY, TAGGING_POLICY_KEY, DEFAULT_TAGGING_PROMPT
61
+ from app.services.agent.tagging import TAGGING_POLICY_KEY
66
62
  from app.usecases.bulk_tag_proposals import apply_bulk_proposals, prepare_proposal_changes
67
63
  from app.services.bulk_operation import bulk_operation_guard
68
64
  from app.services.tab_state import tab_state_store
@@ -79,8 +75,6 @@ def _agent_runtime(*, inference: InferenceAdapter) -> AgentRuntime:
79
75
  context_builder=agent_context_builder,
80
76
  inference=inference,
81
77
  model_policy=SingleModelPolicy(),
82
- permission_policy=AgentPermissionPolicy(),
83
- tool_registry=read_only_agent_tools,
84
78
  trace_store=agent_trace_store,
85
79
  provider_label=inference.provider_label,
86
80
  )
@@ -136,23 +130,6 @@ class CloudPrivacyPreviewResponse(BaseModel):
136
130
  hidden_note_ids: list[str]
137
131
 
138
132
 
139
- class AiSkillDefaultResponse(BaseModel):
140
- skill_id: str
141
- title: str
142
- description: str
143
- trigger_action: str
144
- preference_key: str
145
- content: str
146
- superseded_preference_keys: list[str]
147
-
148
-
149
- class AiPromptDefaultsResponse(BaseModel):
150
- system_prompt: str
151
- final_response_prompt: str
152
- tool_result_prompt: str
153
- skills: list[AiSkillDefaultResponse]
154
-
155
-
156
133
  class AiChatRequest(BaseModel):
157
134
  model_config = ConfigDict(extra="forbid")
158
135
 
@@ -384,32 +361,6 @@ def reset_openai_cost(
384
361
  return _openai_cost_response(openai_cost_tracker.snapshot())
385
362
 
386
363
 
387
- @router.get("/prompts/defaults", response_model=AiPromptDefaultsResponse)
388
- def get_ai_prompt_defaults(
389
- response: Response,
390
- token: Annotated[str, Depends(require_request_auth_token)],
391
- ) -> AiPromptDefaultsResponse:
392
- del token
393
- response.headers["Cache-Control"] = "no-store"
394
- return AiPromptDefaultsResponse(
395
- system_prompt=DEFAULT_AGENT_PROMPTS.system_prompt,
396
- final_response_prompt=DEFAULT_AGENT_PROMPTS.final_response_prompt,
397
- tool_result_prompt=DEFAULT_AGENT_PROMPTS.tool_result_prompt,
398
- skills=[
399
- AiSkillDefaultResponse(
400
- skill_id=skill.skill_id,
401
- title=skill.title,
402
- description=skill.description,
403
- trigger_action=skill.trigger_action,
404
- preference_key=skill.preference_key,
405
- content=skill.content,
406
- superseded_preference_keys=list(skill.superseded_preference_keys),
407
- )
408
- for skill in DEFAULT_AGENT_SKILLS.skills
409
- ],
410
- )
411
-
412
-
413
364
  @router.post(
414
365
  "/cloud-privacy/preview",
415
366
  response_model=CloudPrivacyPreviewResponse,
@@ -637,8 +588,8 @@ def stream_ai_chat(
637
588
  session_key=session_key,
638
589
  )
639
590
  preferences = load_client_preferences(token=token)
640
- prompts = resolve_agent_prompt_set(preferences=preferences)
641
- skills = resolve_agent_skill_set(preferences=preferences)
591
+ prompts = DEFAULT_AGENT_PROMPTS
592
+ skills = DEFAULT_AGENT_SKILLS
642
593
  retrieval_settings = resolve_agent_retrieval_settings(
643
594
  preferences=preferences,
644
595
  provider=payload.provider,
@@ -691,6 +642,7 @@ def stream_ai_chat(
691
642
  model=payload.model,
692
643
  )
693
644
  provider_messages = ai_chat_store.provider_messages(session_key=session_key)
645
+ earlier_actions = ai_chat_store.earlier_actions(session_key=session_key)
694
646
  initial_messages = agent_context_builder.build_initial_messages(
695
647
  canonical_messages=provider_messages,
696
648
  prompts=prompts,
@@ -703,7 +655,7 @@ def stream_ai_chat(
703
655
  events = _stream_runtime_events(payload=payload, openai_api_key=openai_api_key,
704
656
  session_key=session_key, provider_messages=provider_messages, prompts=prompts, skills=skills,
705
657
  retrieval_settings=retrieval_settings, frozen_scope=frozen_scope, tagging_run=tagging_run,
706
- web_settings=web_settings,
658
+ web_settings=web_settings, earlier_actions=earlier_actions,
707
659
  initial_input_tokens=initial_approx_input_tokens)
708
660
 
709
661
  return StreamingResponse(
@@ -722,6 +674,7 @@ async def _stream_runtime_events(
722
674
  provider_messages: list[dict[str, str]], prompts: AgentPromptSet, skills: AgentSkillSet,
723
675
  retrieval_settings: AgentRetrievalSettings, frozen_scope: ScopedSearchSnapshot,
724
676
  tagging_run: TaggingRun, initial_input_tokens: int, web_settings: AgentWebSettings,
677
+ earlier_actions: list[dict[str, object]],
725
678
  ) -> AsyncIterator[dict[str, object]]:
726
679
  action, start_label = 'provider_runtime', 'Connecting to OpenAI API'
727
680
  ready_label = 'OpenAI API ready · 1,050,000-token context'
@@ -731,11 +684,11 @@ async def _stream_runtime_events(
731
684
  approx_input_tokens=initial_input_tokens, output_tokens_received=0, duration_ms=0.0)
732
685
  yield dict(type='action_status', action=action, status='completed', label=ready_label,
733
686
  approx_input_tokens=initial_input_tokens, output_tokens_received=0, duration_ms=0.0)
734
- events = runtime.stream_scoped(session_key=session_key, base_url=base_url,
687
+ events = runtime.stream_agent(session_key=session_key, base_url=base_url,
735
688
  selected_model=payload.model, thinking_level=payload.thinking_level,
736
689
  canonical_messages=provider_messages, prompts=prompts, skills=skills,
737
690
  retrieval_settings=retrieval_settings, web_settings=web_settings,
738
- frozen_scope=frozen_scope, tag_handler=tagging_run.stream)
691
+ frozen_scope=frozen_scope, tagging_run=tagging_run, earlier_actions=earlier_actions)
739
692
  try:
740
693
  async for event in events:
741
694
  yield event
@@ -771,6 +724,8 @@ class BulkAnswerRequest(BaseModel):
771
724
  "prefix_focus_both",
772
725
  "summarize_all",
773
726
  "use_prefix",
727
+ "yes",
728
+ "no",
774
729
  ]
775
730
 
776
731
 
@@ -820,6 +775,4 @@ def manage_bulk_proposals(payload: BulkManageRequest, token: Annotated[str, Depe
820
775
  @router.get("/proposals/settings")
821
776
  def get_tagging_settings(token: Annotated[str, Depends(require_request_auth_token)]):
822
777
  preferences = load_client_preferences(token=token)
823
- return {"policy": preferences.get(TAGGING_POLICY_KEY, ""),
824
- "prompt": preferences.get(TAGGING_PROMPT_KEY, DEFAULT_TAGGING_PROMPT),
825
- "default_prompt": DEFAULT_TAGGING_PROMPT}
778
+ return {"policy": preferences.get(TAGGING_POLICY_KEY, "")}
@@ -20,9 +20,11 @@ from app.api.note_requests import (
20
20
  SearchSuggestionInteractionRequest,
21
21
  TabSearchInteractionRequest,
22
22
  TagSuggestionsRequest,
23
+ DictationPasteRequest,
23
24
  CreateNoteTopRequest,
24
25
  CreateSiblingRequest,
25
26
  CreateChildRequest,
27
+ CreateFilePreviewChildRequest,
26
28
  UpdateNoteRequest,
27
29
  SaveNoteRequest,
28
30
  AddSelectedTextTagRequest,
@@ -61,7 +63,9 @@ from app.services.exception_capture import CapturedExceptionContext
61
63
  from app.usecases.create_note import CmdCreateNote
62
64
  from app.usecases.base import QueryCommand
63
65
  from app.usecases.create_sibling import CmdCreateSibling
66
+ from app.services.file_registry import file_registry
64
67
  from app.usecases.create_child import CmdCreateChild
68
+ from app.usecases.create_file_preview_child import CmdCreateFilePreviewChild
65
69
  from app.usecases.update_content import CmdUpdateContent
66
70
  from app.usecases.prefetch_link_titles import CmdPrefetchLinkTitles
67
71
  from app.usecases.add_selected_text_tag import CmdAddSelectedTextTag
@@ -127,6 +131,7 @@ from app.services.html_export import build_notes_export_filename
127
131
  from app.services.note_fullscreen import build_note_fullscreen_markup
128
132
  from app.services.link_titles import link_title_store
129
133
  from app.services.search_index import search_index
134
+ from app.services.dictation_cleanup import clean_dictated_paste
130
135
  from app.services.tag_suggestions import suggest_tags_for_note
131
136
  from app.services.undo_state import reset_undo_stack
132
137
  from app.usecases.prioritize import list_prioritize_tag_suggestions
@@ -257,12 +262,9 @@ def view_diff(payload: ViewDiffRequest):
257
262
  if normalized_search is not None:
258
263
  if not isinstance(normalized_search, str):
259
264
  raise HTTPException(status_code=400, detail="search must be a string or null")
260
- capture = CapturedExceptionContext(InputRejected, boundary='app/api/routes/notes.py:view_diff:capture')
261
- with capture:
262
- parse_search_query(normalized_search)
263
- if capture.captured_exception is not None:
264
- exc = capture.captured_exception
265
- raise HTTPException(status_code=400, detail=str(exc)) from exc
265
+ # Validated before anything changes; a search that does not parse is
266
+ # answered as rejected input (main.py), shown as a polite warning.
267
+ parse_search_query(normalized_search)
266
268
 
267
269
  maybe_reset_on_context(client_id, undo_context)
268
270
 
@@ -285,14 +287,19 @@ def view_diff(payload: ViewDiffRequest):
285
287
  if tab_view_empty:
286
288
  warm_view = None
287
289
  client_known_note_ids: set[str] = set()
290
+ # The tab's previous root order: a sorted tab keeps the edited note's root there.
291
+ previous_root_ids: list[str] = []
288
292
  if warm_view is not None:
289
293
  client_known_note_ids = set(warm_view.hash_by_id)
294
+ if None in warm_view.children_by_parent:
295
+ previous_root_ids = warm_view.children_by_parent[None]
290
296
 
291
297
  state = build_view_state(
292
298
  editing_note_id=normalized_editing_note_id,
293
299
  search=normalized_search,
294
300
  sort_mode=sort_mode,
295
301
  client_known_note_ids=client_known_note_ids,
302
+ previous_root_ids=previous_root_ids,
296
303
  visible_top_root_id=visible_top_root_id,
297
304
  visible_bottom_root_id=visible_bottom_root_id,
298
305
  is_untagged_view=is_untagged_view,
@@ -549,6 +556,22 @@ def delete_tag_interactions(request: Request) -> Dict[str, object]:
549
556
  return {"deletedCount": deleted_count}
550
557
 
551
558
 
559
+ @router.post("/notes/dictation-paste")
560
+ @transactional_route
561
+ def dictation_paste(payload: DictationPasteRequest) -> Dict[str, object]:
562
+ """Read-only: the cleaned-up text to insert for a paste (docs/ui/dictation-paste.md)."""
563
+ text = clean_dictated_paste(
564
+ text=payload["text"],
565
+ target=payload["target"],
566
+ existing_tag_frequencies=search_index.list_explicit_tag_frequencies(),
567
+ current_value=payload["current_value"],
568
+ quote_open=payload["quote_open"],
569
+ quote_close=payload["quote_close"],
570
+ negate_phrase=payload["negate_phrase"],
571
+ )
572
+ return {"text": text}
573
+
574
+
552
575
  @router.post("/notes/tag-suggestions")
553
576
  @transactional_route
554
577
  def tag_suggestions(payload: TagSuggestionsRequest) -> Dict[str, object]:
@@ -748,6 +771,27 @@ def create_child(request: Request, note_id: str, body: CreateChildRequest):
748
771
  return cmd.execute()
749
772
 
750
773
 
774
+ @router.post("/notes/file-preview-child/{note_id}")
775
+ @transactional_route
776
+ def create_file_preview_child(request: Request, note_id: str, body: CreateFilePreviewChildRequest):
777
+ token = _require_bearer_token(request)
778
+ viewport = _require_viewport(body)
779
+ _require_note_present(note_id, context="notes.file-preview-child")
780
+ file_id = body["fileId"]
781
+ if not file_registry.has_file(file_id):
782
+ raise HTTPException(status_code=404, detail=f"File not found: {file_id}")
783
+ cmd = CmdCreateFilePreviewChild(
784
+ parent_note_id=note_id,
785
+ file_id=file_id,
786
+ search_query=body["search_query"],
787
+ token=token,
788
+ client_id=body["clientId"],
789
+ undo_context=body["undoContext"],
790
+ viewport=viewport,
791
+ )
792
+ return cmd.execute()
793
+
794
+
751
795
  @router.put("/notes/{note_id}")
752
796
  @transactional_route
753
797
  def update_note(request: Request, note_id: str, body: UpdateNoteRequest):
@@ -125,6 +125,8 @@ def assert_mutation_routes_wrapped(app: FastAPI) -> None:
125
125
  def _check_bulk_guard(endpoint_name: str) -> None:
126
126
  if endpoint_name in _STORAGE_TRANSITIONS and bulk_operation_guard.active_mutations > 1:
127
127
  raise HTTPException(status_code=409, detail="Wait for the current request to finish before changing namespace storage.")
128
- permitted = {"answer_bulk_question", "preview_cloud_privacy", "put_ai_debug_details"}
128
+ # Preferences never touch notes, and every operation reads them once when it
129
+ # starts, so saving them (e.g. the chat panel width) cannot disturb it.
130
+ permitted = {"answer_bulk_question", "preview_cloud_privacy", "put_ai_debug_details", "put_client_preferences"}
129
131
  if bulk_operation_guard.operation_id and endpoint_name not in permitted:
130
132
  raise HTTPException(status_code=409, detail="A bulk operation is running. Wait or cancel it before changing the app.")
@@ -14,7 +14,9 @@ CAPTURE_BOUNDARIES = {
14
14
  'app/services/agent/web_fetch.py:_extract_pdf_content:pdf_capture': ('PyPdfError',),
15
15
  'app/services/agent/web_fetch.py:_decode_web_text:encoding_capture': ('LookupError',),
16
16
  'app/services/agent/web_fetch.py:handle_starttag:join_capture': ('ValueError',),
17
- 'app/services/agent/runtime.py:_open_web_action:evidence_capacity_capture': ('WebEvidenceCapacityError',),
17
+ 'app/services/agent/web_actions.py:open_web_pages:evidence_capacity_capture': ('WebEvidenceCapacityError',),
18
+ # A model's tool call is untrusted input; rejected arguments are explained back to the model.
19
+ 'app/services/agent/agent_tools.py:parse_tool_call:arguments_capture': ('ValidationError',),
18
20
  # In-app updates translate only external transport, installation eligibility and job lookup errors.
19
21
  'app/services/app_updates.py:check_for_update:eligibility': ('AppUpdateRejected',),
20
22
  'app/services/app_updates.py:job_path:validation': ('ValueError',),
@@ -86,7 +86,7 @@ from urllib.parse import parse_qsl
86
86
  from urllib.parse import urlencode
87
87
  from urllib.parse import urlsplit
88
88
  from urllib.parse import urlunsplit
89
- from app.services.input_errors import NamespaceInputRejected
89
+ from app.services.input_errors import InputRejected, NamespaceInputRejected
90
90
 
91
91
  logger.remove()
92
92
  logger.add(
@@ -158,6 +158,13 @@ async def request_validation_error(request: Request, exc: RequestValidationError
158
158
  return JSONResponse(status_code=422, content={"detail": summarize_validation_errors(exc.errors())})
159
159
 
160
160
 
161
+ @app.exception_handler(InputRejected)
162
+ async def handle_input_rejected(request: Request, exc: InputRejected):
163
+ # Expected, validated user-input failures (e.g. a search that does not
164
+ # parse): a polite 400 the browser shows as a warning, never a 500.
165
+ return JSONResponse(status_code=400, content={"detail": str(exc), "inputRejected": True})
166
+
167
+
161
168
  @app.exception_handler(OntologyParseError)
162
169
  async def handle_ontology_parse_error(request: Request, exc: OntologyParseError):
163
170
  return JSONResponse(status_code=400, content={"detail": str(exc)})
@@ -17,6 +17,7 @@ from ..services.content_cache import (
17
17
  )
18
18
  from ..services.note_store import store as note_store
19
19
  from app.presentation.render.note_renderer import render_read_only_mode
20
+ from app.services.markdown_rendering import strip_latex_source_attributes
20
21
  from app.db.notes_sql import (
21
22
  fetch_children_ordered,
22
23
  fetch_note,
@@ -652,7 +653,9 @@ def render_note_data_read_only(note_data: Dict[str, Any]) -> Dict[str, Any]:
652
653
  raise TypeError('note_data.children must be a list')
653
654
  child_payloads = [{} for _ in children]
654
655
  rendered.update(node)
655
- rendered['content'] = render_read_only_mode(SimpleNamespace(content=content, tags=tags))
656
+ rendered['content'] = strip_latex_source_attributes(
657
+ render_read_only_mode(SimpleNamespace(content=content, tags=tags))
658
+ )
656
659
  rendered['children'] = child_payloads
657
660
  pending.extend(zip(children, child_payloads))
658
661
  return root
@@ -0,0 +1,59 @@
1
+ """The agent's own record of what it did for an answer.
2
+
3
+ Each tool call becomes one short entry: what was asked and what came of it,
4
+ never the content a tool returned (page text and notes can be huge, and the
5
+ model can read them again). The entries are kept with the answer for the rest of
6
+ the chat and given to the model on later turns, so a question such as "did you
7
+ search the web for that?" is answered from what actually happened. Only the
8
+ model sees them.
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ import json
14
+
15
+
16
+ _NOTE_READ_TOOLS = frozenset({"read_view_notes", "search_view_notes"})
17
+ _OPERATION_TOOLS = frozenset({"summarize_view", "propose_tag_generation", "propose_tag_review"})
18
+ _KNOWN_TOOLS = _NOTE_READ_TOOLS | _OPERATION_TOOLS | {
19
+ "lookup_metalist_help", "view_overview", "open_web_pages", "open_menu",
20
+ }
21
+
22
+
23
+ def describe_action(*, name: str, arguments: str, result_content: str, is_error: bool) -> dict[str, object]:
24
+ """One log entry for a tool call, from its JSON arguments and JSON result."""
25
+ # A rejected call may name a tool that does not exist: it is still recorded.
26
+ if is_error:
27
+ return {"tool": name, "rejected": True}
28
+ if name not in _KNOWN_TOOLS:
29
+ raise ValueError(f"No action log entry for unknown tool: {name!r}")
30
+ parsed_arguments = json.loads(arguments)
31
+ assert isinstance(parsed_arguments, dict), "Tool arguments are a JSON object"
32
+ if name in _OPERATION_TOOLS:
33
+ return {"tool": name, "arguments": parsed_arguments}
34
+ result = json.loads(result_content)
35
+ assert isinstance(result, dict), "Tool results are a JSON object"
36
+ if name == "lookup_metalist_help":
37
+ return {"tool": name, "topics": list(parsed_arguments["topics"])}
38
+ if name == "view_overview":
39
+ return {"tool": name, "notes_in_view": result["note_count"], "trees_in_view": result["tree_count"]}
40
+ if name == "open_menu":
41
+ return {"tool": name, "menu": result["label"], "status": result["status"]}
42
+ if name == "open_web_pages":
43
+ return {"tool": name, "pages": [_page_entry(page) for page in result["pages"]]}
44
+ entry: dict[str, object] = {"tool": name}
45
+ if name == "search_view_notes":
46
+ entry["query"] = parsed_arguments["query"]
47
+ entry["matching_notes"] = result["matching_note_count"]
48
+ entry["trees_read"] = len(result["trees"])
49
+ entry["trees_left_unread"] = len(result["unread_root_ids"])
50
+ entry["trees_too_large"] = len(result["too_large_root_ids"])
51
+ return entry
52
+
53
+
54
+ def _page_entry(page: dict[str, object]) -> dict[str, object]:
55
+ """The address as asked, whether it opened, and its title when it did."""
56
+ title = ""
57
+ if page["status"] == "ok":
58
+ title = page["title"]
59
+ return {"url": page["requested_url"], "status": page["status"], "title": title}