FINAL COMMIT BEFORE REWRITE

This commit is contained in:
2026-05-26 21:45:11 +02:00
parent 42fa6139ed
commit 745dec39f5
264 changed files with 311 additions and 311 deletions
+3 -3
View File
@@ -6,13 +6,13 @@ from collections.abc import AsyncGenerator
from pathlib import Path from pathlib import Path
from typing import Any from typing import Any
from alfred.infrastructure.metadata import MetadataStore from alfred.infrastructure.metadata_TO_CHECK import MetadataStore
from alfred.infrastructure.persistence import get_memory from alfred.infrastructure.persistence_TO_CHECK import get_memory
from alfred.settings import settings from alfred.settings import settings
from .prompt import PromptBuilder from .prompt import PromptBuilder
from .registry import Tool, make_tools from .registry import Tool, make_tools
from .workflows import WorkflowLoader from .workflows_TO_CHECK import WorkflowLoader
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
+3 -3
View File
@@ -3,12 +3,12 @@
import json import json
from typing import Any from typing import Any
from alfred.infrastructure.persistence import get_memory from alfred.infrastructure.persistence_TO_CHECK import get_memory
from alfred.infrastructure.persistence.memory import MemoryRegistry from alfred.infrastructure.persistence_TO_CHECK.memory import MemoryRegistry
from .expressions import build_expressions_context from .expressions import build_expressions_context
from .registry import Tool from .registry import Tool
from .workflows import WorkflowLoader from .workflows_TO_CHECK import WorkflowLoader
# Tools that are always available, regardless of workflow scope. # Tools that are always available, regardless of workflow scope.
# Kept small on purpose — the noyau is what the agent uses to either # Kept small on purpose — the noyau is what the agent uses to either
+6 -6
View File
@@ -6,8 +6,8 @@ from collections.abc import Callable
from dataclasses import dataclass from dataclasses import dataclass
from typing import Any from typing import Any
from .tools.spec import ToolSpec, ToolSpecError from .tools_TO_CHECK.spec import ToolSpec, ToolSpecError
from .tools.spec_loader import load_tool_specs from .tools_TO_CHECK.spec_loader import load_tool_specs
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -130,10 +130,10 @@ def make_tools(settings) -> dict[str, Tool]:
Returns: Returns:
Dictionary mapping tool names to Tool objects. Dictionary mapping tool names to Tool objects.
""" """
from .tools import api as api_tools # noqa: PLC0415 from .tools_TO_CHECK import api as api_tools # noqa: PLC0415
from .tools import filesystem as fs_tools # noqa: PLC0415 from .tools_TO_CHECK import filesystem as fs_tools # noqa: PLC0415
from .tools import language as lang_tools # noqa: PLC0415 from .tools_TO_CHECK import language as lang_tools # noqa: PLC0415
from .tools import workflow as wf_tools # noqa: PLC0415 from .tools_TO_CHECK import workflow as wf_tools # noqa: PLC0415
tool_functions = [ tool_functions = [
fs_tools.set_path_for_folder, fs_tools.set_path_for_folder,
@@ -3,13 +3,13 @@
import logging import logging
from typing import Any from typing import Any
from alfred.application.movies import SearchMovieUseCase from alfred.application.movies_TO_CHECK import SearchMovieUseCase
from alfred.application.torrents import AddTorrentUseCase, SearchTorrentsUseCase from alfred.application.torrents_TO_CHECK import AddTorrentUseCase, SearchTorrentsUseCase
from alfred.application.tv_shows import SearchShowUseCase from alfred.application.tv_shows_TO_CHECK import SearchShowUseCase
from alfred.infrastructure.api.knaben import knaben_client from alfred.infrastructure.api_TO_CHECK.knaben import knaben_client
from alfred.infrastructure.api.qbittorrent import qbittorrent_client from alfred.infrastructure.api_TO_CHECK.qbittorrent import qbittorrent_client
from alfred.infrastructure.api.tmdb import tmdb_client from alfred.infrastructure.api_TO_CHECK.tmdb import tmdb_client
from alfred.infrastructure.persistence import get_memory from alfred.infrastructure.persistence_TO_CHECK import get_memory
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -28,10 +28,10 @@ from alfred.application.filesystem import (
list_dir_use_case, list_dir_use_case,
move_file_use_case, move_file_use_case,
) )
from alfred.infrastructure.knowledge.release_kb import YamlReleaseKnowledge from alfred.infrastructure.knowledge_TO_CHECK.release_kb import YamlReleaseKnowledge
from alfred.infrastructure.metadata import MetadataStore from alfred.infrastructure.metadata_TO_CHECK import MetadataStore
from alfred.infrastructure.persistence import get_memory from alfred.infrastructure.persistence_TO_CHECK import get_memory
from alfred.infrastructure.probe import FfprobeMediaProber from alfred.infrastructure.probe_TO_CHECK import FfprobeMediaProber
# Agent-tools frontier: this is the legitimate home for the singletons that # Agent-tools frontier: this is the legitimate home for the singletons that
# back every LLM-exposed wrapper. The use cases below take ``kb`` / ``prober`` # back every LLM-exposed wrapper. The use cases below take ``kb`` / ``prober``
@@ -214,7 +214,7 @@ def learn(pack: str, category: str, key: str, values: list[str]) -> dict[str, An
def analyze_release(release_name: str, source_path: str) -> dict[str, Any]: def analyze_release(release_name: str, source_path: str) -> dict[str, Any]:
"""Thin tool wrapper — semantics live in alfred/agent/tools/specs/analyze_release.yaml.""" """Thin tool wrapper — semantics live in alfred/agent/tools/specs/analyze_release.yaml."""
from alfred.application.release import inspect_release # noqa: PLC0415 from alfred.application.release_TO_CHECK import inspect_release # noqa: PLC0415
result = inspect_release(release_name, Path(source_path), _KB, _PROBER) result = inspect_release(release_name, Path(source_path), _KB, _PROBER)
parsed = result.parsed parsed = result.parsed
@@ -3,7 +3,7 @@
import logging import logging
from typing import Any from typing import Any
from alfred.infrastructure.persistence import get_memory from alfred.infrastructure.persistence_TO_CHECK import get_memory
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -9,9 +9,9 @@ to reason over the full set.
import logging import logging
from typing import Any from typing import Any
from alfred.infrastructure.persistence import get_memory from alfred.infrastructure.persistence_TO_CHECK import get_memory
from ..workflows import WorkflowLoader from ..workflows_TO_CHECK import WorkflowLoader
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
+1 -1
View File
@@ -15,7 +15,7 @@ from alfred.agent.agent import Agent
from alfred.agent.llm.deepseek import DeepSeekClient from alfred.agent.llm.deepseek import DeepSeekClient
from alfred.agent.llm.exceptions import LLMAPIError, LLMConfigurationError from alfred.agent.llm.exceptions import LLMAPIError, LLMConfigurationError
from alfred.agent.llm.ollama import OllamaClient from alfred.agent.llm.ollama import OllamaClient
from alfred.infrastructure.persistence import get_memory, init_memory from alfred.infrastructure.persistence_TO_CHECK import get_memory, init_memory
from alfred.settings import settings from alfred.settings import settings
logging.basicConfig( logging.basicConfig(
@@ -3,7 +3,7 @@
import logging import logging
from alfred.infrastructure.filesystem import FileManager from alfred.infrastructure.filesystem import FileManager
from alfred.infrastructure.persistence import get_memory from alfred.infrastructure.persistence_TO_CHECK import get_memory
from .dto import CreateSeedLinksResponse from .dto import CreateSeedLinksResponse
@@ -3,25 +3,25 @@
import logging import logging
from pathlib import Path from pathlib import Path
from alfred.application.subtitles.placer import ( from alfred.application.subtitles_TO_CHECK.placer import (
PlacedTrack, PlacedTrack,
SubtitlePlacer, SubtitlePlacer,
_build_dest_name, _build_dest_name,
) )
from alfred.domain.shared.value_objects import ImdbId from alfred.domain.shared_TO_CHECK.value_objects import ImdbId
from alfred.domain.subtitles.entities import SubtitleScanResult from alfred.domain.subtitles_TO_CHECK.entities import SubtitleScanResult
from alfred.domain.subtitles.services.identifier import SubtitleIdentifier from alfred.domain.subtitles_TO_CHECK.services.identifier import SubtitleIdentifier
from alfred.domain.subtitles.services.matcher import SubtitleMatcher from alfred.domain.subtitles_TO_CHECK.services.matcher import SubtitleMatcher
from alfred.domain.subtitles.services.pattern_detector import PatternDetector from alfred.domain.subtitles_TO_CHECK.services.pattern_detector import PatternDetector
from alfred.domain.subtitles.services.utils import available_subtitles from alfred.domain.subtitles_TO_CHECK.services.utils import available_subtitles
from alfred.domain.subtitles.value_objects import ScanStrategy from alfred.domain.subtitles_TO_CHECK.value_objects import ScanStrategy
from alfred.infrastructure.filesystem.scanner import PathlibFilesystemScanner from alfred.infrastructure.filesystem.scanner import PathlibFilesystemScanner
from alfred.infrastructure.knowledge.subtitles.base import SubtitleKnowledgeBase from alfred.infrastructure.knowledge_TO_CHECK.subtitles.base import SubtitleKnowledgeBase
from alfred.infrastructure.knowledge.subtitles.loader import KnowledgeLoader from alfred.infrastructure.knowledge_TO_CHECK.subtitles.loader import KnowledgeLoader
from alfred.infrastructure.persistence.context import get_memory from alfred.infrastructure.persistence_TO_CHECK.context import get_memory
from alfred.infrastructure.probe.ffprobe_prober import FfprobeMediaProber from alfred.infrastructure.probe_TO_CHECK.ffprobe_prober import FfprobeMediaProber
from alfred.infrastructure.subtitle.metadata_store import SubtitleMetadataStore from alfred.infrastructure.subtitle_TO_CHECK.metadata_store import SubtitleMetadataStore
from alfred.infrastructure.subtitle.rule_repository import RuleSetRepository from alfred.infrastructure.subtitle_TO_CHECK.rule_repository import RuleSetRepository
from .dto import ( from .dto import (
AvailableSubtitle, AvailableSubtitle,
@@ -22,12 +22,12 @@ import logging
from dataclasses import dataclass from dataclasses import dataclass
from pathlib import Path from pathlib import Path
from alfred.application.release import inspect_release from alfred.application.release_TO_CHECK import inspect_release
from alfred.domain.release import parse_release from alfred.domain.release import parse_release
from alfred.domain.releases.ports import ReleaseKnowledge from alfred.domain.releases_TO_CHECK.ports import ReleaseKnowledge
from alfred.domain.release.value_objects import ParsedRelease from alfred.domain.release.value_objects import ParsedRelease
from alfred.domain.shared.ports import MediaProber from alfred.domain.shared_TO_CHECK.ports import MediaProber
from alfred.infrastructure.persistence import get_memory from alfred.infrastructure.persistence_TO_CHECK import get_memory
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -2,7 +2,7 @@
import logging import logging
from alfred.infrastructure.api.tmdb import ( from alfred.infrastructure.api_TO_CHECK.tmdb import (
TMDBAPIError, TMDBAPIError,
TMDBClient, TMDBClient,
TMDBConfigurationError, TMDBConfigurationError,
@@ -19,7 +19,7 @@ from __future__ import annotations
from pathlib import Path from pathlib import Path
from alfred.domain.releases.ports import ReleaseKnowledge from alfred.domain.releases_TO_CHECK.ports import ReleaseKnowledge
from alfred.domain.release.value_objects import ParsedRelease from alfred.domain.release.value_objects import ParsedRelease
@@ -4,9 +4,9 @@ from __future__ import annotations
from dataclasses import replace from dataclasses import replace
from alfred.domain.releases.ports import ReleaseKnowledge from alfred.domain.releases_TO_CHECK.ports import ReleaseKnowledge
from alfred.domain.release.value_objects import ParsedRelease from alfred.domain.release.value_objects import ParsedRelease
from alfred.domain.shared.media import MediaInfo from alfred.domain.shared_TO_CHECK.media import MediaInfo
def enrich_from_probe( def enrich_from_probe(
@@ -48,18 +48,18 @@ from __future__ import annotations
from dataclasses import dataclass, replace from dataclasses import dataclass, replace
from pathlib import Path from pathlib import Path
from alfred.application.release.detect_media_type import detect_media_type from alfred.application.release_TO_CHECK.detect_media_type import detect_media_type
from alfred.application.release.enrich_from_probe import enrich_from_probe from alfred.application.release_TO_CHECK.enrich_from_probe import enrich_from_probe
from alfred.application.release.supported_media import find_main_video from alfred.application.release_TO_CHECK.supported_media import find_main_video
from alfred.domain.releases.ports import ReleaseKnowledge from alfred.domain.releases_TO_CHECK.ports import ReleaseKnowledge
from alfred.domain.releases.parser.services import parse_release from alfred.domain.releases_TO_CHECK.parser.services import parse_release
from alfred.domain.release.value_objects import ( from alfred.domain.release.value_objects import (
MediaTypeToken, MediaTypeToken,
ParsedRelease, ParsedRelease,
ParseReport, ParseReport,
) )
from alfred.domain.shared.media import MediaInfo from alfred.domain.shared_TO_CHECK.media import MediaInfo
from alfred.domain.shared.ports import MediaProber from alfred.domain.shared_TO_CHECK.ports import MediaProber
# Media types for which a probe carries no useful information. # Media types for which a probe carries no useful information.
_NON_PROBABLE_MEDIA_TYPES = frozenset({"unknown", "other"}) _NON_PROBABLE_MEDIA_TYPES = frozenset({"unknown", "other"})
@@ -32,7 +32,7 @@ from __future__ import annotations
from pathlib import Path from pathlib import Path
from alfred.domain.releases.ports.knowledge import ReleaseKnowledge from alfred.domain.releases_TO_CHECK.ports.knowledge import ReleaseKnowledge
def is_supported_video(path: Path, kb: ReleaseKnowledge) -> bool: def is_supported_video(path: Path, kb: ReleaseKnowledge) -> bool:
@@ -5,8 +5,8 @@ import os
from dataclasses import dataclass from dataclasses import dataclass
from pathlib import Path from pathlib import Path
from alfred.domain.subtitles.entities import SubtitleScanResult from alfred.domain.subtitles_TO_CHECK.entities import SubtitleScanResult
from alfred.domain.subtitles.value_objects import SubtitleType from alfred.domain.subtitles_TO_CHECK.value_objects import SubtitleType
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -2,7 +2,7 @@
import logging import logging
from alfred.infrastructure.api.qbittorrent import ( from alfred.infrastructure.api_TO_CHECK.qbittorrent import (
QBittorrentAPIError, QBittorrentAPIError,
QBittorrentAuthError, QBittorrentAuthError,
QBittorrentClient, QBittorrentClient,
@@ -2,7 +2,7 @@
import logging import logging
from alfred.infrastructure.api.knaben import ( from alfred.infrastructure.api_TO_CHECK.knaben import (
KnabenAPIError, KnabenAPIError,
KnabenClient, KnabenClient,
KnabenNotFoundError, KnabenNotFoundError,
@@ -2,7 +2,7 @@
import logging import logging
from alfred.infrastructure.api.tmdb import ( from alfred.infrastructure.api_TO_CHECK.tmdb import (
TMDBAPIError, TMDBAPIError,
TMDBClient, TMDBClient,
TMDBConfigurationError, TMDBConfigurationError,
@@ -50,9 +50,9 @@ import re
from dataclasses import dataclass from dataclasses import dataclass
from pathlib import Path from pathlib import Path
from alfred.domain.releases.ports import ReleaseKnowledge from alfred.domain.releases_TO_CHECK.ports import ReleaseKnowledge
from alfred.domain.releases.value_objects import ReleaseMode from alfred.domain.releases_TO_CHECK.value_objects import ReleaseMode
from alfred.domain.shared.ports import FilesystemScanner from alfred.domain.shared_TO_CHECK.ports import FilesystemScanner
_LOG = logging.getLogger(__name__) _LOG = logging.getLogger(__name__)
@@ -2,7 +2,7 @@
from dataclasses import dataclass from dataclasses import dataclass
from ..shared.value_objects import ImdbId, TmdbId from ..shared_TO_CHECK.value_objects import ImdbId, TmdbId
from .value_objects import MovieTitle, ReleaseYear from .value_objects import MovieTitle, ReleaseYear
@@ -1,6 +1,6 @@
"""Movie domain exceptions.""" """Movie domain exceptions."""
from ..shared.exceptions import DomainException, NotFoundError from ..shared_TO_CHECK.exceptions import DomainException, NotFoundError
class MovieNotFound(NotFoundError): class MovieNotFound(NotFoundError):
@@ -3,7 +3,7 @@
from dataclasses import dataclass from dataclasses import dataclass
from enum import Enum from enum import Enum
from ..shared.exceptions import ValidationError from ..shared_TO_CHECK.exceptions import ValidationError
class Quality(Enum): class Quality(Enum):
@@ -32,8 +32,8 @@ Invariants enforced at ``build()`` time:
from __future__ import annotations from __future__ import annotations
from ..shared.exceptions import ValidationError from ..shared_TO_CHECK.exceptions import ValidationError
from ..shared.value_objects import ImdbId, TmdbId from ..shared_TO_CHECK.value_objects import ImdbId, TmdbId
from ..tv_shows.value_objects import SeasonNumber from ..tv_shows.value_objects import SeasonNumber
from .entities import ( from .entities import (
EpisodeRelease, EpisodeRelease,
@@ -15,9 +15,9 @@ from __future__ import annotations
from dataclasses import dataclass from dataclasses import dataclass
from datetime import datetime from datetime import datetime
from ..shared.exceptions import ValidationError from ..shared_TO_CHECK.exceptions import ValidationError
from ..shared.media import AudioTrack, SubtitleTrack from ..shared_TO_CHECK.media import AudioTrack, SubtitleTrack
from ..shared.value_objects import FilePath, ImdbId, TmdbId from ..shared_TO_CHECK.value_objects import FilePath, ImdbId, TmdbId
from ..tv_shows.value_objects import SeasonNumber from ..tv_shows.value_objects import SeasonNumber
from .value_objects import EpisodeRange, ReleaseMode from .value_objects import EpisodeRange, ReleaseMode
@@ -29,7 +29,7 @@ arrives through ``kb: ReleaseKnowledge``.
from __future__ import annotations from __future__ import annotations
from ..ports.knowledge import ReleaseKnowledge from ..ports.knowledge import ReleaseKnowledge
from alfred.domain.releases.value_objects_old_question_mark import MediaTypeToken from alfred.domain.releases_TO_CHECK.value_objects_old_question_mark import MediaTypeToken
from .schema import GroupSchema from .schema import GroupSchema
from .tokens import Token, TokenRole from .tokens import Token, TokenRole
@@ -27,7 +27,7 @@ from __future__ import annotations
from enum import Enum from enum import Enum
from ..ports.knowledge import ReleaseKnowledge from ..ports.knowledge import ReleaseKnowledge
from alfred.domain.releases.value_objects_old_question_mark import ParsedRelease from alfred.domain.releases_TO_CHECK.value_objects_old_question_mark import ParsedRelease
from .tokens import Token, TokenRole from .tokens import Token, TokenRole
@@ -18,9 +18,9 @@ score, the road, and diagnostic info for downstream callers.
from __future__ import annotations from __future__ import annotations
from alfred.domain.releases.parser import scoring as _scoring, pipeline as _v2 from alfred.domain.releases_TO_CHECK.parser import scoring as _scoring, pipeline as _v2
from alfred.domain.releases.ports import ReleaseKnowledge from alfred.domain.releases_TO_CHECK.ports import ReleaseKnowledge
from alfred.domain.releases.value_objects_old_question_mark import MediaTypeToken, ParsedRelease, ParseReport, TokenizationRoute from alfred.domain.releases_TO_CHECK.value_objects_old_question_mark import MediaTypeToken, ParsedRelease, ParseReport, TokenizationRoute
def parse_release( def parse_release(
@@ -17,7 +17,7 @@ aggregates).
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
from ..shared.value_objects import TmdbId from ..shared_TO_CHECK.value_objects import TmdbId
from .entities import MovieRelease, SeriesRelease from .entities import MovieRelease, SeriesRelease
@@ -5,7 +5,7 @@ from __future__ import annotations
from dataclasses import dataclass from dataclasses import dataclass
from enum import Enum from enum import Enum
from ..shared.exceptions import ValidationError from ..shared_TO_CHECK.exceptions import ValidationError
from ..tv_shows.value_objects import EpisodeNumber from ..tv_shows.value_objects import EpisodeNumber
@@ -18,7 +18,7 @@ from __future__ import annotations
from dataclasses import dataclass from dataclasses import dataclass
from enum import Enum from enum import Enum
from alfred.domain.shared.exceptions import ValidationError from alfred.domain.shared_TO_CHECK.exceptions import ValidationError
class MediaTypeToken(str, Enum): class MediaTypeToken(str, Enum):
@@ -10,7 +10,7 @@ from __future__ import annotations
from pathlib import Path from pathlib import Path
from typing import Protocol from typing import Protocol
from alfred.domain.shared.file_entry import FileEntry from alfred.domain.shared_TO_CHECK.file_entry import FileEntry
class FilesystemScanner(Protocol): class FilesystemScanner(Protocol):
@@ -10,7 +10,7 @@ from __future__ import annotations
from typing import Protocol from typing import Protocol
from alfred.domain.shared.value_objects import Language from alfred.domain.shared_TO_CHECK.value_objects import Language
class LanguageRepository(Protocol): class LanguageRepository(Protocol):
@@ -12,7 +12,7 @@ from pathlib import Path
from typing import TYPE_CHECKING, Protocol from typing import TYPE_CHECKING, Protocol
if TYPE_CHECKING: if TYPE_CHECKING:
from alfred.domain.shared.media import MediaInfo from alfred.domain.shared_TO_CHECK.media import MediaInfo
@dataclass(frozen=True) @dataclass(frozen=True)
@@ -3,7 +3,7 @@
from dataclasses import dataclass, field from dataclasses import dataclass, field
from typing import Any from typing import Any
from ..shared.value_objects import ImdbId from ..shared_TO_CHECK.value_objects import ImdbId
from .value_objects import RuleScope, RuleScopeLevel, SubtitleMatchingRules from .value_objects import RuleScope, RuleScopeLevel, SubtitleMatchingRules
@@ -3,7 +3,7 @@
from dataclasses import dataclass, field from dataclasses import dataclass, field
from pathlib import Path from pathlib import Path
from ..shared.value_objects import ImdbId from ..shared_TO_CHECK.value_objects import ImdbId
from .value_objects import ( from .value_objects import (
SubtitleFormat, SubtitleFormat,
SubtitleLanguage, SubtitleLanguage,
@@ -1,6 +1,6 @@
"""Subtitle domain exceptions.""" """Subtitle domain exceptions."""
from ..shared.exceptions import DomainException, NotFoundError from ..shared_TO_CHECK.exceptions import DomainException, NotFoundError
class SubtitleNotFound(NotFoundError): class SubtitleNotFound(NotFoundError):
@@ -4,8 +4,8 @@ import logging
import re import re
from pathlib import Path from pathlib import Path
from ...shared.ports import FilesystemScanner, MediaProber from ...shared_TO_CHECK.ports import FilesystemScanner, MediaProber
from ...shared.value_objects import ImdbId from ...shared_TO_CHECK.value_objects import ImdbId
from ..entities import MediaSubtitleMetadata, SubtitleScanResult from ..entities import MediaSubtitleMetadata, SubtitleScanResult
from ..ports import SubtitleKnowledge from ..ports import SubtitleKnowledge
from ..value_objects import ScanStrategy, SubtitlePattern, SubtitleType from ..value_objects import ScanStrategy, SubtitlePattern, SubtitleType
@@ -3,7 +3,7 @@
import logging import logging
from pathlib import Path from pathlib import Path
from ...shared.ports import FilesystemScanner, MediaProber from ...shared_TO_CHECK.ports import FilesystemScanner, MediaProber
from ..ports import SubtitleKnowledge from ..ports import SubtitleKnowledge
from ..value_objects import ScanStrategy, SubtitlePattern from ..value_objects import ScanStrategy, SubtitlePattern

Some files were not shown because too many files have changed in this diff Show More