MetaList 0.7.5__tar.gz → 0.8.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {metalist-0.7.5/metalist.egg-info → metalist-0.8.0}/PKG-INFO +10 -5
- {metalist-0.7.5 → metalist-0.8.0}/README.md +9 -4
- {metalist-0.7.5 → metalist-0.8.0}/app/main.py +23 -5
- {metalist-0.7.5 → metalist-0.8.0}/app/services/content_formatting.py +5 -7
- {metalist-0.7.5 → metalist-0.8.0}/app/services/diagnostics.py +52 -20
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/api-error-diagnostics.js +5 -1
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/tag-syntax-service.js +59 -1
- {metalist-0.7.5 → metalist-0.8.0}/app/version.py +1 -1
- {metalist-0.7.5 → metalist-0.8.0/metalist.egg-info}/PKG-INFO +10 -5
- {metalist-0.7.5 → metalist-0.8.0}/MANIFEST.in +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/__init__.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/api/__init__.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/api/deps.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/api/dev.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/api/middleware/auth.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/api/note_requests.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/api/request_auth.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/api/routes/ai.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/api/routes/app_updates.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/api/routes/auth.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/api/routes/backups.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/api/routes/files.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/api/routes/notes.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/api/routes/ontology.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/api/routes/reminders.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/api/routes/remote_images.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/api/routes/test.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/api/transactions.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/api/upload_limits.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/config.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/data_directory.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/db/__init__.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/db/backup_settings_sql.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/db/engine.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/db/file_schema.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/db/file_session.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/db/files_sql.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/db/link_titles_sql.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/db/live_recovery.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/db/migrations.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/db/notes_sql.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/db/ontology_rules_sql.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/db/reminders_sql.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/db/retire_sounds.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/db/schema.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/db/search_history_sql.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/db/session.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/db/settings_sql.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/db/tab_state_sql.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/db/version.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/encryption_audit.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/exception_boundaries.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/https_proxy.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/models/commands.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/models/database.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/models/entities.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/models/enums.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/models/linked_list.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/models/list_operations.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/models/list_traversal.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/models/note_crud.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/models/utils.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/network_settings.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/presentation/__init__.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/presentation/render/__init__.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/presentation/render/note_renderer.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/presentation/templates.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/security/authenticated_logging.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/security/encryption.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/security/http_error_diagnostics.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/security/http_headers.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/security/note_html.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/security/request_boundary.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/security/request_hosts.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/security/sensitive_cache.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/security/sensitive_logging.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/security/shell_execution.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/security/validation_errors.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/server_runtime.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/__init__.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/__init__.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/actions.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/cloud_privacy.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/context.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/evidence_serialization.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/help_catalog.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/history.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/inference.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/investigation.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/judging.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/menu_actions.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/model_policy.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/openai_cost_tracking.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/openai_inference.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/permissions.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/prompt_settings.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/prompts/__init__.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/prompts/final-response.md +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/prompts/help-response.md +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/prompts/system.md +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/prompts/tool-result.md +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/retrieval_settings.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/runtime.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/scope.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/skill_settings.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/skills/__init__.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/skills/help-ai.md +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/skills/help-data.md +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/skills/help-formatting.md +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/skills/help-menus.md +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/skills/help-notes.md +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/skills/help-privacy.md +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/skills/help-references.md +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/skills/help-reminders.md +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/skills/help-search.md +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/skills/help-tags.md +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/skills/scoped-investigation.md +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/structured_inference.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/tagging.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/tagging_run.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/token_estimation.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/tools.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/agent/trace.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/ai_chat.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/ai_chat_rendering.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/ai_chat_stream.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/app_update_worker.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/app_updates.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/auth.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/auth_cache_state.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/auth_service.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/backlink_index.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/backlinks.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/backup_service.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/backup_settings_service.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/bulk_operation.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/client_state_service.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/content_cache.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/embedded_references.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/encryption.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/exception_capture.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/file_registry.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/file_storage.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/footnote_layout.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/footnote_rendering.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/hierarchy.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/html_export.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/html_unformatting.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/hydration_state.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/image_size_formatting.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/inline_image_occurrences.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/input_errors.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/integrity.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/latex_rendering.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/link_titles.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/login_rate_limit.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/maintenance_mode.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/markdown_rendering.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/namespace_deletion_jobs.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/namespace_deletion_worker.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/namespace_rename_jobs.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/namespace_rename_worker.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/namespace_runtime_guard.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/namespace_switcher.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/note_fullscreen.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/note_image_tags.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/note_ordering.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/note_store.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/ontology_rules_store.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/openai_credentials.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/password_note_fields.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/reference_presentation.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/reminders.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/remote_image_proxy.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/request_recovery.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/resource_limits.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/root_sorting.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/runtime_generation.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/runtime_hardening.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/runtime_lock.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/search_history.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/search_history_storage.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/search_index.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/search_query.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/search_text.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/selected_text_tag.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/self_update.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/session_timeout_service.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/shell_session_service.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/snapshot.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/store.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/structured_note_renderers.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/sync.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/sync_state.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/tab_state.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/tag_case.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/tag_ontology.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/tag_rename.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/tag_suggestions.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/tag_term_matching.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/test_reset.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/tokens.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/undo_state.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/update_backups.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/update_installer.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/update_preflight.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/view_cache.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/view_diff.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/view_state.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/services/windows_process_control.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/startup_environment.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/startup_js_sanity.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/startup_sanity.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/startup_sanity_config.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/config/agent-menu-actions.json +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/config/command_palette_tags.json +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/css/floating-notes.css +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/css/forms.css +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/css/main.css +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/img/favicon.ico +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/locked.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/main.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/activity-tracker.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/ai-chat/agent-menu-actions.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/ai-chat/agent-prompt-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/ai-chat/agent-retrieval-settings.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/ai-chat/ai-agent-debug-view.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/ai-chat/ai-chat-api.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/ai-chat/ai-chat-panel-controller.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/ai-chat/ai-chat-panel-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/ai-chat/ai-thinking-level-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/ai-chat/bulk-elapsed-clock.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/ai-chat/bulk-proposal-ui.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/ai-chat/cloud-privacy-policy.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/ai-chat/proposal-menu.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/api-client.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/api-failure-classification-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/app-update-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/application-state.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/async-result.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/auth.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/client-state-api.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/client-state-migration.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/command-palette/activation-auth-policy.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/command-palette/backup-command-availability.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/command-palette/click-activation-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/command-palette/command-palette-controller.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/command-palette/endpoint-registry.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/command-palette/note-layout-preferences.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/command-palette/preferences-store.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/command-palette/tag-config-loader.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/command-palette/usage-store.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/config.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/connectivity-monitor.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/context-menu/context-menu-registry.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/context-menu/context-menu-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/context-menu/context-menu-target-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/context-menu/input-caret-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/disconnect-editing-state-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/dom-utils-fixed.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/dom-utils.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/editor-commands.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/editor-selection.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/editor-toolbar.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/elapsed-time.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/error-handler.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/error-overlay.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/expected-errors.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/location-flags.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/login-namespace-picker.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/maintenance.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/modals/agent-prompt-editor-modal.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/modals/ai-agent-settings-modal.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/modals/alphabetize-root-notes-modal.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/modals/backup-restore-modal.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/modals/backup-result-modal.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/modals/backup-retention-modal.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/modals/backup-settings-modal.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/modals/base-modal.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/modals/confirmation-modal.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/modals/delete-namespace-modal.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/modals/delete-namespace-validation.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/modals/help-modal.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/modals/namespace-loading-page.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/modals/namespace-modals.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/modals/namespace-ports-profile.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/modals/namespace-rename-validation.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/modals/note-layout-appearance-modal.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/modals/ontology-modal.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/modals/password-modal.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/modals/prioritize-modal.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/modals/random-password-modal.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/modals/reminder-modal.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/modals/reset-updated-at-modal.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/modals/search-suggestion-statistics-modal.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/modals/session-timeout-modal.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/modals/version-info-modal.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/actions/content-actions.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/actions/history-actions.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/actions/note-actions.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/actions/search-actions.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/actions/selection-actions.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/actions/ui-actions.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/events/context-menu-events.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/events/focus-events.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/events/inactivity-events.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/events/input-events.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/events/keyboard-events.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/events/mouse-events.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/events/search-events.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/mode-context.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/mode-logger.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/mode-manager-controller.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/add-style-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/animated-scroll-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/backlinks-navigation-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/backlinks-panel-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/clipboard-shortcut-policy-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/collapse-affordance-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/collapse-editing-policy-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/command-gate-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/context-menu-target-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/deselect-selection-state-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/differential-view-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/edit-session-collapse-policy-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/edit-session-collapse-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/embedded-image-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/file-drop-policy-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/file-image-preview-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/file-reference-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/filtered-refresh-selection-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/floating-note-dom.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/floating-note-layout.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/floating-note-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/footnote-navigation-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/history-selection-policy-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/history-shortcut-policy-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/html-paste-sanitizer-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/image-context-menu-action-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/image-file-insert-choice-modal-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/infinite-scroll-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/link-context-menu-action-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/link-title-prefetch-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/markdown-render-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/mermaid-render-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/note-click-target-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/note-clipboard-write-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/note-collapse-animation-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/note-context-menu-action-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/note-delete-shortcut-policy-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/note-drag-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/note-fullscreen-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/note-reposition-animation-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/note-split-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/note-timestamp-hover-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/password-clipboard-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/polling-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/reference-source-navigation-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/remote-image-proxy-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/remove-formatting-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/root-date-separator-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/root-sort-indicator-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/root-sort-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/scroll-anchor-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/scroll-restoration-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/scroll-to-top-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/search-contexts-overlay-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/search-debounce-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/search-input-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/search-interaction-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/search-redaction-reveal-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/search-suggestion-statistics-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/search-suggestion-window-labels-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/search-suggestion-windows-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/search-suggestions-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/search-syntax-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/selected-formatting-removal-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/selected-text-tag-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/shell-output-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/tab-dom-cache-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/tab-drag-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/tab-duplication-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/tab-state-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/tag-bar-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/tag-input-selection-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/tag-proposal-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/tag-suggestions-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/todo-toggle-editing-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/untagged-view-indicator-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/view-mode-search-shortcut-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/note-html-sanitizer.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/password-generator.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/password-operation-response.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/password-policy.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/password-strength.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/reminder-store.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/reminder-surface-service.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/selection-markers.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/session-auth.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/tag-token.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/uuid.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/namespace-deleted.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/namespace-renamed.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/vendor/dompurify-3.4.13.LICENSE.txt +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/vendor/dompurify-3.4.13.min.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/vendor/markdown-it-14.3.2.LICENSE.txt +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/vendor/markdown-it-14.3.2.min.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/vendor/mermaid-11.16.1.LICENSE.txt +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/vendor/mermaid-11.16.1.min.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/vendor/zxcvbn-4.4.2.LICENSE.txt +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/js/vendor/zxcvbn-4.4.2.js +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/note-html-policy.json +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/static/video/login-startup.mp4 +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/templates/base.html +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/templates/index.html +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/templates/locked.html +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/templates/maintenance.html +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/templates/namespace_deleted.html +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/templates/namespace_renamed.html +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/templates/notes_list.html +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/upload_limits.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/__init__.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/add_selected_text_tag.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/alphabetize_root_notes.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/base.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/bulk_tag_proposals.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/collapse.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/copy_note.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/create_child.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/create_note.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/create_sibling.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/delete_subtree.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/delete_tag.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/expand.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/indent.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/lock.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/move.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/move_to_top.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/outdent.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/paste_child.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/paste_sibling.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/prefetch_link_titles.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/prioritize.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/redo.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/rename_tag.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/reset_updated_at.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/resize_image.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/run_shell.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/search_comment_autofill.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/search_context_tags.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/set_collapse_bulk.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/set_collapse_in_context.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/split_note.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/tag_proposals.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/toggle_reference_mode.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/toggle_todo_done.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/undo.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/unformat_content.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/update_content.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/usecases/view.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/utils/__init__.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/utils/encryption.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/app/utils/text_utils.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/convert-from-legacy.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/main.py +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/metalist.egg-info/SOURCES.txt +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/metalist.egg-info/dependency_links.txt +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/metalist.egg-info/entry_points.txt +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/metalist.egg-info/requires.txt +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/metalist.egg-info/top_level.txt +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/pyproject.toml +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/scripts/generate-lan-cert.sh +0 -0
- {metalist-0.7.5 → metalist-0.8.0}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: metalist
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.8.0
|
|
4
4
|
Summary: A minimalist single-user note-taking app with SSR, fast in-memory tree operations, and efficient sync.
|
|
5
5
|
Project-URL: Homepage, https://github.com/evolvingstuff/metalist
|
|
6
6
|
Project-URL: Repository, https://github.com/evolvingstuff/metalist
|
|
@@ -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.8.0
|
|
52
|
+
|
|
53
|
+
- Error diagnostics now record safe request IDs, exception types, and source locations through Loguru; full tracebacks are available only in authenticated encrypted logs.
|
|
54
|
+
- Releases run the full cross-platform matrix once on the `main` push. The tag publishes those exact tested distributions without rerunning the matrix.
|
|
55
|
+
|
|
51
56
|
## Changes in 0.7.5
|
|
52
57
|
|
|
53
58
|
- Unexpected API 500 errors now show the exception class and MetaList source line in the browser, without exposing note contents, exception messages, or local filesystem paths.
|
|
@@ -57,7 +62,7 @@ A minimalist single-user note-taking app focused on server-side rendering (SSR),
|
|
|
57
62
|
|
|
58
63
|
- Updates use a private, checksum-verified uv release on Windows, macOS, and Linux. The updater does not execute a user-installed uv, and it revalidates both the cached official archive and extracted executable before each use.
|
|
59
64
|
- The HTTPS listener retries one bodyless safe request after a transient backend reset, records final transport failures server-side, and never replays a mutation or request body.
|
|
60
|
-
- Release CI builds one distribution pair, starts independent platform/Python, installed-update, browser-smoke, and browser-soak gates in parallel, and caches only hash- or lockfile-verified dependencies.
|
|
65
|
+
- Release CI builds one distribution pair, starts independent platform/Python, installed-update, browser-smoke, and browser-soak gates in parallel, and caches only hash- or lockfile-verified dependencies.
|
|
61
66
|
|
|
62
67
|
## Changes in 0.7.3
|
|
63
68
|
|
|
@@ -356,9 +361,9 @@ This repo now packages itself under the PyPI distribution name `metalist`. Curre
|
|
|
356
361
|
|
|
357
362
|
Recommended release path:
|
|
358
363
|
1. In the existing PyPI project `metalist`, configure GitHub Trusted Publishing for `evolvingstuff/metalist` and the workflow file `.github/workflows/publish-pypi.yml`.
|
|
359
|
-
2.
|
|
360
|
-
3.
|
|
361
|
-
4. The tag
|
|
364
|
+
2. Develop and review the candidate on a feature branch with focused checks. Merge it into `main` and push `main` once. This runs the full `Publish to PyPI` validation matrix 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.14. Every installed-package matrix job also exercises the real `metalist update` path with uv, backups, interpreter preservation, and two-namespace restart against a local release index. The old-version fixture carries the candidate updater so this validates the mechanism being shipped; it does not retroactively fix older installed updaters. You do not need those operating systems locally. Archive verification checks runtime files, including agent Markdown resources, against both the wheel and source distribution.
|
|
365
|
+
3. Wait for the exact-commit main release matrix to pass, then run `.venv/bin/python scripts/release.py X.Y.Z` to create and push the tag. Any intervening change requires a new main validation run before tagging.
|
|
366
|
+
4. The tag job independently verifies every main-job conclusion and reuses the wheel and source distribution from that run for GitHub Trusted Publishing; it does not repeat the matrix. Manual dispatch cannot publish. The release driver compares PyPI hashes with the tested artifact and checks a clean public install. Users can then run it with `uvx metalist`, install it persistently with `uv tool install metalist`, or install it with `pip install metalist`.
|
|
362
367
|
|
|
363
368
|
If `--input` is omitted, a file picker opens (when `tkinter` and its native `_tkinter` component are available).
|
|
364
369
|
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.
|
|
@@ -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.8.0
|
|
16
|
+
|
|
17
|
+
- Error diagnostics now record safe request IDs, exception types, and source locations through Loguru; full tracebacks are available only in authenticated encrypted logs.
|
|
18
|
+
- Releases run the full cross-platform matrix once on the `main` push. The tag publishes those exact tested distributions without rerunning the matrix.
|
|
19
|
+
|
|
15
20
|
## Changes in 0.7.5
|
|
16
21
|
|
|
17
22
|
- Unexpected API 500 errors now show the exception class and MetaList source line in the browser, without exposing note contents, exception messages, or local filesystem paths.
|
|
@@ -21,7 +26,7 @@ A minimalist single-user note-taking app focused on server-side rendering (SSR),
|
|
|
21
26
|
|
|
22
27
|
- Updates use a private, checksum-verified uv release on Windows, macOS, and Linux. The updater does not execute a user-installed uv, and it revalidates both the cached official archive and extracted executable before each use.
|
|
23
28
|
- The HTTPS listener retries one bodyless safe request after a transient backend reset, records final transport failures server-side, and never replays a mutation or request body.
|
|
24
|
-
- Release CI builds one distribution pair, starts independent platform/Python, installed-update, browser-smoke, and browser-soak gates in parallel, and caches only hash- or lockfile-verified dependencies.
|
|
29
|
+
- Release CI builds one distribution pair, starts independent platform/Python, installed-update, browser-smoke, and browser-soak gates in parallel, and caches only hash- or lockfile-verified dependencies.
|
|
25
30
|
|
|
26
31
|
## Changes in 0.7.3
|
|
27
32
|
|
|
@@ -320,9 +325,9 @@ This repo now packages itself under the PyPI distribution name `metalist`. Curre
|
|
|
320
325
|
|
|
321
326
|
Recommended release path:
|
|
322
327
|
1. In the existing PyPI project `metalist`, configure GitHub Trusted Publishing for `evolvingstuff/metalist` and the workflow file `.github/workflows/publish-pypi.yml`.
|
|
323
|
-
2.
|
|
324
|
-
3.
|
|
325
|
-
4. The tag
|
|
328
|
+
2. Develop and review the candidate on a feature branch with focused checks. Merge it into `main` and push `main` once. This runs the full `Publish to PyPI` validation matrix 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.14. Every installed-package matrix job also exercises the real `metalist update` path with uv, backups, interpreter preservation, and two-namespace restart against a local release index. The old-version fixture carries the candidate updater so this validates the mechanism being shipped; it does not retroactively fix older installed updaters. You do not need those operating systems locally. Archive verification checks runtime files, including agent Markdown resources, against both the wheel and source distribution.
|
|
329
|
+
3. Wait for the exact-commit main release matrix to pass, then run `.venv/bin/python scripts/release.py X.Y.Z` to create and push the tag. Any intervening change requires a new main validation run before tagging.
|
|
330
|
+
4. The tag job independently verifies every main-job conclusion and reuses the wheel and source distribution from that run for GitHub Trusted Publishing; it does not repeat the matrix. Manual dispatch cannot publish. The release driver compares PyPI hashes with the tested artifact and checks a clean public install. Users can then run it with `uvx metalist`, install it persistently with `uv tool install metalist`, or install it with `pip install metalist`.
|
|
326
331
|
|
|
327
332
|
If `--input` is omitted, a file picker opens (when `tkinter` and its native `_tkinter` component are available).
|
|
328
333
|
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.
|
|
@@ -53,8 +53,11 @@ from app.services.namespace_switcher import open_or_launch_namespace
|
|
|
53
53
|
from app.services.namespace_runtime_guard import start_namespace_runtime_guard
|
|
54
54
|
from app.services.diagnostics import configure_process_diagnostics
|
|
55
55
|
from app.services.diagnostics import allow_plaintext_diagnostics
|
|
56
|
+
from app.services.diagnostics import log_unexpected_exception
|
|
56
57
|
from app.services.diagnostics import start_asyncio_diagnostics
|
|
57
58
|
from app.services.diagnostics import track_request
|
|
59
|
+
from app.services.diagnostics import write_encrypted_exception_trace
|
|
60
|
+
from app.security.sensitive_logging import traceback_frame_summary
|
|
58
61
|
from app.api.request_auth import clear_auth_cookie
|
|
59
62
|
from app.api.routes.notes import router as api2_router
|
|
60
63
|
from app.api.routes.auth import router as api2_auth_router
|
|
@@ -103,13 +106,20 @@ class InterceptHandler(logging.Handler):
|
|
|
103
106
|
frame = frame.f_back
|
|
104
107
|
depth += 1
|
|
105
108
|
|
|
106
|
-
|
|
107
|
-
if record.exc_info is not None:
|
|
108
|
-
|
|
109
|
+
error_detail = ""
|
|
110
|
+
if record.exc_info is not None and record.exc_info[0] is not None:
|
|
111
|
+
error_detail = (
|
|
112
|
+
f" error_type={record.exc_info[0].__name__} "
|
|
113
|
+
f"frames={traceback_frame_summary(record.exc_info[2])}"
|
|
114
|
+
)
|
|
109
115
|
logger.opt(depth=depth).log(
|
|
110
116
|
level,
|
|
111
|
-
f"{record.getMessage()}{
|
|
117
|
+
f"{record.getMessage()}{error_detail}",
|
|
112
118
|
)
|
|
119
|
+
if record.exc_info is not None and record.exc_info[1] is not None:
|
|
120
|
+
write_encrypted_exception_trace(
|
|
121
|
+
context="standard logging", exception=record.exc_info[1], request_id="",
|
|
122
|
+
)
|
|
113
123
|
|
|
114
124
|
|
|
115
125
|
logging.basicConfig(handlers=[InterceptHandler()], level=0, force=True)
|
|
@@ -153,11 +163,18 @@ async def handle_ontology_parse_error(request: Request, exc: OntologyParseError)
|
|
|
153
163
|
|
|
154
164
|
@app.exception_handler(Exception)
|
|
155
165
|
async def handle_unexpected_server_error(request: Request, exc: Exception):
|
|
166
|
+
request_id = request.scope.get("state", {}).get("diagnostic_request_id", "")
|
|
167
|
+
log_unexpected_exception(
|
|
168
|
+
context="HTTP request", exception=exc, request_id=request_id, level="ERROR",
|
|
169
|
+
)
|
|
170
|
+
diagnostic = describe_server_exception(exc)
|
|
171
|
+
if request_id:
|
|
172
|
+
diagnostic["requestId"] = request_id
|
|
156
173
|
return JSONResponse(
|
|
157
174
|
status_code=500,
|
|
158
175
|
content={
|
|
159
176
|
"detail": "Internal server error",
|
|
160
|
-
"diagnostic":
|
|
177
|
+
"diagnostic": diagnostic,
|
|
161
178
|
},
|
|
162
179
|
headers={"Cache-Control": "no-store, private", "X-Content-Type-Options": "nosniff"},
|
|
163
180
|
)
|
|
@@ -361,6 +378,7 @@ async def redirect_remote_http_to_https(request: Request, call_next):
|
|
|
361
378
|
@app.middleware("http")
|
|
362
379
|
async def log_requests(request: Request, call_next):
|
|
363
380
|
request_id = uuid.uuid4().hex[:8]
|
|
381
|
+
request.state.diagnostic_request_id = request_id
|
|
364
382
|
handler = request.scope.get("endpoint")
|
|
365
383
|
handler_name = getattr(handler, "__qualname__", "unknown")
|
|
366
384
|
|
|
@@ -328,7 +328,7 @@ def remove_formatting_scope_delimiters(
|
|
|
328
328
|
def _is_removable_formatting_tag(token: str) -> bool:
|
|
329
329
|
if not isinstance(token, str):
|
|
330
330
|
raise TypeError(f"token must be a string, got {type(token)}")
|
|
331
|
-
if not token.startswith("@"):
|
|
331
|
+
if not token.startswith("@") or token == "@":
|
|
332
332
|
return False
|
|
333
333
|
tag_name = _canonical_meta_tag_name(token[1:].casefold())
|
|
334
334
|
if tag_name in _REMOVABLE_FORMATTING_TAGS:
|
|
@@ -822,7 +822,7 @@ def _add_implied_meta_tags(*, tags: str, config: MetaTagConfig) -> MetaTagConfig
|
|
|
822
822
|
implied_terms = ontology.infer_implication_only(base_tags=source_terms)
|
|
823
823
|
implied_meta_tags: Set[str] = set()
|
|
824
824
|
for term in implied_terms:
|
|
825
|
-
if not term.startswith("@"):
|
|
825
|
+
if not term.startswith("@") or term == "@":
|
|
826
826
|
continue
|
|
827
827
|
tag_name = _canonical_meta_tag_name(term[1:].casefold())
|
|
828
828
|
if _is_formatting_meta_tag_name(tag_name):
|
|
@@ -1230,7 +1230,7 @@ def _parse_meta_tags(tags: str) -> MetaTagConfig:
|
|
|
1230
1230
|
for token in tokens:
|
|
1231
1231
|
base, wrapper = _unwrap_tag_token(token)
|
|
1232
1232
|
if wrapper is None:
|
|
1233
|
-
if not base.startswith("@"):
|
|
1233
|
+
if not base.startswith("@") or base == "@":
|
|
1234
1234
|
continue
|
|
1235
1235
|
tag_name = _canonical_meta_tag_name(base[1:].casefold())
|
|
1236
1236
|
if not _is_formatting_meta_tag_name(tag_name):
|
|
@@ -1248,7 +1248,7 @@ def _parse_meta_tags(tags: str) -> MetaTagConfig:
|
|
|
1248
1248
|
key = (opener, depth)
|
|
1249
1249
|
wrappers_to_consume.add(key)
|
|
1250
1250
|
for inner in inner_tokens:
|
|
1251
|
-
if not inner.startswith("@"):
|
|
1251
|
+
if not inner.startswith("@") or inner == "@":
|
|
1252
1252
|
continue
|
|
1253
1253
|
tag_name = _canonical_meta_tag_name(inner[1:].casefold())
|
|
1254
1254
|
if not _is_formatting_meta_tag_name(tag_name):
|
|
@@ -1257,9 +1257,7 @@ def _parse_meta_tags(tags: str) -> MetaTagConfig:
|
|
|
1257
1257
|
if key in scoped_renderers:
|
|
1258
1258
|
existing = scoped_renderers[key]
|
|
1259
1259
|
if existing is not None and existing != tag_name:
|
|
1260
|
-
|
|
1261
|
-
f"Wrapper {key} has conflicting scoped renderers: {existing} vs {tag_name}"
|
|
1262
|
-
)
|
|
1260
|
+
continue
|
|
1263
1261
|
scoped_renderers[key] = tag_name
|
|
1264
1262
|
continue
|
|
1265
1263
|
if key not in scoped:
|
|
@@ -116,6 +116,42 @@ def authenticated_logging_is_active() -> bool:
|
|
|
116
116
|
return _authenticated_logging_active
|
|
117
117
|
|
|
118
118
|
|
|
119
|
+
def log_unexpected_exception(
|
|
120
|
+
*, context: str, exception: BaseException, request_id: str, level: str,
|
|
121
|
+
) -> None:
|
|
122
|
+
"""Keep plaintext diagnostics data-free; retain full traces in encrypted logs."""
|
|
123
|
+
if context == "":
|
|
124
|
+
raise ValueError("Exception context must not be empty")
|
|
125
|
+
if level not in {"ERROR", "CRITICAL"}:
|
|
126
|
+
raise ValueError(f"Unsupported unexpected-exception level: {level}")
|
|
127
|
+
logger.bind(request_id=request_id).log(
|
|
128
|
+
level,
|
|
129
|
+
"[diagnostics] unexpected {context} exception "
|
|
130
|
+
"error_type={error_type} frames={frames}",
|
|
131
|
+
context=context,
|
|
132
|
+
error_type=type(exception).__name__,
|
|
133
|
+
frames=traceback_frame_summary(exception.__traceback__),
|
|
134
|
+
)
|
|
135
|
+
write_encrypted_exception_trace(
|
|
136
|
+
context=context, exception=exception, request_id=request_id,
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def write_encrypted_exception_trace(
|
|
141
|
+
*, context: str, exception: BaseException, request_id: str,
|
|
142
|
+
) -> None:
|
|
143
|
+
"""Write exception messages only to the authenticated encrypted sink."""
|
|
144
|
+
with _authenticated_logging_lock:
|
|
145
|
+
if not _authenticated_logging_active:
|
|
146
|
+
return
|
|
147
|
+
if _authenticated_log_sink is None:
|
|
148
|
+
raise RuntimeError("Authenticated logging is active without an encrypted sink")
|
|
149
|
+
formatted = "".join(traceback.format_exception(exception))
|
|
150
|
+
_authenticated_log_sink.write(
|
|
151
|
+
f"[diagnostics] {context} request_id={request_id}\n{formatted}"
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
|
|
119
155
|
def _disable_plaintext_fault_logging() -> None:
|
|
120
156
|
if hasattr(signal, "SIGUSR1"):
|
|
121
157
|
faulthandler.unregister(signal.SIGUSR1)
|
|
@@ -397,22 +433,20 @@ def _direct_append_log_recycler_loop() -> None:
|
|
|
397
433
|
|
|
398
434
|
|
|
399
435
|
def _log_unhandled_exception(exc_type, exc_value, exc_traceback) -> None:
|
|
400
|
-
|
|
401
|
-
"
|
|
402
|
-
error_type=exc_type.__name__,
|
|
403
|
-
frames=traceback_frame_summary(exc_traceback),
|
|
436
|
+
log_unexpected_exception(
|
|
437
|
+
context="process", exception=exc_value, request_id="", level="CRITICAL",
|
|
404
438
|
)
|
|
405
439
|
|
|
406
440
|
|
|
407
441
|
def _log_unhandled_thread_exception(args: threading.ExceptHookArgs) -> None:
|
|
408
442
|
if args.thread is None:
|
|
409
443
|
raise RuntimeError("Thread exception hook missing thread")
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
"
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
444
|
+
exception = args.exc_value
|
|
445
|
+
if exception is None:
|
|
446
|
+
raise RuntimeError("Thread exception hook missing exception")
|
|
447
|
+
log_unexpected_exception(
|
|
448
|
+
context=f"thread {args.thread.name}", exception=exception,
|
|
449
|
+
request_id="", level="CRITICAL",
|
|
416
450
|
)
|
|
417
451
|
|
|
418
452
|
|
|
@@ -475,13 +509,13 @@ class TrackedRequest:
|
|
|
475
509
|
ended_at=time.perf_counter(),
|
|
476
510
|
)
|
|
477
511
|
if exc_type is not None:
|
|
478
|
-
|
|
479
|
-
"
|
|
480
|
-
|
|
512
|
+
if exc is None:
|
|
513
|
+
raise RuntimeError("Tracked request exited with an exception type but no exception")
|
|
514
|
+
log_unexpected_exception(
|
|
515
|
+
context=f"request after {duration_ms:.2f} ms",
|
|
516
|
+
exception=exc,
|
|
481
517
|
request_id=self._request_id,
|
|
482
|
-
|
|
483
|
-
error_type=exc_type.__name__,
|
|
484
|
-
frames=traceback_frame_summary(exc_traceback),
|
|
518
|
+
level="ERROR",
|
|
485
519
|
)
|
|
486
520
|
return False
|
|
487
521
|
|
|
@@ -697,10 +731,8 @@ def _handle_asyncio_exception(
|
|
|
697
731
|
) -> None:
|
|
698
732
|
exception = context.get("exception")
|
|
699
733
|
if isinstance(exception, BaseException):
|
|
700
|
-
|
|
701
|
-
"
|
|
702
|
-
error_type=type(exception).__name__,
|
|
703
|
-
frames=traceback_frame_summary(exception.__traceback__),
|
|
734
|
+
log_unexpected_exception(
|
|
735
|
+
context="asyncio task", exception=exception, request_id="", level="ERROR",
|
|
704
736
|
)
|
|
705
737
|
return
|
|
706
738
|
logger.error(
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
const ERROR_TYPE = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
2
2
|
const CODE_LOCATION = /^(?:app(?:\/[A-Za-z_][A-Za-z0-9_]*)+\.py:\d+|external)$/;
|
|
3
|
+
const REQUEST_ID = /^[a-f0-9]{8}$/;
|
|
3
4
|
|
|
4
5
|
export async function describeApiFailure(response) {
|
|
5
6
|
const base = `API call failed: ${response.status} ${response.statusText}`;
|
|
@@ -12,5 +13,8 @@ export async function describeApiFailure(response) {
|
|
|
12
13
|
if (!ERROR_TYPE.test(diagnostic?.errorType) || !CODE_LOCATION.test(diagnostic?.codeLocation)) {
|
|
13
14
|
return base;
|
|
14
15
|
}
|
|
15
|
-
|
|
16
|
+
const requestId = REQUEST_ID.test(diagnostic.requestId)
|
|
17
|
+
? `, request ${diagnostic.requestId}`
|
|
18
|
+
: '';
|
|
19
|
+
return `${base} (${diagnostic.errorType} at ${diagnostic.codeLocation}${requestId})`;
|
|
16
20
|
}
|
{metalist-0.7.5 → metalist-0.8.0}/app/static/js/modules/mode-manager/services/tag-syntax-service.js
RENAMED
|
@@ -28,6 +28,28 @@ const TAG_WRAPPER_PAIRS = new Map([
|
|
|
28
28
|
['(', ')'],
|
|
29
29
|
]);
|
|
30
30
|
const TAG_WRAPPER_CHARS = new Set(['[', ']', '{', '}', '(', ')']);
|
|
31
|
+
const SCOPED_RENDERER_TAGS = new Set(['@markdown', '@latex', '@json', '@csv', '@shell']);
|
|
32
|
+
const KNOWN_META_TAGS = new Set([
|
|
33
|
+
'@footnote', '@monospace', '@heading', '@red', '@green', '@blue', '@grey',
|
|
34
|
+
'@highlighter', '@bold', '@italic', '@strikethrough', '@serif', '@copyable',
|
|
35
|
+
'@list-bulleted', '@list-numbered', '@username', '@password', '@email',
|
|
36
|
+
'@todo', '@done', '@markdown', '@llm', '@latex', '@shell', '@json', '@csv',
|
|
37
|
+
]);
|
|
38
|
+
|
|
39
|
+
function isSupportedMetaTag(term) {
|
|
40
|
+
if (typeof term !== 'string') {
|
|
41
|
+
throw new Error('isSupportedMetaTag requires string');
|
|
42
|
+
}
|
|
43
|
+
if (!term.startsWith('@')) {
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
const folded = term.toLowerCase();
|
|
47
|
+
if (KNOWN_META_TAGS.has(folded)) {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
return /^@size=(?:\d+(?:\.\d*)?|\.\d+)$/.test(folded)
|
|
51
|
+
&& /[1-9]/.test(folded.slice('@size='.length));
|
|
52
|
+
}
|
|
31
53
|
|
|
32
54
|
function isAsciiPrintable(char) {
|
|
33
55
|
if (typeof char !== 'string' || char.length === 0) {
|
|
@@ -515,8 +537,10 @@ export function analyzeTagBarInput(rawInput) {
|
|
|
515
537
|
|
|
516
538
|
const sanitizedSegments = [];
|
|
517
539
|
const normalizedSegments = [];
|
|
540
|
+
let globalRenderer = null;
|
|
518
541
|
for (const segment of segments) {
|
|
519
542
|
normalizedSegments.push(segment.text);
|
|
543
|
+
let sanitizedToken = segment.text;
|
|
520
544
|
if (segment.type === 'token') {
|
|
521
545
|
const wrapperInfo = analyzeUnclosedWrapperTokenInfo(segment.text);
|
|
522
546
|
if (wrapperInfo) {
|
|
@@ -530,8 +554,42 @@ export function analyzeTagBarInput(rawInput) {
|
|
|
530
554
|
hasReservedOrTag = true;
|
|
531
555
|
continue;
|
|
532
556
|
}
|
|
557
|
+
if (closedWrapperInfo) {
|
|
558
|
+
let scopedRenderer = null;
|
|
559
|
+
const retainedTerms = tagTerms.filter((term) => {
|
|
560
|
+
if (!isSupportedMetaTag(term)) {
|
|
561
|
+
return false;
|
|
562
|
+
}
|
|
563
|
+
const renderer = term.toLowerCase();
|
|
564
|
+
if (!SCOPED_RENDERER_TAGS.has(renderer)) {
|
|
565
|
+
return true;
|
|
566
|
+
}
|
|
567
|
+
if (scopedRenderer !== null && scopedRenderer !== renderer) {
|
|
568
|
+
return false;
|
|
569
|
+
}
|
|
570
|
+
scopedRenderer = renderer;
|
|
571
|
+
return true;
|
|
572
|
+
});
|
|
573
|
+
if (retainedTerms.length === 0) {
|
|
574
|
+
continue;
|
|
575
|
+
}
|
|
576
|
+
const opener = segment.text[0];
|
|
577
|
+
const prefix = opener.repeat(closedWrapperInfo.depth);
|
|
578
|
+
const suffix = TAG_WRAPPER_PAIRS.get(opener).repeat(closedWrapperInfo.depth);
|
|
579
|
+
sanitizedToken = `${prefix}${retainedTerms.join(' ')}${suffix}`;
|
|
580
|
+
} else if (!isSupportedMetaTag(segment.text)) {
|
|
581
|
+
continue;
|
|
582
|
+
} else {
|
|
583
|
+
const renderer = segment.text.toLowerCase();
|
|
584
|
+
if (SCOPED_RENDERER_TAGS.has(renderer)) {
|
|
585
|
+
if (globalRenderer !== null && globalRenderer !== renderer) {
|
|
586
|
+
continue;
|
|
587
|
+
}
|
|
588
|
+
globalRenderer = renderer;
|
|
589
|
+
}
|
|
590
|
+
}
|
|
533
591
|
}
|
|
534
|
-
sanitizedSegments.push(
|
|
592
|
+
sanitizedSegments.push(sanitizedToken);
|
|
535
593
|
}
|
|
536
594
|
|
|
537
595
|
const sanitizedText = sanitizedSegments.join(' ').trim();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: metalist
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.8.0
|
|
4
4
|
Summary: A minimalist single-user note-taking app with SSR, fast in-memory tree operations, and efficient sync.
|
|
5
5
|
Project-URL: Homepage, https://github.com/evolvingstuff/metalist
|
|
6
6
|
Project-URL: Repository, https://github.com/evolvingstuff/metalist
|
|
@@ -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.8.0
|
|
52
|
+
|
|
53
|
+
- Error diagnostics now record safe request IDs, exception types, and source locations through Loguru; full tracebacks are available only in authenticated encrypted logs.
|
|
54
|
+
- Releases run the full cross-platform matrix once on the `main` push. The tag publishes those exact tested distributions without rerunning the matrix.
|
|
55
|
+
|
|
51
56
|
## Changes in 0.7.5
|
|
52
57
|
|
|
53
58
|
- Unexpected API 500 errors now show the exception class and MetaList source line in the browser, without exposing note contents, exception messages, or local filesystem paths.
|
|
@@ -57,7 +62,7 @@ A minimalist single-user note-taking app focused on server-side rendering (SSR),
|
|
|
57
62
|
|
|
58
63
|
- Updates use a private, checksum-verified uv release on Windows, macOS, and Linux. The updater does not execute a user-installed uv, and it revalidates both the cached official archive and extracted executable before each use.
|
|
59
64
|
- The HTTPS listener retries one bodyless safe request after a transient backend reset, records final transport failures server-side, and never replays a mutation or request body.
|
|
60
|
-
- Release CI builds one distribution pair, starts independent platform/Python, installed-update, browser-smoke, and browser-soak gates in parallel, and caches only hash- or lockfile-verified dependencies.
|
|
65
|
+
- Release CI builds one distribution pair, starts independent platform/Python, installed-update, browser-smoke, and browser-soak gates in parallel, and caches only hash- or lockfile-verified dependencies.
|
|
61
66
|
|
|
62
67
|
## Changes in 0.7.3
|
|
63
68
|
|
|
@@ -356,9 +361,9 @@ This repo now packages itself under the PyPI distribution name `metalist`. Curre
|
|
|
356
361
|
|
|
357
362
|
Recommended release path:
|
|
358
363
|
1. In the existing PyPI project `metalist`, configure GitHub Trusted Publishing for `evolvingstuff/metalist` and the workflow file `.github/workflows/publish-pypi.yml`.
|
|
359
|
-
2.
|
|
360
|
-
3.
|
|
361
|
-
4. The tag
|
|
364
|
+
2. Develop and review the candidate on a feature branch with focused checks. Merge it into `main` and push `main` once. This runs the full `Publish to PyPI` validation matrix 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.14. Every installed-package matrix job also exercises the real `metalist update` path with uv, backups, interpreter preservation, and two-namespace restart against a local release index. The old-version fixture carries the candidate updater so this validates the mechanism being shipped; it does not retroactively fix older installed updaters. You do not need those operating systems locally. Archive verification checks runtime files, including agent Markdown resources, against both the wheel and source distribution.
|
|
365
|
+
3. Wait for the exact-commit main release matrix to pass, then run `.venv/bin/python scripts/release.py X.Y.Z` to create and push the tag. Any intervening change requires a new main validation run before tagging.
|
|
366
|
+
4. The tag job independently verifies every main-job conclusion and reuses the wheel and source distribution from that run for GitHub Trusted Publishing; it does not repeat the matrix. Manual dispatch cannot publish. The release driver compares PyPI hashes with the tested artifact and checks a clean public install. Users can then run it with `uvx metalist`, install it persistently with `uv tool install metalist`, or install it with `pip install metalist`.
|
|
362
367
|
|
|
363
368
|
If `--input` is omitted, a file picker opens (when `tkinter` and its native `_tkinter` component are available).
|
|
364
369
|
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.
|
|
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
|