MetaList 0.7.2__tar.gz → 0.7.3__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.7.2/metalist.egg-info → metalist-0.7.3}/PKG-INFO +8 -1
- {metalist-0.7.2 → metalist-0.7.3}/README.md +7 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/config.py +2 -2
- {metalist-0.7.2 → metalist-0.7.3}/app/db/live_recovery.py +4 -1
- {metalist-0.7.2 → metalist-0.7.3}/app/models/database.py +3 -18
- {metalist-0.7.2 → metalist-0.7.3}/app/services/app_updates.py +18 -15
- metalist-0.7.3/app/services/update_installer.py +122 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/update_preflight.py +4 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/startup_js_sanity.py +1 -1
- {metalist-0.7.2 → metalist-0.7.3}/app/startup_sanity.py +1 -1
- {metalist-0.7.2 → metalist-0.7.3}/app/version.py +1 -1
- {metalist-0.7.2 → metalist-0.7.3/metalist.egg-info}/PKG-INFO +8 -1
- {metalist-0.7.2 → metalist-0.7.3}/metalist.egg-info/SOURCES.txt +1 -0
- {metalist-0.7.2 → metalist-0.7.3}/MANIFEST.in +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/__init__.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/api/__init__.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/api/deps.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/api/dev.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/api/middleware/auth.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/api/note_requests.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/api/request_auth.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/api/routes/ai.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/api/routes/app_updates.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/api/routes/auth.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/api/routes/backups.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/api/routes/files.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/api/routes/notes.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/api/routes/ontology.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/api/routes/reminders.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/api/routes/remote_images.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/api/routes/test.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/api/transactions.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/api/upload_limits.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/data_directory.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/db/__init__.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/db/backup_settings_sql.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/db/engine.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/db/file_schema.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/db/file_session.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/db/files_sql.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/db/link_titles_sql.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/db/migrations.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/db/notes_sql.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/db/ontology_rules_sql.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/db/reminders_sql.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/db/retire_sounds.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/db/schema.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/db/search_history_sql.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/db/session.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/db/settings_sql.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/db/tab_state_sql.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/db/version.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/encryption_audit.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/exception_boundaries.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/https_proxy.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/main.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/models/commands.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/models/entities.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/models/enums.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/models/linked_list.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/models/list_operations.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/models/list_traversal.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/models/note_crud.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/models/utils.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/network_settings.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/presentation/__init__.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/presentation/render/__init__.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/presentation/render/note_renderer.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/presentation/templates.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/security/authenticated_logging.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/security/encryption.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/security/http_headers.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/security/note_html.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/security/request_boundary.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/security/request_hosts.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/security/sensitive_cache.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/security/sensitive_logging.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/security/shell_execution.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/security/validation_errors.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/server_runtime.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/__init__.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/__init__.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/actions.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/cloud_privacy.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/context.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/evidence_serialization.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/help_catalog.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/history.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/inference.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/investigation.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/judging.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/menu_actions.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/model_policy.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/openai_cost_tracking.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/openai_inference.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/permissions.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/prompt_settings.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/prompts/__init__.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/prompts/final-response.md +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/prompts/help-response.md +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/prompts/system.md +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/prompts/tool-result.md +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/retrieval_settings.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/runtime.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/scope.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/skill_settings.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/skills/__init__.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/skills/help-ai.md +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/skills/help-data.md +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/skills/help-formatting.md +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/skills/help-menus.md +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/skills/help-notes.md +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/skills/help-privacy.md +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/skills/help-references.md +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/skills/help-reminders.md +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/skills/help-search.md +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/skills/help-tags.md +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/skills/scoped-investigation.md +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/structured_inference.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/tagging.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/tagging_run.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/token_estimation.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/tools.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/agent/trace.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/ai_chat.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/ai_chat_rendering.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/ai_chat_stream.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/app_update_worker.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/auth.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/auth_cache_state.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/auth_service.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/backlink_index.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/backlinks.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/backup_service.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/backup_settings_service.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/bulk_operation.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/client_state_service.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/content_cache.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/content_formatting.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/diagnostics.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/embedded_references.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/encryption.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/exception_capture.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/file_registry.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/file_storage.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/footnote_layout.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/footnote_rendering.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/hierarchy.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/html_export.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/html_unformatting.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/hydration_state.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/image_size_formatting.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/inline_image_occurrences.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/input_errors.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/integrity.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/latex_rendering.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/link_titles.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/login_rate_limit.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/maintenance_mode.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/markdown_rendering.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/namespace_deletion_jobs.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/namespace_deletion_worker.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/namespace_rename_jobs.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/namespace_rename_worker.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/namespace_runtime_guard.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/namespace_switcher.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/note_fullscreen.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/note_image_tags.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/note_ordering.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/note_store.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/ontology_rules_store.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/openai_credentials.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/password_note_fields.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/reference_presentation.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/reminders.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/remote_image_proxy.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/request_recovery.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/resource_limits.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/root_sorting.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/runtime_generation.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/runtime_hardening.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/runtime_lock.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/search_history.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/search_history_storage.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/search_index.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/search_query.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/search_text.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/selected_text_tag.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/self_update.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/session_timeout_service.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/shell_session_service.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/snapshot.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/store.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/structured_note_renderers.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/sync.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/sync_state.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/tab_state.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/tag_case.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/tag_ontology.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/tag_rename.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/tag_suggestions.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/tag_term_matching.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/test_reset.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/tokens.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/undo_state.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/update_backups.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/view_cache.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/view_diff.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/view_state.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/services/windows_process_control.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/startup_environment.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/startup_sanity_config.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/config/agent-menu-actions.json +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/config/command_palette_tags.json +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/css/floating-notes.css +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/css/forms.css +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/css/main.css +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/img/favicon.ico +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/locked.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/main.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/activity-tracker.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/ai-chat/agent-menu-actions.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/ai-chat/agent-prompt-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/ai-chat/agent-retrieval-settings.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/ai-chat/ai-agent-debug-view.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/ai-chat/ai-chat-api.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/ai-chat/ai-chat-panel-controller.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/ai-chat/ai-chat-panel-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/ai-chat/ai-thinking-level-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/ai-chat/bulk-elapsed-clock.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/ai-chat/bulk-proposal-ui.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/ai-chat/cloud-privacy-policy.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/ai-chat/proposal-menu.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/api-client.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/api-failure-classification-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/app-update-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/application-state.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/async-result.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/auth.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/client-state-api.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/client-state-migration.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/command-palette/activation-auth-policy.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/command-palette/backup-command-availability.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/command-palette/click-activation-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/command-palette/command-palette-controller.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/command-palette/endpoint-registry.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/command-palette/note-layout-preferences.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/command-palette/preferences-store.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/command-palette/tag-config-loader.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/command-palette/usage-store.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/config.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/connectivity-monitor.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/context-menu/context-menu-registry.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/context-menu/context-menu-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/context-menu/context-menu-target-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/context-menu/input-caret-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/disconnect-editing-state-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/dom-utils-fixed.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/dom-utils.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/editor-commands.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/editor-selection.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/editor-toolbar.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/elapsed-time.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/error-handler.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/error-overlay.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/expected-errors.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/location-flags.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/login-namespace-picker.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/maintenance.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/modals/agent-prompt-editor-modal.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/modals/ai-agent-settings-modal.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/modals/alphabetize-root-notes-modal.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/modals/backup-restore-modal.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/modals/backup-result-modal.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/modals/backup-retention-modal.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/modals/backup-settings-modal.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/modals/base-modal.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/modals/confirmation-modal.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/modals/delete-namespace-modal.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/modals/delete-namespace-validation.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/modals/help-modal.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/modals/namespace-loading-page.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/modals/namespace-modals.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/modals/namespace-ports-profile.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/modals/namespace-rename-validation.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/modals/note-layout-appearance-modal.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/modals/ontology-modal.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/modals/password-modal.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/modals/prioritize-modal.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/modals/random-password-modal.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/modals/reminder-modal.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/modals/reset-updated-at-modal.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/modals/search-suggestion-statistics-modal.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/modals/session-timeout-modal.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/modals/version-info-modal.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/actions/content-actions.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/actions/history-actions.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/actions/note-actions.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/actions/search-actions.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/actions/selection-actions.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/actions/ui-actions.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/events/context-menu-events.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/events/focus-events.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/events/inactivity-events.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/events/input-events.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/events/keyboard-events.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/events/mouse-events.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/events/search-events.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/mode-context.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/mode-logger.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/mode-manager-controller.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/add-style-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/animated-scroll-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/backlinks-navigation-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/backlinks-panel-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/clipboard-shortcut-policy-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/collapse-affordance-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/collapse-editing-policy-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/command-gate-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/context-menu-target-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/deselect-selection-state-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/differential-view-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/edit-session-collapse-policy-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/edit-session-collapse-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/embedded-image-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/file-drop-policy-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/file-image-preview-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/file-reference-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/filtered-refresh-selection-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/floating-note-dom.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/floating-note-layout.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/floating-note-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/footnote-navigation-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/history-selection-policy-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/history-shortcut-policy-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/html-paste-sanitizer-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/image-context-menu-action-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/image-file-insert-choice-modal-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/infinite-scroll-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/link-context-menu-action-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/link-title-prefetch-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/markdown-render-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/mermaid-render-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/note-click-target-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/note-clipboard-write-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/note-collapse-animation-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/note-context-menu-action-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/note-delete-shortcut-policy-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/note-drag-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/note-fullscreen-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/note-reposition-animation-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/note-split-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/note-timestamp-hover-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/password-clipboard-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/polling-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/reference-source-navigation-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/remote-image-proxy-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/remove-formatting-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/root-date-separator-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/root-sort-indicator-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/root-sort-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/scroll-anchor-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/scroll-restoration-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/scroll-to-top-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/search-contexts-overlay-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/search-debounce-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/search-input-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/search-interaction-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/search-redaction-reveal-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/search-suggestion-statistics-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/search-suggestion-window-labels-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/search-suggestion-windows-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/search-suggestions-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/search-syntax-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/selected-formatting-removal-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/selected-text-tag-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/shell-output-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/tab-dom-cache-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/tab-drag-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/tab-duplication-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/tab-state-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/tag-bar-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/tag-input-selection-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/tag-proposal-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/tag-suggestions-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/tag-syntax-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/todo-toggle-editing-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/untagged-view-indicator-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/mode-manager/services/view-mode-search-shortcut-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/note-html-sanitizer.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/password-generator.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/password-operation-response.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/password-policy.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/password-strength.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/reminder-store.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/reminder-surface-service.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/selection-markers.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/session-auth.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/tag-token.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/modules/uuid.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/namespace-deleted.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/namespace-renamed.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/vendor/dompurify-3.4.13.LICENSE.txt +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/vendor/dompurify-3.4.13.min.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/vendor/markdown-it-14.3.2.LICENSE.txt +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/vendor/markdown-it-14.3.2.min.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/vendor/mermaid-11.16.1.LICENSE.txt +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/vendor/mermaid-11.16.1.min.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/vendor/zxcvbn-4.4.2.LICENSE.txt +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/js/vendor/zxcvbn-4.4.2.js +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/note-html-policy.json +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/static/video/login-startup.mp4 +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/templates/base.html +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/templates/index.html +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/templates/locked.html +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/templates/maintenance.html +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/templates/namespace_deleted.html +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/templates/namespace_renamed.html +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/templates/notes_list.html +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/upload_limits.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/__init__.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/add_selected_text_tag.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/alphabetize_root_notes.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/base.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/bulk_tag_proposals.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/collapse.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/copy_note.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/create_child.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/create_note.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/create_sibling.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/delete_subtree.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/delete_tag.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/expand.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/indent.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/lock.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/move.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/move_to_top.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/outdent.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/paste_child.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/paste_sibling.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/prefetch_link_titles.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/prioritize.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/redo.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/rename_tag.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/reset_updated_at.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/resize_image.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/run_shell.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/search_comment_autofill.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/search_context_tags.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/set_collapse_bulk.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/set_collapse_in_context.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/split_note.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/tag_proposals.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/toggle_reference_mode.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/toggle_todo_done.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/undo.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/unformat_content.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/update_content.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/usecases/view.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/utils/__init__.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/utils/encryption.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/app/utils/text_utils.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/convert-from-legacy.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/main.py +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/metalist.egg-info/dependency_links.txt +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/metalist.egg-info/entry_points.txt +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/metalist.egg-info/requires.txt +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/metalist.egg-info/top_level.txt +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/pyproject.toml +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/scripts/generate-lan-cert.sh +0 -0
- {metalist-0.7.2 → metalist-0.7.3}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: metalist
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.3
|
|
4
4
|
Summary: A minimalist single-user note-taking app with SSR, fast in-memory tree operations, and efficient sync.
|
|
5
5
|
Project-URL: Homepage, https://github.com/evolvingstuff/metalist
|
|
6
6
|
Project-URL: Repository, https://github.com/evolvingstuff/metalist
|
|
@@ -48,6 +48,11 @@ A minimalist single-user note-taking app focused on server-side rendering (SSR),
|
|
|
48
48
|
- Multi-tab search contexts with server-persisted scroll/search state (survives browser restarts)
|
|
49
49
|
- Manual namespace backups/restores to a user-selected backup folder with retention controls
|
|
50
50
|
|
|
51
|
+
## Changes in 0.7.3
|
|
52
|
+
|
|
53
|
+
- Windows updates use a private verified uv release when an older installer is vulnerable to the reported PE-resource access-denied failure. A standalone repair ZIP can bootstrap installations whose existing updater cannot update itself.
|
|
54
|
+
- Release candidates now run the complete test and installed-package matrix on Windows, macOS, and Linux across Python 3.10–3.14. Real Chrome and Firefox exercise repeated cold loads and encrypted login on every operating system; Windows also checks Edge over verified LAN HTTPS and the repair path from a published older release.
|
|
55
|
+
|
|
51
56
|
## Changes in 0.7.2
|
|
52
57
|
|
|
53
58
|
- Login, hydration, and workspace requests share one initialized browser-tab identity. Losing the `sessionStorage` copy while opening the workspace no longer causes the reported missing-tab-ID crash. The external trigger for that storage loss remains unconfirmed.
|
|
@@ -147,6 +152,8 @@ metalist update
|
|
|
147
152
|
```
|
|
148
153
|
The updater checks the installed version against the latest PyPI release first. If MetaList is already current, it reports the installed version and leaves all running namespaces untouched. When an update is available, it checks installer prerequisites and uses uv to install the candidate into a disposable tool environment with the current base Python interpreter. It checks dependencies and starts a temporary namespace to verify HTTP readiness, version, and runtime assets. A failed preflight leaves the current installation and running namespaces unchanged. After preflight succeeds, it stops running namespaces, and creates and verifies a new backup of every namespace before installation can begin. Each archive includes the complete notes/settings database, the attachments database when present, and any legacy search-history database. Locked namespaces are backed up with their encrypted data and key metadata intact, without requiring a password.
|
|
149
154
|
|
|
155
|
+
On Windows, the updater checks uv before installing packages. Versions older than 0.12.13 use a temporary PE-resource editing operation that can fail with `uv-trampoline.exe: Access is denied`. This checkout selects a private, checksum-verified uv 0.12.17 for those installations, keeping the same installer through preflight and final installation. It does not replace global uv. Already-installed MetaList releases retain their own updater code; the standalone repair launcher described in [recovery](docs/security/recovery.md#windows-updater-pe-resource-failure) supplies the compatible installer to that existing updater.
|
|
156
|
+
|
|
150
157
|
Backups are saved to `~/MetaList/namespaces/<namespace>/backups/<namespace>-<timestamp>.metalist-backup.tar.gz`; the updater prints each verified path. Existing backups remain unchanged and are not pruned. If any backup fails, the update aborts with the current installation intact; run `metalist` to restart the stopped servers after resolving the failure.
|
|
151
158
|
|
|
152
159
|
Only after all backups pass does the updater hand off to an external PowerShell process on Windows or `/bin/sh` on macOS/Linux so the installed environment can unlock. It delegates installation to uv, pinning the current base interpreter and the exact tested package/dependency versions, using the cache populated during preflight with network access disabled. It then launches MetaList again, and reports the installed version (for example, `MetaList updated to v0.5.0.`). This protection requires an installed version containing the backup safeguard and applies to `metalist update` and the in-app update action; direct pip/uv install commands do not run it.
|
|
@@ -12,6 +12,11 @@ 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.7.3
|
|
16
|
+
|
|
17
|
+
- Windows updates use a private verified uv release when an older installer is vulnerable to the reported PE-resource access-denied failure. A standalone repair ZIP can bootstrap installations whose existing updater cannot update itself.
|
|
18
|
+
- Release candidates now run the complete test and installed-package matrix on Windows, macOS, and Linux across Python 3.10–3.14. Real Chrome and Firefox exercise repeated cold loads and encrypted login on every operating system; Windows also checks Edge over verified LAN HTTPS and the repair path from a published older release.
|
|
19
|
+
|
|
15
20
|
## Changes in 0.7.2
|
|
16
21
|
|
|
17
22
|
- Login, hydration, and workspace requests share one initialized browser-tab identity. Losing the `sessionStorage` copy while opening the workspace no longer causes the reported missing-tab-ID crash. The external trigger for that storage loss remains unconfirmed.
|
|
@@ -111,6 +116,8 @@ metalist update
|
|
|
111
116
|
```
|
|
112
117
|
The updater checks the installed version against the latest PyPI release first. If MetaList is already current, it reports the installed version and leaves all running namespaces untouched. When an update is available, it checks installer prerequisites and uses uv to install the candidate into a disposable tool environment with the current base Python interpreter. It checks dependencies and starts a temporary namespace to verify HTTP readiness, version, and runtime assets. A failed preflight leaves the current installation and running namespaces unchanged. After preflight succeeds, it stops running namespaces, and creates and verifies a new backup of every namespace before installation can begin. Each archive includes the complete notes/settings database, the attachments database when present, and any legacy search-history database. Locked namespaces are backed up with their encrypted data and key metadata intact, without requiring a password.
|
|
113
118
|
|
|
119
|
+
On Windows, the updater checks uv before installing packages. Versions older than 0.12.13 use a temporary PE-resource editing operation that can fail with `uv-trampoline.exe: Access is denied`. This checkout selects a private, checksum-verified uv 0.12.17 for those installations, keeping the same installer through preflight and final installation. It does not replace global uv. Already-installed MetaList releases retain their own updater code; the standalone repair launcher described in [recovery](docs/security/recovery.md#windows-updater-pe-resource-failure) supplies the compatible installer to that existing updater.
|
|
120
|
+
|
|
114
121
|
Backups are saved to `~/MetaList/namespaces/<namespace>/backups/<namespace>-<timestamp>.metalist-backup.tar.gz`; the updater prints each verified path. Existing backups remain unchanged and are not pruned. If any backup fails, the update aborts with the current installation intact; run `metalist` to restart the stopped servers after resolving the failure.
|
|
115
122
|
|
|
116
123
|
Only after all backups pass does the updater hand off to an external PowerShell process on Windows or `/bin/sh` on macOS/Linux so the installed environment can unlock. It delegates installation to uv, pinning the current base interpreter and the exact tested package/dependency versions, using the cache populated during preflight with network access disabled. It then launches MetaList again, and reports the installed version (for example, `MetaList updated to v0.5.0.`). This protection requires an installed version containing the backup safeguard and applies to `metalist update` and the in-app update action; direct pip/uv install commands do not run it.
|
|
@@ -114,9 +114,9 @@ if TEST_MODE:
|
|
|
114
114
|
# Delete existing test.db if it exists
|
|
115
115
|
if test_database_path.exists():
|
|
116
116
|
test_database_path.unlink()
|
|
117
|
-
print("
|
|
117
|
+
print("Deleted existing test.db")
|
|
118
118
|
|
|
119
|
-
print("
|
|
119
|
+
print("Running in TEST MODE - using test.db")
|
|
120
120
|
else:
|
|
121
121
|
# Use production database
|
|
122
122
|
DEFAULT_DB_PATH = str(resolve_default_database_path())
|
|
@@ -44,7 +44,10 @@ def _sync_directory(path: Path) -> None:
|
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
def _sync_file(path: Path) -> None:
|
|
47
|
-
|
|
47
|
+
# Windows' CRT rejects fsync/_commit on a read-only descriptor with EBADF.
|
|
48
|
+
# These are live or recovery files owned by this transaction, so open them
|
|
49
|
+
# without truncation using a descriptor that every supported OS can flush.
|
|
50
|
+
with path.open('r+b') as handle:
|
|
48
51
|
os.fsync(handle.fileno())
|
|
49
52
|
|
|
50
53
|
|
|
@@ -124,15 +124,8 @@ class SafeSession:
|
|
|
124
124
|
_configure_sql_logging(anchor)
|
|
125
125
|
cls._memory_anchor = anchor
|
|
126
126
|
print("\n" + "=" * 50)
|
|
127
|
-
print(
|
|
128
|
-
|
|
129
|
-
🧪 SWITCHING TO TEST MODE 🧪
|
|
130
|
-
┌──────────────────────────┐
|
|
131
|
-
│ IN-MEMORY DATABASE │
|
|
132
|
-
│ *All Data is Temporary │
|
|
133
|
-
└──────────────────────────┘
|
|
134
|
-
"""
|
|
135
|
-
)
|
|
127
|
+
print("TEST MODE: IN-MEMORY DATABASE")
|
|
128
|
+
print("All data is temporary")
|
|
136
129
|
print("=" * 50 + "\n")
|
|
137
130
|
return {"status": "ok", "message": "Using in-memory database"}
|
|
138
131
|
|
|
@@ -159,15 +152,7 @@ class SafeSession:
|
|
|
159
152
|
_configure_sql_logging(conn)
|
|
160
153
|
conn.close()
|
|
161
154
|
print("\n" + "=" * 50)
|
|
162
|
-
print(
|
|
163
|
-
"""
|
|
164
|
-
📝 RETURNING TO PRODUCTION MODE 📝
|
|
165
|
-
┌──────────────────────────┐
|
|
166
|
-
│ PROD DATABASE │
|
|
167
|
-
│ │
|
|
168
|
-
└──────────────────────────┘
|
|
169
|
-
"""
|
|
170
|
-
)
|
|
155
|
+
print("PRODUCTION MODE: FILE DATABASE")
|
|
171
156
|
print("=" * 50 + "\n")
|
|
172
157
|
return {"status": "ok", "message": "Using file database"}
|
|
173
158
|
|
|
@@ -9,6 +9,7 @@ import shutil
|
|
|
9
9
|
import subprocess
|
|
10
10
|
import sys
|
|
11
11
|
import sysconfig
|
|
12
|
+
import threading
|
|
12
13
|
from uuid import UUID, uuid4
|
|
13
14
|
|
|
14
15
|
from app.data_directory import resolve_data_directory
|
|
@@ -28,6 +29,9 @@ class AppUpdateRejected(ValueError):
|
|
|
28
29
|
"""An update cannot be started in this installation or job state."""
|
|
29
30
|
|
|
30
31
|
|
|
32
|
+
_JOB_THREAD_LOCK = threading.Lock()
|
|
33
|
+
|
|
34
|
+
|
|
31
35
|
def update_executable() -> Path:
|
|
32
36
|
receipt = Path(sys.prefix) / 'uv-receipt.toml'
|
|
33
37
|
if not receipt.is_file():
|
|
@@ -165,24 +169,23 @@ def _release_update_job_locked(job_id: str) -> None:
|
|
|
165
169
|
def _job_lock():
|
|
166
170
|
directory = jobs_directory()
|
|
167
171
|
directory.mkdir(parents=True, exist_ok=True)
|
|
168
|
-
#
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
handle.write(b'0')
|
|
173
|
-
handle.flush()
|
|
174
|
-
handle.seek(0)
|
|
175
|
-
msvcrt.locking(handle.fileno(), msvcrt.LK_LOCK, 1)
|
|
176
|
-
else:
|
|
177
|
-
fcntl.flock(handle.fileno(), fcntl.LOCK_EX)
|
|
178
|
-
try:
|
|
179
|
-
yield
|
|
180
|
-
finally:
|
|
172
|
+
# Threads share process-owned POSIX locks, so serialize them before taking
|
|
173
|
+
# the stable cross-process lock shared by all namespaces.
|
|
174
|
+
with _JOB_THREAD_LOCK:
|
|
175
|
+
with (directory / 'admission.lock').open('a+b') as handle:
|
|
181
176
|
if os.name == 'nt':
|
|
182
177
|
handle.seek(0)
|
|
183
|
-
msvcrt.locking(handle.fileno(), msvcrt.
|
|
178
|
+
msvcrt.locking(handle.fileno(), msvcrt.LK_LOCK, 1)
|
|
184
179
|
else:
|
|
185
|
-
fcntl.flock(handle.fileno(), fcntl.
|
|
180
|
+
fcntl.flock(handle.fileno(), fcntl.LOCK_EX)
|
|
181
|
+
try:
|
|
182
|
+
yield
|
|
183
|
+
finally:
|
|
184
|
+
if os.name == 'nt':
|
|
185
|
+
handle.seek(0)
|
|
186
|
+
msvcrt.locking(handle.fileno(), msvcrt.LK_UNLCK, 1)
|
|
187
|
+
else:
|
|
188
|
+
fcntl.flock(handle.fileno(), fcntl.LOCK_UN)
|
|
186
189
|
|
|
187
190
|
|
|
188
191
|
def create_update_job(target_version: str) -> dict[str, object]:
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"""Select a compatible Windows installer; also runs standalone for old installations."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from collections.abc import Mapping
|
|
5
|
+
import hashlib
|
|
6
|
+
import io
|
|
7
|
+
import os
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
import platform
|
|
10
|
+
import re
|
|
11
|
+
import shutil
|
|
12
|
+
import subprocess
|
|
13
|
+
import sys
|
|
14
|
+
from tempfile import NamedTemporaryFile
|
|
15
|
+
from urllib.request import urlopen
|
|
16
|
+
import zipfile
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
# Official immutable 0.12.17 release assets. 0.12.13 removed the temporary
|
|
20
|
+
# Windows PE resource-editing operation that can fail under file inspection.
|
|
21
|
+
INSTALLER_VERSION = "0.12.17"
|
|
22
|
+
MINIMUM_WINDOWS_VERSION = (0, 12, 13)
|
|
23
|
+
WINDOWS_INSTALLERS = {
|
|
24
|
+
"x86_64": (
|
|
25
|
+
"a252121d5b59398fcb137c6ea448176459a44010f33f67e0072305a637119ca7",
|
|
26
|
+
"2019cdf564cb8f749262f5f021cedc75a99abb1c6081227ca340bbcda972611d",
|
|
27
|
+
),
|
|
28
|
+
"aarch64": (
|
|
29
|
+
"3e1aa6849d77f0e00dc865e4afab5c5b32de053e21fe35bf5ad5cec3734ec976",
|
|
30
|
+
"92e3a7af84b7da8925997eb5b856595e1c36a4b3591fbccee7d143e69f1c8656",
|
|
31
|
+
),
|
|
32
|
+
"i686": (
|
|
33
|
+
"1d3653cb6eafd1e675e979d7cd8eeac1456202f8927a2216419993077a4c473f",
|
|
34
|
+
"8d08a9c61f18f9436069f3ccf6e13e7f665b0e9b1ff85ac98f1ec8261c493145",
|
|
35
|
+
),
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _installer_version(executable: str, environ: Mapping[str, str]) -> tuple[int, int, int]:
|
|
40
|
+
completed = subprocess.run([executable, "--version"], env=dict(environ),
|
|
41
|
+
capture_output=True, text=True, check=True, timeout=30)
|
|
42
|
+
match = re.fullmatch(r"uv (\d+)\.(\d+)\.(\d+)(?: \([^\r\n]+\))?", completed.stdout.strip())
|
|
43
|
+
if match is None:
|
|
44
|
+
raise RuntimeError("Cannot verify the uv installer version; MetaList was not stopped")
|
|
45
|
+
return tuple(int(part) for part in match.groups())
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def _windows_architecture() -> str:
|
|
49
|
+
machine = platform.machine().casefold()
|
|
50
|
+
aliases = {"amd64": "x86_64", "x86_64": "x86_64", "arm64": "aarch64",
|
|
51
|
+
"aarch64": "aarch64", "x86": "i686", "i386": "i686", "i686": "i686"}
|
|
52
|
+
if machine not in aliases:
|
|
53
|
+
raise RuntimeError(f"Unsupported Windows updater architecture: {machine}")
|
|
54
|
+
return aliases[machine]
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def _download_installer_archive(architecture: str) -> bytes:
|
|
58
|
+
assert architecture in WINDOWS_INSTALLERS
|
|
59
|
+
url = (f"https://github.com/astral-sh/uv/releases/download/{INSTALLER_VERSION}/"
|
|
60
|
+
f"uv-{architecture}-pc-windows-msvc.zip")
|
|
61
|
+
with urlopen(url, timeout=120) as response:
|
|
62
|
+
return response.read()
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def _managed_windows_installer(environ: Mapping[str, str]) -> str:
|
|
66
|
+
architecture = _windows_architecture()
|
|
67
|
+
archive_digest, binary_digest = WINDOWS_INSTALLERS[architecture]
|
|
68
|
+
local_directory = Path(environ["LOCALAPPDATA"])
|
|
69
|
+
if not local_directory.is_absolute():
|
|
70
|
+
raise RuntimeError("LOCALAPPDATA must be an absolute path for the update installer")
|
|
71
|
+
directory = local_directory / "MetaList" / "update-tools" / f"uv-{INSTALLER_VERSION}-{architecture}"
|
|
72
|
+
executable = directory / "uv.exe"
|
|
73
|
+
if executable.exists():
|
|
74
|
+
if hashlib.sha256(executable.read_bytes()).hexdigest() != binary_digest:
|
|
75
|
+
raise RuntimeError("Cached update installer failed checksum verification; MetaList was not stopped")
|
|
76
|
+
return str(executable)
|
|
77
|
+
print(f"Preparing verified Windows update installer uv {INSTALLER_VERSION}...", flush=True)
|
|
78
|
+
archive_body = _download_installer_archive(architecture)
|
|
79
|
+
if hashlib.sha256(archive_body).hexdigest() != archive_digest:
|
|
80
|
+
raise RuntimeError("Downloaded update installer failed checksum verification; MetaList was not stopped")
|
|
81
|
+
with zipfile.ZipFile(io.BytesIO(archive_body)) as archive:
|
|
82
|
+
binary = archive.read("uv.exe")
|
|
83
|
+
if hashlib.sha256(binary).hexdigest() != binary_digest:
|
|
84
|
+
raise RuntimeError("Update installer executable failed checksum verification; MetaList was not stopped")
|
|
85
|
+
directory.mkdir(parents=True, exist_ok=True)
|
|
86
|
+
# Publish only complete, verified bytes. This is an installer cache, never a backup.
|
|
87
|
+
with NamedTemporaryFile(dir=directory, prefix="uv-", suffix=".tmp", delete=False) as staged:
|
|
88
|
+
staged.write(binary)
|
|
89
|
+
os.replace(staged.name, executable)
|
|
90
|
+
return str(executable)
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def resolve_update_installer(*, uv_executable: str, platform_name: str,
|
|
94
|
+
environ: Mapping[str, str]) -> str:
|
|
95
|
+
if platform_name != "win32":
|
|
96
|
+
return uv_executable
|
|
97
|
+
if _installer_version(uv_executable, environ) >= MINIMUM_WINDOWS_VERSION:
|
|
98
|
+
return uv_executable
|
|
99
|
+
executable = _managed_windows_installer(environ)
|
|
100
|
+
expected_version = tuple(int(part) for part in INSTALLER_VERSION.split("."))
|
|
101
|
+
if _installer_version(executable, environ) != expected_version:
|
|
102
|
+
raise RuntimeError("Verified update installer reported the wrong version; MetaList was not stopped")
|
|
103
|
+
return executable
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def repair_windows_update() -> None:
|
|
107
|
+
if sys.platform != "win32":
|
|
108
|
+
raise RuntimeError("This recovery launcher is for Windows installations")
|
|
109
|
+
uv_executable = shutil.which("uv")
|
|
110
|
+
metalist_executable = shutil.which("metalist")
|
|
111
|
+
if uv_executable is None or metalist_executable is None:
|
|
112
|
+
raise RuntimeError("The existing uv and MetaList commands must be available on PATH")
|
|
113
|
+
environ = dict(os.environ)
|
|
114
|
+
installer = resolve_update_installer(uv_executable=uv_executable, platform_name="win32", environ=environ)
|
|
115
|
+
# The already-installed updater discovers uv through PATH. Preserve that
|
|
116
|
+
# updater's preflight, shutdown, backup, offline install, and restart flow.
|
|
117
|
+
environ["PATH"] = str(Path(installer).parent) + os.pathsep + environ["PATH"]
|
|
118
|
+
subprocess.run([metalist_executable, "update"], env=environ, check=True)
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
if __name__ == "__main__":
|
|
122
|
+
repair_windows_update()
|
|
@@ -16,6 +16,7 @@ from app.services.namespace_switcher import NamespaceLaunchProcess
|
|
|
16
16
|
from app.services.namespace_switcher import _stop_failed_namespace_launch
|
|
17
17
|
from app.services.namespace_switcher import _wait_for_namespace_ready
|
|
18
18
|
from app.services.windows_process_control import stop_process_tree as stop_windows_process_tree
|
|
19
|
+
from app.services.update_installer import resolve_update_installer
|
|
19
20
|
|
|
20
21
|
|
|
21
22
|
def _run_checked(command: list[str], *, environ: Mapping[str, str], directory: Path) -> str:
|
|
@@ -92,6 +93,9 @@ def prepare_update(*, uv_executable: str, target_version: str,
|
|
|
92
93
|
python = str(Path(sys._base_executable).resolve())
|
|
93
94
|
if not Path(python).is_file():
|
|
94
95
|
raise RuntimeError("The current base Python interpreter is missing; MetaList was not stopped")
|
|
96
|
+
uv_executable = resolve_update_installer(
|
|
97
|
+
uv_executable=uv_executable, platform_name=sys.platform, environ=environ,
|
|
98
|
+
)
|
|
95
99
|
print(f"Checking MetaList v{target_version} installation and startup with Python {sys.version.split()[0]}...", flush=True)
|
|
96
100
|
with TemporaryDirectory(prefix="metalist-update-check-") as temporary:
|
|
97
101
|
directory = Path(temporary)
|
|
@@ -165,7 +165,7 @@ def discover_typescript_source_paths(project_root: Path) -> list[Path]:
|
|
|
165
165
|
|
|
166
166
|
|
|
167
167
|
def _path_rel(project_root: Path, path: Path) -> str:
|
|
168
|
-
return
|
|
168
|
+
return path.relative_to(project_root).as_posix()
|
|
169
169
|
|
|
170
170
|
|
|
171
171
|
def _codeframe(lines: list[str], lineno: int, col: int, context_lines: int) -> str:
|
|
@@ -72,7 +72,7 @@ class _RouteDecorator:
|
|
|
72
72
|
|
|
73
73
|
|
|
74
74
|
def _path_rel(project_root: Path, path: Path) -> str:
|
|
75
|
-
return
|
|
75
|
+
return path.relative_to(project_root).as_posix()
|
|
76
76
|
|
|
77
77
|
|
|
78
78
|
def _suppressed(lines: list[str], lineno: int, rule_id: str) -> bool:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: metalist
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.3
|
|
4
4
|
Summary: A minimalist single-user note-taking app with SSR, fast in-memory tree operations, and efficient sync.
|
|
5
5
|
Project-URL: Homepage, https://github.com/evolvingstuff/metalist
|
|
6
6
|
Project-URL: Repository, https://github.com/evolvingstuff/metalist
|
|
@@ -48,6 +48,11 @@ A minimalist single-user note-taking app focused on server-side rendering (SSR),
|
|
|
48
48
|
- Multi-tab search contexts with server-persisted scroll/search state (survives browser restarts)
|
|
49
49
|
- Manual namespace backups/restores to a user-selected backup folder with retention controls
|
|
50
50
|
|
|
51
|
+
## Changes in 0.7.3
|
|
52
|
+
|
|
53
|
+
- Windows updates use a private verified uv release when an older installer is vulnerable to the reported PE-resource access-denied failure. A standalone repair ZIP can bootstrap installations whose existing updater cannot update itself.
|
|
54
|
+
- Release candidates now run the complete test and installed-package matrix on Windows, macOS, and Linux across Python 3.10–3.14. Real Chrome and Firefox exercise repeated cold loads and encrypted login on every operating system; Windows also checks Edge over verified LAN HTTPS and the repair path from a published older release.
|
|
55
|
+
|
|
51
56
|
## Changes in 0.7.2
|
|
52
57
|
|
|
53
58
|
- Login, hydration, and workspace requests share one initialized browser-tab identity. Losing the `sessionStorage` copy while opening the workspace no longer causes the reported missing-tab-ID crash. The external trigger for that storage loss remains unconfirmed.
|
|
@@ -147,6 +152,8 @@ metalist update
|
|
|
147
152
|
```
|
|
148
153
|
The updater checks the installed version against the latest PyPI release first. If MetaList is already current, it reports the installed version and leaves all running namespaces untouched. When an update is available, it checks installer prerequisites and uses uv to install the candidate into a disposable tool environment with the current base Python interpreter. It checks dependencies and starts a temporary namespace to verify HTTP readiness, version, and runtime assets. A failed preflight leaves the current installation and running namespaces unchanged. After preflight succeeds, it stops running namespaces, and creates and verifies a new backup of every namespace before installation can begin. Each archive includes the complete notes/settings database, the attachments database when present, and any legacy search-history database. Locked namespaces are backed up with their encrypted data and key metadata intact, without requiring a password.
|
|
149
154
|
|
|
155
|
+
On Windows, the updater checks uv before installing packages. Versions older than 0.12.13 use a temporary PE-resource editing operation that can fail with `uv-trampoline.exe: Access is denied`. This checkout selects a private, checksum-verified uv 0.12.17 for those installations, keeping the same installer through preflight and final installation. It does not replace global uv. Already-installed MetaList releases retain their own updater code; the standalone repair launcher described in [recovery](docs/security/recovery.md#windows-updater-pe-resource-failure) supplies the compatible installer to that existing updater.
|
|
156
|
+
|
|
150
157
|
Backups are saved to `~/MetaList/namespaces/<namespace>/backups/<namespace>-<timestamp>.metalist-backup.tar.gz`; the updater prints each verified path. Existing backups remain unchanged and are not pruned. If any backup fails, the update aborts with the current installation intact; run `metalist` to restart the stopped servers after resolving the failure.
|
|
151
158
|
|
|
152
159
|
Only after all backups pass does the updater hand off to an external PowerShell process on Windows or `/bin/sh` on macOS/Linux so the installed environment can unlock. It delegates installation to uv, pinning the current base interpreter and the exact tested package/dependency versions, using the cache populated during preflight with network access disabled. It then launches MetaList again, and reports the installed version (for example, `MetaList updated to v0.5.0.`). This protection requires an installed version containing the backup safeguard and applies to `metalist update` and the in-app update action; direct pip/uv install commands do not run it.
|
|
@@ -162,6 +162,7 @@ app/services/test_reset.py
|
|
|
162
162
|
app/services/tokens.py
|
|
163
163
|
app/services/undo_state.py
|
|
164
164
|
app/services/update_backups.py
|
|
165
|
+
app/services/update_installer.py
|
|
165
166
|
app/services/update_preflight.py
|
|
166
167
|
app/services/view_cache.py
|
|
167
168
|
app/services/view_diff.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|