MetaList 0.2.0__tar.gz → 0.3.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.
- {metalist-0.2.0/metalist.egg-info → metalist-0.3.0}/PKG-INFO +17 -19
- {metalist-0.2.0 → metalist-0.3.0}/README.md +2 -2
- {metalist-0.2.0 → metalist-0.3.0}/app/api/routes/auth.py +18 -34
- {metalist-0.2.0 → metalist-0.3.0}/app/config.py +1 -2
- {metalist-0.2.0 → metalist-0.3.0}/app/db/schema.py +0 -14
- {metalist-0.2.0 → metalist-0.3.0}/app/db/settings_sql.py +0 -56
- {metalist-0.2.0 → metalist-0.3.0}/app/main.py +0 -18
- {metalist-0.2.0 → metalist-0.3.0}/app/services/auth_service.py +0 -49
- {metalist-0.2.0 → metalist-0.3.0}/app/services/client_state_service.py +11 -172
- {metalist-0.2.0 → metalist-0.3.0}/app/services/hydration_state.py +1 -2
- {metalist-0.2.0 → metalist-0.3.0}/app/services/latex_rendering.py +14 -25
- {metalist-0.2.0 → metalist-0.3.0}/app/services/markdown_rendering.py +0 -165
- {metalist-0.2.0 → metalist-0.3.0}/app/services/namespace_switcher.py +8 -33
- {metalist-0.2.0 → metalist-0.3.0}/app/services/note_store.py +2 -17
- {metalist-0.2.0 → metalist-0.3.0}/app/services/search_index.py +3 -90
- {metalist-0.2.0 → metalist-0.3.0}/app/services/sound_storage.py +1 -1
- {metalist-0.2.0 → metalist-0.3.0}/app/services/tag_suggestions.py +15 -235
- {metalist-0.2.0 → metalist-0.3.0}/app/services/tag_term_matching.py +5 -44
- {metalist-0.2.0 → metalist-0.3.0}/app/static/css/main.css +6 -12
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/auth.js +39 -66
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/client-state-api.js +3 -13
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/login-namespace-picker.js +0 -13
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/modals/namespace-modals.js +12 -5
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/events/context-menu-events.js +25 -30
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/events/keyboard-events.js +5 -1
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/html-paste-sanitizer-service.js +9 -45
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/search-suggestions-service.js +0 -3
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/tag-bar-service.js +1 -1
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/tag-suggestions-service.js +0 -3
- {metalist-0.2.0 → metalist-0.3.0}/main.py +0 -34
- {metalist-0.2.0 → metalist-0.3.0/metalist.egg-info}/PKG-INFO +17 -19
- {metalist-0.2.0 → metalist-0.3.0}/metalist.egg-info/SOURCES.txt +0 -4
- {metalist-0.2.0 → metalist-0.3.0}/metalist.egg-info/entry_points.txt +0 -1
- metalist-0.3.0/metalist.egg-info/requires.txt +18 -0
- {metalist-0.2.0 → metalist-0.3.0}/pyproject.toml +16 -22
- metalist-0.2.0/app/db/migrations.py +0 -166
- metalist-0.2.0/app/encryption_audit.py +0 -776
- metalist-0.2.0/app/static/js/modules/mode-manager/services/context-menu-target-service.js +0 -78
- metalist-0.2.0/app/version.py +0 -3
- metalist-0.2.0/metalist.egg-info/requires.txt +0 -20
- {metalist-0.2.0 → metalist-0.3.0}/MANIFEST.in +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/__init__.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/api/__init__.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/api/deps.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/api/dev.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/api/middleware/auth.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/api/request_auth.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/api/routes/backups.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/api/routes/files.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/api/routes/mcp.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/api/routes/memory.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/api/routes/notes.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/api/routes/ontology.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/api/routes/reminders.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/api/routes/sounds.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/api/routes/test.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/api/transactions.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/db/__init__.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/db/backup_settings_sql.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/db/engine.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/db/file_schema.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/db/file_session.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/db/files_sql.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/db/link_titles_sql.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/db/notes_sql.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/db/ontology_rules_sql.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/db/reminders_sql.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/db/search_history_sql.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/db/session.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/db/sounds_sql.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/db/tab_state_sql.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/mcp/__init__.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/mcp/__main__.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/mcp/errors.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/mcp/policy.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/mcp/read_service.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/mcp/server.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/mcp/tools.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/models/commands.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/models/database.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/models/entities.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/models/enums.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/models/linked_list.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/models/list_operations.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/models/list_traversal.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/models/note_crud.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/models/utils.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/presentation/__init__.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/presentation/render/__init__.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/presentation/render/note_renderer.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/presentation/templates.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/security/encryption.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/server_runtime.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/__init__.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/auth.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/auth_cache_state.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/backlinks.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/backup_service.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/backup_settings_service.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/base_service.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/content_cache.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/content_formatting.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/date_filtering.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/dependencies.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/diagnostics.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/embedded_references.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/encryption.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/exception_capture.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/file_registry.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/file_storage.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/html_export.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/html_unformatting.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/integrity.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/link_titles.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/login_rate_limit.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/maintenance_mode.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/memory.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/memory_service.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/namespace_deletion_jobs.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/namespace_deletion_worker.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/note_image_tags.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/note_service.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/ontology_rules_store.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/query_service.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/reminders.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/root_sorting.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/runtime_hardening.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/search_history.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/search_query.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/search_text.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/session_timeout_service.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/shell_session_service.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/snapshot.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/store.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/sync.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/sync_state.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/tab_state.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/tag_case.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/tag_ontology.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/tag_rename.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/test_reset.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/tokens.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/transaction_manager.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/undo_service.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/undo_state.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/view_cache.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/view_diff.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/services/view_state.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/startup_js_sanity.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/startup_sanity.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/startup_sanity_config.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/config/command_palette_tags.json +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/css/forms.css +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/img/favicon.ico +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/locked.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/main.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/activity-tracker.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/api-client.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/async-result.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/client-state-migration.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/command-palette/click-activation-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/command-palette/command-palette-controller.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/command-palette/endpoint-registry.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/command-palette/preferences-store.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/command-palette/tag-config-loader.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/command-palette/usage-store.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/config.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/connectivity-monitor.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/context-menu/context-menu-registry.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/context-menu/context-menu-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/context-menu/input-caret-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/dom-utils-fixed.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/dom-utils.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/editor-commands.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/editor-selection.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/editor-toolbar.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/error-handler.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/error-overlay.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/location-flags.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/modals/alphabetize-root-notes-modal.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/modals/backup-restore-modal.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/modals/backup-result-modal.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/modals/backup-retention-modal.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/modals/backup-settings-modal.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/modals/base-modal.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/modals/delete-namespace-modal.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/modals/delete-namespace-validation.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/modals/help-modal.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/modals/memory-modal.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/modals/namespace-loading-page.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/modals/ontology-modal.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/modals/password-modal.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/modals/prioritize-modal.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/modals/random-password-modal.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/modals/reminder-modal.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/modals/reset-updated-at-modal.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/modals/session-timeout-modal.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/modals/sound-manager-modal.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/modals/version-info-modal.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/actions/content-actions.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/actions/history-actions.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/actions/note-actions.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/actions/search-actions.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/actions/selection-actions.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/actions/ui-actions.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/events/focus-events.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/events/inactivity-events.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/events/input-events.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/events/mouse-events.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/events/search-events.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/mode-context.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/mode-logger.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/mode-manager-controller.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/animated-scroll-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/backlinks-panel-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/clipboard-shortcut-policy-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/collapse-affordance-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/collapse-editing-policy-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/command-gate-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/date-filter-indicator-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/date-filter-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/differential-view-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/edit-session-collapse-policy-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/edit-session-collapse-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/embedded-image-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/file-image-preview-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/file-reference-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/filtered-refresh-selection-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/image-context-menu-action-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/image-file-insert-choice-modal-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/infinite-scroll-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/link-context-menu-action-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/markdown-render-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/note-click-target-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/note-clipboard-write-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/note-collapse-animation-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/note-context-menu-action-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/note-drag-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/note-reposition-animation-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/note-split-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/password-clipboard-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/polling-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/rhs-panel-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/root-date-separator-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/root-sort-indicator-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/root-sort-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/scroll-anchor-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/scroll-restoration-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/scroll-to-top-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/search-contexts-overlay-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/search-debounce-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/search-input-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/search-interaction-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/search-redaction-reveal-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/search-syntax-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/shell-output-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/tab-dom-cache-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/tab-duplication-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/tab-state-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/tag-syntax-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/todo-toggle-editing-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/mode-manager/services/view-mode-search-shortcut-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/password-generator.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/reminder-store.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/reminder-surface-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/selection-markers.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/session-auth.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/sound-service.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/tag-token.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/modules/uuid.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/namespace-deleted.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/js/vendor/markdown-it.min.js +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/static/video/login-startup.mp4 +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/templates/base.html +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/templates/index.html +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/templates/locked.html +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/templates/maintenance.html +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/templates/namespace_deleted.html +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/templates/notes_list.html +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/usecases/__init__.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/usecases/alphabetize_root_notes.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/usecases/base.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/usecases/collapse.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/usecases/copy_note.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/usecases/create_child.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/usecases/create_note.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/usecases/create_sibling.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/usecases/delete_subtree.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/usecases/expand.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/usecases/indent.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/usecases/lock.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/usecases/move.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/usecases/move_to_top.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/usecases/outdent.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/usecases/paste_child.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/usecases/paste_sibling.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/usecases/prioritize.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/usecases/record_edit_mode.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/usecases/redo.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/usecases/rename_tag.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/usecases/reset_updated_at.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/usecases/run_shell.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/usecases/search_comment_autofill.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/usecases/search_context_tags.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/usecases/set_collapse_bulk.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/usecases/set_collapse_in_context.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/usecases/split_note.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/usecases/toggle_reference_mode.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/usecases/toggle_todo_done.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/usecases/undo.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/usecases/unformat_content.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/usecases/update_content.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/usecases/view.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/utils/__init__.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/utils/encryption.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/app/utils/text_utils.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/convert-from-legacy.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/mcp_client.py +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/metalist.egg-info/dependency_links.txt +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/metalist.egg-info/top_level.txt +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/scripts/generate-lan-cert.sh +0 -0
- {metalist-0.2.0 → metalist-0.3.0}/setup.cfg +0 -0
|
@@ -1,31 +1,29 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: metalist
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.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
|
|
7
7
|
Project-URL: Issues, https://github.com/evolvingstuff/metalist/issues
|
|
8
|
-
Requires-Python:
|
|
8
|
+
Requires-Python: >=3.10
|
|
9
9
|
Description-Content-Type: text/markdown
|
|
10
|
-
Requires-Dist: argon2-cffi==
|
|
11
|
-
Requires-Dist: cryptography==
|
|
12
|
-
Requires-Dist: fastapi==0.
|
|
13
|
-
Requires-Dist: httpx==0.28.1
|
|
10
|
+
Requires-Dist: argon2-cffi==23.1.0
|
|
11
|
+
Requires-Dist: cryptography==42.0.5
|
|
12
|
+
Requires-Dist: fastapi==0.110.0
|
|
14
13
|
Requires-Dist: latex2mathml==3.81.0
|
|
15
|
-
Requires-Dist: loguru==0.7.
|
|
16
|
-
Requires-Dist: Mako==1.3.
|
|
17
|
-
Requires-Dist: mutagen==1.
|
|
18
|
-
Requires-Dist: pydantic==2.
|
|
19
|
-
Requires-Dist: python-multipart==0.0.
|
|
20
|
-
Requires-Dist: starlette==
|
|
21
|
-
Requires-Dist: tqdm==4.70.0
|
|
14
|
+
Requires-Dist: loguru==0.7.2
|
|
15
|
+
Requires-Dist: Mako==1.3.2
|
|
16
|
+
Requires-Dist: mutagen==1.47.0
|
|
17
|
+
Requires-Dist: pydantic==2.9.2
|
|
18
|
+
Requires-Dist: python-multipart==0.0.9
|
|
19
|
+
Requires-Dist: starlette==0.36.3
|
|
22
20
|
Requires-Dist: tree-sitter==0.25.2
|
|
23
21
|
Requires-Dist: tree-sitter-javascript==0.25.0
|
|
24
|
-
Requires-Dist: uvicorn==0.
|
|
22
|
+
Requires-Dist: uvicorn==0.27.1
|
|
25
23
|
Provides-Extra: dev
|
|
26
|
-
Requires-Dist: hypothesis==6.
|
|
27
|
-
Requires-Dist: pytest==
|
|
28
|
-
Requires-Dist: pytest-cov==
|
|
24
|
+
Requires-Dist: hypothesis==6.112.0; extra == "dev"
|
|
25
|
+
Requires-Dist: pytest==8.0.0; extra == "dev"
|
|
26
|
+
Requires-Dist: pytest-cov==4.1.0; extra == "dev"
|
|
29
27
|
|
|
30
28
|
# MetaList
|
|
31
29
|
|
|
@@ -259,11 +257,11 @@ uv tool install metalist
|
|
|
259
257
|
metalist
|
|
260
258
|
```
|
|
261
259
|
|
|
262
|
-
This repo now packages itself under the PyPI distribution name `metalist`.
|
|
260
|
+
This repo now packages itself under the PyPI distribution name `metalist`. The remaining release step is publishing version `0.3.0` to the existing PyPI project.
|
|
263
261
|
|
|
264
262
|
Recommended release path:
|
|
265
263
|
1. In the existing PyPI project `metalist`, configure GitHub Trusted Publishing for `evolvingstuff/metalist` and the workflow file `.github/workflows/publish-pypi.yml`.
|
|
266
|
-
2. Push a tag such as `v0.
|
|
264
|
+
2. Push a tag such as `v0.3.0`.
|
|
267
265
|
3. After the GitHub Actions workflow completes, users can run it with `uvx metalist`, install it persistently with `uv tool install metalist`, or install it with `pip install metalist`.
|
|
268
266
|
|
|
269
267
|
If `--input` is omitted, a file picker opens (when `tkinter` is available).
|
|
@@ -230,11 +230,11 @@ uv tool install metalist
|
|
|
230
230
|
metalist
|
|
231
231
|
```
|
|
232
232
|
|
|
233
|
-
This repo now packages itself under the PyPI distribution name `metalist`.
|
|
233
|
+
This repo now packages itself under the PyPI distribution name `metalist`. The remaining release step is publishing version `0.3.0` to the existing PyPI project.
|
|
234
234
|
|
|
235
235
|
Recommended release path:
|
|
236
236
|
1. In the existing PyPI project `metalist`, configure GitHub Trusted Publishing for `evolvingstuff/metalist` and the workflow file `.github/workflows/publish-pypi.yml`.
|
|
237
|
-
2. Push a tag such as `v0.
|
|
237
|
+
2. Push a tag such as `v0.3.0`.
|
|
238
238
|
3. After the GitHub Actions workflow completes, users can run it with `uvx metalist`, install it persistently with `uv tool install metalist`, or install it with `pip install metalist`.
|
|
239
239
|
|
|
240
240
|
If `--input` is omitted, a file picker opens (when `tkinter` is available).
|
|
@@ -408,16 +408,7 @@ def _verify_namespace_password(*, namespace: str, password: str) -> None:
|
|
|
408
408
|
raise HTTPException(status_code=401, detail="Invalid password")
|
|
409
409
|
|
|
410
410
|
|
|
411
|
-
def _run_hydration(
|
|
412
|
-
hydration_state.set_phase(
|
|
413
|
-
phase="database_check",
|
|
414
|
-
message="Database is up to date",
|
|
415
|
-
total=1,
|
|
416
|
-
)
|
|
417
|
-
hydration_state.update(1)
|
|
418
|
-
if not rebuild_required:
|
|
419
|
-
hydration_state.finish()
|
|
420
|
-
return
|
|
411
|
+
def _run_hydration() -> None:
|
|
421
412
|
session = SafeSession()
|
|
422
413
|
try:
|
|
423
414
|
prefetched_rows = populate_cache_from_db(session)
|
|
@@ -440,7 +431,7 @@ def _on_hydration_done(future: Future) -> None:
|
|
|
440
431
|
hydration_state.fail(str(error))
|
|
441
432
|
|
|
442
433
|
|
|
443
|
-
def _start_hydration(
|
|
434
|
+
def _start_hydration(first_load: bool) -> None:
|
|
444
435
|
global _hydration_future
|
|
445
436
|
with _hydration_lock:
|
|
446
437
|
if _hydration_future is not None and not _hydration_future.done():
|
|
@@ -449,10 +440,7 @@ def _start_hydration(*, first_load: bool, rebuild_required: bool) -> None:
|
|
|
449
440
|
first_load=first_load,
|
|
450
441
|
message="Preparing encrypted data",
|
|
451
442
|
)
|
|
452
|
-
_hydration_future = _hydration_executor.submit(
|
|
453
|
-
_run_hydration,
|
|
454
|
-
rebuild_required=rebuild_required,
|
|
455
|
-
)
|
|
443
|
+
_hydration_future = _hydration_executor.submit(_run_hydration)
|
|
456
444
|
_hydration_future.add_done_callback(_on_hydration_done)
|
|
457
445
|
|
|
458
446
|
|
|
@@ -461,7 +449,7 @@ def _build_hydration_status() -> HydrationStatusResponse:
|
|
|
461
449
|
if not auth_cache_state.cache_refresh_needed() and snapshot["status"] == "idle":
|
|
462
450
|
snapshot["status"] = "ready"
|
|
463
451
|
snapshot["phase"] = "complete"
|
|
464
|
-
snapshot["message"] = "
|
|
452
|
+
snapshot["message"] = "Hydration complete"
|
|
465
453
|
snapshot["overall_percent"] = 100
|
|
466
454
|
return HydrationStatusResponse(**snapshot)
|
|
467
455
|
|
|
@@ -636,7 +624,6 @@ def login(
|
|
|
636
624
|
raise HTTPException(status_code=401, detail="Invalid password")
|
|
637
625
|
|
|
638
626
|
dek = auth.unwrap_dek_for_password(payload.password)
|
|
639
|
-
auth.run_authenticated_database_migrations(dek=dek)
|
|
640
627
|
|
|
641
628
|
set_session_dek(dek)
|
|
642
629
|
ensure_rules_decrypted_and_compiled(token="")
|
|
@@ -645,13 +632,17 @@ def login(
|
|
|
645
632
|
reminder_store.ensure_decrypted(token="")
|
|
646
633
|
search_history_store.ensure_decrypted(token="")
|
|
647
634
|
|
|
635
|
+
needs_hydration = auth_cache_state.cache_refresh_needed()
|
|
636
|
+
if not note_store.loaded:
|
|
637
|
+
needs_hydration = True
|
|
638
|
+
|
|
648
639
|
token = token_service.create_token(_client_info(request), tab_id, dek=dek)
|
|
649
640
|
set_auth_cookie(request=request, response=response, token=token)
|
|
650
641
|
login_rate_limiter.record_success(rate_limit_key)
|
|
651
642
|
clear_all_locks()
|
|
652
643
|
return LoginResponse(
|
|
653
644
|
message="Login successful",
|
|
654
|
-
hydration_required=
|
|
645
|
+
hydration_required=needs_hydration,
|
|
655
646
|
)
|
|
656
647
|
|
|
657
648
|
|
|
@@ -755,11 +746,6 @@ def auth_status(
|
|
|
755
746
|
database_user_version = database_user_version_row[0]
|
|
756
747
|
if not isinstance(database_user_version, int) or database_user_version < 0:
|
|
757
748
|
raise RuntimeError(f"Invalid database user_version: {database_user_version!r}")
|
|
758
|
-
client_preferences: dict[str, str] = {}
|
|
759
|
-
if not bool(settings and settings.encryption_enabled):
|
|
760
|
-
client_preferences = load_client_preferences(token="")
|
|
761
|
-
elif token is not None:
|
|
762
|
-
client_preferences = load_client_preferences(token=token)
|
|
763
749
|
return {
|
|
764
750
|
"version": VERSION,
|
|
765
751
|
"database_user_version": database_user_version,
|
|
@@ -774,13 +760,14 @@ def auth_status(
|
|
|
774
760
|
"cache_ready": not auth_cache_state.cache_refresh_needed(),
|
|
775
761
|
"namespace": ACTIVE_NAMESPACE,
|
|
776
762
|
"link_title_revision": link_title_store.get_revision(),
|
|
777
|
-
"client_preferences":
|
|
763
|
+
"client_preferences": load_client_preferences(),
|
|
778
764
|
}
|
|
779
765
|
|
|
780
766
|
|
|
781
767
|
@router.get("/client-state", response_model=ClientStateResponse)
|
|
782
768
|
def get_client_state(token: Annotated[str, Depends(_require_auth)]):
|
|
783
|
-
|
|
769
|
+
del token
|
|
770
|
+
payload = load_client_state()
|
|
784
771
|
return ClientStateResponse(**payload)
|
|
785
772
|
|
|
786
773
|
|
|
@@ -790,7 +777,8 @@ def put_client_preferences(
|
|
|
790
777
|
payload: ClientPreferencesUpdateRequest,
|
|
791
778
|
token: Annotated[str, Depends(_require_auth)],
|
|
792
779
|
):
|
|
793
|
-
|
|
780
|
+
del token
|
|
781
|
+
normalized = save_client_preferences(preferences=payload.preferences)
|
|
794
782
|
return ClientPreferencesResponse(preferences=normalized)
|
|
795
783
|
|
|
796
784
|
|
|
@@ -800,10 +788,8 @@ def put_command_palette_usage(
|
|
|
800
788
|
payload: CommandPaletteUsageUpdateRequest,
|
|
801
789
|
token: Annotated[str, Depends(_require_auth)],
|
|
802
790
|
):
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
token=token,
|
|
806
|
-
)
|
|
791
|
+
del token
|
|
792
|
+
normalized = save_command_palette_usage(usage_state=payload.command_palette_usage)
|
|
807
793
|
return CommandPaletteUsageResponse(command_palette_usage=normalized)
|
|
808
794
|
|
|
809
795
|
|
|
@@ -1081,10 +1067,8 @@ def hydrate_cache(
|
|
|
1081
1067
|
if not note_store.loaded:
|
|
1082
1068
|
needs_hydration = True
|
|
1083
1069
|
|
|
1084
|
-
|
|
1085
|
-
first_load=auth_cache_state.cache_refresh_needed()
|
|
1086
|
-
rebuild_required=needs_hydration,
|
|
1087
|
-
)
|
|
1070
|
+
if needs_hydration:
|
|
1071
|
+
_start_hydration(first_load=auth_cache_state.cache_refresh_needed())
|
|
1088
1072
|
|
|
1089
1073
|
return _build_hydration_status()
|
|
1090
1074
|
|
|
@@ -5,9 +5,8 @@ from app.server_runtime import resolve_api_prefix
|
|
|
5
5
|
from app.server_runtime import resolve_database_runtime_config
|
|
6
6
|
from app.server_runtime import resolve_default_database_path
|
|
7
7
|
from app.server_runtime import resolve_v1_api_prefix
|
|
8
|
-
from app.version import __version__
|
|
9
8
|
|
|
10
|
-
VERSION =
|
|
9
|
+
VERSION = "0.3.0"
|
|
11
10
|
|
|
12
11
|
|
|
13
12
|
def _env_flag(name: str, default: bool) -> bool:
|
|
@@ -64,14 +64,7 @@ CREATE TABLE IF NOT EXISTS {APP_SETTINGS_TABLE} (
|
|
|
64
64
|
backup_settings_encryption_nonce BLOB,
|
|
65
65
|
backup_settings_encryption_tag BLOB,
|
|
66
66
|
client_preferences_json TEXT,
|
|
67
|
-
client_preferences_encryption_nonce BLOB,
|
|
68
|
-
client_preferences_encryption_tag BLOB,
|
|
69
67
|
command_palette_usage_json TEXT,
|
|
70
|
-
command_palette_usage_encryption_nonce BLOB,
|
|
71
|
-
command_palette_usage_encryption_tag BLOB,
|
|
72
|
-
tag_prefix_settings_json TEXT,
|
|
73
|
-
tag_prefix_settings_encryption_nonce BLOB,
|
|
74
|
-
tag_prefix_settings_encryption_tag BLOB,
|
|
75
68
|
session_timeout_minutes INTEGER,
|
|
76
69
|
created_at TEXT NOT NULL,
|
|
77
70
|
updated_at TEXT NOT NULL
|
|
@@ -217,14 +210,7 @@ def initialize_schema(connection: Connection) -> None:
|
|
|
217
210
|
"backup_settings_encryption_nonce": "BLOB",
|
|
218
211
|
"backup_settings_encryption_tag": "BLOB",
|
|
219
212
|
"client_preferences_json": "TEXT",
|
|
220
|
-
"client_preferences_encryption_nonce": "BLOB",
|
|
221
|
-
"client_preferences_encryption_tag": "BLOB",
|
|
222
213
|
"command_palette_usage_json": "TEXT",
|
|
223
|
-
"command_palette_usage_encryption_nonce": "BLOB",
|
|
224
|
-
"command_palette_usage_encryption_tag": "BLOB",
|
|
225
|
-
"tag_prefix_settings_json": "TEXT",
|
|
226
|
-
"tag_prefix_settings_encryption_nonce": "BLOB",
|
|
227
|
-
"tag_prefix_settings_encryption_tag": "BLOB",
|
|
228
214
|
"session_timeout_minutes": "INTEGER",
|
|
229
215
|
},
|
|
230
216
|
)
|
|
@@ -51,22 +51,7 @@ def fetch_settings(connection: GuardedConnection | sqlite3.Connection) -> Option
|
|
|
51
51
|
"backup_settings_encryption_nonce": row["backup_settings_encryption_nonce"],
|
|
52
52
|
"backup_settings_encryption_tag": row["backup_settings_encryption_tag"],
|
|
53
53
|
"client_preferences_json": row["client_preferences_json"],
|
|
54
|
-
"client_preferences_encryption_nonce": row["client_preferences_encryption_nonce"],
|
|
55
|
-
"client_preferences_encryption_tag": row["client_preferences_encryption_tag"],
|
|
56
54
|
"command_palette_usage_json": row["command_palette_usage_json"],
|
|
57
|
-
"command_palette_usage_encryption_nonce": row[
|
|
58
|
-
"command_palette_usage_encryption_nonce"
|
|
59
|
-
],
|
|
60
|
-
"command_palette_usage_encryption_tag": row[
|
|
61
|
-
"command_palette_usage_encryption_tag"
|
|
62
|
-
],
|
|
63
|
-
"tag_prefix_settings_json": row["tag_prefix_settings_json"],
|
|
64
|
-
"tag_prefix_settings_encryption_nonce": row[
|
|
65
|
-
"tag_prefix_settings_encryption_nonce"
|
|
66
|
-
],
|
|
67
|
-
"tag_prefix_settings_encryption_tag": row[
|
|
68
|
-
"tag_prefix_settings_encryption_tag"
|
|
69
|
-
],
|
|
70
55
|
"session_timeout_minutes": row["session_timeout_minutes"],
|
|
71
56
|
"created_at": datetime.fromisoformat(row["created_at"]),
|
|
72
57
|
"updated_at": datetime.fromisoformat(row["updated_at"]),
|
|
@@ -183,8 +168,6 @@ def update_client_preferences_json(
|
|
|
183
168
|
connection: GuardedConnection | sqlite3.Connection,
|
|
184
169
|
*,
|
|
185
170
|
client_preferences_json: str,
|
|
186
|
-
client_preferences_encryption_nonce: bytes | None,
|
|
187
|
-
client_preferences_encryption_tag: bytes | None,
|
|
188
171
|
) -> None:
|
|
189
172
|
if not isinstance(client_preferences_json, str):
|
|
190
173
|
raise TypeError("client_preferences_json must be a string")
|
|
@@ -194,15 +177,11 @@ def update_client_preferences_json(
|
|
|
194
177
|
f"""
|
|
195
178
|
UPDATE {APP_SETTINGS_TABLE}
|
|
196
179
|
SET client_preferences_json = ?,
|
|
197
|
-
client_preferences_encryption_nonce = ?,
|
|
198
|
-
client_preferences_encryption_tag = ?,
|
|
199
180
|
updated_at = ?
|
|
200
181
|
WHERE id = 1
|
|
201
182
|
""",
|
|
202
183
|
(
|
|
203
184
|
client_preferences_json,
|
|
204
|
-
client_preferences_encryption_nonce,
|
|
205
|
-
client_preferences_encryption_tag,
|
|
206
185
|
_serialize_datetime(datetime.now(timezone.utc)),
|
|
207
186
|
),
|
|
208
187
|
)
|
|
@@ -212,8 +191,6 @@ def update_command_palette_usage_json(
|
|
|
212
191
|
connection: GuardedConnection | sqlite3.Connection,
|
|
213
192
|
*,
|
|
214
193
|
command_palette_usage_json: str,
|
|
215
|
-
command_palette_usage_encryption_nonce: bytes | None,
|
|
216
|
-
command_palette_usage_encryption_tag: bytes | None,
|
|
217
194
|
) -> None:
|
|
218
195
|
if not isinstance(command_palette_usage_json, str):
|
|
219
196
|
raise TypeError("command_palette_usage_json must be a string")
|
|
@@ -223,44 +200,11 @@ def update_command_palette_usage_json(
|
|
|
223
200
|
f"""
|
|
224
201
|
UPDATE {APP_SETTINGS_TABLE}
|
|
225
202
|
SET command_palette_usage_json = ?,
|
|
226
|
-
command_palette_usage_encryption_nonce = ?,
|
|
227
|
-
command_palette_usage_encryption_tag = ?,
|
|
228
203
|
updated_at = ?
|
|
229
204
|
WHERE id = 1
|
|
230
205
|
""",
|
|
231
206
|
(
|
|
232
207
|
command_palette_usage_json,
|
|
233
|
-
command_palette_usage_encryption_nonce,
|
|
234
|
-
command_palette_usage_encryption_tag,
|
|
235
|
-
_serialize_datetime(datetime.now(timezone.utc)),
|
|
236
|
-
),
|
|
237
|
-
)
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
def update_tag_prefix_settings_json(
|
|
241
|
-
connection: GuardedConnection | sqlite3.Connection,
|
|
242
|
-
*,
|
|
243
|
-
tag_prefix_settings_json: str,
|
|
244
|
-
tag_prefix_settings_encryption_nonce: bytes | None,
|
|
245
|
-
tag_prefix_settings_encryption_tag: bytes | None,
|
|
246
|
-
) -> None:
|
|
247
|
-
if not isinstance(tag_prefix_settings_json, str):
|
|
248
|
-
raise TypeError("tag_prefix_settings_json must be a string")
|
|
249
|
-
|
|
250
|
-
conn = _conn(connection)
|
|
251
|
-
conn.execute(
|
|
252
|
-
f"""
|
|
253
|
-
UPDATE {APP_SETTINGS_TABLE}
|
|
254
|
-
SET tag_prefix_settings_json = ?,
|
|
255
|
-
tag_prefix_settings_encryption_nonce = ?,
|
|
256
|
-
tag_prefix_settings_encryption_tag = ?,
|
|
257
|
-
updated_at = ?
|
|
258
|
-
WHERE id = 1
|
|
259
|
-
""",
|
|
260
|
-
(
|
|
261
|
-
tag_prefix_settings_json,
|
|
262
|
-
tag_prefix_settings_encryption_nonce,
|
|
263
|
-
tag_prefix_settings_encryption_tag,
|
|
264
208
|
_serialize_datetime(datetime.now(timezone.utc)),
|
|
265
209
|
),
|
|
266
210
|
)
|
|
@@ -10,9 +10,6 @@ from .api.middleware.auth import AuthMiddleware
|
|
|
10
10
|
from app.config import ACTIVE_NAMESPACE, STARTUP_ANIMATION_ENABLED, VERSION
|
|
11
11
|
from .db.session import begin_writer, enable_read_guard
|
|
12
12
|
from .db.schema import initialize_schema
|
|
13
|
-
from .db.migrations import CURRENT_DATABASE_VERSION
|
|
14
|
-
from .db.migrations import read_database_version
|
|
15
|
-
from .db.migrations import run_database_migrations
|
|
16
13
|
from .db.notes_sql import clear_encryption_metadata_for_empty_notes
|
|
17
14
|
from .db.settings_sql import fetch_settings, insert_default_settings
|
|
18
15
|
from .api.deps import get_db
|
|
@@ -156,21 +153,6 @@ with begin_writer() as connection:
|
|
|
156
153
|
settings = fetch_settings(connection)
|
|
157
154
|
if not settings:
|
|
158
155
|
insert_default_settings(connection)
|
|
159
|
-
settings = fetch_settings(connection)
|
|
160
|
-
if settings is None:
|
|
161
|
-
raise RuntimeError("App settings missing after schema initialization")
|
|
162
|
-
database_version = read_database_version(connection.raw_connection)
|
|
163
|
-
if database_version > CURRENT_DATABASE_VERSION:
|
|
164
|
-
raise RuntimeError(
|
|
165
|
-
f"Database version {database_version} is newer than supported version "
|
|
166
|
-
f"{CURRENT_DATABASE_VERSION}"
|
|
167
|
-
)
|
|
168
|
-
if not bool(settings["encryption_enabled"]):
|
|
169
|
-
run_database_migrations(
|
|
170
|
-
connection=connection.raw_connection,
|
|
171
|
-
encryption_enabled=False,
|
|
172
|
-
encryption_service=None,
|
|
173
|
-
)
|
|
174
156
|
bootstrap_ontology_rules_store(connection=connection)
|
|
175
157
|
tab_state_store.bootstrap(connection=connection)
|
|
176
158
|
link_title_store.bootstrap(connection=connection)
|
|
@@ -19,10 +19,6 @@ from app.config import (
|
|
|
19
19
|
VAULT_VERSION,
|
|
20
20
|
)
|
|
21
21
|
from app.db.session import begin_writer
|
|
22
|
-
from app.db.migrations import CURRENT_DATABASE_VERSION
|
|
23
|
-
from app.db.migrations import MigrationResult
|
|
24
|
-
from app.db.migrations import read_database_version
|
|
25
|
-
from app.db.migrations import run_database_migrations
|
|
26
22
|
from app.db.notes_sql import fetch_all_for_cache
|
|
27
23
|
from app.db.notes_sql import update_note_fields_preserving_updated_at
|
|
28
24
|
from app.db.ontology_rules_sql import fetch_all_rules as fetch_all_ontology_rules
|
|
@@ -48,8 +44,6 @@ from app.services.encryption import EncryptionService
|
|
|
48
44
|
from app.services.maintenance_mode import maintenance_service
|
|
49
45
|
from app.services.note_store import store as note_store
|
|
50
46
|
from app.services.tab_state import tab_state_store
|
|
51
|
-
from app.services.backup_service import create_timestamped_backup
|
|
52
|
-
from app.services.client_state_service import rewrite_client_state_storage
|
|
53
47
|
from app.security.encryption import set_encryption_required
|
|
54
48
|
|
|
55
49
|
|
|
@@ -203,39 +197,6 @@ class AuthService:
|
|
|
203
197
|
kek,
|
|
204
198
|
)
|
|
205
199
|
|
|
206
|
-
def run_authenticated_database_migrations(self, *, dek: bytes) -> MigrationResult:
|
|
207
|
-
if not isinstance(dek, bytes) or len(dek) == 0:
|
|
208
|
-
raise ValueError("Database migrations require a non-empty DEK")
|
|
209
|
-
connection = self.db.connection()
|
|
210
|
-
initial_version = read_database_version(connection)
|
|
211
|
-
if initial_version > CURRENT_DATABASE_VERSION:
|
|
212
|
-
raise RuntimeError(
|
|
213
|
-
f"Database version {initial_version} is newer than supported version "
|
|
214
|
-
f"{CURRENT_DATABASE_VERSION}"
|
|
215
|
-
)
|
|
216
|
-
if initial_version == CURRENT_DATABASE_VERSION:
|
|
217
|
-
return MigrationResult(
|
|
218
|
-
initial_version=initial_version,
|
|
219
|
-
final_version=initial_version,
|
|
220
|
-
applied_versions=(),
|
|
221
|
-
rewritten_payload_count=0,
|
|
222
|
-
)
|
|
223
|
-
maintenance_service.enter_maintenance("Upgrading namespace database")
|
|
224
|
-
try:
|
|
225
|
-
create_timestamped_backup()
|
|
226
|
-
migration_encryption = EncryptionService()
|
|
227
|
-
migration_encryption.dek = dek
|
|
228
|
-
with SafeSession.allow_reads("auth:database_migrations"):
|
|
229
|
-
with connection:
|
|
230
|
-
migration_result = run_database_migrations(
|
|
231
|
-
connection=connection,
|
|
232
|
-
encryption_enabled=True,
|
|
233
|
-
encryption_service=migration_encryption,
|
|
234
|
-
)
|
|
235
|
-
return migration_result
|
|
236
|
-
finally:
|
|
237
|
-
maintenance_service.exit_maintenance()
|
|
238
|
-
|
|
239
200
|
def set_password(self, password: str, time_cost: int) -> Tuple[bool, str]:
|
|
240
201
|
"""Enable password protection by encrypting all existing content."""
|
|
241
202
|
if self.has_password():
|
|
@@ -418,11 +379,6 @@ class AuthService:
|
|
|
418
379
|
encryption_service=self.encryption,
|
|
419
380
|
force_plaintext=False,
|
|
420
381
|
)
|
|
421
|
-
rewrite_client_state_storage(
|
|
422
|
-
connection=connection,
|
|
423
|
-
encryption_service=self.encryption,
|
|
424
|
-
force_plaintext=False,
|
|
425
|
-
)
|
|
426
382
|
finally:
|
|
427
383
|
maintenance_service.exit_maintenance()
|
|
428
384
|
|
|
@@ -697,11 +653,6 @@ class AuthService:
|
|
|
697
653
|
encryption_service=None,
|
|
698
654
|
force_plaintext=True,
|
|
699
655
|
)
|
|
700
|
-
rewrite_client_state_storage(
|
|
701
|
-
connection=connection,
|
|
702
|
-
encryption_service=self.encryption,
|
|
703
|
-
force_plaintext=True,
|
|
704
|
-
)
|
|
705
656
|
clear_password_settings(connection)
|
|
706
657
|
self.encryption.clear_keys()
|
|
707
658
|
finally:
|