MetaList 0.24.2__tar.gz → 0.25.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.24.2/metalist.egg-info → metalist-0.25.0}/PKG-INFO +19 -1
- {metalist-0.24.2 → metalist-0.25.0}/README.md +17 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/api/note_requests.py +19 -8
- {metalist-0.24.2 → metalist-0.25.0}/app/api/routes/ai.py +92 -56
- {metalist-0.24.2 → metalist-0.25.0}/app/api/routes/auth.py +14 -11
- {metalist-0.24.2 → metalist-0.25.0}/app/api/routes/notes.py +90 -49
- {metalist-0.24.2 → metalist-0.25.0}/app/api/transactions.py +19 -9
- metalist-0.25.0/app/db/link_icons_sql.py +175 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/db/migrations.py +53 -1
- {metalist-0.24.2 → metalist-0.25.0}/app/db/schema.py +46 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/db/settings_sql.py +55 -16
- {metalist-0.24.2 → metalist-0.25.0}/app/db/version.py +1 -1
- {metalist-0.24.2 → metalist-0.25.0}/app/encryption_audit.py +63 -1
- {metalist-0.24.2 → metalist-0.25.0}/app/exception_boundaries.py +6 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/main.py +6 -1
- {metalist-0.24.2 → metalist-0.25.0}/app/presentation/render/note_renderer.py +15 -4
- {metalist-0.24.2 → metalist-0.25.0}/app/security/rendered_html.py +1 -1
- {metalist-0.24.2 → metalist-0.25.0}/app/security/sensitive_cache.py +13 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/agent_loop.py +1 -2
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/ai_send.py +2 -4
- metalist-0.25.0/app/services/agent/anthropic_inference.py +613 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/cloud_privacy.py +7 -3
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/export_title_suggestions.py +4 -4
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/failure_explanations.py +18 -7
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/history.py +0 -1
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/inference.py +28 -4
- metalist-0.25.0/app/services/agent/openai_compatible_inference.py +423 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/openai_inference.py +8 -25
- metalist-0.25.0/app/services/agent/openai_models.py +12 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/prompts/agent.md +6 -3
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/release_notes.py +22 -3
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/retrieval_settings.py +14 -17
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/runtime.py +2 -14
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/skills/help-ai.md +31 -13
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/skills/help-data.md +10 -10
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/skills/help-dictation.md +3 -3
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/skills/help-formatting.md +10 -8
- metalist-0.25.0/app/services/agent/skills/help-menus.md +140 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/skills/help-mouse.md +7 -4
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/skills/help-notes.md +18 -14
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/skills/help-ontology.md +1 -1
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/skills/help-privacy.md +7 -5
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/skills/help-references.md +17 -14
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/skills/help-releases.md +18 -31
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/skills/help-reminders.md +10 -10
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/skills/help-search.md +9 -6
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/skills/help-tags.md +7 -5
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/structured_inference.py +17 -1
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/tagging_run.py +2 -2
- metalist-0.25.0/app/services/ai_catalog.py +110 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/ai_chat.py +3 -2
- {metalist-0.24.2 → metalist-0.25.0}/app/services/ai_chat_rendering.py +8 -3
- metalist-0.25.0/app/services/ai_credentials.py +221 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/ai_setup.py +33 -23
- {metalist-0.24.2 → metalist-0.25.0}/app/services/auth_service.py +11 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/backlinks.py +13 -1
- {metalist-0.24.2 → metalist-0.25.0}/app/services/client_state_service.py +71 -14
- {metalist-0.24.2 → metalist-0.25.0}/app/services/content_cache.py +57 -8
- {metalist-0.24.2 → metalist-0.25.0}/app/services/content_formatting.py +192 -37
- {metalist-0.24.2 → metalist-0.25.0}/app/services/dictation_cleanup.py +5 -4
- {metalist-0.24.2 → metalist-0.25.0}/app/services/embedded_references.py +275 -137
- {metalist-0.24.2 → metalist-0.25.0}/app/services/file_registry.py +14 -10
- {metalist-0.24.2 → metalist-0.25.0}/app/services/html_export.py +39 -9
- metalist-0.25.0/app/services/link_icons.py +758 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/link_titles.py +37 -1
- {metalist-0.24.2 → metalist-0.25.0}/app/services/markdown_rendering.py +49 -10
- {metalist-0.24.2 → metalist-0.25.0}/app/services/memory_breakdown.py +2 -0
- metalist-0.25.0/app/services/meta_tag_renames.py +62 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/note_fullscreen.py +55 -6
- {metalist-0.24.2 → metalist-0.25.0}/app/services/note_store.py +24 -2
- metalist-0.25.0/app/services/reference_suggestions.py +509 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/request_recovery.py +1 -1
- {metalist-0.24.2 → metalist-0.25.0}/app/services/reset_for_tests.py +1 -1
- {metalist-0.24.2 → metalist-0.25.0}/app/services/search_index.py +259 -7
- {metalist-0.24.2 → metalist-0.25.0}/app/services/search_query.py +22 -3
- {metalist-0.24.2 → metalist-0.25.0}/app/services/snapshot.py +22 -2
- metalist-0.25.0/app/services/subtree_stats.py +430 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/tab_state.py +72 -6
- {metalist-0.24.2 → metalist-0.25.0}/app/services/tag_properties.py +47 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/tag_suggestions.py +113 -4
- {metalist-0.24.2 → metalist-0.25.0}/app/startup_environment.py +13 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/startup_sanity_config.py +6 -6
- {metalist-0.24.2 → metalist-0.25.0}/app/static/config/agent-menu-actions.json +98 -74
- {metalist-0.24.2 → metalist-0.25.0}/app/static/config/command_palette_tags.json +16 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/css/main.css +1617 -746
- metalist-0.25.0/app/static/css/reference-preview.css +19 -0
- metalist-0.25.0/app/static/img/apple-touch-icon.png +0 -0
- metalist-0.25.0/app/static/img/favicon.ico +0 -0
- metalist-0.25.0/app/static/img/favicon.svg +9 -0
- metalist-0.25.0/app/static/img/icon-192.png +0 -0
- metalist-0.25.0/app/static/img/icon-512.png +0 -0
- metalist-0.25.0/app/static/img/icon-maskable-512.png +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/main.js +5 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/ai-chat/agent-menu-actions.js +7 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/ai-chat/agent-retrieval-settings.js +10 -16
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/ai-chat/ai-chat-api.js +30 -20
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/ai-chat/ai-chat-panel-controller.js +58 -50
- metalist-0.25.0/app/static/js/modules/ai-chat/ai-model-names.js +41 -0
- metalist-0.25.0/app/static/js/modules/ai-chat/ai-providers.js +20 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/ai-chat/ai-thinking-level-service.js +4 -3
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/ai-chat/bulk-proposal-ui.js +21 -35
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/ai-chat/confirmation-card.js +4 -3
- metalist-0.25.0/app/static/js/modules/ai-chat/proposal-menu.js +186 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/api-client.js +43 -28
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/auth.js +81 -3
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/command-palette/command-palette-controller.js +184 -45
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/command-palette/endpoint-registry.js +164 -71
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/config.js +5 -4
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/context-menu/context-menu-registry.js +135 -105
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/context-menu/context-menu-service.js +7 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/dom-utils.js +1 -1
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/error-handler.js +45 -63
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/excalidraw/excalidraw-editor-service.js +36 -14
- metalist-0.25.0/app/static/js/modules/excalidraw/excalidraw-status-shown.js +19 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/expected-errors.js +14 -0
- metalist-0.25.0/app/static/js/modules/floating-messages.js +279 -0
- metalist-0.25.0/app/static/js/modules/modals/action-row.js +100 -0
- metalist-0.25.0/app/static/js/modules/modals/ai-agent-settings-modal.js +510 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/alphabetize-root-notes-modal.js +10 -20
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/backup-restore-modal.js +65 -61
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/backup-settings-modal.js +56 -95
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/base-modal.js +65 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/confirmation-modal.js +10 -8
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/date-range-modal.js +10 -4
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/delete-namespace-modal.js +53 -79
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/delete-namespace-validation.js +5 -3
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/dictation-settings-modal.js +26 -21
- metalist-0.25.0/app/static/js/modules/modals/error-dialog.js +207 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/export-options-modal.js +24 -14
- metalist-0.25.0/app/static/js/modules/modals/field-message.js +74 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/link-title-retry-modal.js +18 -4
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/namespace-modals.js +219 -192
- metalist-0.25.0/app/static/js/modules/modals/namespace-rename-validation.js +51 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/note-layout-appearance-modal.js +12 -10
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/ontology-modal.js +53 -58
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/password-modal.js +81 -71
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/prioritize-modal.js +49 -47
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/random-password-modal.js +4 -21
- metalist-0.25.0/app/static/js/modules/modals/recent-messages-modal.js +58 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/reminder-modal.js +35 -19
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/reset-updated-at-modal.js +10 -20
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/search-suggestion-statistics-modal.js +55 -25
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/session-timeout-modal.js +45 -35
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/version-info-modal.js +6 -8
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/actions/content-actions.js +1 -1
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/actions/history-actions.js +1 -1
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/actions/note-actions.js +3 -12
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/actions/selection-actions.js +2 -2
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/actions/ui-actions.js +17 -13
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/events/context-menu-events.js +17 -70
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/events/input-events.js +5 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/events/keyboard-events.js +15 -84
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/events/mouse-events.js +8 -8
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/mode-context.js +0 -15
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/add-style-service.js +1 -1
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/collapse-affordance-service.js +19 -6
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/date-range-kinds.js +3 -3
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/dictation-paste-service.js +1 -1
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/differential-view-service.js +12 -12
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/file-filter-kinds.js +3 -3
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/file-reference-service.js +59 -17
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/find-in-list-service.js +15 -2
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/floating-note-service.js +2 -0
- metalist-0.25.0/app/static/js/modules/mode-manager/services/fold-arrow-alignment-service.js +192 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/image-file-insert-choice-modal-service.js +12 -6
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/infinite-scroll-service.js +8 -1
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/note-fullscreen-service.js +2 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/polling-service.js +1 -1
- metalist-0.25.0/app/static/js/modules/mode-manager/services/reference-hover-preview-service.js +132 -0
- metalist-0.24.2/app/static/js/modules/mode-manager/services/paste-reference-here-service.js → metalist-0.25.0/app/static/js/modules/mode-manager/services/reference-insert-point-service.js +6 -6
- metalist-0.25.0/app/static/js/modules/mode-manager/services/reference-preview-card-service.js +129 -0
- metalist-0.25.0/app/static/js/modules/mode-manager/services/reference-suggestions-service.js +523 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/root-date-separator-service.js +1 -1
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/search-syntax-service.js +20 -1
- metalist-0.25.0/app/static/js/modules/mode-manager/services/tab-context-actions.js +20 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/tab-dom-cache-service.js +1 -1
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/tag-syntax-service.js +11 -4
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/viewport-hold-service.js +65 -15
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/viewport-reference.js +18 -0
- metalist-0.25.0/app/static/js/modules/phone/phone-mode.js +584 -0
- metalist-0.25.0/app/static/js/modules/phone/phone-search-terms.js +65 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/reminder-surface-service.js +1 -1
- metalist-0.25.0/app/static/manifest.json +13 -0
- metalist-0.25.0/app/templates/_logo_mark.html +10 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/templates/base.html +4 -1
- {metalist-0.24.2 → metalist-0.25.0}/app/templates/index.html +5 -2
- {metalist-0.24.2 → metalist-0.25.0}/app/templates/locked.html +4 -1
- {metalist-0.24.2 → metalist-0.25.0}/app/templates/namespace_deleted.html +4 -1
- {metalist-0.24.2 → metalist-0.25.0}/app/templates/namespace_renamed.html +4 -1
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/search_context_tags.py +2 -1
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/update_content.py +3 -7
- {metalist-0.24.2 → metalist-0.25.0}/app/version.py +1 -1
- {metalist-0.24.2 → metalist-0.25.0/metalist.egg-info}/PKG-INFO +19 -1
- {metalist-0.24.2 → metalist-0.25.0}/metalist.egg-info/SOURCES.txt +32 -9
- {metalist-0.24.2 → metalist-0.25.0}/metalist.egg-info/requires.txt +1 -0
- {metalist-0.24.2 → metalist-0.25.0}/pyproject.toml +10 -0
- metalist-0.24.2/app/services/agent/openai_models.py +0 -25
- metalist-0.24.2/app/services/agent/skills/help-menus.md +0 -136
- metalist-0.24.2/app/services/openai_credentials.py +0 -191
- metalist-0.24.2/app/static/img/favicon.ico +0 -0
- metalist-0.24.2/app/static/img/metalist-logo-black-1024.png +0 -0
- metalist-0.24.2/app/static/img/metalist-logo-black-512.png +0 -0
- metalist-0.24.2/app/static/img/metalist-logo-black.svg +0 -9
- metalist-0.24.2/app/static/img/metalist-logo-white-1024.png +0 -0
- metalist-0.24.2/app/static/img/metalist-logo-white-512.png +0 -0
- metalist-0.24.2/app/static/img/metalist-logo-white.svg +0 -9
- metalist-0.24.2/app/static/js/modules/ai-chat/proposal-menu.js +0 -86
- metalist-0.24.2/app/static/js/modules/modals/ai-agent-settings-modal.js +0 -596
- metalist-0.24.2/app/static/js/modules/modals/namespace-rename-validation.js +0 -32
- metalist-0.24.2/app/templates/_logo_mark.html +0 -6
- metalist-0.24.2/app/usecases/paste_reference.py +0 -78
- {metalist-0.24.2 → metalist-0.25.0}/MANIFEST.in +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/__init__.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/api/__init__.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/api/deps.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/api/dev.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/api/middleware/auth.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/api/request_auth.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/api/routes/app_updates.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/api/routes/backups.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/api/routes/files.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/api/routes/ontology.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/api/routes/reminders.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/api/routes/remote_images.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/api/routes/test.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/api/upload_limits.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/config.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/contracts.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/data_directory.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/db/__init__.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/db/backup_settings_sql.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/db/content_migrations_sql.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/db/editable_files_migration.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/db/engine.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/db/file_schema.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/db/file_session.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/db/files_sql.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/db/link_titles_sql.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/db/live_recovery.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/db/notes_sql.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/db/ontology_rules_sql.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/db/raw_connection.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/db/reminders_sql.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/db/retire_sounds.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/db/search_history_sql.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/db/session.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/db/tab_state_sql.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/https_proxy.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/launch_clock.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/models/database.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/models/utils.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/network_settings.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/presentation/__init__.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/presentation/login_page.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/presentation/render/__init__.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/presentation/templates.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/process_memory.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/security/authenticated_logging.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/security/crypto_sizes.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/security/encryption.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/security/http_error_diagnostics.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/security/http_headers.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/security/note_html.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/security/request_boundary.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/security/request_hosts.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/security/sensitive_logging.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/security/shell_execution.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/security/validation_errors.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/server_runtime.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/__init__.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/__init__.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/action_log.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/agent_tools.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/citation_tokens.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/context.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/evidence_serialization.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/execution_errors.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/help_catalog.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/investigation.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/judging.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/menu_actions.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/model_policy.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/note_aliases.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/note_tag_suggestions.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/openai_cost_tracking.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/privacy_guard.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/prompt_settings.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/prompts/__init__.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/prompts/final-response.md +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/prompts/system.md +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/scope.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/skill_settings.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/skills/__init__.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/skills/staged-summary.md +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/skills/tag-proposals.md +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/skills/web-browsing.md +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/staged_summary.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/strict_structured_outputs.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/summary_batch_store.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/tagging.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/token_estimation.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/tool_calling.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/trace.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/web_actions.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/web_capabilities.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/web_evidence.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/web_fetch.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/agent/web_settings.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/ai_chat_stream.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/app_update_worker.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/app_updates.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/auth.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/auth_cache_state.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/backlink_index.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/backup_service.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/backup_settings_service.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/bulk_operation.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/chess_rendering.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/code_rendering.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/diagnostics.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/diff_rendering.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/editing_image_sizes.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/encryption.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/exception_capture.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/file_edit_sessions.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/file_kinds.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/file_storage.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/file_text_preview.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/find_text.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/footnote_layout.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/footnote_rendering.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/hierarchy.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/html_unformatting.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/hydration_state.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/image_size_formatting.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/inline_image_dimensions.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/inline_image_occurrences.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/input_errors.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/integrity.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/latex_rendering.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/link_title_retry.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/login_rate_limit.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/maintenance_mode.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/memory_usage.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/mermaid_note_rendering.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/namespace_deletion_jobs.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/namespace_deletion_worker.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/namespace_rename_jobs.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/namespace_rename_worker.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/namespace_runtime_guard.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/namespace_switcher.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/note_image_tags.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/note_ordering.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/ontology_rules_store.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/password_note_fields.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/preference_values.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/public_http.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/reference_presentation.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/reminders.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/remote_image_proxy.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/resource_limits.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/root_date_filter.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/root_sorting.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/runtime_generation.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/runtime_hardening.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/runtime_lock.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/search_history.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/search_history_storage.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/search_text.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/selected_text_tag.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/self_update.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/session_timeout_service.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/shared_sets.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/shell_session_service.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/store.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/structured_note_renderers.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/sync.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/tag_case.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/tag_details.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/tag_ontology.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/tag_plural_variants.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/tag_rename.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/tag_suggestion_reasons.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/tag_term_matching.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/tokens.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/undo_state.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/update_backups.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/update_installer.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/update_preflight.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/view_cache.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/view_diff.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/view_state.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/services/windows_process_control.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/startup_console.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/startup_js_sanity.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/startup_sanity.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/startup_shockharness.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/css/floating-notes.css +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/css/forms.css +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/locked.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/activity-tracker.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/ai-chat/agent-web-settings.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/ai-chat/ai-agent-debug-view.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/ai-chat/ai-chat-message-placement.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/ai-chat/ai-chat-panel-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/ai-chat/ai-chat-refused-turns.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/ai-chat/ai-chat-size-limits.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/ai-chat/bulk-elapsed-clock.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/ai-chat/bulk-scope-question.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/ai-chat/cloud-privacy-policy.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/ai-chat/confirmation-question.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/ai-chat/summary-batch-preview.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/api-error-diagnostics.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/api-failure-classification-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/app-notice-stack.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/app-update-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/application-state.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/async-result.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/backup-reminder-schedule.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/backup-reminder-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/byte-sizes.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/client-state-api.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/client-state-migration.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/command-palette/activation-auth-policy.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/command-palette/backup-command-availability.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/command-palette/click-activation-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/command-palette/note-layout-preferences.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/command-palette/preferences-store.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/command-palette/tag-config-loader.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/command-palette/usage-store.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/context-menu/context-menu-target-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/context-menu/input-caret-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/decimal-integer.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/disconnect-editing-state-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/dom-focus.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/editor-commands.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/editor-selection.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/editor-toolbar.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/elapsed-time.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/error-overlay.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/excalidraw/excalidraw-actions.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/excalidraw/excalidraw-autosave.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/excalidraw/excalidraw-editor-state.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/excalidraw/excalidraw-loader.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/excalidraw/excalidraw-preview-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/excalidraw/excalidraw-scene.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/half.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/html-escape.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/http-status.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/list-selection.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/local-date-text.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/location-flags.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/login-namespace-picker.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/maintenance.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/backup-result-modal.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/help-modal.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/memory-usage-modal.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/namespace-loading-page.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/namespace-ports-profile.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/modals/visual-cues-modal.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/actions/search-actions.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/events/focus-events.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/events/inactivity-events.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/events/search-events.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/mode-logger.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/mode-manager-controller.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/animated-scroll-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/backlinks-navigation-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/clipboard-shortcut-policy-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/collapse-editing-policy-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/command-gate-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/context-menu-target-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/date-range-filter-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/deselect-selection-state-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/dictation-note-paste.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/dictation-paste-padding.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/dropped-file-preview-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/edit-session-collapse-policy-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/edit-session-collapse-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/editing-image-size-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/embedded-image-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/export-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/export-title-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/file-drop-policy-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/file-filter-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/file-image-preview-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/filtered-refresh-selection-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/floating-note-dom.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/floating-note-layout.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/footnote-navigation-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/formatted-paste-format-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/history-selection-policy-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/history-shortcut-policy-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/html-paste-sanitizer-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/image-context-menu-action-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/link-context-menu-action-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/link-target-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/link-title-prefetch-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/mermaid-render-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/note-click-target-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/note-clipboard-write-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/note-collapse-animation-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/note-context-menu-action-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/note-delete-shortcut-policy-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/note-drag-indicator-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/note-drag-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/note-reposition-animation-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/note-split-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/note-timestamp-hover-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/password-clipboard-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/paste-format-detection-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/paste-format-guess-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/paste-format-offer-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/print-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/reference-source-navigation-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/reference-view-transition-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/referenced-note-removal-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/remote-image-proxy-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/remove-formatting-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/right-press-focus-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/root-note-creation-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/root-sort-indicator-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/root-sort-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/scroll-anchor-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/scroll-restoration-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/scroll-to-top-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/search-contexts-overlay-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/search-debounce-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/search-highlight-matching.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/search-highlight-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/search-input-chip-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/search-input-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/search-interaction-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/search-redaction-reveal-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/search-suggestion-statistics-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/search-suggestion-window-labels-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/search-suggestion-windows-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/search-suggestions-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/selected-formatting-removal-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/selected-text-tag-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/shell-output-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/tab-drag-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/tab-duplication-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/tab-state-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/tag-bar-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/tag-input-selection-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/tag-proposal-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/tag-suggestions-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/todo-toggle-editing-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/untagged-view-indicator-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/mode-manager/services/view-mode-search-shortcut-service.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/not-found.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/note-html-sanitizer.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/password-generator.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/password-operation-response.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/password-policy.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/password-strength.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/reminder-store.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/server-rendered-html.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/session-auth.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/startup-timing.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/tag-token.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/tcp-ports.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/time-units.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/url-tracking-cleaner.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/modules/uuid.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/namespace-deleted.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/namespace-renamed.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/shockharness/contracts.d.ts +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/shockharness/contracts.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/dompurify-3.4.17.LICENSE.txt +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/dompurify-3.4.17.min.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/excalidraw.css +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Assistant/Assistant-Bold.woff2 +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Assistant/Assistant-Medium.woff2 +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Assistant/Assistant-Regular.woff2 +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Assistant/Assistant-SemiBold.woff2 +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Cascadia/CascadiaCode-Regular.woff2 +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/ComicShanns/ComicShanns-Regular-279a7b317d12eb88de06167bd672b4b4.woff2 +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/ComicShanns/ComicShanns-Regular-6e066e8de2ac57ea9283adb9c24d7f0c.woff2 +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/ComicShanns/ComicShanns-Regular-dc6a8806fa96795d7b3be5026f989a17.woff2 +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/ComicShanns/ComicShanns-Regular-fcb0fc02dcbee4c9846b3e2508668039.woff2 +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-349fac6ca4700ffec595a7150a0d1e1d.woff2 +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-3f2c5db56cc93c5a6873b1361d730c16.woff2 +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-41b173a47b57366892116a575a43e2b6.woff2 +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-623ccf21b21ef6b3a0d87738f77eb071.woff2 +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2 +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-b9dcf9d2e50a1eaf42fc664b50a3fd0d.woff2 +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-be310b9bcd4f1a43f571c46df7809174.woff2 +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYE98RXi4EwSsbg.woff2 +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYEF8RXi4EwQ.woff2 +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTA3j6zbXWjgevT5.woff2 +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTQ3j6zbXWjgeg.woff2 +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTk3j6zbXWjgevT5.woff2 +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTo3j6zbXWjgevT5.woff2 +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTs3j6zbXWjgevT5.woff2 +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Virgil/Virgil-Regular.woff2 +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1.LICENSE.txt +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/excalidraw-0.18.1.min.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/mermaid-11.16.1.LICENSE.txt +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/mermaid-11.16.1.min.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/zxcvbn-4.4.2.LICENSE.txt +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/js/vendor/zxcvbn-4.4.2.js +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/static/note-html-policy.json +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/templates/maintenance.html +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/templates/notes_list.html +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/upload_limits.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/__init__.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/add_selected_text_tag.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/alphabetize_root_notes.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/base.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/bulk_tag_proposals.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/collapse.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/copy_note.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/create_child.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/create_file_preview_child.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/create_note.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/create_sibling.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/delete_subtree.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/delete_tag.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/expand.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/file_edit_session.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/indent.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/move.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/move_to_top.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/outdent.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/paste_child.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/paste_sibling.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/prefetch_link_titles.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/prioritize.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/redo.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/rename_tag.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/reset_updated_at.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/resize_image.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/run_shell.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/search_comment_autofill.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/set_collapse_bulk.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/set_collapse_in_context.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/split_note.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/tag_proposals.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/toggle_todo_done.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/undo.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/usecases/unformat_content.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/utils/__init__.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/utils/byte_sizes.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/utils/encryption.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/utils/not_found.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/utils/sent_fields.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/utils/tcp_ports.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/utils/text_utils.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/app/utils/time_units.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/convert-from-legacy.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/main.py +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/metalist.egg-info/dependency_links.txt +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/metalist.egg-info/entry_points.txt +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/metalist.egg-info/top_level.txt +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/scripts/generate-lan-cert.sh +0 -0
- {metalist-0.24.2 → metalist-0.25.0}/setup.cfg +0 -0
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: metalist
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.25.0
|
|
4
4
|
Summary: A minimalist single-user note-taking app with SSR, fast in-memory tree operations, and efficient sync.
|
|
5
5
|
Project-URL: Homepage, https://metalist.app
|
|
6
6
|
Project-URL: Repository, https://github.com/metalist-app/metalist
|
|
7
7
|
Project-URL: Issues, https://github.com/metalist-app/metalist/issues
|
|
8
8
|
Requires-Python: <3.15,>=3.11
|
|
9
9
|
Description-Content-Type: text/markdown
|
|
10
|
+
Requires-Dist: anthropic==1.12.1
|
|
10
11
|
Requires-Dist: argon2-cffi==25.1.0
|
|
11
12
|
Requires-Dist: cryptography==50.0.0
|
|
12
13
|
Requires-Dist: fastapi==0.141.1
|
|
@@ -53,6 +54,23 @@ A minimalist single-user note-taking app focused on server-side rendering (SSR),
|
|
|
53
54
|
- Multi-tab search contexts with server-persisted scroll/search state (survives browser restarts)
|
|
54
55
|
- Manual namespace backups/restores to a user-selected backup folder with retention controls
|
|
55
56
|
|
|
57
|
+
## Changes in 0.25.0
|
|
58
|
+
|
|
59
|
+
- **Claude and Gemini beside OpenAI.** AI Agent Settings has a key for each provider, on your own account; you pick the model in the chat, and a conversation carries on when you switch provider.
|
|
60
|
+
- **Stats of a note's subtree.** `@stats` shows, under a note's own text, the Total, Min, Max and Count of each number property in it and the notes under it; `@sum=calories` (and `@avg`, `@min`, `@max`, `@count`) shows one figure, and a plain `@sum` covers every property. With nothing logged yet, a sum or count reads 0. **Stats Style** in the command palette: Strip, Tiles or Ledger. Search the figures with `@sum:calories>2000`: the days over 2000, each with the notes under it.
|
|
61
|
+
- **Four built-in tags renamed:** `@highlighter` is now `@highlight`, `@llm` `@ai`, `@list-bulleted` `@bullets` and `@list-numbered` `@numbered`. Each vault converts its notes and saved searches once, the first time it is unlocked after the update; the old names stop working. `@gray` works as well as `@grey`.
|
|
62
|
+
- **Light and Dark everywhere:** dialogs, menus, the command palette, reminder cards and the tag rules editor follow the theme, and changing the theme cross-fades the page. After logging in, the login screen fades out over your notes.
|
|
63
|
+
- References: typing `[[` suggests notes to link or embed; `[[note|text]]` shows your own link text; a link to a password or username note shows its copyable row. A folded note reads as one line.
|
|
64
|
+
- The tag bar suggests a super tag with last time's values (`jogging:miles=12`), and property names for a tag that has none yet (`calories=` for a new `salad:`).
|
|
65
|
+
- Markdown tables: `<br>` breaks a line in a cell, rows with too few or too many cells and escaped `\|` work, and a wide table scrolls instead of squeezing its columns.
|
|
66
|
+
- Web links show their site's icon, their title and their domain.
|
|
67
|
+
- Under 640 px wide (a phone), MetaList shows a read-only layout with a box to capture new notes.
|
|
68
|
+
- Dialogs are consistent: the main action on the right, Cancel beside it, and Enter never confirms a deletion. Messages float instead of moving the page. The command palette keeps its order while it is open, and its box says "Type keywords".
|
|
69
|
+
- A new mark and favicon.
|
|
70
|
+
- Fixed: changing the sort order while the list was still loading could open it partway down; a refresh asked for during another could be dropped, leaving deleted notes or old search results on screen; a dropped file could land out of sight; tag suggestions failed on a note whose only tags were `@` tags.
|
|
71
|
+
- Vaults are upgraded (database version 12) when first unlocked: an older MetaList cannot open them afterwards.
|
|
72
|
+
- Security: msgpack 1.2.4 (CVE-2026-114613) in the tools that build and test MetaList; MetaList itself does not use msgpack.
|
|
73
|
+
|
|
56
74
|
## Changes in 0.24.2
|
|
57
75
|
|
|
58
76
|
- ⇧⌘V pastes a copied note as a child again. Since 0.21.0, in Chrome, it put the copied note's text into the selected note instead.
|
|
@@ -12,6 +12,23 @@ 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.25.0
|
|
16
|
+
|
|
17
|
+
- **Claude and Gemini beside OpenAI.** AI Agent Settings has a key for each provider, on your own account; you pick the model in the chat, and a conversation carries on when you switch provider.
|
|
18
|
+
- **Stats of a note's subtree.** `@stats` shows, under a note's own text, the Total, Min, Max and Count of each number property in it and the notes under it; `@sum=calories` (and `@avg`, `@min`, `@max`, `@count`) shows one figure, and a plain `@sum` covers every property. With nothing logged yet, a sum or count reads 0. **Stats Style** in the command palette: Strip, Tiles or Ledger. Search the figures with `@sum:calories>2000`: the days over 2000, each with the notes under it.
|
|
19
|
+
- **Four built-in tags renamed:** `@highlighter` is now `@highlight`, `@llm` `@ai`, `@list-bulleted` `@bullets` and `@list-numbered` `@numbered`. Each vault converts its notes and saved searches once, the first time it is unlocked after the update; the old names stop working. `@gray` works as well as `@grey`.
|
|
20
|
+
- **Light and Dark everywhere:** dialogs, menus, the command palette, reminder cards and the tag rules editor follow the theme, and changing the theme cross-fades the page. After logging in, the login screen fades out over your notes.
|
|
21
|
+
- References: typing `[[` suggests notes to link or embed; `[[note|text]]` shows your own link text; a link to a password or username note shows its copyable row. A folded note reads as one line.
|
|
22
|
+
- The tag bar suggests a super tag with last time's values (`jogging:miles=12`), and property names for a tag that has none yet (`calories=` for a new `salad:`).
|
|
23
|
+
- Markdown tables: `<br>` breaks a line in a cell, rows with too few or too many cells and escaped `\|` work, and a wide table scrolls instead of squeezing its columns.
|
|
24
|
+
- Web links show their site's icon, their title and their domain.
|
|
25
|
+
- Under 640 px wide (a phone), MetaList shows a read-only layout with a box to capture new notes.
|
|
26
|
+
- Dialogs are consistent: the main action on the right, Cancel beside it, and Enter never confirms a deletion. Messages float instead of moving the page. The command palette keeps its order while it is open, and its box says "Type keywords".
|
|
27
|
+
- A new mark and favicon.
|
|
28
|
+
- Fixed: changing the sort order while the list was still loading could open it partway down; a refresh asked for during another could be dropped, leaving deleted notes or old search results on screen; a dropped file could land out of sight; tag suggestions failed on a note whose only tags were `@` tags.
|
|
29
|
+
- Vaults are upgraded (database version 12) when first unlocked: an older MetaList cannot open them afterwards.
|
|
30
|
+
- Security: msgpack 1.2.4 (CVE-2026-114613) in the tools that build and test MetaList; MetaList itself does not use msgpack.
|
|
31
|
+
|
|
15
32
|
## Changes in 0.24.2
|
|
16
33
|
|
|
17
34
|
- ⇧⌘V pastes a copied note as a child again. Since 0.21.0, in Chrome, it put the copied note's text into the selected note instead.
|
|
@@ -116,6 +116,8 @@ class UpdateTabStateRequest(TypedDict):
|
|
|
116
116
|
tabs: dict[Identifier, Tab]
|
|
117
117
|
tabOrder: list[Identifier]
|
|
118
118
|
referenceViews: dict[Identifier, ReferenceView]
|
|
119
|
+
# The tab-state version the browser had when it read this snapshot.
|
|
120
|
+
version: Nonnegative
|
|
119
121
|
|
|
120
122
|
@with_config(ConfigDict(strict=True))
|
|
121
123
|
class UpdateTabSortModeRequest(TypedDict):
|
|
@@ -188,6 +190,16 @@ class DictationPasteRequest(TypedDict):
|
|
|
188
190
|
# Spoken before a search term to exclude it (Dictation Settings).
|
|
189
191
|
negate_phrase: Identifier
|
|
190
192
|
|
|
193
|
+
@with_config(ConfigDict(strict=True))
|
|
194
|
+
class ReferenceSuggestionsRequest(TypedDict):
|
|
195
|
+
"""What was typed after `[[` in a note, the note it is typed in, and the tab's view
|
|
196
|
+
(its search, '' for none, and kind), whose notes rank first."""
|
|
197
|
+
query: Text
|
|
198
|
+
editing_note_id: Identifier
|
|
199
|
+
search: Text
|
|
200
|
+
tabId: Identifier
|
|
201
|
+
isUntaggedView: bool
|
|
202
|
+
|
|
191
203
|
@with_config(ConfigDict(strict=True))
|
|
192
204
|
class TagSuggestionsRequest(TypedDict):
|
|
193
205
|
note_id: Identifier
|
|
@@ -273,6 +285,13 @@ class AddTagProposalsRequest(TypedDict):
|
|
|
273
285
|
undoContext: UndoContext
|
|
274
286
|
viewport: Viewport
|
|
275
287
|
|
|
288
|
+
# The fields naming a tab's view: its tab, search ('' for none) and kind. Every
|
|
289
|
+
# request below that names a view carries them (routes/notes.py _view_note_ids).
|
|
290
|
+
class ViewScope(TypedDict):
|
|
291
|
+
search: Text
|
|
292
|
+
tabId: Identifier
|
|
293
|
+
isUntaggedView: bool
|
|
294
|
+
|
|
276
295
|
# The view a robot count (🤖 N) was shown in: its tab, search ('' for none) and kind.
|
|
277
296
|
@with_config(ConfigDict(strict=True))
|
|
278
297
|
class OpenToTagProposalsRequest(TypedDict):
|
|
@@ -480,11 +499,3 @@ class PasteChildEndpointRequest(TypedDict):
|
|
|
480
499
|
undoContext: UndoContext
|
|
481
500
|
viewport: Viewport
|
|
482
501
|
|
|
483
|
-
@with_config(ConfigDict(strict=True))
|
|
484
|
-
class PasteReferenceEndpointRequest(TypedDict):
|
|
485
|
-
reference_note_id: Identifier
|
|
486
|
-
search_query: Text | None
|
|
487
|
-
clientId: Identifier
|
|
488
|
-
undoContext: UndoContext
|
|
489
|
-
viewport: Viewport
|
|
490
|
-
|
|
@@ -21,6 +21,7 @@ from app.api.transactions import transactional_route
|
|
|
21
21
|
from app.models.utils import note_data_to_html
|
|
22
22
|
from app.models.utils import render_note_data_read_only
|
|
23
23
|
from app.services.ai_chat_stream import ChatTurnStream
|
|
24
|
+
from app.services.ai_setup import AI_PROVIDERS
|
|
24
25
|
from app.services.ai_setup import AiConnection
|
|
25
26
|
from app.services.ai_setup import AiNotSetUp
|
|
26
27
|
from app.services.ai_setup import AiProvider
|
|
@@ -35,8 +36,9 @@ from app.services.agent.cloud_privacy import cloud_privacy_evaluator
|
|
|
35
36
|
from app.services.agent.cloud_privacy import resolve_cloud_privacy_boundary
|
|
36
37
|
from app.services.agent.inference import InferenceAdapter
|
|
37
38
|
from app.services.agent.model_policy import SingleModelPolicy
|
|
38
|
-
from app.services.
|
|
39
|
-
from app.services.
|
|
39
|
+
from app.services.ai_catalog import catalog_entry
|
|
40
|
+
from app.services.ai_catalog import require_shipped_model
|
|
41
|
+
from app.services.ai_catalog import validate_model_name
|
|
40
42
|
from app.services.agent.openai_cost_tracking import OpenAICostSnapshot
|
|
41
43
|
from app.services.agent.openai_cost_tracking import openai_cost_tracker
|
|
42
44
|
from app.services.agent.prompt_settings import AgentPromptSet
|
|
@@ -54,9 +56,9 @@ from app.services.agent.trace import agent_trace_store
|
|
|
54
56
|
from app.services.agent.menu_actions import MenuResult, menu_action_store
|
|
55
57
|
from app.services.client_state_service import load_client_preferences
|
|
56
58
|
from app.services.note_store import store as note_store
|
|
57
|
-
from app.services.
|
|
58
|
-
from app.services.
|
|
59
|
-
from app.services.
|
|
59
|
+
from app.services.ai_credentials import AiCredentialInputError
|
|
60
|
+
from app.services.ai_credentials import ai_credential_store
|
|
61
|
+
from app.services.ai_credentials import validate_ai_api_key
|
|
60
62
|
from app.services.sync import set_clipboard, get_current_sync_uuid
|
|
61
63
|
from app.services.agent.tagging_run import TaggingRun, proposal_scope_ids
|
|
62
64
|
from app.services.agent.retrieval_settings import resolve_tagging_batch_tokens
|
|
@@ -84,6 +86,7 @@ from app.services.input_errors import InputRejected
|
|
|
84
86
|
from app.utils.text_utils import strip_html
|
|
85
87
|
from app.services.preference_values import preference_or_default
|
|
86
88
|
from app.contracts import requires
|
|
89
|
+
from app.startup_environment import is_development_environment
|
|
87
90
|
|
|
88
91
|
|
|
89
92
|
router = APIRouter(prefix="/ai", tags=["ai"])
|
|
@@ -98,7 +101,9 @@ _MAX_TAG_FILTER_LENGTH = 256
|
|
|
98
101
|
agent_context_builder = AgentContextBuilder()
|
|
99
102
|
|
|
100
103
|
|
|
101
|
-
def _require_ai_connection(*, provider: AiProvider, token: str, session_key: str) -> AiConnection:
|
|
104
|
+
def _require_ai_connection(*, provider: AiProvider, model: str, token: str, session_key: str) -> AiConnection:
|
|
105
|
+
"""A connection to the AI, for one of the models MetaList offers for it."""
|
|
106
|
+
require_shipped_model(provider, model)
|
|
102
107
|
# lint: allow-PY001 rationale="the user removed or never added the AI's key: an expected 409, not a defect"
|
|
103
108
|
try:
|
|
104
109
|
return connect_to_ai(provider=provider, token=token, session_key=session_key)
|
|
@@ -117,23 +122,24 @@ def _agent_runtime(*, inference: InferenceAdapter) -> AgentRuntime:
|
|
|
117
122
|
)
|
|
118
123
|
|
|
119
124
|
|
|
120
|
-
class
|
|
121
|
-
|
|
125
|
+
class AiModelChoiceGroup(BaseModel):
|
|
126
|
+
provider: AiProvider
|
|
127
|
+
label: str
|
|
128
|
+
models: list[str]
|
|
122
129
|
|
|
123
|
-
provider: Literal["openai"]
|
|
124
130
|
|
|
131
|
+
class AiModelChoicesResponse(BaseModel):
|
|
132
|
+
# One group per provider with a key, in the registry's order.
|
|
133
|
+
groups: list[AiModelChoiceGroup]
|
|
125
134
|
|
|
126
|
-
class AiModelsResponse(BaseModel):
|
|
127
|
-
models: list[str]
|
|
128
135
|
|
|
129
|
-
|
|
130
|
-
class OpenAICredentialRequest(BaseModel):
|
|
136
|
+
class AiCredentialRequest(BaseModel):
|
|
131
137
|
model_config = ConfigDict(extra="forbid")
|
|
132
138
|
|
|
133
139
|
api_key: SecretStr
|
|
134
140
|
|
|
135
141
|
|
|
136
|
-
class
|
|
142
|
+
class AiCredentialStatusResponse(BaseModel):
|
|
137
143
|
configured: bool
|
|
138
144
|
persistent: bool
|
|
139
145
|
|
|
@@ -149,7 +155,7 @@ class OpenAICostResponse(BaseModel):
|
|
|
149
155
|
class CloudPrivacyPreviewRequest(BaseModel):
|
|
150
156
|
model_config = ConfigDict(extra="forbid")
|
|
151
157
|
|
|
152
|
-
provider:
|
|
158
|
+
provider: AiProvider
|
|
153
159
|
note_ids: list[str] = Field(..., max_length=_MAX_PRIVACY_PREVIEW_NOTE_IDS)
|
|
154
160
|
|
|
155
161
|
@field_validator("note_ids")
|
|
@@ -170,7 +176,7 @@ class CloudPrivacyPreviewResponse(BaseModel):
|
|
|
170
176
|
class AiChatRequest(BaseModel):
|
|
171
177
|
model_config = ConfigDict(extra="forbid")
|
|
172
178
|
|
|
173
|
-
provider:
|
|
179
|
+
provider: AiProvider
|
|
174
180
|
model: str
|
|
175
181
|
thinking_level: Literal["off", "low", "medium", "high"]
|
|
176
182
|
show_diagnostics: bool
|
|
@@ -195,7 +201,7 @@ class AiChatRequest(BaseModel):
|
|
|
195
201
|
|
|
196
202
|
@model_validator(mode="after")
|
|
197
203
|
def validate_thinking_level_for_model(self) -> Self:
|
|
198
|
-
|
|
204
|
+
validate_model_name(self.model)
|
|
199
205
|
return self
|
|
200
206
|
|
|
201
207
|
|
|
@@ -227,8 +233,7 @@ class NoteTagSuggestionRequest(BaseModel):
|
|
|
227
233
|
|
|
228
234
|
@model_validator(mode="after")
|
|
229
235
|
def validate_model_for_provider(self) -> Self:
|
|
230
|
-
|
|
231
|
-
validate_openai_model(self.model)
|
|
236
|
+
validate_model_name(self.model)
|
|
232
237
|
return self
|
|
233
238
|
|
|
234
239
|
|
|
@@ -264,8 +269,7 @@ class ExportTitleSuggestionRequest(ExportTitleScope):
|
|
|
264
269
|
|
|
265
270
|
@model_validator(mode="after")
|
|
266
271
|
def validate_model_for_provider(self) -> Self:
|
|
267
|
-
|
|
268
|
-
validate_openai_model(self.model)
|
|
272
|
+
validate_model_name(self.model)
|
|
269
273
|
return self
|
|
270
274
|
|
|
271
275
|
|
|
@@ -295,7 +299,7 @@ class AiChatMessage(BaseModel):
|
|
|
295
299
|
rendered_thinking: str
|
|
296
300
|
status: Literal["complete", "streaming", "error"]
|
|
297
301
|
error: str
|
|
298
|
-
provider:
|
|
302
|
+
provider: AiProvider
|
|
299
303
|
model: str
|
|
300
304
|
activities: list[AiChatActivity]
|
|
301
305
|
|
|
@@ -362,76 +366,94 @@ def _render_ai_response_note_content(*, markdown_text: str, session_key: str) ->
|
|
|
362
366
|
)
|
|
363
367
|
|
|
364
368
|
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
+
# The chat's model picker: every model of every provider with a key, so picking a
|
|
370
|
+
# model picks its provider too (docs/ui/ai-chat.md, "Model picker"). A read, so it takes
|
|
371
|
+
# no mutation slot: the chat refreshes it while the user edits notes. current_provider is
|
|
372
|
+
# the provider of the model picked last; its models stay listed even without a key.
|
|
373
|
+
@router.get("/model-choices", response_model=AiModelChoicesResponse)
|
|
374
|
+
async def list_ai_model_choices(
|
|
375
|
+
current_provider: AiProvider,
|
|
369
376
|
token: Annotated[str, Depends(require_request_auth_token)],
|
|
370
|
-
) ->
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
377
|
+
) -> AiModelChoicesResponse:
|
|
378
|
+
setup = describe_ai_setup(token=token, session_key=token_service.get_session_key(token))
|
|
379
|
+
groups = []
|
|
380
|
+
for provider in AI_PROVIDERS:
|
|
381
|
+
if not setup.is_ready_for(provider) and provider != current_provider:
|
|
382
|
+
continue
|
|
383
|
+
entry = catalog_entry(provider)
|
|
384
|
+
groups.append(AiModelChoiceGroup(
|
|
385
|
+
provider=provider, label=entry.label,
|
|
386
|
+
models=list(entry.models),
|
|
387
|
+
))
|
|
388
|
+
assert groups, "the current provider is always listed"
|
|
389
|
+
return AiModelChoicesResponse(groups=groups)
|
|
390
|
+
|
|
391
|
+
|
|
392
|
+
# One key slot per provider, per vault (app/services/ai_credentials.py); a provider
|
|
393
|
+
# that is not registered has no route.
|
|
375
394
|
@router.get(
|
|
376
|
-
"/
|
|
377
|
-
response_model=
|
|
395
|
+
"/{provider}/credential",
|
|
396
|
+
response_model=AiCredentialStatusResponse,
|
|
378
397
|
)
|
|
379
|
-
def
|
|
398
|
+
def get_ai_credential_status(
|
|
399
|
+
provider: AiProvider,
|
|
380
400
|
response: Response,
|
|
381
401
|
token: Annotated[str, Depends(require_request_auth_token)],
|
|
382
|
-
) ->
|
|
402
|
+
) -> AiCredentialStatusResponse:
|
|
383
403
|
response.headers["Cache-Control"] = "no-store"
|
|
384
404
|
session_key = token_service.get_session_key(token)
|
|
385
|
-
status =
|
|
386
|
-
return
|
|
405
|
+
status = ai_credential_store(provider).status(token=token, session_key=session_key)
|
|
406
|
+
return AiCredentialStatusResponse(
|
|
387
407
|
configured=status.configured,
|
|
388
408
|
persistent=status.persistent,
|
|
389
409
|
)
|
|
390
410
|
|
|
391
411
|
|
|
392
412
|
@router.put(
|
|
393
|
-
"/
|
|
394
|
-
response_model=
|
|
413
|
+
"/{provider}/credential",
|
|
414
|
+
response_model=AiCredentialStatusResponse,
|
|
395
415
|
)
|
|
396
416
|
@transactional_route
|
|
397
|
-
def
|
|
398
|
-
|
|
417
|
+
def put_ai_credential(
|
|
418
|
+
provider: AiProvider,
|
|
419
|
+
payload: AiCredentialRequest,
|
|
399
420
|
response: Response,
|
|
400
421
|
token: Annotated[str, Depends(require_request_auth_token)],
|
|
401
|
-
) ->
|
|
422
|
+
) -> AiCredentialStatusResponse:
|
|
402
423
|
response.headers["Cache-Control"] = "no-store"
|
|
403
424
|
session_key = token_service.get_session_key(token)
|
|
404
425
|
submitted_api_key = payload.api_key.get_secret_value()
|
|
405
426
|
# lint: allow-PY001 rationale="validate user-supplied secret after Pydantic has masked it"
|
|
406
427
|
try:
|
|
407
|
-
api_key =
|
|
428
|
+
api_key = validate_ai_api_key(provider, submitted_api_key)
|
|
408
429
|
# lint: allow-PY001 rationale="return a concise validation error without echoing the secret"
|
|
409
|
-
except
|
|
430
|
+
except AiCredentialInputError as exc:
|
|
410
431
|
raise HTTPException(status_code=HTTPStatus.UNPROCESSABLE_ENTITY, detail=str(exc)) from exc
|
|
411
|
-
status =
|
|
432
|
+
status = ai_credential_store(provider).configure(
|
|
412
433
|
token=token,
|
|
413
434
|
session_key=session_key,
|
|
414
435
|
api_key=api_key,
|
|
415
436
|
)
|
|
416
|
-
return
|
|
437
|
+
return AiCredentialStatusResponse(
|
|
417
438
|
configured=status.configured,
|
|
418
439
|
persistent=status.persistent,
|
|
419
440
|
)
|
|
420
441
|
|
|
421
442
|
|
|
422
443
|
@router.delete(
|
|
423
|
-
"/
|
|
424
|
-
response_model=
|
|
444
|
+
"/{provider}/credential",
|
|
445
|
+
response_model=AiCredentialStatusResponse,
|
|
425
446
|
)
|
|
426
447
|
@transactional_route
|
|
427
|
-
def
|
|
448
|
+
def delete_ai_credential(
|
|
449
|
+
provider: AiProvider,
|
|
428
450
|
response: Response,
|
|
429
451
|
token: Annotated[str, Depends(require_request_auth_token)],
|
|
430
|
-
) ->
|
|
452
|
+
) -> AiCredentialStatusResponse:
|
|
431
453
|
response.headers["Cache-Control"] = "no-store"
|
|
432
454
|
session_key = token_service.get_session_key(token)
|
|
433
|
-
status =
|
|
434
|
-
return
|
|
455
|
+
status = ai_credential_store(provider).clear(session_key=session_key)
|
|
456
|
+
return AiCredentialStatusResponse(
|
|
435
457
|
configured=status.configured,
|
|
436
458
|
persistent=status.persistent,
|
|
437
459
|
)
|
|
@@ -488,7 +510,9 @@ def suggest_tags_for_note_with_ai(
|
|
|
488
510
|
if not note_store.has_note(note_id):
|
|
489
511
|
raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail=f"Note not found: {note_id}")
|
|
490
512
|
session_key = token_service.get_session_key(token)
|
|
491
|
-
connection = _require_ai_connection(
|
|
513
|
+
connection = _require_ai_connection(
|
|
514
|
+
provider=payload.provider, model=payload.model, token=token, session_key=session_key,
|
|
515
|
+
)
|
|
492
516
|
preferences = load_client_preferences(token=token)
|
|
493
517
|
boundary = resolve_cloud_privacy_boundary(preferences=preferences, provider=payload.provider)
|
|
494
518
|
if cloud_privacy_evaluator.exclusion_reason(note_id=note_id, boundary=boundary) != "":
|
|
@@ -593,7 +617,9 @@ def suggest_export_title_with_ai(
|
|
|
593
617
|
"""Ask the AI for an export's or print's title: one {"type": "title"} or {"type": "failed"} line.
|
|
594
618
|
Streamed, so Stop (the client going away) ends the request."""
|
|
595
619
|
session_key = token_service.get_session_key(token)
|
|
596
|
-
connection = _require_ai_connection(
|
|
620
|
+
connection = _require_ai_connection(
|
|
621
|
+
provider=payload.provider, model=payload.model, token=token, session_key=session_key,
|
|
622
|
+
)
|
|
597
623
|
request = _export_title_request(payload, token)
|
|
598
624
|
if not request.notes:
|
|
599
625
|
raise InputRejected("These notes are private, so the AI can't suggest a title")
|
|
@@ -643,12 +669,19 @@ def _openai_cost_response(snapshot: OpenAICostSnapshot) -> OpenAICostResponse:
|
|
|
643
669
|
)
|
|
644
670
|
|
|
645
671
|
|
|
672
|
+
def _require_cost_estimate_offered() -> None:
|
|
673
|
+
"""The cost estimate is a developer tool (docs/ui/ai-chat.md): in production it does not exist."""
|
|
674
|
+
if not is_development_environment():
|
|
675
|
+
raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail="Not Found")
|
|
676
|
+
|
|
677
|
+
|
|
646
678
|
@router.get("/openai/cost", response_model=OpenAICostResponse)
|
|
647
679
|
def get_openai_cost(
|
|
648
680
|
response: Response,
|
|
649
681
|
token: Annotated[str, Depends(require_request_auth_token)],
|
|
650
682
|
) -> OpenAICostResponse:
|
|
651
683
|
del token
|
|
684
|
+
_require_cost_estimate_offered()
|
|
652
685
|
response.headers["Cache-Control"] = "no-store"
|
|
653
686
|
return _openai_cost_response(openai_cost_tracker.snapshot())
|
|
654
687
|
|
|
@@ -660,6 +693,7 @@ def reset_openai_cost(
|
|
|
660
693
|
token: Annotated[str, Depends(require_request_auth_token)],
|
|
661
694
|
) -> OpenAICostResponse:
|
|
662
695
|
del token
|
|
696
|
+
_require_cost_estimate_offered()
|
|
663
697
|
response.headers["Cache-Control"] = "no-store"
|
|
664
698
|
openai_cost_tracker.reset()
|
|
665
699
|
return _openai_cost_response(openai_cost_tracker.snapshot())
|
|
@@ -847,7 +881,7 @@ def copy_ai_message(
|
|
|
847
881
|
if content == "":
|
|
848
882
|
raise HTTPException(status_code=HTTPStatus.CONFLICT, detail="AI response is empty")
|
|
849
883
|
|
|
850
|
-
tags = "@
|
|
884
|
+
tags = "@ai"
|
|
851
885
|
note_content = _render_ai_response_note_content(
|
|
852
886
|
markdown_text=content,
|
|
853
887
|
session_key=session_key,
|
|
@@ -882,7 +916,9 @@ def stream_ai_chat(
|
|
|
882
916
|
token: Annotated[str, Depends(require_request_auth_token)],
|
|
883
917
|
) -> StreamingResponse:
|
|
884
918
|
session_key = token_service.get_session_key(token)
|
|
885
|
-
connection = _require_ai_connection(
|
|
919
|
+
connection = _require_ai_connection(
|
|
920
|
+
provider=payload.provider, model=payload.model, token=token, session_key=session_key,
|
|
921
|
+
)
|
|
886
922
|
preferences = load_client_preferences(token=token)
|
|
887
923
|
prompts = DEFAULT_AGENT_PROMPTS
|
|
888
924
|
skills = DEFAULT_AGENT_SKILLS
|
|
@@ -69,7 +69,7 @@ from app.services.root_sorting import clear_root_sort_cache
|
|
|
69
69
|
from app.services.undo_state import reset_all_undo_state
|
|
70
70
|
from app.services.sync import reset_state as reset_sync_state
|
|
71
71
|
from app.services.runtime_generation import current_generation, invalidate_runtime_work
|
|
72
|
-
from app.security.sensitive_cache import disable_and_clear_sensitive_caches, clear_sensitive_caches
|
|
72
|
+
from app.security.sensitive_cache import disable_and_clear_sensitive_caches, clear_sensitive_caches, enable_sensitive_caches
|
|
73
73
|
from app.services.bulk_operation import bulk_operation_guard
|
|
74
74
|
from app.services.diagnostics import activate_authenticated_logging
|
|
75
75
|
from app.services.diagnostics import deactivate_authenticated_logging
|
|
@@ -95,7 +95,7 @@ from app.services.client_state_service import load_client_state
|
|
|
95
95
|
from app.services.client_state_service import _validate_client_preferences, _validate_usage_state
|
|
96
96
|
from app.services.client_state_service import save_client_preferences
|
|
97
97
|
from app.services.client_state_service import save_command_palette_usage
|
|
98
|
-
from app.services.
|
|
98
|
+
from app.services.ai_credentials import clear_ai_credential_sessions, reset_ai_credentials
|
|
99
99
|
from app.services.input_errors import NamespaceInputRejected
|
|
100
100
|
from app.services.link_title_retry import stop_link_title_retry
|
|
101
101
|
|
|
@@ -303,7 +303,7 @@ def _run_hydration(*, rebuild_required: bool) -> None:
|
|
|
303
303
|
return
|
|
304
304
|
session = SafeSession()
|
|
305
305
|
try:
|
|
306
|
-
prefetched_rows = populate_cache_from_db(session)
|
|
306
|
+
prefetched_rows = populate_cache_from_db(session, saved_searches=tab_state_store)
|
|
307
307
|
session.commit()
|
|
308
308
|
finally:
|
|
309
309
|
session.close()
|
|
@@ -386,7 +386,7 @@ def _reset_runtime_state_after_restore() -> bool:
|
|
|
386
386
|
web_evidence_store.reset()
|
|
387
387
|
summary_batch_store.reset()
|
|
388
388
|
agent_trace_store.reset()
|
|
389
|
-
|
|
389
|
+
reset_ai_credentials()
|
|
390
390
|
view_cache.clear()
|
|
391
391
|
tab_state_store.reset()
|
|
392
392
|
link_title_store.reset()
|
|
@@ -428,9 +428,12 @@ def _reset_runtime_state_after_restore() -> bool:
|
|
|
428
428
|
if password_required:
|
|
429
429
|
return True
|
|
430
430
|
|
|
431
|
-
prefetched_rows = populate_cache_from_db(session)
|
|
431
|
+
prefetched_rows = populate_cache_from_db(session, saved_searches=tab_state_store)
|
|
432
432
|
note_store.load_from_db(None, prefetched_rows=prefetched_rows)
|
|
433
433
|
auth_cache_state.mark_cache_ready()
|
|
434
|
+
# Unlocking turns the caches of note text back on (set_encryption_key); a vault
|
|
435
|
+
# without a password has no unlock, so they come back on once its notes are loaded.
|
|
436
|
+
enable_sensitive_caches()
|
|
434
437
|
del prefetched_rows
|
|
435
438
|
release_freed_memory()
|
|
436
439
|
return False
|
|
@@ -573,7 +576,7 @@ def login(
|
|
|
573
576
|
web_evidence_store.reset()
|
|
574
577
|
summary_batch_store.reset()
|
|
575
578
|
agent_trace_store.reset()
|
|
576
|
-
|
|
579
|
+
reset_ai_credentials()
|
|
577
580
|
view_cache.clear()
|
|
578
581
|
reset_all_undo_state()
|
|
579
582
|
reset_sync_state()
|
|
@@ -599,7 +602,7 @@ def logout(
|
|
|
599
602
|
web_evidence_store.clear_session(session_key=session_key)
|
|
600
603
|
summary_batch_store.clear_session(session_key=session_key)
|
|
601
604
|
agent_trace_store.clear_session(session_key=session_key)
|
|
602
|
-
|
|
605
|
+
clear_ai_credential_sessions(session_key=session_key)
|
|
603
606
|
token_service.revoke_token(token)
|
|
604
607
|
shell_session_service.reset()
|
|
605
608
|
# Lock and login end a retry through the runtime generation; a passwordless
|
|
@@ -668,7 +671,7 @@ def create_passwordless_session(
|
|
|
668
671
|
web_evidence_store.reset()
|
|
669
672
|
summary_batch_store.reset()
|
|
670
673
|
agent_trace_store.reset()
|
|
671
|
-
|
|
674
|
+
reset_ai_credentials()
|
|
672
675
|
view_cache.clear()
|
|
673
676
|
reset_all_undo_state()
|
|
674
677
|
reset_sync_state()
|
|
@@ -1088,7 +1091,7 @@ def create_password(
|
|
|
1088
1091
|
web_evidence_store.reset()
|
|
1089
1092
|
summary_batch_store.reset()
|
|
1090
1093
|
agent_trace_store.reset()
|
|
1091
|
-
|
|
1094
|
+
reset_ai_credentials()
|
|
1092
1095
|
clear_all_locks()
|
|
1093
1096
|
return {"message": message}
|
|
1094
1097
|
|
|
@@ -1115,7 +1118,7 @@ def change_password(
|
|
|
1115
1118
|
web_evidence_store.reset()
|
|
1116
1119
|
summary_batch_store.reset()
|
|
1117
1120
|
agent_trace_store.reset()
|
|
1118
|
-
|
|
1121
|
+
reset_ai_credentials()
|
|
1119
1122
|
clear_all_locks()
|
|
1120
1123
|
return {"message": message}
|
|
1121
1124
|
|
|
@@ -1138,7 +1141,7 @@ def remove_password(
|
|
|
1138
1141
|
web_evidence_store.reset()
|
|
1139
1142
|
summary_batch_store.reset()
|
|
1140
1143
|
agent_trace_store.reset()
|
|
1141
|
-
|
|
1144
|
+
reset_ai_credentials()
|
|
1142
1145
|
clear_all_locks()
|
|
1143
1146
|
clear_encryption_key()
|
|
1144
1147
|
deactivate_authenticated_logging()
|