Skip to content

v0.31.0

Choose a tag to compare

@hyoshi hyoshi released this 21 Oct 23:07
ad25ad6

Changed

  • The mcp dependency floor moves to >=1.8.0 (#863).
    mureo.learning.federation now imports its MCP client transports at
    module level, and 1.8.0 is the first mcp release that ships
    mcp.client.streamable_http. With an older mcp the module now fails
    to import instead of failing on the first http source.
  • mureo.rollback, mureo.policy, mureo.amazon_ads and mureo.core
    no longer import mureo.mcp
    (#863). The failure-envelope reader
    (failure_of, is_error_result, is_auth_error_result, Failure,
    FAILURE_STATUSES, API_ERROR_PREFIX, API_ERROR_CODE) now lives in
    mureo.core.tool_failure; every name is still importable from
    mureo.mcp._helpers as the same object. mureo.mcp.server.plugin_reversal_param_keys
    is removed: the server publishes its plugin reversal keys to the rollback
    registry through mureo.rollback.planner.set_plugin_reversal_keys at load,
    so a caller outside the server that plans plugin reversals must import
    mureo.mcp.server first (mureo rollback list / show do, only when they
    run).
    The built-in platform tool names the learning-reset pre-flight uses are
    likewise published to mureo.policy.learning_reset by the server
    (set_builtin_platform_tool_names); reading them before the server has
    loaded raises instead of answering with an empty set.
  • mureo.core.credential_source is the new home of the credential-source
    API
    (#863). The old path, mureo.mcp.credential_source, still works and
    re-exports the same objects (one context variable), but it imports the
    whole MCP server; the new path does not. Workspace account scoping
    (mureo.core.account_scope) and the BYOD-or-live client factory
    (mureo.client_factory) moved below mureo.mcp too, so the analytics
    adapters and change import no longer load the MCP server to open a client.
    Visible side effects of the move: the credential-source logger is now named
    mureo.core.credential_source, and CredentialSource.__module__ (and that
    of the other credential-source classes and functions) is
    mureo.core.credential_source.
  • The configure OAuth wizard moved from mureo.cli.web_auth to
    mureo.web.auth_wizard
    (#863); the old module path is removed.
    mureo.web.oauth_bridge imports it at load, so code that patched
    WebAuthWizard for the bridge patches mureo.web.oauth_bridge.WebAuthWizard.
    mureo.meta_ads no longer imports mureo.auth or mureo.auth_setup:
    the Meta OAuth scopes and the Graph HTTP timeout are public as
    mureo.meta_ads.accounts.META_OAUTH_SCOPES /
    META_HTTP_TIMEOUT_SECONDS (replacing the private
    mureo.auth_setup._META_OAUTH_SCOPES and
    mureo.meta_ads.accounts._HTTP_TIMEOUT / _META_GRAPH_API_BASE), and the
    log-line bounding helpers are public as
    mureo.logging_setup.truncate_text / one_log_line. The legacy
    credentials location has one definition,
    mureo.core.secret_store.default_credentials_path(), and
    mureo.core.runtime_context.runtime_credentials_path() now takes an
    optional default that falls back to it.
  • mureo.web no longer imports the configure server at load (#863).
    mureo.web.ConfigureWizard and mureo.web.run_configure_wizard are still
    importable (__all__ and from mureo.web import ... are unchanged) and
    resolve to the mureo.web.server objects on first access. A fresh
    import mureo.web now loads 26 modules instead of 549 (sys.modules after
    the import minus a bare interpreter's). Two visible side effects:
    import mureo.web alone no longer sets mureo.web.server as a package
    attribute (import the submodule explicitly, import mureo.web.server; first
    access of either name also sets it), and
    dir(mureo.web) no longer lists ConfigureWizard / run_configure_wizard.
    DEFAULT_CONFIGURE_PORT lives in mureo.web.instance
    (mureo.web.server.DEFAULT_CONFIGURE_PORT is the same object), so
    mureo.web.service no longer loads the server either. Installed-distribution
    discovery is public in mureo.installed_packages (canonicalise,
    is_mureo_package, discover_all_mureo_packages, replacing the private
    mureo.cli.upgrade_cmd._canonicalise / _is_mureo_package /
    _discover_all_mureo_packages), and skill-version detection moved from
    mureo.web.status_collector to mureo.cli.skill_status (SKILLS_MISSING,
    SKILLS_STALE, SKILLS_CURRENT, SkillsStatus, and
    detect_workflow_skills, formerly _detect_workflow_skills). Code that
    patched mureo.web.service.is_managed_service for the dashboard's restart
    patches mureo.web.handlers.is_managed_service.
  • The MCP server now fails to start if the bundled Amazon money-path table
    cannot be imported
    (#863). mureo.mcp._plugin_declarations imports
    mureo.amazon_ads.money_paths at load; previously a failed import logged a
    warning and the server started without the bridged money declarations.
    Registering each declaration is still best-effort.

Fixed

  • A hand-edited platform, campaign or ad entry no longer blocks every
    write to STATE.json
    (#881). A platform without account_id, a
    campaigns value that is not a list, or a campaign or ad missing a
    required field made every write to that workspace fail — sync,
    action_log appends, decisions, the ops history switch — while the
    dashboard kept rendering. Such entries are now read (missing values
    empty) and written back as found, with mureo's own changes applied on
    top. Keys mureo does not know on these entries are kept on every write
    instead of being dropped — except on a campaign in the legacy top-level
    campaigns list matched by an upsert, which is replaced whole as before
    (that match is platform-blind). The read-only Reports view now shows such
    a campaign with the missing fields empty instead of skipping it, so its
    campaign count includes it. mureo repair no longer offers an entry
    holding a hand-written campaigns value or unknown keys as an empty stub.
    A platforms value, a platform value or a document that is not a JSON
    object now fails with a ValueError naming the section instead of an
    AttributeError.