MetaList 0.4.0__tar.gz → 0.4.2__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.4.0/metalist.egg-info → metalist-0.4.2}/PKG-INFO +12 -4
- {metalist-0.4.0 → metalist-0.4.2}/README.md +10 -3
- {metalist-0.4.0 → metalist-0.4.2}/app/api/routes/ai.py +2 -1
- {metalist-0.4.0 → metalist-0.4.2}/app/api/routes/auth.py +0 -4
- metalist-0.4.2/app/data_directory.py +22 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/db/migrations.py +58 -2
- {metalist-0.4.0 → metalist-0.4.2}/app/db/schema.py +0 -15
- {metalist-0.4.0 → metalist-0.4.2}/app/db/version.py +1 -1
- {metalist-0.4.0 → metalist-0.4.2}/app/encryption_audit.py +5 -6
- {metalist-0.4.0 → metalist-0.4.2}/app/main.py +0 -4
- {metalist-0.4.0 → metalist-0.4.2}/app/presentation/render/note_renderer.py +1 -2
- {metalist-0.4.0 → metalist-0.4.2}/app/server_runtime.py +50 -6
- {metalist-0.4.0 → metalist-0.4.2}/app/services/agent/actions.py +2 -1
- {metalist-0.4.0 → metalist-0.4.2}/app/services/agent/scope.py +2 -1
- {metalist-0.4.0 → metalist-0.4.2}/app/services/agent/skills/__init__.py +0 -1
- metalist-0.4.2/app/services/agent/skills/scoped-investigation.md +27 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/auth_service.py +0 -11
- {metalist-0.4.0 → metalist-0.4.2}/app/services/embedded_references.py +1 -11
- {metalist-0.4.0 → metalist-0.4.2}/app/services/managed_ollama_runtime.py +2 -2
- {metalist-0.4.0 → metalist-0.4.2}/app/services/namespace_rename_worker.py +2 -2
- {metalist-0.4.0 → metalist-0.4.2}/app/services/namespace_switcher.py +3 -2
- {metalist-0.4.0 → metalist-0.4.2}/app/services/runtime_lock.py +0 -3
- {metalist-0.4.0 → metalist-0.4.2}/app/services/self_update.py +25 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/snapshot.py +1 -2
- {metalist-0.4.0 → metalist-0.4.2}/app/services/tag_suggestions.py +3 -2
- {metalist-0.4.0 → metalist-0.4.2}/app/services/tag_term_matching.py +21 -5
- {metalist-0.4.0 → metalist-0.4.2}/app/services/test_reset.py +0 -3
- {metalist-0.4.0 → metalist-0.4.2}/app/services/undo_state.py +2 -25
- metalist-0.4.2/app/services/update_backups.py +162 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/config/command_palette_tags.json +0 -1
- {metalist-0.4.0 → metalist-0.4.2}/app/static/css/main.css +0 -154
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/command-palette/command-palette-controller.js +2 -34
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/command-palette/endpoint-registry.js +0 -6
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/command-palette/tag-config-loader.js +35 -1
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/context-menu/context-menu-registry.js +0 -5
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/actions/ui-actions.js +6 -2
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/events/context-menu-events.js +0 -14
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/events/mouse-events.js +0 -2
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/note-html-sanitizer.js +1 -3
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/password-generator.js +6 -6
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/copy_note.py +1 -2
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/paste_child.py +0 -2
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/paste_sibling.py +0 -2
- {metalist-0.4.0 → metalist-0.4.2}/app/version.py +1 -1
- {metalist-0.4.0 → metalist-0.4.2}/main.py +11 -2
- {metalist-0.4.0 → metalist-0.4.2/metalist.egg-info}/PKG-INFO +12 -4
- {metalist-0.4.0 → metalist-0.4.2}/metalist.egg-info/SOURCES.txt +3 -18
- {metalist-0.4.0 → metalist-0.4.2}/metalist.egg-info/requires.txt +1 -0
- {metalist-0.4.0 → metalist-0.4.2}/pyproject.toml +2 -0
- metalist-0.4.0/app/api/routes/embedded_documents.py +0 -87
- metalist-0.4.0/app/services/diagram_rendering.py +0 -96
- metalist-0.4.0/app/services/diagram_schema.py +0 -128
- metalist-0.4.0/app/services/diagram_theme.py +0 -159
- metalist-0.4.0/app/services/diagram_vector.py +0 -209
- metalist-0.4.0/app/services/document_references.py +0 -51
- metalist-0.4.0/app/services/embedded_documents.py +0 -222
- metalist-0.4.0/app/static/js/modules/embedded-documents/diagram-canvas.js +0 -76
- metalist-0.4.0/app/static/js/modules/embedded-documents/diagram-document.js +0 -237
- metalist-0.4.0/app/static/js/modules/embedded-documents/diagram-editor.js +0 -475
- metalist-0.4.0/app/static/js/modules/embedded-documents/diagram-model.js +0 -130
- metalist-0.4.0/app/static/js/modules/embedded-documents/diagram-scene.js +0 -88
- metalist-0.4.0/app/static/js/modules/embedded-documents/diagram-text-editor.js +0 -76
- metalist-0.4.0/app/static/js/modules/embedded-documents/diagram-theme.js +0 -118
- metalist-0.4.0/app/static/js/modules/embedded-documents/document-api.js +0 -30
- metalist-0.4.0/app/static/js/modules/embedded-documents/serialization.js +0 -12
- metalist-0.4.0/app/static/js/modules/embedded-documents/widget-ui.js +0 -194
- metalist-0.4.0/app/usecases/embedded_documents.py +0 -55
- {metalist-0.4.0 → metalist-0.4.2}/MANIFEST.in +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/__init__.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/api/__init__.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/api/deps.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/api/dev.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/api/middleware/auth.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/api/request_auth.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/api/routes/backups.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/api/routes/files.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/api/routes/notes.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/api/routes/ontology.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/api/routes/reminders.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/api/routes/remote_images.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/api/routes/sounds.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/api/routes/test.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/api/transactions.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/config.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/db/__init__.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/db/backup_settings_sql.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/db/engine.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/db/file_schema.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/db/file_session.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/db/files_sql.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/db/link_titles_sql.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/db/notes_sql.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/db/ontology_rules_sql.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/db/reminders_sql.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/db/search_history_sql.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/db/session.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/db/settings_sql.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/db/sounds_sql.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/db/tab_state_sql.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/models/commands.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/models/database.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/models/entities.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/models/enums.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/models/linked_list.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/models/list_operations.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/models/list_traversal.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/models/note_crud.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/models/utils.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/presentation/__init__.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/presentation/render/__init__.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/presentation/templates.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/security/authenticated_logging.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/security/encryption.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/security/http_headers.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/security/note_html.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/security/request_boundary.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/security/sensitive_logging.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/security/shell_execution.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/security/validation_errors.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/__init__.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/agent/__init__.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/agent/cloud_privacy.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/agent/context.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/agent/evidence_serialization.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/agent/inference.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/agent/investigation.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/agent/model_policy.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/agent/ollama_inference.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/agent/openai_cost_tracking.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/agent/openai_inference.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/agent/permissions.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/agent/prompt_settings.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/agent/prompts/__init__.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/agent/prompts/final-response.md +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/agent/prompts/system.md +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/agent/prompts/tool-result.md +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/agent/retrieval_settings.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/agent/runtime.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/agent/skill_settings.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/agent/tagging.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/agent/tagging_run.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/agent/token_estimation.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/agent/tools.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/agent/trace.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/ai_chat.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/ai_chat_rendering.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/auth.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/auth_cache_state.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/backlink_index.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/backlinks.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/backup_service.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/backup_settings_service.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/base_service.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/bulk_operation.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/client_state_service.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/content_cache.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/content_formatting.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/dependencies.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/diagnostics.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/encryption.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/exception_capture.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/file_registry.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/file_storage.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/footnote_layout.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/footnote_rendering.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/html_export.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/html_unformatting.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/hydration_state.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/image_size_formatting.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/inline_image_occurrences.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/integrity.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/latex_rendering.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/link_titles.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/login_rate_limit.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/maintenance_mode.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/markdown_rendering.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/namespace_deletion_jobs.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/namespace_deletion_worker.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/namespace_rename_jobs.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/namespace_runtime_guard.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/note_fullscreen.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/note_image_tags.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/note_service.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/note_store.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/ollama_provider.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/ontology_rules_store.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/openai_credentials.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/query_service.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/reference_presentation.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/reminders.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/remote_image_proxy.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/root_sorting.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/runtime_hardening.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/search_history.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/search_history_storage.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/search_index.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/search_query.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/search_text.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/selected_text_tag.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/session_timeout_service.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/shell_session_service.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/sound_storage.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/store.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/sync.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/sync_state.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/tab_state.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/tag_case.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/tag_ontology.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/tag_rename.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/tokens.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/transaction_manager.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/undo_service.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/view_cache.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/view_diff.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/view_state.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/services/windows_process_control.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/startup_environment.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/startup_js_sanity.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/startup_sanity.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/startup_sanity_config.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/css/forms.css +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/img/favicon.ico +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/locked.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/main.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/activity-tracker.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/ai-chat/agent-prompt-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/ai-chat/agent-retrieval-settings.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/ai-chat/ai-agent-debug-view.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/ai-chat/ai-chat-api.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/ai-chat/ai-chat-panel-controller.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/ai-chat/ai-chat-panel-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/ai-chat/ai-thinking-level-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/ai-chat/bulk-elapsed-clock.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/ai-chat/bulk-proposal-ui.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/ai-chat/cloud-privacy-policy.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/ai-chat/proposal-menu.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/api-client.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/api-failure-classification-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/async-result.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/auth.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/client-state-api.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/client-state-migration.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/command-palette/activation-auth-policy.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/command-palette/backup-command-availability.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/command-palette/click-activation-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/command-palette/note-layout-preferences.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/command-palette/preferences-store.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/command-palette/usage-store.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/config.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/connectivity-monitor.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/context-menu/context-menu-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/context-menu/context-menu-target-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/context-menu/input-caret-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/disconnect-editing-state-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/dom-utils-fixed.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/dom-utils.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/editor-commands.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/editor-selection.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/editor-toolbar.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/elapsed-time.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/error-handler.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/error-overlay.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/location-flags.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/login-namespace-picker.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/modals/agent-prompt-editor-modal.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/modals/ai-agent-settings-modal.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/modals/alphabetize-root-notes-modal.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/modals/backup-restore-modal.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/modals/backup-result-modal.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/modals/backup-retention-modal.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/modals/backup-settings-modal.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/modals/base-modal.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/modals/confirmation-modal.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/modals/delete-namespace-modal.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/modals/delete-namespace-validation.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/modals/help-modal.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/modals/namespace-loading-page.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/modals/namespace-modals.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/modals/namespace-ports-profile.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/modals/namespace-rename-validation.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/modals/note-layout-appearance-modal.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/modals/ontology-modal.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/modals/password-modal.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/modals/prioritize-modal.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/modals/random-password-modal.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/modals/reminder-modal.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/modals/reset-updated-at-modal.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/modals/search-suggestion-statistics-modal.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/modals/session-timeout-modal.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/modals/sound-manager-modal.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/modals/version-info-modal.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/actions/content-actions.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/actions/history-actions.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/actions/note-actions.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/actions/search-actions.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/actions/selection-actions.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/events/focus-events.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/events/inactivity-events.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/events/input-events.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/events/keyboard-events.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/events/search-events.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/mode-context.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/mode-logger.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/mode-manager-controller.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/add-style-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/animated-scroll-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/backlinks-navigation-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/backlinks-panel-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/clipboard-shortcut-policy-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/collapse-affordance-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/collapse-editing-policy-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/command-gate-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/context-menu-target-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/deselect-selection-state-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/differential-view-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/edit-session-collapse-policy-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/edit-session-collapse-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/embedded-image-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/file-drop-policy-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/file-image-preview-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/file-reference-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/filtered-refresh-selection-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/footnote-navigation-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/history-selection-policy-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/history-shortcut-policy-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/html-paste-sanitizer-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/image-context-menu-action-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/image-file-insert-choice-modal-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/infinite-scroll-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/link-context-menu-action-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/markdown-render-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/mermaid-render-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/note-click-target-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/note-clipboard-write-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/note-collapse-animation-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/note-context-menu-action-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/note-delete-shortcut-policy-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/note-drag-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/note-fullscreen-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/note-reposition-animation-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/note-split-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/note-timestamp-hover-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/password-clipboard-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/polling-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/reference-source-navigation-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/remote-image-proxy-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/remove-formatting-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/root-date-separator-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/root-sort-indicator-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/root-sort-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/scroll-anchor-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/scroll-restoration-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/scroll-to-top-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/search-contexts-overlay-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/search-debounce-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/search-input-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/search-interaction-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/search-redaction-reveal-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/search-suggestion-statistics-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/search-suggestion-window-labels-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/search-suggestion-windows-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/search-suggestions-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/search-syntax-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/selected-formatting-removal-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/selected-text-tag-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/shell-output-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/tab-dom-cache-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/tab-drag-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/tab-duplication-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/tab-state-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/tag-bar-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/tag-proposal-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/tag-suggestions-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/tag-syntax-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/todo-toggle-editing-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/untagged-view-indicator-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/mode-manager/services/view-mode-search-shortcut-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/password-operation-response.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/password-policy.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/password-strength.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/reminder-store.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/reminder-surface-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/selection-markers.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/session-auth.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/sound-service.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/tag-token.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/modules/uuid.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/namespace-deleted.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/namespace-renamed.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/vendor/dompurify-3.4.12.LICENSE.txt +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/vendor/dompurify-3.4.12.min.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/vendor/markdown-it.min.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/vendor/mermaid-11.9.0.LICENSE.txt +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/vendor/mermaid-11.9.0.min.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/vendor/zxcvbn-4.4.2.LICENSE.txt +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/js/vendor/zxcvbn-4.4.2.js +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/note-html-policy.json +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/static/video/login-startup.mp4 +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/templates/base.html +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/templates/index.html +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/templates/locked.html +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/templates/maintenance.html +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/templates/namespace_deleted.html +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/templates/namespace_renamed.html +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/templates/notes_list.html +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/__init__.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/add_selected_text_tag.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/alphabetize_root_notes.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/base.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/bulk_tag_proposals.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/collapse.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/create_child.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/create_note.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/create_sibling.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/delete_subtree.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/delete_tag.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/expand.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/indent.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/lock.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/move.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/move_to_top.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/outdent.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/prioritize.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/redo.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/rename_tag.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/reset_updated_at.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/resize_image.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/run_shell.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/search_comment_autofill.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/search_context_tags.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/set_collapse_bulk.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/set_collapse_in_context.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/split_note.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/tag_proposals.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/toggle_reference_mode.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/toggle_todo_done.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/undo.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/unformat_content.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/update_content.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/usecases/view.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/utils/__init__.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/utils/encryption.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/app/utils/text_utils.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/convert-from-legacy.py +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/metalist.egg-info/dependency_links.txt +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/metalist.egg-info/entry_points.txt +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/metalist.egg-info/top_level.txt +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/scripts/generate-lan-cert.sh +0 -0
- {metalist-0.4.0 → metalist-0.4.2}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: metalist
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.2
|
|
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
|
|
@@ -27,6 +27,7 @@ Requires-Dist: starlette==1.3.1
|
|
|
27
27
|
Requires-Dist: tqdm==4.70.0
|
|
28
28
|
Requires-Dist: tree-sitter==0.25.2
|
|
29
29
|
Requires-Dist: tree-sitter-javascript==0.25.0
|
|
30
|
+
Requires-Dist: typing_extensions==4.16.0
|
|
30
31
|
Requires-Dist: uvicorn==0.52.0
|
|
31
32
|
Requires-Dist: zxcvbn==4.5.0
|
|
32
33
|
Provides-Extra: dev
|
|
@@ -101,7 +102,11 @@ After the first installation, update and restart MetaList with one cross-platfor
|
|
|
101
102
|
```bash
|
|
102
103
|
metalist update
|
|
103
104
|
```
|
|
104
|
-
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 stops running namespaces,
|
|
105
|
+
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 the installer prerequisites, 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/sounds 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.
|
|
106
|
+
|
|
107
|
+
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.
|
|
108
|
+
|
|
109
|
+
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 installs the exact version reported by PyPI with a forced cache refresh, launches MetaList again, and reports the installed version (for example, `MetaList updated to v0.4.2.`). This protection requires an installed version containing the backup safeguard and applies to `metalist update`; direct pip/uv install commands do not run it.
|
|
105
110
|
|
|
106
111
|
For pip, users can run `pip install metalist`. For a non-editable local install from this checkout, use `uv pip install .` or `pip install .` instead of the editable command below.
|
|
107
112
|
|
|
@@ -114,6 +119,8 @@ npm install
|
|
|
114
119
|
```
|
|
115
120
|
|
|
116
121
|
### Run
|
|
122
|
+
|
|
123
|
+
Persistent data defaults to `~/MetaList`. Set `METALIST_DATA_DIRECTORY` to an absolute directory path before launch to use a separate data root, including namespaces, backups, certificates, logs, and runtime jobs. This is used by release tests to keep their disposable data separate from real notes.
|
|
117
124
|
The installed entrypoint starts or restarts every known namespace, prints their URLs, and exits:
|
|
118
125
|
```bash
|
|
119
126
|
metalist
|
|
@@ -269,8 +276,9 @@ This repo now packages itself under the PyPI distribution name `metalist`. Curre
|
|
|
269
276
|
|
|
270
277
|
Recommended release path:
|
|
271
278
|
1. In the existing PyPI project `metalist`, configure GitHub Trusted Publishing for `evolvingstuff/metalist` and the workflow file `.github/workflows/publish-pypi.yml`.
|
|
272
|
-
2. Push a
|
|
273
|
-
3.
|
|
279
|
+
2. Push the candidate commit to a branch and wait for the `Publish to PyPI` validation workflow to pass for that exact commit. GitHub-hosted Windows, macOS, and Linux runners install the built wheel and test application startup outside the source checkout on Python 3.10 through 3.13. You do not need those operating systems locally. Archive verification also checks runtime files, including agent Markdown resources, against both the wheel and source distribution.
|
|
280
|
+
3. Only after every required check passes, create and push the release tag for that same commit. Any intervening change requires a new validation run before tagging. Branch and pull-request runs validate without publishing.
|
|
281
|
+
4. The tag workflow repeats validation and publishes the same artifacts tested by its full matrix. Manual publication also requires all checks to pass. Users can then run it with `uvx metalist`, install it persistently with `uv tool install metalist`, or install it with `pip install metalist`.
|
|
274
282
|
|
|
275
283
|
If `--input` is omitted, a file picker opens (when `tkinter` is available).
|
|
276
284
|
Notes tagged with `@implies` are converted into ontology rules and are not imported as notes. Legacy rules that are invalid under the current ontology grammar are reported and skipped while valid rules continue importing.
|
|
@@ -65,7 +65,11 @@ After the first installation, update and restart MetaList with one cross-platfor
|
|
|
65
65
|
```bash
|
|
66
66
|
metalist update
|
|
67
67
|
```
|
|
68
|
-
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 stops running namespaces,
|
|
68
|
+
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 the installer prerequisites, 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/sounds 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.
|
|
69
|
+
|
|
70
|
+
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.
|
|
71
|
+
|
|
72
|
+
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 installs the exact version reported by PyPI with a forced cache refresh, launches MetaList again, and reports the installed version (for example, `MetaList updated to v0.4.2.`). This protection requires an installed version containing the backup safeguard and applies to `metalist update`; direct pip/uv install commands do not run it.
|
|
69
73
|
|
|
70
74
|
For pip, users can run `pip install metalist`. For a non-editable local install from this checkout, use `uv pip install .` or `pip install .` instead of the editable command below.
|
|
71
75
|
|
|
@@ -78,6 +82,8 @@ npm install
|
|
|
78
82
|
```
|
|
79
83
|
|
|
80
84
|
### Run
|
|
85
|
+
|
|
86
|
+
Persistent data defaults to `~/MetaList`. Set `METALIST_DATA_DIRECTORY` to an absolute directory path before launch to use a separate data root, including namespaces, backups, certificates, logs, and runtime jobs. This is used by release tests to keep their disposable data separate from real notes.
|
|
81
87
|
The installed entrypoint starts or restarts every known namespace, prints their URLs, and exits:
|
|
82
88
|
```bash
|
|
83
89
|
metalist
|
|
@@ -233,8 +239,9 @@ This repo now packages itself under the PyPI distribution name `metalist`. Curre
|
|
|
233
239
|
|
|
234
240
|
Recommended release path:
|
|
235
241
|
1. In the existing PyPI project `metalist`, configure GitHub Trusted Publishing for `evolvingstuff/metalist` and the workflow file `.github/workflows/publish-pypi.yml`.
|
|
236
|
-
2. Push a
|
|
237
|
-
3.
|
|
242
|
+
2. Push the candidate commit to a branch and wait for the `Publish to PyPI` validation workflow to pass for that exact commit. GitHub-hosted Windows, macOS, and Linux runners install the built wheel and test application startup outside the source checkout on Python 3.10 through 3.13. You do not need those operating systems locally. Archive verification also checks runtime files, including agent Markdown resources, against both the wheel and source distribution.
|
|
243
|
+
3. Only after every required check passes, create and push the release tag for that same commit. Any intervening change requires a new validation run before tagging. Branch and pull-request runs validate without publishing.
|
|
244
|
+
4. The tag workflow repeats validation and publishes the same artifacts tested by its full matrix. Manual publication also requires all checks to pass. Users can then run it with `uvx metalist`, install it persistently with `uv tool install metalist`, or install it with `pip install metalist`.
|
|
238
245
|
|
|
239
246
|
If `--input` is omitted, a file picker opens (when `tkinter` is available).
|
|
240
247
|
Notes tagged with `@implies` are converted into ontology rules and are not imported as notes. Legacy rules that are invalid under the current ontology grammar are reported and skipped while valid rules continue importing.
|
|
@@ -7,12 +7,13 @@ import json
|
|
|
7
7
|
import math
|
|
8
8
|
import time
|
|
9
9
|
from collections.abc import AsyncIterator
|
|
10
|
-
from typing import Annotated, Any, Literal
|
|
10
|
+
from typing import Annotated, Any, Literal
|
|
11
11
|
from uuid import uuid4
|
|
12
12
|
|
|
13
13
|
from fastapi import APIRouter, Depends, HTTPException, Response
|
|
14
14
|
from fastapi.responses import StreamingResponse
|
|
15
15
|
from pydantic import BaseModel, ConfigDict, Field, SecretStr, field_validator, model_validator
|
|
16
|
+
from typing_extensions import Self
|
|
16
17
|
|
|
17
18
|
from app.api.request_auth import require_request_auth_token
|
|
18
19
|
from app.api.transactions import transactional_route
|
|
@@ -60,7 +60,6 @@ from app.services import auth_cache_state
|
|
|
60
60
|
from app.services.ontology_rules_store import ensure_rules_decrypted_and_compiled
|
|
61
61
|
from app.services.link_titles import link_title_store
|
|
62
62
|
from app.services.reminders import reminder_store
|
|
63
|
-
from app.services.embedded_documents import document_store
|
|
64
63
|
from app.services.search_history import search_history_store
|
|
65
64
|
from app.services.sound_storage import sound_store
|
|
66
65
|
from app.services.runtime_lock import purge_decrypted_runtime_state
|
|
@@ -347,7 +346,6 @@ def _reset_runtime_state_after_restore() -> bool:
|
|
|
347
346
|
tab_state_store.reset()
|
|
348
347
|
link_title_store.reset()
|
|
349
348
|
reminder_store.reset()
|
|
350
|
-
document_store.reset()
|
|
351
349
|
search_history_store.reset()
|
|
352
350
|
sound_store.reset()
|
|
353
351
|
clear_all_locks()
|
|
@@ -378,7 +376,6 @@ def _reset_runtime_state_after_restore() -> bool:
|
|
|
378
376
|
tab_state_store.bootstrap(connection=connection)
|
|
379
377
|
link_title_store.bootstrap(connection=connection)
|
|
380
378
|
reminder_store.bootstrap(connection=connection)
|
|
381
|
-
document_store.bootstrap(connection=connection)
|
|
382
379
|
if not password_required or database_version == CURRENT_DATABASE_VERSION:
|
|
383
380
|
search_history_store.bootstrap(connection=connection)
|
|
384
381
|
else:
|
|
@@ -520,7 +517,6 @@ def login(
|
|
|
520
517
|
tab_state_store.ensure_decrypted(token="")
|
|
521
518
|
link_title_store.ensure_decrypted(token="")
|
|
522
519
|
reminder_store.ensure_decrypted(token="")
|
|
523
|
-
document_store.ensure_decrypted(token="")
|
|
524
520
|
search_history_store.ensure_decrypted(token="")
|
|
525
521
|
|
|
526
522
|
ai_chat_store.reset()
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"""Resolve the persistent data root without importing application runtime state.
|
|
2
|
+
|
|
3
|
+
METALIST_DATA_DIRECTORY accepts an absolute directory path. When omitted,
|
|
4
|
+
MetaList uses the current user's ~/MetaList directory.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from collections.abc import Mapping
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def resolve_data_directory(*, environ: Mapping[str, str]) -> Path:
|
|
14
|
+
if "METALIST_DATA_DIRECTORY" not in environ:
|
|
15
|
+
return Path.home() / "MetaList"
|
|
16
|
+
configured_directory = environ["METALIST_DATA_DIRECTORY"]
|
|
17
|
+
if not isinstance(configured_directory, str) or configured_directory.strip() == "":
|
|
18
|
+
raise ValueError("METALIST_DATA_DIRECTORY must be a nonempty absolute path")
|
|
19
|
+
directory = Path(configured_directory)
|
|
20
|
+
if not directory.is_absolute():
|
|
21
|
+
raise ValueError("METALIST_DATA_DIRECTORY must be an absolute path")
|
|
22
|
+
return directory
|
|
@@ -5,10 +5,10 @@ from __future__ import annotations
|
|
|
5
5
|
from collections.abc import Callable
|
|
6
6
|
from dataclasses import dataclass
|
|
7
7
|
import sqlite3
|
|
8
|
+
import re
|
|
8
9
|
|
|
9
10
|
from app.db.version import CURRENT_DATABASE_VERSION
|
|
10
11
|
from app.db.schema import create_namespace_content_migrations_table
|
|
11
|
-
from app.db.schema import create_embedded_documents_table
|
|
12
12
|
from app.services.encryption import EncryptionService
|
|
13
13
|
|
|
14
14
|
|
|
@@ -309,10 +309,65 @@ def _migration_6_to_7(
|
|
|
309
309
|
encryption_enabled: bool,
|
|
310
310
|
encryption_service: EncryptionService | None,
|
|
311
311
|
) -> int:
|
|
312
|
-
|
|
312
|
+
# Retain the historical step so upgrades remain ordered and transactional.
|
|
313
|
+
connection.execute(
|
|
314
|
+
"CREATE TABLE IF NOT EXISTS embedded_documents ("
|
|
315
|
+
"id TEXT PRIMARY KEY, payload TEXT NOT NULL, nonce BLOB, tag BLOB)"
|
|
316
|
+
)
|
|
313
317
|
return 0
|
|
314
318
|
|
|
315
319
|
|
|
320
|
+
def _remove_retired_document_references(
|
|
321
|
+
*, connection: sqlite3.Connection, document_ids: set[str],
|
|
322
|
+
encryption_enabled: bool, encryption_service: EncryptionService | None,
|
|
323
|
+
) -> int:
|
|
324
|
+
if encryption_enabled and (encryption_service is None or encryption_service.dek is None):
|
|
325
|
+
raise RuntimeError("Database migration 7→8 requires the namespace DEK")
|
|
326
|
+
token_pattern = re.compile(r"!?\[\[([0-9a-fA-F-]{36})\]\]")
|
|
327
|
+
rewritten_count = 0
|
|
328
|
+
rows = connection.execute("SELECT id, content, encryption_nonce, encryption_tag FROM notes").fetchall()
|
|
329
|
+
for note_id, content, nonce, tag in rows:
|
|
330
|
+
if (nonce is None) != (tag is None):
|
|
331
|
+
raise RuntimeError("Note has incomplete encryption metadata during migration 7→8")
|
|
332
|
+
plaintext = content
|
|
333
|
+
if nonce is not None:
|
|
334
|
+
if encryption_service is None or encryption_service.dek is None:
|
|
335
|
+
raise RuntimeError("Encrypted note requires the namespace DEK during migration 7→8")
|
|
336
|
+
plaintext = encryption_service.decrypt_from_storage(content, nonce, tag)
|
|
337
|
+
cleaned = token_pattern.sub(
|
|
338
|
+
lambda match: "" if match.group(1).lower() in document_ids else match.group(0),
|
|
339
|
+
plaintext,
|
|
340
|
+
)
|
|
341
|
+
if cleaned == plaintext:
|
|
342
|
+
continue
|
|
343
|
+
fields = (cleaned, None, None)
|
|
344
|
+
if encryption_enabled:
|
|
345
|
+
assert encryption_service is not None
|
|
346
|
+
fields = encryption_service.encrypt_for_storage(cleaned)
|
|
347
|
+
connection.execute(
|
|
348
|
+
"UPDATE notes SET content = ?, encryption_nonce = ?, encryption_tag = ? WHERE id = ?",
|
|
349
|
+
(*fields, note_id),
|
|
350
|
+
)
|
|
351
|
+
rewritten_count += 1
|
|
352
|
+
return rewritten_count
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
def _migration_7_to_8(
|
|
356
|
+
*, connection: sqlite3.Connection, encryption_enabled: bool,
|
|
357
|
+
encryption_service: EncryptionService | None,
|
|
358
|
+
) -> int:
|
|
359
|
+
"""Remove retired diagrams and their placements from the installed live DB only."""
|
|
360
|
+
document_ids = {row[0] for row in connection.execute("SELECT id FROM embedded_documents")}
|
|
361
|
+
rewritten_count = 0
|
|
362
|
+
if document_ids:
|
|
363
|
+
rewritten_count = _remove_retired_document_references(
|
|
364
|
+
connection=connection, document_ids=document_ids,
|
|
365
|
+
encryption_enabled=encryption_enabled, encryption_service=encryption_service,
|
|
366
|
+
)
|
|
367
|
+
connection.execute("DROP TABLE embedded_documents")
|
|
368
|
+
return rewritten_count
|
|
369
|
+
|
|
370
|
+
|
|
316
371
|
_MIGRATIONS: dict[
|
|
317
372
|
int,
|
|
318
373
|
Callable[..., int],
|
|
@@ -324,6 +379,7 @@ _MIGRATIONS: dict[
|
|
|
324
379
|
4: _migration_4_to_5,
|
|
325
380
|
5: _migration_5_to_6,
|
|
326
381
|
6: _migration_6_to_7,
|
|
382
|
+
7: _migration_7_to_8,
|
|
327
383
|
}
|
|
328
384
|
|
|
329
385
|
|
|
@@ -14,15 +14,6 @@ SEARCH_HISTORY_TABLE = "search_interaction_history"
|
|
|
14
14
|
NAMESPACE_LAUNCH_PROFILE_TABLE = "namespace_launch_profile"
|
|
15
15
|
NAMESPACE_CONTENT_MIGRATIONS_TABLE = "namespace_content_migrations"
|
|
16
16
|
|
|
17
|
-
_CREATE_EMBEDDED_DOCUMENTS_TABLE = """
|
|
18
|
-
CREATE TABLE IF NOT EXISTS embedded_documents (
|
|
19
|
-
id TEXT PRIMARY KEY,
|
|
20
|
-
payload TEXT NOT NULL,
|
|
21
|
-
nonce BLOB,
|
|
22
|
-
tag BLOB
|
|
23
|
-
);
|
|
24
|
-
"""
|
|
25
|
-
|
|
26
17
|
_CREATE_NOTES_TABLE = f"""
|
|
27
18
|
CREATE TABLE IF NOT EXISTS {NOTES_TABLE} (
|
|
28
19
|
id TEXT PRIMARY KEY,
|
|
@@ -190,11 +181,6 @@ def create_namespace_content_migrations_table(connection: Connection) -> None:
|
|
|
190
181
|
connection.execute(_CREATE_NAMESPACE_CONTENT_MIGRATIONS_TABLE)
|
|
191
182
|
|
|
192
183
|
|
|
193
|
-
def create_embedded_documents_table(connection: Connection) -> None:
|
|
194
|
-
"""Create the v7 editable-document table in the live namespace database."""
|
|
195
|
-
connection.execute(_CREATE_EMBEDDED_DOCUMENTS_TABLE)
|
|
196
|
-
|
|
197
|
-
|
|
198
184
|
def _ensure_columns(connection: Connection, table: str, columns: dict[str, str]) -> None:
|
|
199
185
|
existing = {
|
|
200
186
|
row[1]
|
|
@@ -217,7 +203,6 @@ def initialize_schema(connection: Connection) -> None:
|
|
|
217
203
|
connection.execute(_CREATE_TAB_STATE_TABLE)
|
|
218
204
|
connection.execute(_CREATE_LINK_TITLES_TABLE)
|
|
219
205
|
connection.execute(_CREATE_REMINDERS_TABLE)
|
|
220
|
-
create_embedded_documents_table(connection)
|
|
221
206
|
connection.execute(_CREATE_SEARCH_HISTORY_TABLE)
|
|
222
207
|
connection.execute(_CREATE_NAMESPACE_LAUNCH_PROFILE_TABLE)
|
|
223
208
|
connection.execute(_CREATE_NAMESPACE_CONTENT_MIGRATIONS_TABLE)
|
|
@@ -285,7 +285,6 @@ _MAIN_SCHEMA_BEFORE_CONTENT_MIGRATIONS = {
|
|
|
285
285
|
"next_check_after", "failure_count", "created_at", "updated_at",
|
|
286
286
|
}
|
|
287
287
|
),
|
|
288
|
-
"embedded_documents": frozenset({"id", "payload", "nonce", "tag"}),
|
|
289
288
|
"reminders": frozenset(
|
|
290
289
|
{
|
|
291
290
|
"id", "payload_json", "payload_encryption_nonce", "payload_encryption_tag",
|
|
@@ -424,6 +423,7 @@ _MIGRATION_DEFERRED_PLAINTEXT_FIELDS_BY_DATABASE_VERSION = {
|
|
|
424
423
|
4: frozenset({("notes", "proposed_tags")}),
|
|
425
424
|
5: frozenset({("notes", "proposed_tags")}),
|
|
426
425
|
6: frozenset(),
|
|
426
|
+
7: frozenset(),
|
|
427
427
|
}
|
|
428
428
|
|
|
429
429
|
|
|
@@ -453,12 +453,11 @@ def _main_schema_for_database_version(
|
|
|
453
453
|
if database_version < 0 or database_version > CURRENT_DATABASE_VERSION:
|
|
454
454
|
raise ValueError("database_version is outside the supported audit range")
|
|
455
455
|
resolved_schema = expected_schema
|
|
456
|
-
#
|
|
457
|
-
|
|
458
|
-
if database_version < 7 and "embedded_documents" not in actual_tables:
|
|
456
|
+
# Read-only audits must still validate retired payloads before the live 7→8 migration.
|
|
457
|
+
if database_version < 8 and (database_version == 7 or "embedded_documents" in actual_tables):
|
|
459
458
|
resolved_schema = {
|
|
460
|
-
|
|
461
|
-
|
|
459
|
+
**resolved_schema,
|
|
460
|
+
"embedded_documents": frozenset({"id", "payload", "nonce", "tag"}),
|
|
462
461
|
}
|
|
463
462
|
if database_version < 6 and _PROPOSED_TAG_COLUMNS.isdisjoint(actual_notes_columns):
|
|
464
463
|
note_columns = resolved_schema["notes"]
|
|
@@ -28,7 +28,6 @@ from app.services.ontology_rules_store import bootstrap_ontology_rules_store
|
|
|
28
28
|
from app.services.tab_state import tab_state_store
|
|
29
29
|
from app.services.link_titles import link_title_store
|
|
30
30
|
from app.services.reminders import reminder_store
|
|
31
|
-
from app.services.embedded_documents import document_store
|
|
32
31
|
from app.services.search_history import search_history_store
|
|
33
32
|
from app.services.sound_storage import sound_store
|
|
34
33
|
from app.services.runtime_hardening import apply_runtime_hardening
|
|
@@ -58,7 +57,6 @@ from app.api.routes.sounds import router as api2_sounds_router
|
|
|
58
57
|
from app.api.routes.ontology import router as api2_ontology_router
|
|
59
58
|
from app.api.routes.backups import router as api2_backup_router
|
|
60
59
|
from app.api.routes.reminders import router as api2_reminders_router
|
|
61
|
-
from app.api.routes.embedded_documents import router as api2_documents_router
|
|
62
60
|
from app.api.routes.remote_images import router as api2_remote_images_router
|
|
63
61
|
from app.api.routes.ai import router as api2_ai_router
|
|
64
62
|
from app.api.routes.test import router as api2_test_router
|
|
@@ -198,7 +196,6 @@ with begin_writer() as connection:
|
|
|
198
196
|
tab_state_store.bootstrap(connection=connection)
|
|
199
197
|
link_title_store.bootstrap(connection=connection)
|
|
200
198
|
reminder_store.bootstrap(connection=connection)
|
|
201
|
-
document_store.bootstrap(connection=connection)
|
|
202
199
|
if not bool(settings["encryption_enabled"]) or database_version >= CURRENT_DATABASE_VERSION:
|
|
203
200
|
search_history_store.bootstrap(connection=connection)
|
|
204
201
|
else:
|
|
@@ -323,7 +320,6 @@ app.include_router(api2_files_router, prefix=API_PREFIX)
|
|
|
323
320
|
app.include_router(api2_sounds_router, prefix=API_PREFIX)
|
|
324
321
|
app.include_router(api2_ontology_router, prefix=API_PREFIX)
|
|
325
322
|
app.include_router(api2_reminders_router, prefix=API_PREFIX)
|
|
326
|
-
app.include_router(api2_documents_router, prefix=API_PREFIX)
|
|
327
323
|
app.include_router(api2_remote_images_router, prefix=API_PREFIX)
|
|
328
324
|
app.include_router(api2_ai_router, prefix=API_PREFIX)
|
|
329
325
|
if TEST_MODE:
|
|
@@ -8,7 +8,6 @@ Acts as the single source of truth for note rendering across the application.
|
|
|
8
8
|
import re
|
|
9
9
|
import logging
|
|
10
10
|
|
|
11
|
-
from app.services.document_references import render_editable_documents
|
|
12
11
|
from app.services.content_formatting import format_note_content_for_view
|
|
13
12
|
from app.services.content_formatting import has_scoped_footnotes
|
|
14
13
|
from app.services.content_formatting import extract_plain_text_from_note_html
|
|
@@ -150,7 +149,7 @@ def render_collapsed_read_only_mode(note) -> str:
|
|
|
150
149
|
|
|
151
150
|
|
|
152
151
|
def render_editing_mode(note) -> str:
|
|
153
|
-
return
|
|
152
|
+
return note.content
|
|
154
153
|
|
|
155
154
|
|
|
156
155
|
def render_redacted_mode(note) -> str:
|
|
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
import argparse
|
|
4
4
|
from collections.abc import Mapping, MutableMapping, Sequence
|
|
5
5
|
from dataclasses import dataclass
|
|
6
|
-
from datetime import
|
|
6
|
+
from datetime import datetime, timedelta, timezone
|
|
7
7
|
import ipaddress
|
|
8
8
|
import os
|
|
9
9
|
from pathlib import Path
|
|
@@ -17,6 +17,7 @@ from cryptography import x509
|
|
|
17
17
|
from cryptography.hazmat.primitives import hashes, serialization
|
|
18
18
|
from cryptography.hazmat.primitives.asymmetric import rsa
|
|
19
19
|
from cryptography.x509.oid import NameOID
|
|
20
|
+
from app.data_directory import resolve_data_directory
|
|
20
21
|
from app.db.schema import NAMESPACE_LAUNCH_PROFILE_TABLE
|
|
21
22
|
from app.db.schema import initialize_schema
|
|
22
23
|
from app.db.settings_sql import insert_default_settings
|
|
@@ -28,10 +29,12 @@ from app.security.shell_execution import SHELL_EXECUTION_ENV_NAME
|
|
|
28
29
|
_LOOPBACK_BIND_HOSTS = frozenset({"127.0.0.1", "localhost", "0.0.0.0", "::1"})
|
|
29
30
|
_DEFAULT_API_PREFIX = "/api2"
|
|
30
31
|
_DEFAULT_V1_API_PREFIX = "/api"
|
|
31
|
-
_DEFAULT_DATABASE_DIRECTORY =
|
|
32
|
+
_DEFAULT_DATABASE_DIRECTORY = resolve_data_directory(environ=os.environ)
|
|
32
33
|
_DEFAULT_CERT_PATH = _DEFAULT_DATABASE_DIRECTORY / "certs" / "metalist-cert.pem"
|
|
33
34
|
_DEFAULT_KEY_PATH = _DEFAULT_DATABASE_DIRECTORY / "certs" / "metalist-key.pem"
|
|
34
35
|
_DEFAULT_RUNTIME_DIRECTORY = Path(tempfile.gettempdir()) / "metalist-runtime"
|
|
36
|
+
if "METALIST_DATA_DIRECTORY" in os.environ:
|
|
37
|
+
_DEFAULT_RUNTIME_DIRECTORY = _DEFAULT_DATABASE_DIRECTORY / "runtime"
|
|
35
38
|
_DEFAULT_NAMESPACES_DIRECTORY_NAME = "namespaces"
|
|
36
39
|
_DEFAULT_NAMESPACE_DELETE_JOBS_DIRECTORY_NAME = "namespace-delete-jobs"
|
|
37
40
|
_DEFAULT_NAMESPACE_RENAME_JOBS_DIRECTORY_NAME = "namespace-rename-jobs"
|
|
@@ -180,7 +183,7 @@ def _coerce_optional_db_port(*, value: object) -> int | None:
|
|
|
180
183
|
|
|
181
184
|
|
|
182
185
|
def _utc_timestamp() -> str:
|
|
183
|
-
return datetime.now(
|
|
186
|
+
return datetime.now(timezone.utc).isoformat()
|
|
184
187
|
|
|
185
188
|
|
|
186
189
|
def _connect_namespace_database(
|
|
@@ -305,7 +308,34 @@ def load_namespace_launch_profile(*, namespace: str) -> NamespaceLaunchProfile |
|
|
|
305
308
|
return profile
|
|
306
309
|
|
|
307
310
|
|
|
308
|
-
def
|
|
311
|
+
def _read_namespace_launch_profile(
|
|
312
|
+
*,
|
|
313
|
+
database_path: Path,
|
|
314
|
+
namespace: str,
|
|
315
|
+
) -> NamespaceLaunchProfile | None:
|
|
316
|
+
database_uri = f"{database_path.resolve().as_uri()}?mode=ro"
|
|
317
|
+
connection = sqlite3.connect(database_uri, uri=True, check_same_thread=False)
|
|
318
|
+
try:
|
|
319
|
+
connection.execute("PRAGMA query_only = ON")
|
|
320
|
+
profile_table = connection.execute(
|
|
321
|
+
"SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?",
|
|
322
|
+
(NAMESPACE_LAUNCH_PROFILE_TABLE,),
|
|
323
|
+
).fetchone()
|
|
324
|
+
if profile_table is None:
|
|
325
|
+
return None
|
|
326
|
+
_assert_launch_profile_rows_belong_to_namespace(
|
|
327
|
+
connection=connection,
|
|
328
|
+
namespace=namespace,
|
|
329
|
+
)
|
|
330
|
+
return _fetch_launch_profile_from_connection(
|
|
331
|
+
connection=connection,
|
|
332
|
+
namespace=namespace,
|
|
333
|
+
)
|
|
334
|
+
finally:
|
|
335
|
+
connection.close()
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
def _load_all_namespace_launch_profiles(*, read_only: bool) -> list[NamespaceLaunchProfile]:
|
|
309
339
|
namespaces_directory = resolve_namespaces_directory()
|
|
310
340
|
if not namespaces_directory.exists():
|
|
311
341
|
return []
|
|
@@ -330,13 +360,27 @@ def load_all_namespace_launch_profiles() -> list[NamespaceLaunchProfile]:
|
|
|
330
360
|
f"Namespace {normalized_namespace} directory exists but database is missing: "
|
|
331
361
|
f"{database_path}"
|
|
332
362
|
)
|
|
333
|
-
|
|
363
|
+
if read_only:
|
|
364
|
+
profile = _read_namespace_launch_profile(
|
|
365
|
+
database_path=database_path,
|
|
366
|
+
namespace=normalized_namespace,
|
|
367
|
+
)
|
|
368
|
+
else:
|
|
369
|
+
profile = load_namespace_launch_profile(namespace=normalized_namespace)
|
|
334
370
|
if profile is None:
|
|
335
371
|
continue
|
|
336
372
|
profiles.append(profile)
|
|
337
373
|
return profiles
|
|
338
374
|
|
|
339
375
|
|
|
376
|
+
def load_all_namespace_launch_profiles() -> list[NamespaceLaunchProfile]:
|
|
377
|
+
return _load_all_namespace_launch_profiles(read_only=False)
|
|
378
|
+
|
|
379
|
+
|
|
380
|
+
def load_all_namespace_launch_profiles_read_only() -> list[NamespaceLaunchProfile]:
|
|
381
|
+
return _load_all_namespace_launch_profiles(read_only=True)
|
|
382
|
+
|
|
383
|
+
|
|
340
384
|
def save_namespace_launch_profile(
|
|
341
385
|
*,
|
|
342
386
|
namespace: str,
|
|
@@ -896,7 +940,7 @@ def ensure_default_tls_pair(*, environ: Mapping[str, str]) -> tuple[str, str] |
|
|
|
896
940
|
subject = issuer = x509.Name(
|
|
897
941
|
[x509.NameAttribute(NameOID.COMMON_NAME, common_name)]
|
|
898
942
|
)
|
|
899
|
-
now = datetime.now(
|
|
943
|
+
now = datetime.now(timezone.utc)
|
|
900
944
|
certificate = (
|
|
901
945
|
x509.CertificateBuilder()
|
|
902
946
|
.subject_name(subject)
|
|
@@ -7,9 +7,10 @@ from collections.abc import Iterator
|
|
|
7
7
|
from contextlib import contextmanager
|
|
8
8
|
from contextvars import ContextVar
|
|
9
9
|
from dataclasses import dataclass
|
|
10
|
-
from typing import Annotated, Literal,
|
|
10
|
+
from typing import Annotated, Literal, Union
|
|
11
11
|
|
|
12
12
|
from pydantic import BaseModel, ConfigDict, Field, TypeAdapter, field_validator, model_validator
|
|
13
|
+
from typing_extensions import Self
|
|
13
14
|
|
|
14
15
|
from app.services.search_query import parse_search_query
|
|
15
16
|
|
|
@@ -6,9 +6,10 @@ from collections.abc import Callable
|
|
|
6
6
|
from dataclasses import dataclass
|
|
7
7
|
from datetime import datetime, timezone
|
|
8
8
|
from types import MappingProxyType
|
|
9
|
-
from typing import Literal, Mapping
|
|
9
|
+
from typing import Literal, Mapping
|
|
10
10
|
|
|
11
11
|
from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
|
|
12
|
+
from typing_extensions import Self
|
|
12
13
|
|
|
13
14
|
from app.services.agent.cloud_privacy import CloudPrivacyBoundary
|
|
14
15
|
from app.services.agent.cloud_privacy import CloudPrivacyEvaluator
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Investigate Current Scope
|
|
2
|
+
|
|
3
|
+
This skill is active because the user explicitly asked for evidence from saved
|
|
4
|
+
notes in the frozen current MetaList scope.
|
|
5
|
+
|
|
6
|
+
The runtime supplies one authoritative evidence payload. It contains complete
|
|
7
|
+
root-note trees in the same order visible to the user. Every included note has
|
|
8
|
+
its full agent-visible content; there is no per-note truncation. If the complete
|
|
9
|
+
scope exceeds the configured token limit, the runtime keeps the longest leading
|
|
10
|
+
prefix of complete result trees that fits and reports the included and omitted
|
|
11
|
+
counts. Never imply that a truncated scope is exhaustive.
|
|
12
|
+
|
|
13
|
+
Treat each nested object as a note. Child notes inherit their ancestors' context,
|
|
14
|
+
but only explicit tags are serialized on each note. Privacy-redacted content is
|
|
15
|
+
not present. Do not invent omitted content.
|
|
16
|
+
|
|
17
|
+
Answer the current user request directly from relevant nodes in the payload.
|
|
18
|
+
Shared scope terms do not make every node relevant. Exclude material that does
|
|
19
|
+
not directly help answer the exact request.
|
|
20
|
+
|
|
21
|
+
For every factual claim derived from a note, cite the exact supporting note as
|
|
22
|
+
`[[note_id]]`. Copy the ID from the same object whose `content_text` supports
|
|
23
|
+
the claim. Do not cite an enclosing root merely because the supporting child is
|
|
24
|
+
inside it. Do not emit duplicate adjacent citations.
|
|
25
|
+
|
|
26
|
+
Write the final response in Markdown. LaTeX and Mermaid are available when they
|
|
27
|
+
materially help.
|
|
@@ -54,7 +54,6 @@ from app.services.sound_storage import decrypt_all_sounds_for_plaintext
|
|
|
54
54
|
from app.services.sound_storage import encrypt_all_sounds_for_active_dek
|
|
55
55
|
from app.services.link_titles import rewrite_persisted_link_titles
|
|
56
56
|
from app.services.reminders import reminder_store
|
|
57
|
-
from app.services.embedded_documents import document_store
|
|
58
57
|
from app.utils.text_utils import strip_html
|
|
59
58
|
from app.services.encryption import EncryptionService
|
|
60
59
|
from app.services.maintenance_mode import maintenance_service
|
|
@@ -529,11 +528,6 @@ class AuthService:
|
|
|
529
528
|
encryption_service=self.encryption,
|
|
530
529
|
force_plaintext=False,
|
|
531
530
|
)
|
|
532
|
-
document_store.rewrite_storage(
|
|
533
|
-
connection=connection,
|
|
534
|
-
encryption_service=self.encryption,
|
|
535
|
-
force_plaintext=False,
|
|
536
|
-
)
|
|
537
531
|
finally:
|
|
538
532
|
maintenance_service.exit_maintenance()
|
|
539
533
|
|
|
@@ -848,11 +842,6 @@ class AuthService:
|
|
|
848
842
|
encryption_service=self.encryption,
|
|
849
843
|
force_plaintext=True,
|
|
850
844
|
)
|
|
851
|
-
document_store.rewrite_storage(
|
|
852
|
-
connection=connection,
|
|
853
|
-
encryption_service=self.encryption,
|
|
854
|
-
force_plaintext=True,
|
|
855
|
-
)
|
|
856
845
|
clear_password_settings(connection)
|
|
857
846
|
self.encryption.clear_keys()
|
|
858
847
|
finally:
|
|
@@ -6,7 +6,6 @@ from dataclasses import dataclass
|
|
|
6
6
|
from html.parser import HTMLParser
|
|
7
7
|
from typing import Callable, FrozenSet, List, Optional, Tuple
|
|
8
8
|
|
|
9
|
-
from app.services.embedded_documents import document_store, render_document
|
|
10
9
|
from app.services.content_formatting import find_consumed_content_wrapper_keys
|
|
11
10
|
from app.services.content_formatting import find_global_credential_tag
|
|
12
11
|
from app.services.content_formatting import format_note_content_for_view
|
|
@@ -342,11 +341,7 @@ def collapsed_preview_source_has_media(content_html: str) -> bool:
|
|
|
342
341
|
preview_source_html = extract_collapsed_preview_source_html(content_html)
|
|
343
342
|
if preview_source_html == "":
|
|
344
343
|
return False
|
|
345
|
-
|
|
346
|
-
return True
|
|
347
|
-
# Editable documents store UUID tokens, but render as visual previews.
|
|
348
|
-
return any(document_store.has(token.note_id)
|
|
349
|
-
for token in collect_reference_tokens_from_html(preview_source_html))
|
|
344
|
+
return _fragment_has_media_tag(preview_source_html)
|
|
350
345
|
|
|
351
346
|
|
|
352
347
|
def collapsed_preview_source_has_image_file_embed(
|
|
@@ -551,11 +546,6 @@ def _render_reference_block(
|
|
|
551
546
|
redact_passwords: bool,
|
|
552
547
|
render_note_embeds_as_links: bool,
|
|
553
548
|
) -> str:
|
|
554
|
-
if document_store.has(reference_note_id):
|
|
555
|
-
prefix = ""
|
|
556
|
-
if is_embed:
|
|
557
|
-
prefix = "!"
|
|
558
|
-
return render_document(reference_note_id, token=prefix + "[[" + reference_note_id + "]]", static_export=static_export)
|
|
559
549
|
mode = "link"
|
|
560
550
|
if is_embed:
|
|
561
551
|
mode = "embed"
|
|
@@ -4,7 +4,7 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
from collections.abc import Mapping
|
|
6
6
|
from dataclasses import asdict, dataclass
|
|
7
|
-
from datetime import
|
|
7
|
+
from datetime import datetime, timezone
|
|
8
8
|
import json
|
|
9
9
|
import os
|
|
10
10
|
from pathlib import Path
|
|
@@ -283,7 +283,7 @@ class ManagedOllamaRuntime:
|
|
|
283
283
|
executable=executable,
|
|
284
284
|
pid=process.pid,
|
|
285
285
|
port=self.config.port,
|
|
286
|
-
started_at=datetime.now(
|
|
286
|
+
started_at=datetime.now(timezone.utc).isoformat(),
|
|
287
287
|
version=version,
|
|
288
288
|
)
|
|
289
289
|
self._write_state(state=state)
|