MetaList 0.22.0__tar.gz → 0.24.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.22.0/metalist.egg-info → metalist-0.24.0}/PKG-INFO +27 -2
- {metalist-0.22.0 → metalist-0.24.0}/README.md +25 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/api/note_requests.py +49 -3
- {metalist-0.22.0 → metalist-0.24.0}/app/api/routes/ai.py +10 -1
- {metalist-0.22.0 → metalist-0.24.0}/app/api/routes/auth.py +2 -2
- {metalist-0.22.0 → metalist-0.24.0}/app/api/routes/backups.py +10 -10
- {metalist-0.22.0 → metalist-0.24.0}/app/api/routes/notes.py +135 -3
- {metalist-0.22.0 → metalist-0.24.0}/app/api/routes/ontology.py +196 -51
- {metalist-0.22.0 → metalist-0.24.0}/app/api/transactions.py +2 -2
- {metalist-0.22.0 → metalist-0.24.0}/app/db/engine.py +0 -4
- {metalist-0.22.0 → metalist-0.24.0}/app/main.py +15 -15
- {metalist-0.22.0 → metalist-0.24.0}/app/security/authenticated_logging.py +5 -3
- {metalist-0.22.0 → metalist-0.24.0}/app/server_runtime.py +10 -8
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/agent_tools.py +2 -2
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/cloud_privacy.py +50 -2
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/help_catalog.py +1 -1
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/note_tag_suggestions.py +10 -4
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/scope.py +12 -1
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skills/help-ai.md +3 -3
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skills/help-data.md +15 -15
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skills/help-dictation.md +3 -4
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skills/help-formatting.md +3 -3
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skills/help-menus.md +35 -24
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skills/help-mouse.md +6 -5
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skills/help-notes.md +16 -7
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skills/help-ontology.md +40 -2
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skills/help-privacy.md +17 -17
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skills/help-references.md +11 -11
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skills/help-releases.md +25 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skills/help-reminders.md +3 -3
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skills/help-search.md +54 -4
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skills/help-tags.md +19 -2
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skills/tag-proposals.md +10 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/tagging.py +10 -6
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/tagging_run.py +14 -10
- {metalist-0.22.0 → metalist-0.24.0}/app/services/app_updates.py +1 -1
- {metalist-0.22.0 → metalist-0.24.0}/app/services/auth_service.py +1 -1
- {metalist-0.22.0 → metalist-0.24.0}/app/services/backup_service.py +2 -2
- {metalist-0.22.0 → metalist-0.24.0}/app/services/bulk_operation.py +1 -1
- {metalist-0.22.0 → metalist-0.24.0}/app/services/content_formatting.py +7 -1
- {metalist-0.22.0 → metalist-0.24.0}/app/services/dictation_cleanup.py +10 -17
- {metalist-0.22.0 → metalist-0.24.0}/app/services/embedded_references.py +66 -5
- {metalist-0.22.0 → metalist-0.24.0}/app/services/file_registry.py +63 -1
- {metalist-0.22.0 → metalist-0.24.0}/app/services/file_storage.py +23 -1
- metalist-0.24.0/app/services/find_text.py +119 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/html_export.py +11 -5
- {metalist-0.22.0 → metalist-0.24.0}/app/services/namespace_deletion_jobs.py +1 -1
- {metalist-0.22.0 → metalist-0.24.0}/app/services/namespace_deletion_worker.py +1 -1
- {metalist-0.22.0 → metalist-0.24.0}/app/services/namespace_rename_worker.py +1 -1
- {metalist-0.22.0 → metalist-0.24.0}/app/services/namespace_runtime_guard.py +5 -5
- {metalist-0.22.0 → metalist-0.24.0}/app/services/namespace_switcher.py +42 -42
- {metalist-0.22.0 → metalist-0.24.0}/app/services/note_store.py +66 -7
- {metalist-0.22.0 → metalist-0.24.0}/app/services/ontology_rules_store.py +7 -1
- {metalist-0.22.0 → metalist-0.24.0}/app/services/openai_credentials.py +1 -1
- metalist-0.24.0/app/services/root_date_filter.py +153 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/root_sorting.py +32 -4
- {metalist-0.22.0 → metalist-0.24.0}/app/services/search_index.py +369 -4
- {metalist-0.22.0 → metalist-0.24.0}/app/services/search_query.py +52 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/search_text.py +6 -1
- {metalist-0.22.0 → metalist-0.24.0}/app/services/self_update.py +2 -2
- {metalist-0.22.0 → metalist-0.24.0}/app/services/snapshot.py +346 -66
- {metalist-0.22.0 → metalist-0.24.0}/app/services/tab_state.py +174 -3
- {metalist-0.22.0 → metalist-0.24.0}/app/services/tag_ontology.py +196 -2
- metalist-0.24.0/app/services/tag_properties.py +472 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/tag_rename.py +6 -3
- {metalist-0.22.0 → metalist-0.24.0}/app/services/update_backups.py +1 -1
- {metalist-0.22.0 → metalist-0.24.0}/app/services/update_preflight.py +1 -1
- {metalist-0.22.0 → metalist-0.24.0}/app/static/config/agent-menu-actions.json +68 -8
- {metalist-0.22.0 → metalist-0.24.0}/app/static/config/command_palette_tags.json +45 -5
- {metalist-0.22.0 → metalist-0.24.0}/app/static/css/main.css +518 -135
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/proposal-menu.js +1 -1
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/api-client.js +22 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/auth.js +5 -5
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/backup-reminder-schedule.js +1 -1
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/command-palette/command-palette-controller.js +119 -1
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/command-palette/endpoint-registry.js +75 -12
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/command-palette/tag-config-loader.js +25 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/config.js +2 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/context-menu/context-menu-registry.js +131 -21
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/context-menu/context-menu-service.js +21 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/login-namespace-picker.js +1 -1
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/ai-agent-settings-modal.js +3 -3
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/backup-restore-modal.js +12 -12
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/backup-result-modal.js +1 -1
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/backup-settings-modal.js +5 -5
- metalist-0.24.0/app/static/js/modules/modals/date-range-modal.js +178 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/delete-namespace-modal.js +22 -22
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/help-modal.js +4 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/memory-usage-modal.js +2 -2
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/namespace-modals.js +46 -46
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/note-layout-appearance-modal.js +1 -1
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/ontology-modal.js +127 -67
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/search-suggestion-statistics-modal.js +1 -1
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/session-timeout-modal.js +1 -1
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/version-info-modal.js +3 -3
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/actions/ui-actions.js +5 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/events/context-menu-events.js +184 -21
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/events/keyboard-events.js +280 -30
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/events/mouse-events.js +48 -4
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/events/search-events.js +31 -5
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/mode-context.js +27 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/context-menu-target-service.js +2 -1
- metalist-0.24.0/app/static/js/modules/mode-manager/services/date-range-filter-service.js +173 -0
- metalist-0.24.0/app/static/js/modules/mode-manager/services/date-range-kinds.js +20 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/dictation-paste-service.js +18 -3
- metalist-0.24.0/app/static/js/modules/mode-manager/services/find-in-list-service.js +779 -0
- metalist-0.24.0/app/static/js/modules/mode-manager/services/reference-source-navigation-service.js +606 -0
- metalist-0.24.0/app/static/js/modules/mode-manager/services/reference-view-transition-service.js +206 -0
- metalist-0.24.0/app/static/js/modules/mode-manager/services/root-sort-indicator-service.js +81 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/root-sort-service.js +59 -26
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/scroll-anchor-service.js +7 -2
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/search-debounce-service.js +5 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/search-highlight-service.js +3 -2
- metalist-0.24.0/app/static/js/modules/mode-manager/services/search-input-chip-service.js +85 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/search-suggestions-service.js +24 -2
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/search-syntax-service.js +87 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/tab-state-service.js +31 -4
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/tag-suggestions-service.js +19 -3
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/tag-syntax-service.js +158 -7
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/untagged-view-indicator-service.js +3 -1
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/viewport-hold-service.js +67 -8
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/namespace-deleted.js +18 -18
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/namespace-renamed.js +5 -5
- metalist-0.24.0/app/static/js/vendor/dompurify-3.4.17.min.js +7 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/templates/base.html +1 -1
- {metalist-0.22.0 → metalist-0.24.0}/app/templates/index.html +65 -35
- {metalist-0.22.0 → metalist-0.24.0}/app/templates/namespace_deleted.html +5 -5
- {metalist-0.22.0 → metalist-0.24.0}/app/templates/namespace_renamed.html +1 -1
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/alphabetize_root_notes.py +1 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/bulk_tag_proposals.py +10 -9
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/move_to_top.py +1 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/reset_updated_at.py +1 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/search_context_tags.py +35 -1
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/set_collapse_in_context.py +21 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/tag_proposals.py +82 -19
- {metalist-0.22.0 → metalist-0.24.0}/app/version.py +1 -1
- {metalist-0.22.0 → metalist-0.24.0}/main.py +6 -6
- {metalist-0.22.0 → metalist-0.24.0/metalist.egg-info}/PKG-INFO +27 -2
- {metalist-0.22.0 → metalist-0.24.0}/metalist.egg-info/SOURCES.txt +11 -2
- {metalist-0.22.0 → metalist-0.24.0}/metalist.egg-info/requires.txt +1 -1
- {metalist-0.22.0 → metalist-0.24.0}/pyproject.toml +1 -1
- metalist-0.22.0/app/static/js/modules/mode-manager/services/reference-source-navigation-service.js +0 -309
- metalist-0.22.0/app/static/js/modules/mode-manager/services/root-sort-indicator-service.js +0 -48
- metalist-0.22.0/app/static/js/vendor/dompurify-3.4.16.min.js +0 -7
- {metalist-0.22.0 → metalist-0.24.0}/MANIFEST.in +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/__init__.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/api/__init__.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/api/deps.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/api/dev.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/api/middleware/auth.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/api/request_auth.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/api/routes/app_updates.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/api/routes/files.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/api/routes/reminders.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/api/routes/remote_images.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/api/routes/test.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/api/upload_limits.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/config.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/contracts.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/data_directory.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/db/__init__.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/db/backup_settings_sql.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/db/content_migrations_sql.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/db/editable_files_migration.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/db/file_schema.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/db/file_session.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/db/files_sql.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/db/link_titles_sql.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/db/live_recovery.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/db/migrations.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/db/notes_sql.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/db/ontology_rules_sql.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/db/raw_connection.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/db/reminders_sql.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/db/retire_sounds.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/db/schema.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/db/search_history_sql.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/db/session.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/db/settings_sql.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/db/tab_state_sql.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/db/version.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/encryption_audit.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/exception_boundaries.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/https_proxy.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/launch_clock.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/models/database.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/models/utils.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/network_settings.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/presentation/__init__.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/presentation/login_page.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/presentation/render/__init__.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/presentation/render/note_renderer.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/presentation/templates.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/process_memory.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/security/crypto_sizes.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/security/encryption.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/security/http_error_diagnostics.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/security/http_headers.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/security/note_html.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/security/rendered_html.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/security/request_boundary.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/security/request_hosts.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/security/sensitive_cache.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/security/sensitive_logging.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/security/shell_execution.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/security/validation_errors.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/__init__.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/__init__.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/action_log.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/agent_loop.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/ai_send.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/citation_tokens.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/context.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/evidence_serialization.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/execution_errors.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/export_title_suggestions.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/failure_explanations.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/history.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/inference.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/investigation.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/judging.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/menu_actions.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/model_policy.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/note_aliases.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/openai_cost_tracking.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/openai_inference.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/openai_models.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/privacy_guard.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/prompt_settings.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/prompts/__init__.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/prompts/agent.md +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/prompts/final-response.md +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/prompts/system.md +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/release_notes.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/retrieval_settings.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/runtime.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skill_settings.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skills/__init__.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skills/staged-summary.md +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/skills/web-browsing.md +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/staged_summary.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/strict_structured_outputs.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/structured_inference.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/summary_batch_store.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/token_estimation.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/tool_calling.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/trace.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/web_actions.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/web_capabilities.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/web_evidence.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/web_fetch.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/agent/web_settings.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/ai_chat.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/ai_chat_rendering.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/ai_chat_stream.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/ai_setup.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/app_update_worker.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/auth.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/auth_cache_state.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/backlink_index.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/backlinks.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/backup_settings_service.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/chess_rendering.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/client_state_service.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/code_rendering.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/content_cache.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/diagnostics.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/diff_rendering.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/editing_image_sizes.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/encryption.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/exception_capture.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/file_edit_sessions.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/file_text_preview.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/footnote_layout.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/footnote_rendering.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/hierarchy.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/html_unformatting.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/hydration_state.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/image_size_formatting.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/inline_image_dimensions.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/inline_image_occurrences.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/input_errors.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/integrity.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/latex_rendering.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/link_title_retry.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/link_titles.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/login_rate_limit.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/maintenance_mode.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/markdown_rendering.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/memory_breakdown.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/memory_usage.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/mermaid_note_rendering.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/namespace_rename_jobs.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/note_fullscreen.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/note_image_tags.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/note_ordering.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/password_note_fields.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/preference_values.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/public_http.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/reference_presentation.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/reminders.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/remote_image_proxy.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/request_recovery.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/reset_for_tests.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/resource_limits.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/runtime_generation.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/runtime_hardening.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/runtime_lock.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/search_history.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/search_history_storage.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/selected_text_tag.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/session_timeout_service.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/shared_sets.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/shell_session_service.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/store.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/structured_note_renderers.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/sync.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/tag_case.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/tag_details.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/tag_plural_variants.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/tag_suggestion_reasons.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/tag_suggestions.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/tag_term_matching.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/tokens.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/undo_state.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/update_installer.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/view_cache.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/view_diff.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/view_state.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/services/windows_process_control.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/startup_console.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/startup_environment.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/startup_js_sanity.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/startup_sanity.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/startup_sanity_config.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/startup_shockharness.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/css/floating-notes.css +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/css/forms.css +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/img/favicon.ico +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/img/metalist-logo-black-1024.png +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/img/metalist-logo-black-512.png +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/img/metalist-logo-black.svg +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/img/metalist-logo-white-1024.png +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/img/metalist-logo-white-512.png +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/img/metalist-logo-white.svg +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/locked.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/main.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/activity-tracker.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/agent-menu-actions.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/agent-retrieval-settings.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/agent-web-settings.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/ai-agent-debug-view.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/ai-chat-api.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/ai-chat-message-placement.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/ai-chat-panel-controller.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/ai-chat-panel-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/ai-chat-refused-turns.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/ai-chat-size-limits.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/ai-thinking-level-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/bulk-elapsed-clock.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/bulk-proposal-ui.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/bulk-scope-question.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/cloud-privacy-policy.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/confirmation-card.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/confirmation-question.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/ai-chat/summary-batch-preview.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/api-error-diagnostics.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/api-failure-classification-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/app-notice-stack.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/app-update-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/application-state.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/async-result.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/backup-reminder-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/byte-sizes.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/client-state-api.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/client-state-migration.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/command-palette/activation-auth-policy.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/command-palette/backup-command-availability.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/command-palette/click-activation-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/command-palette/note-layout-preferences.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/command-palette/preferences-store.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/command-palette/usage-store.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/context-menu/context-menu-target-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/context-menu/input-caret-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/decimal-integer.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/disconnect-editing-state-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/dom-focus.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/dom-utils.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/editor-commands.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/editor-selection.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/editor-toolbar.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/elapsed-time.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/error-handler.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/error-overlay.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/excalidraw/excalidraw-actions.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/excalidraw/excalidraw-autosave.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/excalidraw/excalidraw-editor-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/excalidraw/excalidraw-editor-state.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/excalidraw/excalidraw-loader.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/excalidraw/excalidraw-preview-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/excalidraw/excalidraw-scene.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/expected-errors.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/half.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/html-escape.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/http-status.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/list-selection.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/local-date-text.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/location-flags.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/maintenance.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/alphabetize-root-notes-modal.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/base-modal.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/confirmation-modal.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/delete-namespace-validation.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/dictation-settings-modal.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/export-options-modal.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/link-title-retry-modal.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/namespace-loading-page.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/namespace-ports-profile.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/namespace-rename-validation.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/password-modal.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/prioritize-modal.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/random-password-modal.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/reminder-modal.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/reset-updated-at-modal.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/modals/visual-cues-modal.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/actions/content-actions.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/actions/history-actions.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/actions/note-actions.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/actions/search-actions.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/actions/selection-actions.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/events/focus-events.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/events/inactivity-events.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/events/input-events.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/mode-logger.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/mode-manager-controller.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/add-style-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/animated-scroll-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/backlinks-navigation-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/clipboard-shortcut-policy-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/collapse-affordance-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/collapse-editing-policy-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/command-gate-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/deselect-selection-state-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/dictation-note-paste.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/dictation-paste-padding.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/differential-view-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/dropped-file-preview-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/edit-session-collapse-policy-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/edit-session-collapse-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/editing-image-size-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/embedded-image-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/export-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/export-title-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/file-drop-policy-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/file-image-preview-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/file-reference-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/filtered-refresh-selection-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/floating-note-dom.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/floating-note-layout.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/floating-note-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/footnote-navigation-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/history-selection-policy-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/history-shortcut-policy-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/html-paste-sanitizer-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/image-context-menu-action-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/image-file-insert-choice-modal-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/infinite-scroll-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/link-context-menu-action-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/link-target-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/link-title-prefetch-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/mermaid-render-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/note-click-target-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/note-clipboard-write-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/note-collapse-animation-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/note-context-menu-action-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/note-delete-shortcut-policy-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/note-drag-indicator-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/note-drag-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/note-fullscreen-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/note-reposition-animation-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/note-split-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/note-timestamp-hover-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/password-clipboard-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/paste-format-detection-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/paste-format-guess-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/paste-format-offer-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/paste-reference-here-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/polling-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/print-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/referenced-note-removal-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/remote-image-proxy-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/remove-formatting-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/right-press-focus-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/root-date-separator-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/root-note-creation-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/scroll-restoration-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/scroll-to-top-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/search-contexts-overlay-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/search-highlight-matching.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/search-input-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/search-interaction-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/search-redaction-reveal-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/search-suggestion-statistics-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/search-suggestion-window-labels-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/search-suggestion-windows-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/selected-formatting-removal-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/selected-text-tag-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/shell-output-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/tab-dom-cache-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/tab-drag-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/tab-duplication-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/tag-bar-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/tag-input-selection-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/tag-proposal-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/todo-toggle-editing-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/view-mode-search-shortcut-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/mode-manager/services/viewport-reference.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/not-found.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/note-html-sanitizer.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/password-generator.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/password-operation-response.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/password-policy.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/password-strength.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/reminder-store.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/reminder-surface-service.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/server-rendered-html.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/session-auth.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/startup-timing.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/tag-token.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/tcp-ports.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/time-units.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/url-tracking-cleaner.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/modules/uuid.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/shockharness/contracts.d.ts +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/shockharness/contracts.js +0 -0
- /metalist-0.22.0/app/static/js/vendor/dompurify-3.4.16.LICENSE.txt → /metalist-0.24.0/app/static/js/vendor/dompurify-3.4.17.LICENSE.txt +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/excalidraw.css +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Assistant/Assistant-Bold.woff2 +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Assistant/Assistant-Medium.woff2 +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Assistant/Assistant-Regular.woff2 +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Assistant/Assistant-SemiBold.woff2 +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Cascadia/CascadiaCode-Regular.woff2 +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/ComicShanns/ComicShanns-Regular-279a7b317d12eb88de06167bd672b4b4.woff2 +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/ComicShanns/ComicShanns-Regular-6e066e8de2ac57ea9283adb9c24d7f0c.woff2 +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/ComicShanns/ComicShanns-Regular-dc6a8806fa96795d7b3be5026f989a17.woff2 +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/ComicShanns/ComicShanns-Regular-fcb0fc02dcbee4c9846b3e2508668039.woff2 +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-349fac6ca4700ffec595a7150a0d1e1d.woff2 +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-3f2c5db56cc93c5a6873b1361d730c16.woff2 +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-41b173a47b57366892116a575a43e2b6.woff2 +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-623ccf21b21ef6b3a0d87738f77eb071.woff2 +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2 +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-b9dcf9d2e50a1eaf42fc664b50a3fd0d.woff2 +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-be310b9bcd4f1a43f571c46df7809174.woff2 +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYE98RXi4EwSsbg.woff2 +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYEF8RXi4EwQ.woff2 +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTA3j6zbXWjgevT5.woff2 +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTQ3j6zbXWjgeg.woff2 +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTk3j6zbXWjgevT5.woff2 +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTo3j6zbXWjgevT5.woff2 +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTs3j6zbXWjgevT5.woff2 +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Virgil/Virgil-Regular.woff2 +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1.LICENSE.txt +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/excalidraw-0.18.1.min.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/mermaid-11.16.1.LICENSE.txt +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/mermaid-11.16.1.min.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/zxcvbn-4.4.2.LICENSE.txt +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/js/vendor/zxcvbn-4.4.2.js +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/static/note-html-policy.json +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/templates/_logo_mark.html +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/templates/locked.html +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/templates/maintenance.html +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/templates/notes_list.html +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/upload_limits.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/__init__.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/add_selected_text_tag.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/base.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/collapse.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/copy_note.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/create_child.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/create_file_preview_child.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/create_note.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/create_sibling.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/delete_subtree.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/delete_tag.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/expand.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/file_edit_session.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/indent.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/move.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/outdent.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/paste_child.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/paste_reference.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/paste_sibling.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/prefetch_link_titles.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/prioritize.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/redo.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/rename_tag.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/resize_image.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/run_shell.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/search_comment_autofill.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/set_collapse_bulk.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/split_note.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/toggle_todo_done.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/undo.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/unformat_content.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/usecases/update_content.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/utils/__init__.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/utils/byte_sizes.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/utils/encryption.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/utils/not_found.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/utils/sent_fields.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/utils/tcp_ports.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/utils/text_utils.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/app/utils/time_units.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/convert-from-legacy.py +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/metalist.egg-info/dependency_links.txt +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/metalist.egg-info/entry_points.txt +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/metalist.egg-info/top_level.txt +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/scripts/generate-lan-cert.sh +0 -0
- {metalist-0.22.0 → metalist-0.24.0}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: metalist
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.24.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://metalist.app
|
|
6
6
|
Project-URL: Repository, https://github.com/metalist-app/metalist
|
|
@@ -36,7 +36,7 @@ Provides-Extra: dev
|
|
|
36
36
|
Requires-Dist: hypothesis==6.164.0; extra == "dev"
|
|
37
37
|
Requires-Dist: pytest==9.1.1; extra == "dev"
|
|
38
38
|
Requires-Dist: pytest-cov==7.1.0; extra == "dev"
|
|
39
|
-
Requires-Dist: shockharness==0.
|
|
39
|
+
Requires-Dist: shockharness==0.26.0; extra == "dev"
|
|
40
40
|
Requires-Dist: mypy==2.4.0; extra == "dev"
|
|
41
41
|
|
|
42
42
|
# MetaList
|
|
@@ -53,6 +53,31 @@ A minimalist single-user note-taking app focused on server-side rendering (SSR),
|
|
|
53
53
|
- Multi-tab search contexts with server-persisted scroll/search state (survives browser restarts)
|
|
54
54
|
- Manual namespace backups/restores to a user-selected backup folder with retention controls
|
|
55
55
|
|
|
56
|
+
## Changes in 0.24.0
|
|
57
|
+
|
|
58
|
+
- **Super tags.** A tag can carry values: `jogging:miles=3:duration=30`, `drug:dosage=10mg`, `run:start=10:30pm`. Search by them with `jogging:miles>2`, `jogging:miles?` (notes missing it), `date>=2024-01`, or `jogging:miles=MAX` / `=MIN` for the largest or smallest among the notes found. Values compare as numbers (a unit is a label: `dosage>5mg` compares only mg, `dosage>5` every unit), dates, times (`10:30pm` = `22:30`) or text. A search reads values through tag rules too: with `jogging => exercise`, `exercise:miles>2` finds your runs. The tag bar and the search box suggest the property names and units you already use, and `MAX`/`MIN` after `=`. A plain `jogging` search still finds `jogging:miles=3`; children inherit the tag, never its values.
|
|
59
|
+
- Tag rules can test values: `jogging:miles>10 => long-run`, `task:due? => needs-date`. The tag a rule gives passes to the note's children; Edit Tag Relationships shows such a rule in the left column of the tag it gives, suggests names and units while you type one, and warns about a property no note has (a typo). Saving one re-tags only the notes it can concern.
|
|
60
|
+
- The AI can propose super tags with values a note states (`jogging:miles=3` for "ran 3 miles"), reusing your property names and units; accepting one adds its values to the note's tag.
|
|
61
|
+
- **Date range** (right-click menu, search box menu and command palette): show only notes created, or last updated, today, in the last 7 or 30 days, this year, or in a custom range. A chip in the search box names it; its `×`, a new search or leaving the tab ends it.
|
|
62
|
+
- File names are searchable: a quoted search (`"congratulation"`) and find (Cmd/Ctrl+F) match the names of files a note holds, and the AI sees them.
|
|
63
|
+
- ⌘+ / ⌘− with the pointer on a picture or diagram makes it bigger or smaller, viewing or editing.
|
|
64
|
+
- Right-clicking the search box past what you typed offers View, Sort by and Date range.
|
|
65
|
+
|
|
66
|
+
## Changes in 0.23.0
|
|
67
|
+
|
|
68
|
+
- **Reference views.** Following a reference (a link, an embed's reference icon, Go to Source Note) or an AI answer's references slides the list to the left, and a gray chip takes the search box's place: **Source note** (its first line is the tooltip), **Reference** or **All references**. `←` or Escape goes back one level, `×` straight back to your search, each to the exact place you left; the list slides back to the right. With Reduce Motion it is a quick fade. The magnifier beside the chip starts a new search. Reference tabs keep their label and chip after a reload and in every window: no tab is named by a note ID any more.
|
|
69
|
+
- One reference icon, a page with an arrow coming into it, on embeds, links, the chip, the tab list and the right-click menu's **Go to Source Note**; All references has two pages. A collapsed embed shows its source's first line in its own formatting (a green heading stays a green heading), and embeds are a shade darker grey, deeper again for an embed inside an embed.
|
|
70
|
+
- Sort orders and Untagged show as chips inside the search box (`Created`, `Updated`, `A–Z`, `Size`, `Untagged`; the full name is the tooltip). New **Reverse Order** in Sort by works with any order: Z to A, oldest or smallest first, or your own order bottom to top. Typing a new search or leaving a tab ends its sort; a new tab starts unsorted; a reference view and back keeps it.
|
|
71
|
+
- Right-clicking the list offers **Paste Note as Reference at Top** (⌘R) beside Paste Note at Top.
|
|
72
|
+
- Backlinks (`↖`) are hidden for now, until they have a sign of their own.
|
|
73
|
+
- Coming back to a tab, or from a reference view, lands exactly where you were; a note just below the top could put you up to 80px further down.
|
|
74
|
+
- **Find in the list** (Cmd/Ctrl+F) finds text far below the loaded notes and inside folded ones; a folded match opens just for the find.
|
|
75
|
+
- Namespaces are called **vaults** on screen; `--vault` works like `--namespace`.
|
|
76
|
+
- Edit tag relationships: suggestions list tags linked to the focus tag first, a condition shows one part per line, and with no focus tag the `+` buttons are dimmed instead of stopping MetaList.
|
|
77
|
+
- A file link downloads only from its badge and name; a click beside it edits the note.
|
|
78
|
+
- Make Bigger, Make Smaller and Reset Size keep the caret on its side of the image.
|
|
79
|
+
- Logging out while a log entry was being written could close the log under it; the logout now waits.
|
|
80
|
+
|
|
56
81
|
## Changes in 0.22.0
|
|
57
82
|
|
|
58
83
|
- Tag suggestions only narrow as you type, however many letters: `q`, `qu`, `que` keep their order, and a tag that already applies (a parent's, or implied by a rule) stays right after the tags with evidence instead of dropping to the bottom. Each letter after the first answers in a few milliseconds. Measured on a 107,000-note namespace, the wanted tag is in the top five more often after two and three letters (90% and 96%, up from 88% and 93%).
|
|
@@ -12,6 +12,31 @@ 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.24.0
|
|
16
|
+
|
|
17
|
+
- **Super tags.** A tag can carry values: `jogging:miles=3:duration=30`, `drug:dosage=10mg`, `run:start=10:30pm`. Search by them with `jogging:miles>2`, `jogging:miles?` (notes missing it), `date>=2024-01`, or `jogging:miles=MAX` / `=MIN` for the largest or smallest among the notes found. Values compare as numbers (a unit is a label: `dosage>5mg` compares only mg, `dosage>5` every unit), dates, times (`10:30pm` = `22:30`) or text. A search reads values through tag rules too: with `jogging => exercise`, `exercise:miles>2` finds your runs. The tag bar and the search box suggest the property names and units you already use, and `MAX`/`MIN` after `=`. A plain `jogging` search still finds `jogging:miles=3`; children inherit the tag, never its values.
|
|
18
|
+
- Tag rules can test values: `jogging:miles>10 => long-run`, `task:due? => needs-date`. The tag a rule gives passes to the note's children; Edit Tag Relationships shows such a rule in the left column of the tag it gives, suggests names and units while you type one, and warns about a property no note has (a typo). Saving one re-tags only the notes it can concern.
|
|
19
|
+
- The AI can propose super tags with values a note states (`jogging:miles=3` for "ran 3 miles"), reusing your property names and units; accepting one adds its values to the note's tag.
|
|
20
|
+
- **Date range** (right-click menu, search box menu and command palette): show only notes created, or last updated, today, in the last 7 or 30 days, this year, or in a custom range. A chip in the search box names it; its `×`, a new search or leaving the tab ends it.
|
|
21
|
+
- File names are searchable: a quoted search (`"congratulation"`) and find (Cmd/Ctrl+F) match the names of files a note holds, and the AI sees them.
|
|
22
|
+
- ⌘+ / ⌘− with the pointer on a picture or diagram makes it bigger or smaller, viewing or editing.
|
|
23
|
+
- Right-clicking the search box past what you typed offers View, Sort by and Date range.
|
|
24
|
+
|
|
25
|
+
## Changes in 0.23.0
|
|
26
|
+
|
|
27
|
+
- **Reference views.** Following a reference (a link, an embed's reference icon, Go to Source Note) or an AI answer's references slides the list to the left, and a gray chip takes the search box's place: **Source note** (its first line is the tooltip), **Reference** or **All references**. `←` or Escape goes back one level, `×` straight back to your search, each to the exact place you left; the list slides back to the right. With Reduce Motion it is a quick fade. The magnifier beside the chip starts a new search. Reference tabs keep their label and chip after a reload and in every window: no tab is named by a note ID any more.
|
|
28
|
+
- One reference icon, a page with an arrow coming into it, on embeds, links, the chip, the tab list and the right-click menu's **Go to Source Note**; All references has two pages. A collapsed embed shows its source's first line in its own formatting (a green heading stays a green heading), and embeds are a shade darker grey, deeper again for an embed inside an embed.
|
|
29
|
+
- Sort orders and Untagged show as chips inside the search box (`Created`, `Updated`, `A–Z`, `Size`, `Untagged`; the full name is the tooltip). New **Reverse Order** in Sort by works with any order: Z to A, oldest or smallest first, or your own order bottom to top. Typing a new search or leaving a tab ends its sort; a new tab starts unsorted; a reference view and back keeps it.
|
|
30
|
+
- Right-clicking the list offers **Paste Note as Reference at Top** (⌘R) beside Paste Note at Top.
|
|
31
|
+
- Backlinks (`↖`) are hidden for now, until they have a sign of their own.
|
|
32
|
+
- Coming back to a tab, or from a reference view, lands exactly where you were; a note just below the top could put you up to 80px further down.
|
|
33
|
+
- **Find in the list** (Cmd/Ctrl+F) finds text far below the loaded notes and inside folded ones; a folded match opens just for the find.
|
|
34
|
+
- Namespaces are called **vaults** on screen; `--vault` works like `--namespace`.
|
|
35
|
+
- Edit tag relationships: suggestions list tags linked to the focus tag first, a condition shows one part per line, and with no focus tag the `+` buttons are dimmed instead of stopping MetaList.
|
|
36
|
+
- A file link downloads only from its badge and name; a click beside it edits the note.
|
|
37
|
+
- Make Bigger, Make Smaller and Reset Size keep the caret on its side of the image.
|
|
38
|
+
- Logging out while a log entry was being written could close the log under it; the logout now waits.
|
|
39
|
+
|
|
15
40
|
## Changes in 0.22.0
|
|
16
41
|
|
|
17
42
|
- Tag suggestions only narrow as you type, however many letters: `q`, `qu`, `que` keep their order, and a tag that already applies (a parent's, or implied by a rule) stays right after the tags with evidence instead of dropping to the bottom. Each letter after the first answers in a few milliseconds. Measured on a 107,000-note namespace, the wanted tag is in the top five more often after two and three letters (90% and 96%, up from 88% and 93%).
|
|
@@ -56,18 +56,26 @@ class Viewport(TypedDict):
|
|
|
56
56
|
scrollY: Nonnegative
|
|
57
57
|
scrollAnchor: ScrollAnchor | None
|
|
58
58
|
|
|
59
|
+
# A root sort order, and the same order reversed (app/services/root_sorting.py).
|
|
60
|
+
SortMode = Literal[
|
|
61
|
+
'normal', 'created', 'updated', 'alphabetical', 'content-volume',
|
|
62
|
+
'normal-reversed', 'created-reversed', 'updated-reversed', 'alphabetical-reversed', 'content-volume-reversed',
|
|
63
|
+
]
|
|
64
|
+
|
|
59
65
|
@with_config(ConfigDict(strict=True))
|
|
60
66
|
class Tab(TypedDict):
|
|
61
67
|
searchQuery: Text
|
|
62
68
|
scrollY: Nonnegative
|
|
63
69
|
anchorRootId: Text | None
|
|
64
70
|
scrollAnchor: ScrollAnchor | None
|
|
65
|
-
sortMode:
|
|
71
|
+
sortMode: SortMode
|
|
66
72
|
|
|
67
73
|
@with_config(ConfigDict(strict=True))
|
|
68
74
|
class ViewDiffRequest(TypedDict):
|
|
69
75
|
clientId: Identifier
|
|
70
76
|
editingNoteId: Text | None
|
|
77
|
+
# The note find opened to show a match folded away, for this view only (docs/ui/find.md).
|
|
78
|
+
findRevealNoteId: Text | None
|
|
71
79
|
search: Text | None
|
|
72
80
|
tabId: Identifier
|
|
73
81
|
undoContext: UndoContext
|
|
@@ -77,16 +85,54 @@ class ViewDiffRequest(TypedDict):
|
|
|
77
85
|
isUntaggedView: bool
|
|
78
86
|
startAtListEnd: bool
|
|
79
87
|
|
|
88
|
+
# Find in the list (docs/ui/find.md): one step from a root position of the view.
|
|
89
|
+
@with_config(ConfigDict(strict=True))
|
|
90
|
+
class FindInListRequest(TypedDict):
|
|
91
|
+
tabId: Identifier
|
|
92
|
+
search: Text | None
|
|
93
|
+
isUntaggedView: bool
|
|
94
|
+
text: Annotated[str, Field(min_length=1, max_length=KIB)]
|
|
95
|
+
fromRootIndex: Nonnegative
|
|
96
|
+
direction: Literal['forward', 'backward']
|
|
97
|
+
|
|
98
|
+
@with_config(ConfigDict(strict=True))
|
|
99
|
+
class ReferenceOriginScope(TypedDict):
|
|
100
|
+
scopeTabId: Identifier
|
|
101
|
+
searchQuery: Text
|
|
102
|
+
sortMode: SortMode
|
|
103
|
+
isUntaggedView: bool
|
|
104
|
+
|
|
105
|
+
# A tab showing a reference view, opened from another tab (app/services/tab_state.py).
|
|
106
|
+
@with_config(ConfigDict(strict=True))
|
|
107
|
+
class ReferenceView(TypedDict):
|
|
108
|
+
fromTabId: Identifier
|
|
109
|
+
referenceQuery: Text
|
|
110
|
+
viewKind: Literal['source', 'backlinks', 'reference', 'references']
|
|
111
|
+
originScope: ReferenceOriginScope
|
|
112
|
+
|
|
80
113
|
@with_config(ConfigDict(strict=True))
|
|
81
114
|
class UpdateTabStateRequest(TypedDict):
|
|
82
115
|
activeTabId: Identifier
|
|
83
116
|
tabs: dict[Identifier, Tab]
|
|
84
117
|
tabOrder: list[Identifier]
|
|
118
|
+
referenceViews: dict[Identifier, ReferenceView]
|
|
85
119
|
|
|
86
120
|
@with_config(ConfigDict(strict=True))
|
|
87
121
|
class UpdateTabSortModeRequest(TypedDict):
|
|
88
122
|
tabId: Identifier
|
|
89
|
-
sortMode:
|
|
123
|
+
sortMode: SortMode
|
|
124
|
+
clientId: Identifier
|
|
125
|
+
undoContext: UndoContext
|
|
126
|
+
|
|
127
|
+
@with_config(ConfigDict(strict=True))
|
|
128
|
+
class UpdateTabDateFilterRequest(TypedDict):
|
|
129
|
+
tabId: Identifier
|
|
130
|
+
field: Literal["created", "updated"]
|
|
131
|
+
# "none" shows every date again.
|
|
132
|
+
rangeKind: Literal["none", "today", "last-7-days", "last-30-days", "this-year", "custom"]
|
|
133
|
+
# A custom range's ends (YYYY-MM-DD); "" for an open end, and for every other range.
|
|
134
|
+
fromDate: Text
|
|
135
|
+
toDate: Text
|
|
90
136
|
clientId: Identifier
|
|
91
137
|
undoContext: UndoContext
|
|
92
138
|
|
|
@@ -126,7 +172,7 @@ class TabSearchInteractionRequest(TypedDict):
|
|
|
126
172
|
class DictationPasteRequest(TypedDict):
|
|
127
173
|
"""Text pasted into the search bar or the tag bar, and the field's current value."""
|
|
128
174
|
text: Text
|
|
129
|
-
target: Literal["search", "tags", "tag"
|
|
175
|
+
target: Literal["search", "tags", "tag"]
|
|
130
176
|
current_value: Text
|
|
131
177
|
# The spoken phrases around a quoted phrase (Dictation Settings).
|
|
132
178
|
quote_open: Identifier
|
|
@@ -498,6 +498,7 @@ def suggest_tags_for_note_with_ai(
|
|
|
498
498
|
scope = resolve_view_scope_membership(
|
|
499
499
|
search=payload.search,
|
|
500
500
|
sort_mode=tab_state_store.get_sort_mode(tab_id=payload.tab_id),
|
|
501
|
+
date_filter=tab_state_store.get_date_filter(tab_id=payload.tab_id),
|
|
501
502
|
is_untagged_view=payload.is_untagged_view,
|
|
502
503
|
)
|
|
503
504
|
if note_id not in scope.allowed_note_ids:
|
|
@@ -559,6 +560,7 @@ def _export_title_request(scope: ExportTitleScope, token: str) -> ExportTitleReq
|
|
|
559
560
|
root_ids, allowed_note_ids = resolve_export_scope(
|
|
560
561
|
search=search,
|
|
561
562
|
sort_mode=tab_state_store.get_sort_mode(tab_id=scope.tab_id),
|
|
563
|
+
date_filter=tab_state_store.get_date_filter(tab_id=scope.tab_id),
|
|
562
564
|
is_untagged_view=scope.is_untagged_view, root_note_id=note_id,
|
|
563
565
|
)
|
|
564
566
|
boundary = resolve_cloud_privacy_boundary(preferences=load_client_preferences(token=token), provider=scope.provider)
|
|
@@ -903,21 +905,26 @@ def stream_ai_chat(
|
|
|
903
905
|
authoritative_sort_mode = tab_state_store.get_sort_mode(
|
|
904
906
|
tab_id=payload.scope.scope_tab_id
|
|
905
907
|
)
|
|
908
|
+
authoritative_date_filter = tab_state_store.get_date_filter(tab_id=payload.scope.scope_tab_id)
|
|
906
909
|
active_search_query = authoritative_search_query
|
|
907
910
|
active_sort_mode = authoritative_sort_mode
|
|
911
|
+
active_date_filter = authoritative_date_filter
|
|
908
912
|
if payload.selected_note_id and payload.scope.active_tab_id != payload.scope.scope_tab_id:
|
|
909
913
|
active_search_query = tab_state_store.get_search_query(tab_id=authoritative_active_tab_id)
|
|
910
914
|
active_sort_mode = tab_state_store.get_sort_mode(tab_id=authoritative_active_tab_id)
|
|
915
|
+
active_date_filter = tab_state_store.get_date_filter(tab_id=authoritative_active_tab_id)
|
|
911
916
|
frozen_scope = scoped_search_snapshot_factory.freeze(
|
|
912
917
|
descriptor=payload.scope,
|
|
913
918
|
authoritative_search_query=authoritative_search_query,
|
|
914
919
|
authoritative_sort_mode=authoritative_sort_mode,
|
|
920
|
+
authoritative_date_filter=authoritative_date_filter,
|
|
915
921
|
run_id=str(uuid4()),
|
|
916
922
|
session_key=session_key,
|
|
917
923
|
privacy_boundary=privacy_boundary,
|
|
918
924
|
selected_note_id=payload.selected_note_id,
|
|
919
925
|
authoritative_active_search_query=active_search_query,
|
|
920
926
|
authoritative_active_sort_mode=active_sort_mode,
|
|
927
|
+
authoritative_active_date_filter=active_date_filter,
|
|
921
928
|
)
|
|
922
929
|
tagging_run = TaggingRun(token=token, snapshot=frozen_scope, privacy_boundary=privacy_boundary,
|
|
923
930
|
preferences=preferences, sync_uuid=get_current_sync_uuid(),
|
|
@@ -1054,7 +1061,9 @@ def manage_bulk_proposals(payload: BulkManageRequest, token: Annotated[str, Depe
|
|
|
1054
1061
|
raise HTTPException(status_code=HTTPStatus.CONFLICT, detail="Search context changed")
|
|
1055
1062
|
async def execute():
|
|
1056
1063
|
with bulk_operation_guard.acquire(token_service.get_session_key(token)):
|
|
1057
|
-
note_ids = proposal_scope_ids(
|
|
1064
|
+
note_ids = proposal_scope_ids(
|
|
1065
|
+
payload.scope, date_filter=tab_state_store.get_date_filter(tab_id=payload.scope.scope_tab_id),
|
|
1066
|
+
)
|
|
1058
1067
|
if payload.target == "namespace":
|
|
1059
1068
|
note_ids = tuple(note_store.list_note_ids())
|
|
1060
1069
|
changes, count, _ = prepare_proposal_changes(
|
|
@@ -1024,7 +1024,7 @@ def namespace_delete_job_status(
|
|
|
1024
1024
|
exc = job_record_capture.captured_exception
|
|
1025
1025
|
raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail=str(exc)) from exc
|
|
1026
1026
|
if job_record is None:
|
|
1027
|
-
raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail=f"
|
|
1027
|
+
raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail=f"Vault deletion job not found: {job_id}")
|
|
1028
1028
|
return job_record
|
|
1029
1029
|
|
|
1030
1030
|
|
|
@@ -1038,7 +1038,7 @@ def namespace_rename_job_status(job_id: str):
|
|
|
1038
1038
|
exc = job_record_capture.captured_exception
|
|
1039
1039
|
raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail=str(exc)) from exc
|
|
1040
1040
|
if job_record is None:
|
|
1041
|
-
raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail=f"
|
|
1041
|
+
raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail=f"Vault rename job not found: {job_id}")
|
|
1042
1042
|
return job_record
|
|
1043
1043
|
|
|
1044
1044
|
|
|
@@ -301,7 +301,7 @@ def _normalize_selected_namespaces(*, selected_namespaces: list[str]) -> list[st
|
|
|
301
301
|
raise TypeError("selected_namespaces must be a list")
|
|
302
302
|
normalized_selected_namespaces = _order_namespaces(namespaces=selected_namespaces)
|
|
303
303
|
if len(normalized_selected_namespaces) == 0:
|
|
304
|
-
raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail="Select at least one
|
|
304
|
+
raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail="Select at least one vault to back up")
|
|
305
305
|
return normalized_selected_namespaces
|
|
306
306
|
|
|
307
307
|
|
|
@@ -310,7 +310,7 @@ def _require_existing_selected_namespaces(*, selected_namespaces: list[str]) ->
|
|
|
310
310
|
for namespace in normalized_selected_namespaces:
|
|
311
311
|
database_path = resolve_namespaced_database_path(namespace=namespace)
|
|
312
312
|
if not database_path.is_file():
|
|
313
|
-
raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail=f"Selected
|
|
313
|
+
raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail=f"Selected vault has no database yet: {namespace}")
|
|
314
314
|
return normalized_selected_namespaces
|
|
315
315
|
|
|
316
316
|
|
|
@@ -324,7 +324,7 @@ def _filter_deleted_selected_namespaces(*, selected_namespaces: list[str]) -> li
|
|
|
324
324
|
if len(existing_selected_namespaces) == 0:
|
|
325
325
|
raise HTTPException(
|
|
326
326
|
status_code=HTTPStatus.BAD_REQUEST,
|
|
327
|
-
detail="None of the selected backup
|
|
327
|
+
detail="None of the selected backup vaults still exist",
|
|
328
328
|
)
|
|
329
329
|
return existing_selected_namespaces
|
|
330
330
|
|
|
@@ -583,7 +583,7 @@ def _verify_target_namespace_password(*, target_namespace: str, password: str) -
|
|
|
583
583
|
if not _target_auth_settings_have_password(settings=settings):
|
|
584
584
|
return
|
|
585
585
|
if password == "":
|
|
586
|
-
raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail="Target
|
|
586
|
+
raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail="Target vault password is required")
|
|
587
587
|
|
|
588
588
|
assert settings is not None
|
|
589
589
|
auth_salt = settings["auth_salt"]
|
|
@@ -610,7 +610,7 @@ def _verify_target_namespace_password(*, target_namespace: str, password: str) -
|
|
|
610
610
|
parallelism,
|
|
611
611
|
).hex()
|
|
612
612
|
if not secrets.compare_digest(candidate, auth_verifier):
|
|
613
|
-
raise HTTPException(status_code=HTTPStatus.FORBIDDEN, detail="Target
|
|
613
|
+
raise HTTPException(status_code=HTTPStatus.FORBIDDEN, detail="Target vault password is incorrect")
|
|
614
614
|
|
|
615
615
|
|
|
616
616
|
def _collect_import_profile_port_conflicts(
|
|
@@ -633,7 +633,7 @@ def _collect_import_profile_port_conflicts(
|
|
|
633
633
|
continue
|
|
634
634
|
conflict_namespace, conflict_service = occupied_ports[port]
|
|
635
635
|
conflicts.append(
|
|
636
|
-
f"{service} port {port} conflicts with {conflict_service} port reserved for
|
|
636
|
+
f"{service} port {port} conflicts with {conflict_service} port reserved for vault {conflict_namespace}"
|
|
637
637
|
)
|
|
638
638
|
return conflicts
|
|
639
639
|
|
|
@@ -959,7 +959,7 @@ def restore_backup_preflight(
|
|
|
959
959
|
|
|
960
960
|
folder_namespace, folder_filename = _parse_folder_backup_id(payload.backup_id)
|
|
961
961
|
if folder_namespace != backup_namespace:
|
|
962
|
-
raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail="folder backup
|
|
962
|
+
raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail="folder backup vault does not match payload")
|
|
963
963
|
if folder_filename != payload.backup_filename:
|
|
964
964
|
raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail="folder backup filename does not match payload")
|
|
965
965
|
settings = load_backup_settings(token=token)
|
|
@@ -1030,7 +1030,7 @@ def restore_backup(
|
|
|
1030
1030
|
|
|
1031
1031
|
folder_namespace, folder_filename = _parse_folder_backup_id(payload.backup_id)
|
|
1032
1032
|
if folder_namespace != backup_namespace:
|
|
1033
|
-
raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail="folder backup
|
|
1033
|
+
raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail="folder backup vault does not match payload")
|
|
1034
1034
|
if folder_filename != payload.backup_filename:
|
|
1035
1035
|
raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail="folder backup filename does not match payload")
|
|
1036
1036
|
settings = load_backup_settings(token=token)
|
|
@@ -1101,7 +1101,7 @@ def import_backup(
|
|
|
1101
1101
|
if target_exists and not payload.overwrite_existing_target:
|
|
1102
1102
|
raise HTTPException(
|
|
1103
1103
|
status_code=HTTPStatus.CONFLICT,
|
|
1104
|
-
detail=f"Target
|
|
1104
|
+
detail=f"Target vault already exists: {target_namespace}",
|
|
1105
1105
|
)
|
|
1106
1106
|
if target_exists:
|
|
1107
1107
|
_verify_target_namespace_password(
|
|
@@ -1112,7 +1112,7 @@ def import_backup(
|
|
|
1112
1112
|
target_database_path = resolve_namespaced_database_path(namespace=target_namespace)
|
|
1113
1113
|
folder_namespace, folder_filename = _parse_folder_backup_id(payload.backup_id)
|
|
1114
1114
|
if folder_namespace != backup_namespace:
|
|
1115
|
-
raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail="folder backup
|
|
1115
|
+
raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail="folder backup vault does not match payload")
|
|
1116
1116
|
if folder_filename != payload.backup_filename:
|
|
1117
1117
|
raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail="folder backup filename does not match payload")
|
|
1118
1118
|
settings = load_backup_settings(token=token)
|
|
@@ -11,7 +11,9 @@ from pydantic import BaseModel
|
|
|
11
11
|
|
|
12
12
|
from app.api.note_requests import (
|
|
13
13
|
ViewDiffRequest,
|
|
14
|
+
FindInListRequest,
|
|
14
15
|
UpdateTabStateRequest,
|
|
16
|
+
UpdateTabDateFilterRequest,
|
|
15
17
|
UpdateTabSortModeRequest,
|
|
16
18
|
CreateNewTabRequest,
|
|
17
19
|
DeleteTabRequest,
|
|
@@ -62,7 +64,16 @@ from app.api.note_requests import (
|
|
|
62
64
|
)
|
|
63
65
|
from app.api.transactions import serialized_read_route, transactional_route
|
|
64
66
|
from app.services.sync import touch_client
|
|
67
|
+
from app.services.root_date_filter import DATE_RANGE_NONE
|
|
68
|
+
from app.services.tag_properties import PROPERTY_SUGGESTIONS_IN_SEARCH
|
|
69
|
+
from app.services.tag_properties import PROPERTY_SUGGESTIONS_IN_TAG_BAR
|
|
70
|
+
from app.services.tag_properties import PropertySuggestion
|
|
71
|
+
from app.services.tag_properties import has_property_syntax
|
|
72
|
+
from app.services.tag_properties import is_property_term
|
|
73
|
+
from app.services.root_date_filter import RootDateFilter
|
|
74
|
+
from app.services.root_date_filter import make_root_date_filter
|
|
65
75
|
from app.services.snapshot import build_view_state
|
|
76
|
+
from app.services.snapshot import find_in_view
|
|
66
77
|
from app.services.snapshot import resolve_search_scope
|
|
67
78
|
from app.services.snapshot import resolve_view_scope_membership
|
|
68
79
|
from app.services.note_store import store as note_store
|
|
@@ -260,6 +271,13 @@ def _resolve_tab_sort_mode(tab_id: object) -> str:
|
|
|
260
271
|
return sort_mode
|
|
261
272
|
|
|
262
273
|
|
|
274
|
+
def _resolve_tab_date_filter(tab_id: str) -> RootDateFilter | None:
|
|
275
|
+
"""The tab's date range filter (None: every date), as its sort order is resolved."""
|
|
276
|
+
if not isinstance(tab_id, str) or tab_id == "":
|
|
277
|
+
raise TypeError("tabId must be a non-empty string")
|
|
278
|
+
return tab_state_store.get_date_filter(tab_id=tab_id)
|
|
279
|
+
|
|
280
|
+
|
|
263
281
|
def _block_root_reorder_when_sorted(note_id: str, *, tab_id: object, new_parent_id: object) -> None:
|
|
264
282
|
sort_mode = _resolve_tab_sort_mode(tab_id)
|
|
265
283
|
if not is_root_reorder_locked(sort_mode):
|
|
@@ -300,6 +318,7 @@ def view_diff(payload: ViewDiffRequest):
|
|
|
300
318
|
client_id = payload["clientId"]
|
|
301
319
|
touch_client(client_id)
|
|
302
320
|
editing_note_id = payload["editingNoteId"]
|
|
321
|
+
find_reveal_note_id = payload["findRevealNoteId"]
|
|
303
322
|
search = payload["search"]
|
|
304
323
|
tab_id = payload["tabId"]
|
|
305
324
|
undo_context = payload["undoContext"]
|
|
@@ -341,6 +360,10 @@ def view_diff(payload: ViewDiffRequest):
|
|
|
341
360
|
if not note_store.has_note(normalized_editing_note_id):
|
|
342
361
|
normalized_editing_note_id = None
|
|
343
362
|
|
|
363
|
+
# Like editingNoteId, the note find opened can be gone by now (deleted, undone).
|
|
364
|
+
if find_reveal_note_id is not None and not note_store.has_note(find_reveal_note_id):
|
|
365
|
+
find_reveal_note_id = None
|
|
366
|
+
|
|
344
367
|
# The server keeps each tab's warm view (what that browser tab displays),
|
|
345
368
|
# so the browser sends only where it is. A tab with no warm view, or one
|
|
346
369
|
# whose browser shows nothing for it, gets its initial window.
|
|
@@ -357,8 +380,10 @@ def view_diff(payload: ViewDiffRequest):
|
|
|
357
380
|
|
|
358
381
|
state = build_view_state(
|
|
359
382
|
editing_note_id=normalized_editing_note_id,
|
|
383
|
+
find_reveal_note_id=find_reveal_note_id,
|
|
360
384
|
search=normalized_search,
|
|
361
385
|
sort_mode=sort_mode,
|
|
386
|
+
date_filter=_resolve_tab_date_filter(tab_id),
|
|
362
387
|
client_known_note_ids=client_known_note_ids,
|
|
363
388
|
previous_root_ids=previous_root_ids,
|
|
364
389
|
visible_top_root_id=visible_top_root_id,
|
|
@@ -414,17 +439,26 @@ def get_tab_state() -> Dict[str, object]:
|
|
|
414
439
|
@router.post("/notes/tab-state")
|
|
415
440
|
@transactional_route
|
|
416
441
|
def update_tab_state(payload: UpdateTabStateRequest) -> Dict[str, object]:
|
|
417
|
-
if
|
|
418
|
-
|
|
442
|
+
if (
|
|
443
|
+
"activeTabId" not in payload or "tabs" not in payload or "tabOrder" not in payload
|
|
444
|
+
or "referenceViews" not in payload
|
|
445
|
+
):
|
|
446
|
+
raise HTTPException(
|
|
447
|
+
status_code=HTTPStatus.BAD_REQUEST,
|
|
448
|
+
detail="activeTabId, tabs, tabOrder, and referenceViews are required",
|
|
449
|
+
)
|
|
419
450
|
active_tab_id = payload["activeTabId"]
|
|
420
451
|
tabs = payload["tabs"]
|
|
421
452
|
tab_order = payload["tabOrder"]
|
|
453
|
+
reference_views = payload["referenceViews"]
|
|
422
454
|
if not isinstance(tab_order, list):
|
|
423
455
|
raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail="tabOrder must be a list")
|
|
424
456
|
tab_order_list = [str(entry) for entry in tab_order]
|
|
425
457
|
capture = CapturedExceptionContext(InputRejected, boundary='app/api/routes/notes.py:update_tab_state:capture')
|
|
426
458
|
with capture:
|
|
427
|
-
response = tab_state_store.update(
|
|
459
|
+
response = tab_state_store.update(
|
|
460
|
+
active_tab_id=active_tab_id, tabs=tabs, tab_order=tab_order_list, reference_views=reference_views,
|
|
461
|
+
)
|
|
428
462
|
if capture.captured_exception is not None:
|
|
429
463
|
raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail="Invalid or stale tab state") from capture.captured_exception
|
|
430
464
|
return response
|
|
@@ -457,6 +491,23 @@ def update_tab_sort_mode(payload: UpdateTabSortModeRequest) -> Dict[str, object]
|
|
|
457
491
|
return response
|
|
458
492
|
|
|
459
493
|
|
|
494
|
+
@router.post("/notes/tab-state/date-filter")
|
|
495
|
+
@transactional_route
|
|
496
|
+
def update_tab_date_filter(payload: UpdateTabDateFilterRequest) -> Dict[str, object]:
|
|
497
|
+
"""Set or clear a tab's date range filter (root_date_filter.py). A range that is
|
|
498
|
+
not one (its start after its end, say) is answered as rejected input."""
|
|
499
|
+
date_filter: RootDateFilter | None = None
|
|
500
|
+
if payload["rangeKind"] != DATE_RANGE_NONE:
|
|
501
|
+
date_filter = make_root_date_filter(
|
|
502
|
+
field=payload["field"], range_kind=payload["rangeKind"],
|
|
503
|
+
from_date=payload["fromDate"], to_date=payload["toDate"],
|
|
504
|
+
)
|
|
505
|
+
response = tab_state_store.set_date_filter(tab_id=payload["tabId"], date_filter=date_filter)
|
|
506
|
+
if response["changed"] is True:
|
|
507
|
+
reset_undo_stack(payload["clientId"], payload["undoContext"])
|
|
508
|
+
return response
|
|
509
|
+
|
|
510
|
+
|
|
460
511
|
@router.post("/notes/tab-state/new-tab")
|
|
461
512
|
@transactional_route
|
|
462
513
|
def create_new_tab(payload: CreateNewTabRequest) -> Dict[str, object]:
|
|
@@ -506,6 +557,15 @@ def search_suggestions(request: Request, payload: SearchSuggestionsRequest) -> D
|
|
|
506
557
|
)
|
|
507
558
|
window_days = tuple(raw_window_days)
|
|
508
559
|
validate_tag_activity_windows(window_days)
|
|
560
|
+
# Typing a property term (exercise:mi, drug:dosage>5): its names or units.
|
|
561
|
+
typed_term = _typed_property_term(query)
|
|
562
|
+
if typed_term is not None:
|
|
563
|
+
return _property_suggestions_response(
|
|
564
|
+
search_index.suggest_property_completions(
|
|
565
|
+
typed=typed_term, place=PROPERTY_SUGGESTIONS_IN_SEARCH, limit=MAX_SEARCH_SUGGESTIONS,
|
|
566
|
+
),
|
|
567
|
+
personalized=True,
|
|
568
|
+
)
|
|
509
569
|
all_suggestions = search_index.suggest_all_tag_completions(query=query)
|
|
510
570
|
suggestions = all_suggestions[:MAX_SEARCH_SUGGESTIONS]
|
|
511
571
|
personalized_selections: list[TagActivityWindowSelection] = []
|
|
@@ -544,7 +604,31 @@ def search_suggestions(request: Request, payload: SearchSuggestionsRequest) -> D
|
|
|
544
604
|
tag: list(search_suggestion_reasons(facts=facts, term=tag, recent_activity=recent_activity))
|
|
545
605
|
for tag in suggestions
|
|
546
606
|
},
|
|
607
|
+
"labels": {tag: tag for tag in suggestions},
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
|
|
611
|
+
def _typed_property_term(query: str) -> str | None:
|
|
612
|
+
"""The property term being typed at the end of a search, without its - or +."""
|
|
613
|
+
if query == "" or query[-1].isspace():
|
|
614
|
+
return None
|
|
615
|
+
term = query.split()[-1].lstrip("+-")
|
|
616
|
+
if '"' in term or "'" in term or not is_property_term(term):
|
|
617
|
+
return None
|
|
618
|
+
return term
|
|
619
|
+
|
|
620
|
+
|
|
621
|
+
def _property_suggestions_response(suggestions: list[PropertySuggestion], *, personalized: bool) -> Dict[str, object]:
|
|
622
|
+
"""Property names or units as the suggestion lists take them: the full replacement,
|
|
623
|
+
the part the list shows (miles= for jogging:miles=) and why."""
|
|
624
|
+
response: Dict[str, object] = {
|
|
625
|
+
"suggestions": [suggestion.replacement for suggestion in suggestions],
|
|
626
|
+
"reasons": {suggestion.replacement: list(suggestion.reasons) for suggestion in suggestions},
|
|
627
|
+
"labels": {suggestion.replacement: suggestion.label for suggestion in suggestions},
|
|
547
628
|
}
|
|
629
|
+
if personalized:
|
|
630
|
+
response["personalizedSuggestions"] = []
|
|
631
|
+
return response
|
|
548
632
|
|
|
549
633
|
|
|
550
634
|
@router.post("/notes/prioritize-tag-suggestions")
|
|
@@ -632,6 +716,40 @@ def get_memory_usage(request: Request) -> Dict[str, object]:
|
|
|
632
716
|
return describe_memory_usage()
|
|
633
717
|
|
|
634
718
|
|
|
719
|
+
@router.post("/notes/find")
|
|
720
|
+
@transactional_route
|
|
721
|
+
def find_in_list(payload: FindInListRequest) -> Dict[str, object]:
|
|
722
|
+
"""One step of find through the list a tab shows (docs/ui/find.md): the notes the
|
|
723
|
+
text occurs in, in list order, from a root position forward or before it backward."""
|
|
724
|
+
search = payload["search"]
|
|
725
|
+
if search is None or search.strip() == "":
|
|
726
|
+
search = ""
|
|
727
|
+
else:
|
|
728
|
+
# A search that does not parse is answered as rejected input, as the view does.
|
|
729
|
+
parse_search_query(search)
|
|
730
|
+
if payload["text"].strip() == "":
|
|
731
|
+
raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail="text must hold more than spaces")
|
|
732
|
+
window = find_in_view(
|
|
733
|
+
find_text=payload["text"], search=search, sort_mode=_resolve_tab_sort_mode(payload["tabId"]),
|
|
734
|
+
date_filter=_resolve_tab_date_filter(payload["tabId"]),
|
|
735
|
+
is_untagged_view=payload["isUntaggedView"], from_root_index=payload["fromRootIndex"],
|
|
736
|
+
direction=payload["direction"],
|
|
737
|
+
)
|
|
738
|
+
return {
|
|
739
|
+
"matches": [
|
|
740
|
+
{
|
|
741
|
+
"noteId": match.note_id, "rootId": match.root_id, "rootIndex": match.root_index,
|
|
742
|
+
"contentCount": match.content_count, "commentCount": match.comment_count,
|
|
743
|
+
"previewCount": match.preview_count, "isUnderFoldedNote": match.is_under_folded_note,
|
|
744
|
+
}
|
|
745
|
+
for match in window.matches
|
|
746
|
+
],
|
|
747
|
+
"firstRootIndex": window.first_root_index,
|
|
748
|
+
"endRootIndex": window.end_root_index,
|
|
749
|
+
"rootCount": window.root_count,
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
|
|
635
753
|
@router.get("/notes/memory-usage/breakdown")
|
|
636
754
|
@serialized_read_route
|
|
637
755
|
def get_memory_breakdown(request: Request) -> Dict[str, object]:
|
|
@@ -687,6 +805,15 @@ def tag_suggestions(payload: TagSuggestionsRequest) -> Dict[str, object]:
|
|
|
687
805
|
|
|
688
806
|
_require_note_present(note_id, context="notes.tag-suggestions")
|
|
689
807
|
|
|
808
|
+
# Typing after a tag's colon (jogging:mi, drug:dosage=10m): property names or units.
|
|
809
|
+
if has_property_syntax(prefix):
|
|
810
|
+
return _property_suggestions_response(
|
|
811
|
+
search_index.suggest_property_completions(
|
|
812
|
+
typed=prefix, place=PROPERTY_SUGGESTIONS_IN_TAG_BAR, limit=MAX_TAG_SUGGESTIONS,
|
|
813
|
+
),
|
|
814
|
+
personalized=False,
|
|
815
|
+
)
|
|
816
|
+
|
|
690
817
|
suggestions = suggest_tags_with_reasons_for_note(
|
|
691
818
|
note_id=note_id,
|
|
692
819
|
anchors=anchors,
|
|
@@ -699,6 +826,7 @@ def tag_suggestions(payload: TagSuggestionsRequest) -> Dict[str, object]:
|
|
|
699
826
|
return {
|
|
700
827
|
"suggestions": [suggestion.tag for suggestion in suggestions],
|
|
701
828
|
"reasons": {suggestion.tag: list(suggestion.reasons) for suggestion in suggestions},
|
|
829
|
+
"labels": {suggestion.tag: suggestion.tag for suggestion in suggestions},
|
|
702
830
|
}
|
|
703
831
|
|
|
704
832
|
|
|
@@ -747,6 +875,7 @@ def export_summary(request: Request) -> Dict[str, object]:
|
|
|
747
875
|
normalized_search = None
|
|
748
876
|
counts = exported_credential_counts(
|
|
749
877
|
search=normalized_search, sort_mode=_resolve_tab_sort_mode(tab_id),
|
|
878
|
+
date_filter=_resolve_tab_date_filter(tab_id),
|
|
750
879
|
is_untagged_view=is_untagged_view == "true", root_note_id=note_id,
|
|
751
880
|
)
|
|
752
881
|
return {
|
|
@@ -806,6 +935,7 @@ def export_notes_html(request: Request) -> Response:
|
|
|
806
935
|
document = build_notes_export_document(
|
|
807
936
|
search=normalized_search,
|
|
808
937
|
sort_mode=_resolve_tab_sort_mode(tab_id),
|
|
938
|
+
date_filter=_resolve_tab_date_filter(tab_id),
|
|
809
939
|
is_untagged_view=is_untagged_view == "true",
|
|
810
940
|
theme=normalized_theme,
|
|
811
941
|
token=token,
|
|
@@ -867,6 +997,7 @@ def backlinks(request: Request, note_id: str) -> Dict[str, object]:
|
|
|
867
997
|
search=normalized_search,
|
|
868
998
|
editing_note_id=None,
|
|
869
999
|
sort_mode="normal",
|
|
1000
|
+
date_filter=None,
|
|
870
1001
|
ordered_root_ids=None,
|
|
871
1002
|
)
|
|
872
1003
|
source_note_ids = search_scope.allowed_note_ids
|
|
@@ -1067,6 +1198,7 @@ def _robot_scope_note_ids(body: dict) -> frozenset[str]:
|
|
|
1067
1198
|
return resolve_view_scope_membership(
|
|
1068
1199
|
search=body["search"],
|
|
1069
1200
|
sort_mode=_resolve_tab_sort_mode(body["tabId"]),
|
|
1201
|
+
date_filter=_resolve_tab_date_filter(body["tabId"]),
|
|
1070
1202
|
is_untagged_view=body["isUntaggedView"],
|
|
1071
1203
|
).allowed_note_ids
|
|
1072
1204
|
|