MetaList 0.11.0__tar.gz → 0.13.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.11.0 → metalist-0.13.0}/PKG-INFO +19 -1
- {metalist-0.11.0 → metalist-0.13.0}/README.md +18 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/api/note_requests.py +20 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/api/routes/ai.py +11 -58
- {metalist-0.11.0 → metalist-0.13.0}/app/api/routes/notes.py +50 -6
- {metalist-0.11.0 → metalist-0.13.0}/app/api/transactions.py +3 -1
- {metalist-0.11.0 → metalist-0.13.0}/app/exception_boundaries.py +3 -1
- {metalist-0.11.0 → metalist-0.13.0}/app/main.py +8 -1
- {metalist-0.11.0 → metalist-0.13.0}/app/models/utils.py +4 -1
- metalist-0.13.0/app/services/agent/action_log.py +59 -0
- metalist-0.13.0/app/services/agent/agent_loop.py +571 -0
- metalist-0.13.0/app/services/agent/agent_tools.py +464 -0
- metalist-0.13.0/app/services/agent/citation_tokens.py +62 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/context.py +76 -259
- metalist-0.13.0/app/services/agent/execution_errors.py +7 -0
- metalist-0.13.0/app/services/agent/failure_explanations.py +164 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/help_catalog.py +3 -23
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/history.py +19 -1
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/inference.py +29 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/investigation.py +67 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/model_policy.py +1 -2
- metalist-0.13.0/app/services/agent/note_aliases.py +77 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/openai_inference.py +169 -1
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/prompt_settings.py +8 -49
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/prompts/__init__.py +1 -1
- metalist-0.13.0/app/services/agent/prompts/agent.md +132 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/prompts/final-response.md +3 -5
- metalist-0.13.0/app/services/agent/prompts/system.md +28 -0
- metalist-0.13.0/app/services/agent/release_notes.py +50 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/runtime.py +94 -1341
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/scope.py +16 -1
- metalist-0.13.0/app/services/agent/skill_settings.py +130 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/skills/__init__.py +0 -2
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/skills/help-ai.md +45 -22
- metalist-0.13.0/app/services/agent/skills/help-dictation.md +92 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/skills/help-formatting.md +1 -1
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/skills/help-menus.md +5 -8
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/skills/help-notes.md +18 -3
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/skills/help-privacy.md +1 -1
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/skills/help-references.md +3 -2
- metalist-0.13.0/app/services/agent/skills/help-releases.md +108 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/skills/help-search.md +10 -1
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/skills/help-tags.md +3 -2
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/structured_inference.py +34 -17
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/tagging.py +0 -15
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/tagging_run.py +49 -37
- metalist-0.13.0/app/services/agent/tool_calling.py +147 -0
- metalist-0.13.0/app/services/agent/web_actions.py +214 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/web_capabilities.py +21 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/web_evidence.py +22 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/web_fetch.py +16 -3
- {metalist-0.11.0 → metalist-0.13.0}/app/services/ai_chat.py +37 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/ai_chat_stream.py +13 -3
- {metalist-0.11.0 → metalist-0.13.0}/app/services/bulk_operation.py +31 -7
- {metalist-0.11.0 → metalist-0.13.0}/app/services/client_state_service.py +19 -22
- {metalist-0.11.0 → metalist-0.13.0}/app/services/content_formatting.py +2 -1
- metalist-0.13.0/app/services/dictation_cleanup.py +469 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/embedded_references.py +13 -2
- metalist-0.13.0/app/services/file_text_preview.py +83 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/html_export.py +3 -2
- metalist-0.13.0/app/services/inline_image_dimensions.py +140 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/integrity.py +3 -2
- {metalist-0.11.0 → metalist-0.13.0}/app/services/markdown_rendering.py +16 -1
- {metalist-0.11.0 → metalist-0.13.0}/app/services/root_sorting.py +5 -3
- {metalist-0.11.0 → metalist-0.13.0}/app/services/search_index.py +28 -21
- {metalist-0.11.0 → metalist-0.13.0}/app/services/search_query.py +10 -2
- {metalist-0.11.0 → metalist-0.13.0}/app/services/search_text.py +35 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/snapshot.py +71 -10
- {metalist-0.11.0 → metalist-0.13.0}/app/services/tag_suggestions.py +104 -23
- {metalist-0.11.0 → metalist-0.13.0}/app/startup_sanity.py +28 -1
- {metalist-0.11.0 → metalist-0.13.0}/app/static/config/agent-menu-actions.json +15 -9
- {metalist-0.11.0 → metalist-0.13.0}/app/static/config/command_palette_tags.json +10 -6
- {metalist-0.11.0 → metalist-0.13.0}/app/static/css/main.css +181 -142
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/main.js +2 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/ai-chat/ai-chat-api.js +0 -9
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/ai-chat/ai-chat-panel-controller.js +80 -32
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/ai-chat/ai-chat-panel-service.js +0 -66
- metalist-0.13.0/app/static/js/modules/ai-chat/confirmation-card.js +93 -0
- metalist-0.13.0/app/static/js/modules/ai-chat/confirmation-question.js +28 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/ai-chat/proposal-menu.js +11 -7
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/api-client.js +15 -1
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/auth.js +2 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/command-palette/command-palette-controller.js +104 -80
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/command-palette/endpoint-registry.js +17 -10
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/config.js +2 -1
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/error-overlay.js +22 -1
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/excalidraw/excalidraw-actions.js +5 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/excalidraw/excalidraw-preview-service.js +29 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/expected-errors.js +9 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/ai-agent-settings-modal.js +4 -0
- metalist-0.13.0/app/static/js/modules/modals/dictation-settings-modal.js +130 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/ontology-modal.js +20 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/prioritize-modal.js +3 -0
- metalist-0.13.0/app/static/js/modules/modals/visual-cues-modal.js +138 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/actions/content-actions.js +2 -11
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/actions/note-actions.js +64 -20
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/actions/selection-actions.js +71 -4
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/actions/ui-actions.js +30 -3
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/events/input-events.js +14 -1
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/events/keyboard-events.js +56 -6
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/events/mouse-events.js +253 -30
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/events/search-events.js +7 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/mode-manager-controller.js +2 -1
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/animated-scroll-service.js +4 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/collapse-editing-policy-service.js +8 -0
- metalist-0.13.0/app/static/js/modules/mode-manager/services/dictation-note-paste.js +48 -0
- metalist-0.13.0/app/static/js/modules/mode-manager/services/dictation-paste-padding.js +21 -0
- metalist-0.13.0/app/static/js/modules/mode-manager/services/dictation-paste-service.js +236 -0
- metalist-0.13.0/app/static/js/modules/mode-manager/services/dropped-file-preview-service.js +47 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/edit-session-collapse-policy-service.js +3 -1
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/edit-session-collapse-service.js +9 -2
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/file-image-preview-service.js +25 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/file-reference-service.js +3 -2
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/mermaid-render-service.js +49 -0
- metalist-0.13.0/app/static/js/modules/mode-manager/services/note-drag-indicator-service.js +117 -0
- metalist-0.13.0/app/static/js/modules/mode-manager/services/root-note-creation-service.js +34 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/root-sort-service.js +24 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/scroll-restoration-service.js +28 -3
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/search-syntax-service.js +28 -0
- metalist-0.13.0/app/static/js/modules/mode-manager/services/viewport-hold-service.js +755 -0
- metalist-0.13.0/app/static/js/vendor/dompurify-3.4.16.min.js +7 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/templates/base.html +1 -1
- {metalist-0.11.0 → metalist-0.13.0}/app/templates/index.html +1 -0
- metalist-0.13.0/app/usecases/create_file_preview_child.py +68 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/prioritize.py +5 -4
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/search_comment_autofill.py +4 -3
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/search_context_tags.py +4 -3
- {metalist-0.11.0 → metalist-0.13.0}/app/version.py +1 -1
- {metalist-0.11.0 → metalist-0.13.0}/metalist.egg-info/PKG-INFO +19 -1
- {metalist-0.11.0 → metalist-0.13.0}/metalist.egg-info/SOURCES.txt +29 -11
- metalist-0.11.0/app/services/agent/actions.py +0 -292
- metalist-0.11.0/app/services/agent/markdown_validation.py +0 -35
- metalist-0.11.0/app/services/agent/permissions.py +0 -30
- metalist-0.11.0/app/services/agent/prompts/help-response.md +0 -25
- metalist-0.11.0/app/services/agent/prompts/system.md +0 -92
- metalist-0.11.0/app/services/agent/prompts/tool-result.md +0 -2
- metalist-0.11.0/app/services/agent/skill_settings.py +0 -219
- metalist-0.11.0/app/services/agent/skills/scoped-investigation.md +0 -27
- metalist-0.11.0/app/services/agent/tools.py +0 -323
- metalist-0.11.0/app/static/js/modules/ai-chat/agent-prompt-service.js +0 -257
- metalist-0.11.0/app/static/js/modules/modals/agent-prompt-editor-modal.js +0 -347
- metalist-0.11.0/app/static/js/modules/mode-manager/services/viewport-hold-service.js +0 -75
- metalist-0.11.0/app/static/js/vendor/dompurify-3.4.13.min.js +0 -3
- {metalist-0.11.0 → metalist-0.13.0}/MANIFEST.in +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/__init__.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/api/__init__.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/api/deps.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/api/dev.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/api/middleware/auth.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/api/request_auth.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/api/routes/app_updates.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/api/routes/auth.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/api/routes/backups.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/api/routes/files.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/api/routes/ontology.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/api/routes/reminders.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/api/routes/remote_images.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/api/routes/test.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/api/upload_limits.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/config.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/data_directory.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/db/__init__.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/db/backup_settings_sql.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/db/editable_files_migration.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/db/engine.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/db/file_schema.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/db/file_session.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/db/files_sql.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/db/link_titles_sql.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/db/live_recovery.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/db/migrations.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/db/notes_sql.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/db/ontology_rules_sql.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/db/reminders_sql.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/db/retire_sounds.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/db/schema.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/db/search_history_sql.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/db/session.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/db/settings_sql.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/db/tab_state_sql.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/db/version.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/encryption_audit.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/https_proxy.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/models/commands.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/models/database.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/models/entities.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/models/enums.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/models/linked_list.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/models/list_operations.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/models/list_traversal.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/models/note_crud.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/network_settings.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/presentation/__init__.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/presentation/render/__init__.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/presentation/render/note_renderer.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/presentation/templates.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/security/authenticated_logging.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/security/encryption.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/security/http_error_diagnostics.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/security/http_headers.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/security/note_html.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/security/request_boundary.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/security/request_hosts.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/security/sensitive_cache.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/security/sensitive_logging.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/security/shell_execution.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/security/validation_errors.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/server_runtime.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/__init__.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/__init__.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/cloud_privacy.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/evidence_serialization.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/judging.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/menu_actions.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/openai_cost_tracking.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/retrieval_settings.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/skills/help-data.md +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/skills/help-reminders.md +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/skills/staged-summary.md +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/skills/tag-proposals.md +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/skills/web-browsing.md +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/staged_summary.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/token_estimation.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/trace.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/agent/web_settings.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/ai_chat_rendering.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/app_update_worker.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/app_updates.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/auth.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/auth_cache_state.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/auth_service.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/backlink_index.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/backlinks.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/backup_service.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/backup_settings_service.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/content_cache.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/diagnostics.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/encryption.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/exception_capture.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/file_edit_sessions.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/file_registry.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/file_storage.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/footnote_layout.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/footnote_rendering.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/hierarchy.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/html_unformatting.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/hydration_state.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/image_size_formatting.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/inline_image_occurrences.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/input_errors.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/latex_rendering.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/link_titles.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/login_rate_limit.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/maintenance_mode.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/namespace_deletion_jobs.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/namespace_deletion_worker.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/namespace_rename_jobs.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/namespace_rename_worker.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/namespace_runtime_guard.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/namespace_switcher.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/note_fullscreen.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/note_image_tags.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/note_ordering.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/note_store.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/ontology_rules_store.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/openai_credentials.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/password_note_fields.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/public_http.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/reference_presentation.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/reminders.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/remote_image_proxy.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/request_recovery.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/resource_limits.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/runtime_generation.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/runtime_hardening.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/runtime_lock.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/search_history.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/search_history_storage.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/selected_text_tag.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/self_update.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/session_timeout_service.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/shell_session_service.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/store.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/structured_note_renderers.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/sync.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/sync_state.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/tab_state.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/tag_case.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/tag_ontology.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/tag_rename.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/tag_term_matching.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/test_reset.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/tokens.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/undo_state.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/update_backups.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/update_installer.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/update_preflight.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/view_cache.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/view_diff.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/view_state.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/services/windows_process_control.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/startup_environment.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/startup_js_sanity.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/startup_sanity_config.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/css/floating-notes.css +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/css/forms.css +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/img/favicon.ico +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/locked.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/activity-tracker.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/ai-chat/agent-menu-actions.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/ai-chat/agent-retrieval-settings.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/ai-chat/agent-web-settings.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/ai-chat/ai-agent-debug-view.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/ai-chat/ai-chat-message-placement.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/ai-chat/ai-thinking-level-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/ai-chat/bulk-elapsed-clock.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/ai-chat/bulk-proposal-ui.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/ai-chat/bulk-scope-question.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/ai-chat/cloud-privacy-policy.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/ai-chat/summary-batch-preview.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/api-error-diagnostics.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/api-failure-classification-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/app-update-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/application-state.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/async-result.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/client-state-api.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/client-state-migration.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/command-palette/activation-auth-policy.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/command-palette/backup-command-availability.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/command-palette/click-activation-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/command-palette/note-layout-preferences.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/command-palette/preferences-store.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/command-palette/tag-config-loader.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/command-palette/usage-store.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/connectivity-monitor.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/context-menu/context-menu-registry.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/context-menu/context-menu-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/context-menu/context-menu-target-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/context-menu/input-caret-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/disconnect-editing-state-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/dom-utils-fixed.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/dom-utils.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/editor-commands.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/editor-selection.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/editor-toolbar.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/elapsed-time.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/error-handler.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/excalidraw/excalidraw-autosave.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/excalidraw/excalidraw-editor-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/excalidraw/excalidraw-editor-state.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/excalidraw/excalidraw-loader.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/excalidraw/excalidraw-scene.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/location-flags.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/login-namespace-picker.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/maintenance.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/alphabetize-root-notes-modal.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/backup-restore-modal.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/backup-result-modal.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/backup-retention-modal.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/backup-settings-modal.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/base-modal.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/confirmation-modal.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/delete-namespace-modal.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/delete-namespace-validation.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/help-modal.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/namespace-loading-page.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/namespace-modals.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/namespace-ports-profile.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/namespace-rename-validation.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/note-layout-appearance-modal.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/password-modal.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/random-password-modal.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/reminder-modal.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/reset-updated-at-modal.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/search-suggestion-statistics-modal.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/session-timeout-modal.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/modals/version-info-modal.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/actions/history-actions.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/actions/search-actions.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/events/context-menu-events.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/events/focus-events.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/events/inactivity-events.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/mode-context.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/mode-logger.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/add-style-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/backlinks-navigation-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/backlinks-panel-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/clipboard-shortcut-policy-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/collapse-affordance-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/command-gate-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/context-menu-target-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/deselect-selection-state-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/differential-view-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/embedded-image-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/file-drop-policy-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/filtered-refresh-selection-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/floating-note-dom.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/floating-note-layout.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/floating-note-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/footnote-navigation-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/history-selection-policy-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/history-shortcut-policy-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/html-paste-sanitizer-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/image-context-menu-action-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/image-file-insert-choice-modal-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/infinite-scroll-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/link-context-menu-action-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/link-title-prefetch-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/markdown-render-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/note-click-target-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/note-clipboard-write-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/note-collapse-animation-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/note-context-menu-action-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/note-delete-shortcut-policy-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/note-drag-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/note-fullscreen-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/note-reposition-animation-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/note-split-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/note-timestamp-hover-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/password-clipboard-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/polling-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/reference-source-navigation-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/remote-image-proxy-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/remove-formatting-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/root-date-separator-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/root-sort-indicator-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/scroll-anchor-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/scroll-to-top-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/search-contexts-overlay-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/search-debounce-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/search-input-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/search-interaction-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/search-redaction-reveal-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/search-suggestion-statistics-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/search-suggestion-window-labels-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/search-suggestion-windows-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/search-suggestions-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/selected-formatting-removal-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/selected-text-tag-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/shell-output-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/tab-dom-cache-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/tab-drag-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/tab-duplication-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/tab-state-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/tag-bar-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/tag-input-selection-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/tag-proposal-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/tag-suggestions-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/tag-syntax-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/todo-toggle-editing-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/untagged-view-indicator-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/mode-manager/services/view-mode-search-shortcut-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/note-html-sanitizer.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/password-generator.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/password-operation-response.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/password-policy.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/password-strength.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/reminder-store.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/reminder-surface-service.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/selection-markers.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/session-auth.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/tag-token.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/modules/uuid.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/namespace-deleted.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/namespace-renamed.js +0 -0
- /metalist-0.11.0/app/static/js/vendor/dompurify-3.4.13.LICENSE.txt → /metalist-0.13.0/app/static/js/vendor/dompurify-3.4.16.LICENSE.txt +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/excalidraw.css +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Assistant/Assistant-Bold.woff2 +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Assistant/Assistant-Medium.woff2 +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Assistant/Assistant-Regular.woff2 +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Assistant/Assistant-SemiBold.woff2 +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Cascadia/CascadiaCode-Regular.woff2 +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/ComicShanns/ComicShanns-Regular-279a7b317d12eb88de06167bd672b4b4.woff2 +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/ComicShanns/ComicShanns-Regular-6e066e8de2ac57ea9283adb9c24d7f0c.woff2 +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/ComicShanns/ComicShanns-Regular-dc6a8806fa96795d7b3be5026f989a17.woff2 +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/ComicShanns/ComicShanns-Regular-fcb0fc02dcbee4c9846b3e2508668039.woff2 +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-349fac6ca4700ffec595a7150a0d1e1d.woff2 +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-3f2c5db56cc93c5a6873b1361d730c16.woff2 +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-41b173a47b57366892116a575a43e2b6.woff2 +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-623ccf21b21ef6b3a0d87738f77eb071.woff2 +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2 +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-b9dcf9d2e50a1eaf42fc664b50a3fd0d.woff2 +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Excalifont/Excalifont-Regular-be310b9bcd4f1a43f571c46df7809174.woff2 +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYE98RXi4EwSsbg.woff2 +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYEF8RXi4EwQ.woff2 +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTA3j6zbXWjgevT5.woff2 +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTQ3j6zbXWjgeg.woff2 +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTk3j6zbXWjgevT5.woff2 +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTo3j6zbXWjgevT5.woff2 +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTs3j6zbXWjgevT5.woff2 +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1-assets/fonts/Virgil/Virgil-Regular.woff2 +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1.LICENSE.txt +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/excalidraw-0.18.1.min.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/markdown-it-14.3.2.LICENSE.txt +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/markdown-it-14.3.2.min.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/mermaid-11.16.1.LICENSE.txt +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/mermaid-11.16.1.min.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/zxcvbn-4.4.2.LICENSE.txt +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/js/vendor/zxcvbn-4.4.2.js +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/note-html-policy.json +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/static/video/login-startup.mp4 +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/templates/locked.html +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/templates/maintenance.html +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/templates/namespace_deleted.html +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/templates/namespace_renamed.html +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/templates/notes_list.html +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/upload_limits.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/__init__.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/add_selected_text_tag.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/alphabetize_root_notes.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/base.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/bulk_tag_proposals.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/collapse.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/copy_note.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/create_child.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/create_note.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/create_sibling.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/delete_subtree.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/delete_tag.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/expand.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/file_edit_session.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/indent.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/lock.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/move.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/move_to_top.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/outdent.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/paste_child.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/paste_sibling.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/prefetch_link_titles.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/redo.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/rename_tag.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/reset_updated_at.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/resize_image.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/run_shell.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/set_collapse_bulk.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/set_collapse_in_context.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/split_note.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/tag_proposals.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/toggle_reference_mode.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/toggle_todo_done.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/undo.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/unformat_content.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/update_content.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/usecases/view.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/utils/__init__.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/utils/encryption.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/app/utils/text_utils.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/convert-from-legacy.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/main.py +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/metalist.egg-info/dependency_links.txt +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/metalist.egg-info/entry_points.txt +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/metalist.egg-info/requires.txt +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/metalist.egg-info/top_level.txt +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/pyproject.toml +0 -0
- {metalist-0.11.0 → metalist-0.13.0}/scripts/generate-lan-cert.sh +0 -0
- {metalist-0.11.0 → metalist-0.13.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.13.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
|
|
@@ -49,6 +49,24 @@ A minimalist single-user note-taking app focused on server-side rendering (SSR),
|
|
|
49
49
|
- Multi-tab search contexts with server-persisted scroll/search state (survives browser restarts)
|
|
50
50
|
- Manual namespace backups/restores to a user-selected backup folder with retention controls
|
|
51
51
|
|
|
52
|
+
## Changes in 0.13.0
|
|
53
|
+
|
|
54
|
+
- Dictation: text from speech-to-text tools such as Superwhisper, pasted into the search bar or any tag field, becomes your existing tags ("neural network" gives `neural-network`). Say "quote … end quote" for text, "minus" to exclude, "at" before meta tags such as `@todo`. In a note, the words after "start tags" go to its tag bar. The phrases are set in Dictation Settings, and one undo restores what was pasted.
|
|
55
|
+
- A quoted search with a space at its edge matches whole words: `" fat"` no longer finds "father".
|
|
56
|
+
- The AI keeps a record of what it did for each answer (notes read, searches, web pages opened), so questions like "did you search the web for that?" are answered from what actually happened.
|
|
57
|
+
- Dropping a `.txt`, `.md`, `.csv` or `.json` file stores it as before and adds its text as a child note, shown as Markdown, a table or formatted JSON. File pills show the extension (`.MD`, `.CSV`, …), and hovering a pill says that clicking downloads the file.
|
|
58
|
+
- Typing one letter in the tag bar now narrows the suggestions you were already shown instead of reordering them, so the tag you want is in the top five far more often.
|
|
59
|
+
|
|
60
|
+
## Changes in 0.12.0
|
|
61
|
+
|
|
62
|
+
- AI chat is now a tool-using agent: in one answer it can look up MetaList help, read and search the notes in your view, open web pages, and open menus, instead of picking a single route up front. Answers cite notes and web pages with clickable references, including each item listed from a web page.
|
|
63
|
+
- Nothing changes without your Yes: tag operations ask first with the exact change, and web addresses that carry words from your notes ask before opening. Summaries that fit in one pass start without a dialog, and summaries never block other edits while they run.
|
|
64
|
+
- "How do I change…" questions open the menu that holds the setting; release notes are part of the help. AI prompts and skills are no longer editable, and a $ button shows or hides the spend estimate.
|
|
65
|
+
- The AI is told only that a note is private, never which privacy setting hides it, and failed AI steps are explained in the chat.
|
|
66
|
+
- Leaving edit mode keeps your place, with no highlight; a collapsed note you changed stays expanded. Clicking into a note keeps the clicked spot under the pointer, including in diagrams and formulas.
|
|
67
|
+
- Dragging a note shows a ghost, a drop line and a direction cursor; the note lands where you dropped it without the page scrolling.
|
|
68
|
+
- Searches that cannot be parsed are explained politely instead of failing.
|
|
69
|
+
|
|
52
70
|
## Changes in 0.11.0
|
|
53
71
|
|
|
54
72
|
- Large namespaces stay fast while scrolling: only a band of root notes around the viewport is loaded, the server remembers what each tab shows so the browser no longer sends note hashes, and rendered notes are cached.
|
|
@@ -12,6 +12,24 @@ 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.13.0
|
|
16
|
+
|
|
17
|
+
- Dictation: text from speech-to-text tools such as Superwhisper, pasted into the search bar or any tag field, becomes your existing tags ("neural network" gives `neural-network`). Say "quote … end quote" for text, "minus" to exclude, "at" before meta tags such as `@todo`. In a note, the words after "start tags" go to its tag bar. The phrases are set in Dictation Settings, and one undo restores what was pasted.
|
|
18
|
+
- A quoted search with a space at its edge matches whole words: `" fat"` no longer finds "father".
|
|
19
|
+
- The AI keeps a record of what it did for each answer (notes read, searches, web pages opened), so questions like "did you search the web for that?" are answered from what actually happened.
|
|
20
|
+
- Dropping a `.txt`, `.md`, `.csv` or `.json` file stores it as before and adds its text as a child note, shown as Markdown, a table or formatted JSON. File pills show the extension (`.MD`, `.CSV`, …), and hovering a pill says that clicking downloads the file.
|
|
21
|
+
- Typing one letter in the tag bar now narrows the suggestions you were already shown instead of reordering them, so the tag you want is in the top five far more often.
|
|
22
|
+
|
|
23
|
+
## Changes in 0.12.0
|
|
24
|
+
|
|
25
|
+
- AI chat is now a tool-using agent: in one answer it can look up MetaList help, read and search the notes in your view, open web pages, and open menus, instead of picking a single route up front. Answers cite notes and web pages with clickable references, including each item listed from a web page.
|
|
26
|
+
- Nothing changes without your Yes: tag operations ask first with the exact change, and web addresses that carry words from your notes ask before opening. Summaries that fit in one pass start without a dialog, and summaries never block other edits while they run.
|
|
27
|
+
- "How do I change…" questions open the menu that holds the setting; release notes are part of the help. AI prompts and skills are no longer editable, and a $ button shows or hides the spend estimate.
|
|
28
|
+
- The AI is told only that a note is private, never which privacy setting hides it, and failed AI steps are explained in the chat.
|
|
29
|
+
- Leaving edit mode keeps your place, with no highlight; a collapsed note you changed stays expanded. Clicking into a note keeps the clicked spot under the pointer, including in diagrams and formulas.
|
|
30
|
+
- Dragging a note shows a ghost, a drop line and a direction cursor; the note lands where you dropped it without the page scrolling.
|
|
31
|
+
- Searches that cannot be parsed are explained politely instead of failing.
|
|
32
|
+
|
|
15
33
|
## Changes in 0.11.0
|
|
16
34
|
|
|
17
35
|
- Large namespaces stay fast while scrolling: only a band of root notes around the viewport is loaded, the server remembers what each tab shows so the browser no longer sends note hashes, and rendered notes are cached.
|
|
@@ -106,6 +106,18 @@ class SearchSuggestionInteractionRequest(TypedDict):
|
|
|
106
106
|
class TabSearchInteractionRequest(TypedDict):
|
|
107
107
|
searchQuery: Text
|
|
108
108
|
|
|
109
|
+
@with_config(ConfigDict(strict=True))
|
|
110
|
+
class DictationPasteRequest(TypedDict):
|
|
111
|
+
"""Text pasted into the search bar or the tag bar, and the field's current value."""
|
|
112
|
+
text: Text
|
|
113
|
+
target: Literal["search", "tags", "tag", "condition"]
|
|
114
|
+
current_value: Text
|
|
115
|
+
# The spoken phrases around a quoted phrase (Dictation Settings).
|
|
116
|
+
quote_open: Identifier
|
|
117
|
+
quote_close: Identifier
|
|
118
|
+
# Spoken before a search term to exclude it (Dictation Settings).
|
|
119
|
+
negate_phrase: Identifier
|
|
120
|
+
|
|
109
121
|
@with_config(ConfigDict(strict=True))
|
|
110
122
|
class TagSuggestionsRequest(TypedDict):
|
|
111
123
|
note_id: Identifier
|
|
@@ -136,6 +148,14 @@ class CreateChildRequest(TypedDict):
|
|
|
136
148
|
undoContext: UndoContext
|
|
137
149
|
viewport: Viewport
|
|
138
150
|
|
|
151
|
+
@with_config(ConfigDict(strict=True))
|
|
152
|
+
class CreateFilePreviewChildRequest(TypedDict):
|
|
153
|
+
fileId: Identifier
|
|
154
|
+
search_query: Text | None
|
|
155
|
+
clientId: Identifier
|
|
156
|
+
undoContext: UndoContext
|
|
157
|
+
viewport: Viewport
|
|
158
|
+
|
|
139
159
|
@with_config(ConfigDict(strict=True))
|
|
140
160
|
class UpdateNoteRequest(TypedDict):
|
|
141
161
|
clientId: Identifier
|
|
@@ -33,21 +33,17 @@ from app.services.agent.openai_inference import OpenAIInferenceAdapter
|
|
|
33
33
|
from app.services.agent.openai_inference import validate_openai_model
|
|
34
34
|
from app.services.agent.openai_cost_tracking import OpenAICostSnapshot
|
|
35
35
|
from app.services.agent.openai_cost_tracking import openai_cost_tracker
|
|
36
|
-
from app.services.agent.permissions import AgentPermissionPolicy
|
|
37
36
|
from app.services.agent.prompt_settings import AgentPromptSet
|
|
38
37
|
from app.services.agent.skill_settings import AgentSkillSet
|
|
39
38
|
from app.services.agent.retrieval_settings import AgentRetrievalSettings
|
|
40
39
|
from app.services.agent.scope import ScopedSearchSnapshot
|
|
41
40
|
from app.services.agent.prompt_settings import DEFAULT_AGENT_PROMPTS
|
|
42
|
-
from app.services.agent.prompt_settings import resolve_agent_prompt_set
|
|
43
41
|
from app.services.agent.retrieval_settings import resolve_agent_retrieval_settings
|
|
44
42
|
from app.services.agent.scope import AgentScopeDescriptor
|
|
45
43
|
from app.services.agent.scope import scoped_search_snapshot_factory
|
|
46
44
|
from app.services.agent.runtime import AgentRuntime
|
|
47
45
|
from app.services.agent.skill_settings import DEFAULT_AGENT_SKILLS
|
|
48
|
-
from app.services.agent.skill_settings import resolve_agent_skill_set
|
|
49
46
|
from app.services.agent.token_estimation import estimate_input_tokens
|
|
50
|
-
from app.services.agent.tools import read_only_agent_tools
|
|
51
47
|
from app.services.agent.trace import agent_trace_store
|
|
52
48
|
from app.services.agent.menu_actions import MenuResult, menu_action_store
|
|
53
49
|
from app.services.client_state_service import load_client_preferences
|
|
@@ -62,7 +58,7 @@ from app.services.agent.retrieval_settings import resolve_tagging_batch_tokens
|
|
|
62
58
|
from app.services.agent.web_settings import AgentWebSettings
|
|
63
59
|
from app.services.agent.web_settings import resolve_agent_web_settings
|
|
64
60
|
from app.services.agent.web_evidence import web_evidence_store
|
|
65
|
-
from app.services.agent.tagging import
|
|
61
|
+
from app.services.agent.tagging import TAGGING_POLICY_KEY
|
|
66
62
|
from app.usecases.bulk_tag_proposals import apply_bulk_proposals, prepare_proposal_changes
|
|
67
63
|
from app.services.bulk_operation import bulk_operation_guard
|
|
68
64
|
from app.services.tab_state import tab_state_store
|
|
@@ -79,8 +75,6 @@ def _agent_runtime(*, inference: InferenceAdapter) -> AgentRuntime:
|
|
|
79
75
|
context_builder=agent_context_builder,
|
|
80
76
|
inference=inference,
|
|
81
77
|
model_policy=SingleModelPolicy(),
|
|
82
|
-
permission_policy=AgentPermissionPolicy(),
|
|
83
|
-
tool_registry=read_only_agent_tools,
|
|
84
78
|
trace_store=agent_trace_store,
|
|
85
79
|
provider_label=inference.provider_label,
|
|
86
80
|
)
|
|
@@ -136,23 +130,6 @@ class CloudPrivacyPreviewResponse(BaseModel):
|
|
|
136
130
|
hidden_note_ids: list[str]
|
|
137
131
|
|
|
138
132
|
|
|
139
|
-
class AiSkillDefaultResponse(BaseModel):
|
|
140
|
-
skill_id: str
|
|
141
|
-
title: str
|
|
142
|
-
description: str
|
|
143
|
-
trigger_action: str
|
|
144
|
-
preference_key: str
|
|
145
|
-
content: str
|
|
146
|
-
superseded_preference_keys: list[str]
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
class AiPromptDefaultsResponse(BaseModel):
|
|
150
|
-
system_prompt: str
|
|
151
|
-
final_response_prompt: str
|
|
152
|
-
tool_result_prompt: str
|
|
153
|
-
skills: list[AiSkillDefaultResponse]
|
|
154
|
-
|
|
155
|
-
|
|
156
133
|
class AiChatRequest(BaseModel):
|
|
157
134
|
model_config = ConfigDict(extra="forbid")
|
|
158
135
|
|
|
@@ -384,32 +361,6 @@ def reset_openai_cost(
|
|
|
384
361
|
return _openai_cost_response(openai_cost_tracker.snapshot())
|
|
385
362
|
|
|
386
363
|
|
|
387
|
-
@router.get("/prompts/defaults", response_model=AiPromptDefaultsResponse)
|
|
388
|
-
def get_ai_prompt_defaults(
|
|
389
|
-
response: Response,
|
|
390
|
-
token: Annotated[str, Depends(require_request_auth_token)],
|
|
391
|
-
) -> AiPromptDefaultsResponse:
|
|
392
|
-
del token
|
|
393
|
-
response.headers["Cache-Control"] = "no-store"
|
|
394
|
-
return AiPromptDefaultsResponse(
|
|
395
|
-
system_prompt=DEFAULT_AGENT_PROMPTS.system_prompt,
|
|
396
|
-
final_response_prompt=DEFAULT_AGENT_PROMPTS.final_response_prompt,
|
|
397
|
-
tool_result_prompt=DEFAULT_AGENT_PROMPTS.tool_result_prompt,
|
|
398
|
-
skills=[
|
|
399
|
-
AiSkillDefaultResponse(
|
|
400
|
-
skill_id=skill.skill_id,
|
|
401
|
-
title=skill.title,
|
|
402
|
-
description=skill.description,
|
|
403
|
-
trigger_action=skill.trigger_action,
|
|
404
|
-
preference_key=skill.preference_key,
|
|
405
|
-
content=skill.content,
|
|
406
|
-
superseded_preference_keys=list(skill.superseded_preference_keys),
|
|
407
|
-
)
|
|
408
|
-
for skill in DEFAULT_AGENT_SKILLS.skills
|
|
409
|
-
],
|
|
410
|
-
)
|
|
411
|
-
|
|
412
|
-
|
|
413
364
|
@router.post(
|
|
414
365
|
"/cloud-privacy/preview",
|
|
415
366
|
response_model=CloudPrivacyPreviewResponse,
|
|
@@ -637,8 +588,8 @@ def stream_ai_chat(
|
|
|
637
588
|
session_key=session_key,
|
|
638
589
|
)
|
|
639
590
|
preferences = load_client_preferences(token=token)
|
|
640
|
-
prompts =
|
|
641
|
-
skills =
|
|
591
|
+
prompts = DEFAULT_AGENT_PROMPTS
|
|
592
|
+
skills = DEFAULT_AGENT_SKILLS
|
|
642
593
|
retrieval_settings = resolve_agent_retrieval_settings(
|
|
643
594
|
preferences=preferences,
|
|
644
595
|
provider=payload.provider,
|
|
@@ -691,6 +642,7 @@ def stream_ai_chat(
|
|
|
691
642
|
model=payload.model,
|
|
692
643
|
)
|
|
693
644
|
provider_messages = ai_chat_store.provider_messages(session_key=session_key)
|
|
645
|
+
earlier_actions = ai_chat_store.earlier_actions(session_key=session_key)
|
|
694
646
|
initial_messages = agent_context_builder.build_initial_messages(
|
|
695
647
|
canonical_messages=provider_messages,
|
|
696
648
|
prompts=prompts,
|
|
@@ -703,7 +655,7 @@ def stream_ai_chat(
|
|
|
703
655
|
events = _stream_runtime_events(payload=payload, openai_api_key=openai_api_key,
|
|
704
656
|
session_key=session_key, provider_messages=provider_messages, prompts=prompts, skills=skills,
|
|
705
657
|
retrieval_settings=retrieval_settings, frozen_scope=frozen_scope, tagging_run=tagging_run,
|
|
706
|
-
web_settings=web_settings,
|
|
658
|
+
web_settings=web_settings, earlier_actions=earlier_actions,
|
|
707
659
|
initial_input_tokens=initial_approx_input_tokens)
|
|
708
660
|
|
|
709
661
|
return StreamingResponse(
|
|
@@ -722,6 +674,7 @@ async def _stream_runtime_events(
|
|
|
722
674
|
provider_messages: list[dict[str, str]], prompts: AgentPromptSet, skills: AgentSkillSet,
|
|
723
675
|
retrieval_settings: AgentRetrievalSettings, frozen_scope: ScopedSearchSnapshot,
|
|
724
676
|
tagging_run: TaggingRun, initial_input_tokens: int, web_settings: AgentWebSettings,
|
|
677
|
+
earlier_actions: list[dict[str, object]],
|
|
725
678
|
) -> AsyncIterator[dict[str, object]]:
|
|
726
679
|
action, start_label = 'provider_runtime', 'Connecting to OpenAI API'
|
|
727
680
|
ready_label = 'OpenAI API ready · 1,050,000-token context'
|
|
@@ -731,11 +684,11 @@ async def _stream_runtime_events(
|
|
|
731
684
|
approx_input_tokens=initial_input_tokens, output_tokens_received=0, duration_ms=0.0)
|
|
732
685
|
yield dict(type='action_status', action=action, status='completed', label=ready_label,
|
|
733
686
|
approx_input_tokens=initial_input_tokens, output_tokens_received=0, duration_ms=0.0)
|
|
734
|
-
events = runtime.
|
|
687
|
+
events = runtime.stream_agent(session_key=session_key, base_url=base_url,
|
|
735
688
|
selected_model=payload.model, thinking_level=payload.thinking_level,
|
|
736
689
|
canonical_messages=provider_messages, prompts=prompts, skills=skills,
|
|
737
690
|
retrieval_settings=retrieval_settings, web_settings=web_settings,
|
|
738
|
-
frozen_scope=frozen_scope,
|
|
691
|
+
frozen_scope=frozen_scope, tagging_run=tagging_run, earlier_actions=earlier_actions)
|
|
739
692
|
try:
|
|
740
693
|
async for event in events:
|
|
741
694
|
yield event
|
|
@@ -771,6 +724,8 @@ class BulkAnswerRequest(BaseModel):
|
|
|
771
724
|
"prefix_focus_both",
|
|
772
725
|
"summarize_all",
|
|
773
726
|
"use_prefix",
|
|
727
|
+
"yes",
|
|
728
|
+
"no",
|
|
774
729
|
]
|
|
775
730
|
|
|
776
731
|
|
|
@@ -820,6 +775,4 @@ def manage_bulk_proposals(payload: BulkManageRequest, token: Annotated[str, Depe
|
|
|
820
775
|
@router.get("/proposals/settings")
|
|
821
776
|
def get_tagging_settings(token: Annotated[str, Depends(require_request_auth_token)]):
|
|
822
777
|
preferences = load_client_preferences(token=token)
|
|
823
|
-
return {"policy": preferences.get(TAGGING_POLICY_KEY, "")
|
|
824
|
-
"prompt": preferences.get(TAGGING_PROMPT_KEY, DEFAULT_TAGGING_PROMPT),
|
|
825
|
-
"default_prompt": DEFAULT_TAGGING_PROMPT}
|
|
778
|
+
return {"policy": preferences.get(TAGGING_POLICY_KEY, "")}
|
|
@@ -20,9 +20,11 @@ from app.api.note_requests import (
|
|
|
20
20
|
SearchSuggestionInteractionRequest,
|
|
21
21
|
TabSearchInteractionRequest,
|
|
22
22
|
TagSuggestionsRequest,
|
|
23
|
+
DictationPasteRequest,
|
|
23
24
|
CreateNoteTopRequest,
|
|
24
25
|
CreateSiblingRequest,
|
|
25
26
|
CreateChildRequest,
|
|
27
|
+
CreateFilePreviewChildRequest,
|
|
26
28
|
UpdateNoteRequest,
|
|
27
29
|
SaveNoteRequest,
|
|
28
30
|
AddSelectedTextTagRequest,
|
|
@@ -61,7 +63,9 @@ from app.services.exception_capture import CapturedExceptionContext
|
|
|
61
63
|
from app.usecases.create_note import CmdCreateNote
|
|
62
64
|
from app.usecases.base import QueryCommand
|
|
63
65
|
from app.usecases.create_sibling import CmdCreateSibling
|
|
66
|
+
from app.services.file_registry import file_registry
|
|
64
67
|
from app.usecases.create_child import CmdCreateChild
|
|
68
|
+
from app.usecases.create_file_preview_child import CmdCreateFilePreviewChild
|
|
65
69
|
from app.usecases.update_content import CmdUpdateContent
|
|
66
70
|
from app.usecases.prefetch_link_titles import CmdPrefetchLinkTitles
|
|
67
71
|
from app.usecases.add_selected_text_tag import CmdAddSelectedTextTag
|
|
@@ -127,6 +131,7 @@ from app.services.html_export import build_notes_export_filename
|
|
|
127
131
|
from app.services.note_fullscreen import build_note_fullscreen_markup
|
|
128
132
|
from app.services.link_titles import link_title_store
|
|
129
133
|
from app.services.search_index import search_index
|
|
134
|
+
from app.services.dictation_cleanup import clean_dictated_paste
|
|
130
135
|
from app.services.tag_suggestions import suggest_tags_for_note
|
|
131
136
|
from app.services.undo_state import reset_undo_stack
|
|
132
137
|
from app.usecases.prioritize import list_prioritize_tag_suggestions
|
|
@@ -257,12 +262,9 @@ def view_diff(payload: ViewDiffRequest):
|
|
|
257
262
|
if normalized_search is not None:
|
|
258
263
|
if not isinstance(normalized_search, str):
|
|
259
264
|
raise HTTPException(status_code=400, detail="search must be a string or null")
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
if capture.captured_exception is not None:
|
|
264
|
-
exc = capture.captured_exception
|
|
265
|
-
raise HTTPException(status_code=400, detail=str(exc)) from exc
|
|
265
|
+
# Validated before anything changes; a search that does not parse is
|
|
266
|
+
# answered as rejected input (main.py), shown as a polite warning.
|
|
267
|
+
parse_search_query(normalized_search)
|
|
266
268
|
|
|
267
269
|
maybe_reset_on_context(client_id, undo_context)
|
|
268
270
|
|
|
@@ -285,14 +287,19 @@ def view_diff(payload: ViewDiffRequest):
|
|
|
285
287
|
if tab_view_empty:
|
|
286
288
|
warm_view = None
|
|
287
289
|
client_known_note_ids: set[str] = set()
|
|
290
|
+
# The tab's previous root order: a sorted tab keeps the edited note's root there.
|
|
291
|
+
previous_root_ids: list[str] = []
|
|
288
292
|
if warm_view is not None:
|
|
289
293
|
client_known_note_ids = set(warm_view.hash_by_id)
|
|
294
|
+
if None in warm_view.children_by_parent:
|
|
295
|
+
previous_root_ids = warm_view.children_by_parent[None]
|
|
290
296
|
|
|
291
297
|
state = build_view_state(
|
|
292
298
|
editing_note_id=normalized_editing_note_id,
|
|
293
299
|
search=normalized_search,
|
|
294
300
|
sort_mode=sort_mode,
|
|
295
301
|
client_known_note_ids=client_known_note_ids,
|
|
302
|
+
previous_root_ids=previous_root_ids,
|
|
296
303
|
visible_top_root_id=visible_top_root_id,
|
|
297
304
|
visible_bottom_root_id=visible_bottom_root_id,
|
|
298
305
|
is_untagged_view=is_untagged_view,
|
|
@@ -549,6 +556,22 @@ def delete_tag_interactions(request: Request) -> Dict[str, object]:
|
|
|
549
556
|
return {"deletedCount": deleted_count}
|
|
550
557
|
|
|
551
558
|
|
|
559
|
+
@router.post("/notes/dictation-paste")
|
|
560
|
+
@transactional_route
|
|
561
|
+
def dictation_paste(payload: DictationPasteRequest) -> Dict[str, object]:
|
|
562
|
+
"""Read-only: the cleaned-up text to insert for a paste (docs/ui/dictation-paste.md)."""
|
|
563
|
+
text = clean_dictated_paste(
|
|
564
|
+
text=payload["text"],
|
|
565
|
+
target=payload["target"],
|
|
566
|
+
existing_tag_frequencies=search_index.list_explicit_tag_frequencies(),
|
|
567
|
+
current_value=payload["current_value"],
|
|
568
|
+
quote_open=payload["quote_open"],
|
|
569
|
+
quote_close=payload["quote_close"],
|
|
570
|
+
negate_phrase=payload["negate_phrase"],
|
|
571
|
+
)
|
|
572
|
+
return {"text": text}
|
|
573
|
+
|
|
574
|
+
|
|
552
575
|
@router.post("/notes/tag-suggestions")
|
|
553
576
|
@transactional_route
|
|
554
577
|
def tag_suggestions(payload: TagSuggestionsRequest) -> Dict[str, object]:
|
|
@@ -748,6 +771,27 @@ def create_child(request: Request, note_id: str, body: CreateChildRequest):
|
|
|
748
771
|
return cmd.execute()
|
|
749
772
|
|
|
750
773
|
|
|
774
|
+
@router.post("/notes/file-preview-child/{note_id}")
|
|
775
|
+
@transactional_route
|
|
776
|
+
def create_file_preview_child(request: Request, note_id: str, body: CreateFilePreviewChildRequest):
|
|
777
|
+
token = _require_bearer_token(request)
|
|
778
|
+
viewport = _require_viewport(body)
|
|
779
|
+
_require_note_present(note_id, context="notes.file-preview-child")
|
|
780
|
+
file_id = body["fileId"]
|
|
781
|
+
if not file_registry.has_file(file_id):
|
|
782
|
+
raise HTTPException(status_code=404, detail=f"File not found: {file_id}")
|
|
783
|
+
cmd = CmdCreateFilePreviewChild(
|
|
784
|
+
parent_note_id=note_id,
|
|
785
|
+
file_id=file_id,
|
|
786
|
+
search_query=body["search_query"],
|
|
787
|
+
token=token,
|
|
788
|
+
client_id=body["clientId"],
|
|
789
|
+
undo_context=body["undoContext"],
|
|
790
|
+
viewport=viewport,
|
|
791
|
+
)
|
|
792
|
+
return cmd.execute()
|
|
793
|
+
|
|
794
|
+
|
|
751
795
|
@router.put("/notes/{note_id}")
|
|
752
796
|
@transactional_route
|
|
753
797
|
def update_note(request: Request, note_id: str, body: UpdateNoteRequest):
|
|
@@ -125,6 +125,8 @@ def assert_mutation_routes_wrapped(app: FastAPI) -> None:
|
|
|
125
125
|
def _check_bulk_guard(endpoint_name: str) -> None:
|
|
126
126
|
if endpoint_name in _STORAGE_TRANSITIONS and bulk_operation_guard.active_mutations > 1:
|
|
127
127
|
raise HTTPException(status_code=409, detail="Wait for the current request to finish before changing namespace storage.")
|
|
128
|
-
|
|
128
|
+
# Preferences never touch notes, and every operation reads them once when it
|
|
129
|
+
# starts, so saving them (e.g. the chat panel width) cannot disturb it.
|
|
130
|
+
permitted = {"answer_bulk_question", "preview_cloud_privacy", "put_ai_debug_details", "put_client_preferences"}
|
|
129
131
|
if bulk_operation_guard.operation_id and endpoint_name not in permitted:
|
|
130
132
|
raise HTTPException(status_code=409, detail="A bulk operation is running. Wait or cancel it before changing the app.")
|
|
@@ -14,7 +14,9 @@ CAPTURE_BOUNDARIES = {
|
|
|
14
14
|
'app/services/agent/web_fetch.py:_extract_pdf_content:pdf_capture': ('PyPdfError',),
|
|
15
15
|
'app/services/agent/web_fetch.py:_decode_web_text:encoding_capture': ('LookupError',),
|
|
16
16
|
'app/services/agent/web_fetch.py:handle_starttag:join_capture': ('ValueError',),
|
|
17
|
-
'app/services/agent/
|
|
17
|
+
'app/services/agent/web_actions.py:open_web_pages:evidence_capacity_capture': ('WebEvidenceCapacityError',),
|
|
18
|
+
# A model's tool call is untrusted input; rejected arguments are explained back to the model.
|
|
19
|
+
'app/services/agent/agent_tools.py:parse_tool_call:arguments_capture': ('ValidationError',),
|
|
18
20
|
# In-app updates translate only external transport, installation eligibility and job lookup errors.
|
|
19
21
|
'app/services/app_updates.py:check_for_update:eligibility': ('AppUpdateRejected',),
|
|
20
22
|
'app/services/app_updates.py:job_path:validation': ('ValueError',),
|
|
@@ -86,7 +86,7 @@ from urllib.parse import parse_qsl
|
|
|
86
86
|
from urllib.parse import urlencode
|
|
87
87
|
from urllib.parse import urlsplit
|
|
88
88
|
from urllib.parse import urlunsplit
|
|
89
|
-
from app.services.input_errors import NamespaceInputRejected
|
|
89
|
+
from app.services.input_errors import InputRejected, NamespaceInputRejected
|
|
90
90
|
|
|
91
91
|
logger.remove()
|
|
92
92
|
logger.add(
|
|
@@ -158,6 +158,13 @@ async def request_validation_error(request: Request, exc: RequestValidationError
|
|
|
158
158
|
return JSONResponse(status_code=422, content={"detail": summarize_validation_errors(exc.errors())})
|
|
159
159
|
|
|
160
160
|
|
|
161
|
+
@app.exception_handler(InputRejected)
|
|
162
|
+
async def handle_input_rejected(request: Request, exc: InputRejected):
|
|
163
|
+
# Expected, validated user-input failures (e.g. a search that does not
|
|
164
|
+
# parse): a polite 400 the browser shows as a warning, never a 500.
|
|
165
|
+
return JSONResponse(status_code=400, content={"detail": str(exc), "inputRejected": True})
|
|
166
|
+
|
|
167
|
+
|
|
161
168
|
@app.exception_handler(OntologyParseError)
|
|
162
169
|
async def handle_ontology_parse_error(request: Request, exc: OntologyParseError):
|
|
163
170
|
return JSONResponse(status_code=400, content={"detail": str(exc)})
|
|
@@ -17,6 +17,7 @@ from ..services.content_cache import (
|
|
|
17
17
|
)
|
|
18
18
|
from ..services.note_store import store as note_store
|
|
19
19
|
from app.presentation.render.note_renderer import render_read_only_mode
|
|
20
|
+
from app.services.markdown_rendering import strip_latex_source_attributes
|
|
20
21
|
from app.db.notes_sql import (
|
|
21
22
|
fetch_children_ordered,
|
|
22
23
|
fetch_note,
|
|
@@ -652,7 +653,9 @@ def render_note_data_read_only(note_data: Dict[str, Any]) -> Dict[str, Any]:
|
|
|
652
653
|
raise TypeError('note_data.children must be a list')
|
|
653
654
|
child_payloads = [{} for _ in children]
|
|
654
655
|
rendered.update(node)
|
|
655
|
-
rendered['content'] =
|
|
656
|
+
rendered['content'] = strip_latex_source_attributes(
|
|
657
|
+
render_read_only_mode(SimpleNamespace(content=content, tags=tags))
|
|
658
|
+
)
|
|
656
659
|
rendered['children'] = child_payloads
|
|
657
660
|
pending.extend(zip(children, child_payloads))
|
|
658
661
|
return root
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"""The agent's own record of what it did for an answer.
|
|
2
|
+
|
|
3
|
+
Each tool call becomes one short entry: what was asked and what came of it,
|
|
4
|
+
never the content a tool returned (page text and notes can be huge, and the
|
|
5
|
+
model can read them again). The entries are kept with the answer for the rest of
|
|
6
|
+
the chat and given to the model on later turns, so a question such as "did you
|
|
7
|
+
search the web for that?" is answered from what actually happened. Only the
|
|
8
|
+
model sees them.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import json
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
_NOTE_READ_TOOLS = frozenset({"read_view_notes", "search_view_notes"})
|
|
17
|
+
_OPERATION_TOOLS = frozenset({"summarize_view", "propose_tag_generation", "propose_tag_review"})
|
|
18
|
+
_KNOWN_TOOLS = _NOTE_READ_TOOLS | _OPERATION_TOOLS | {
|
|
19
|
+
"lookup_metalist_help", "view_overview", "open_web_pages", "open_menu",
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def describe_action(*, name: str, arguments: str, result_content: str, is_error: bool) -> dict[str, object]:
|
|
24
|
+
"""One log entry for a tool call, from its JSON arguments and JSON result."""
|
|
25
|
+
# A rejected call may name a tool that does not exist: it is still recorded.
|
|
26
|
+
if is_error:
|
|
27
|
+
return {"tool": name, "rejected": True}
|
|
28
|
+
if name not in _KNOWN_TOOLS:
|
|
29
|
+
raise ValueError(f"No action log entry for unknown tool: {name!r}")
|
|
30
|
+
parsed_arguments = json.loads(arguments)
|
|
31
|
+
assert isinstance(parsed_arguments, dict), "Tool arguments are a JSON object"
|
|
32
|
+
if name in _OPERATION_TOOLS:
|
|
33
|
+
return {"tool": name, "arguments": parsed_arguments}
|
|
34
|
+
result = json.loads(result_content)
|
|
35
|
+
assert isinstance(result, dict), "Tool results are a JSON object"
|
|
36
|
+
if name == "lookup_metalist_help":
|
|
37
|
+
return {"tool": name, "topics": list(parsed_arguments["topics"])}
|
|
38
|
+
if name == "view_overview":
|
|
39
|
+
return {"tool": name, "notes_in_view": result["note_count"], "trees_in_view": result["tree_count"]}
|
|
40
|
+
if name == "open_menu":
|
|
41
|
+
return {"tool": name, "menu": result["label"], "status": result["status"]}
|
|
42
|
+
if name == "open_web_pages":
|
|
43
|
+
return {"tool": name, "pages": [_page_entry(page) for page in result["pages"]]}
|
|
44
|
+
entry: dict[str, object] = {"tool": name}
|
|
45
|
+
if name == "search_view_notes":
|
|
46
|
+
entry["query"] = parsed_arguments["query"]
|
|
47
|
+
entry["matching_notes"] = result["matching_note_count"]
|
|
48
|
+
entry["trees_read"] = len(result["trees"])
|
|
49
|
+
entry["trees_left_unread"] = len(result["unread_root_ids"])
|
|
50
|
+
entry["trees_too_large"] = len(result["too_large_root_ids"])
|
|
51
|
+
return entry
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def _page_entry(page: dict[str, object]) -> dict[str, object]:
|
|
55
|
+
"""The address as asked, whether it opened, and its title when it did."""
|
|
56
|
+
title = ""
|
|
57
|
+
if page["status"] == "ok":
|
|
58
|
+
title = page["title"]
|
|
59
|
+
return {"url": page["requested_url"], "status": page["status"], "title": title}
|