Skip to content

v1.5.0

Latest

Choose a tag to compare

@Bobsans Bobsans released this 31 Aug 18:16

AIHelper v1.5.0

Linux gains a managed MCP service, OpenCode joins the agents AIHelper can wire
itself into, and every published JSON Schema is now derived from the Rust type
that serializes it — which is how the GitLab and PostgreSQL schema defects fixed
here were found, and why they cannot come back.

Highlights

  • The managed MCP HTTP server installs as a systemd user unit on Linux
    (experimental), with the same lifecycle, status reduction, and drift detection
    as the Windows Task Scheduler path.
  • ah ai install supports the opencode target, and ah ai status reports
    every system, user, project, and local environment rather than one scope per
    target.
  • Published JSON Schemas are derived from the types that serialize them, so a
    schema can no longer disagree with its payload. Two GitLab commands that
    failed every typed call with OUTPUT_SCHEMA_VIOLATION are fixed as a
    consequence.
  • An ah invocation consumed by update recovery now says so, in the event log
    and in --json output.

What's Changed

✨ New

  • ah mcp service install, start, stop, restart, status, and uninstall
    work on Linux, registering the managed HTTP server as the systemd user unit
    aihelper-managed-mcp.service wanted by default.target. The support is
    experimental: it needs a reachable systemctl --user manager
    (XDG_RUNTIME_DIR and a running user manager), and running the unit with
    nobody logged in still requires loginctl enable-linger, which AIHelper does
    not enable for you. macOS continues to report
    MCP_SERVICE_UNSUPPORTED_PLATFORM.
  • ah ai install, ah ai uninstall, and ah ai status support the opencode
    target. The aihelper MCP server is registered in OpenCode's JSON/JSONC
    configuration with its comments preserved, and ah ai status now reports every
    supported system, user, project, and local environment instead of one scope per
    target.
  • An invocation consumed by update recovery reports itself. The event log gets
    one system record, severity warning, code
    UPDATE_RECOVERY_CONSUMED_INVOCATION, carrying the redacted argv, the
    interrupted transaction id, the operation, and the journal state found on disk.
    With --json, the payload's consumed_invocation field distinguishes a
    command that never ran from one that ran and printed nothing.

🚀 Improvements

  • Every published JSON Schema — built-in domains, host commands, and all four
    dynamic plugins — is derived from the Rust types it describes instead of being
    written by hand.
  • file.stat.kind and plugins.list.source/state publish their enum values,
    and the three plugins.* mutations publish const on command, where before
    the values existed only in prose.
  • The managed rules block written by ah ai install states the invariants no
    per-command description can carry: context.cwd over MCP, closed argument
    schemas, long work belonging to ah.job.*, paths that must already exist, a
    missing secret being the user's to add, and 401/403 meaning a missing scope
    rather than something to retry. Rerun ah ai install to refresh an existing
    block.
  • Ollama's decode failure message matches the GitHub and GitLab wording:
    failed to decode ollama response for '<path>'. The OLLAMA_RESPONSE_INVALID
    code is unchanged.
  • A write to stdout that the stream refuses is reported as OUTPUT_WRITE_FAILED
    instead of panicking the process.

🐛 Fixes

  • gitlab.issues and gitlab.pipelines published an output schema declaring
    four of the ten properties they serialize, with additionalProperties: false,
    so every typed call returned OUTPUT_SCHEMA_VIOLATION. Both schemas now come
    from the types that produce them.
  • MCP clients could receive a credential id in an error cause. Redaction had
    been applied on the CLI side only; both surfaces now project from one table.
  • gitlab.job.trace and gitlab.job.warnings left OSC terminal sequences in the
    trace text, so a warning wrapped in one did not match the warning scan. GitLab
    now uses the same stripper as GitHub, which handles OSC and CSI.
  • postgres.exec published its yes confirmation flag as optional and relied on
    the handler to refuse; the schema now requires it. postgres.describe requires
    object, which its extractor always needed.
  • github release create and gitlab release create sent unset options as an
    explicit null — rejected by GitHub with nil is not a string, and read by
    GitLab as a request to clear the field. Unset options are omitted, so each API
    applies its own default.
  • Over MCP, github.* and gitlab.* calls that name their own repo or
    project and read no file input no longer require context.cwd.
  • A git remote pointing at a self-managed GitLab supplies the host when --host
    is omitted, instead of failing with GITLAB_PROJECT_UNDETECTED while
    addressing gitlab.com. An explicit --host or --project is never
    overridden.
  • The workspace builds, tests, and lints cleanly on Linux and macOS.

⚠️ Compatibility

  • Derived schemas differ from the hand-written ones in four ways that carry no
    meaning: required is alphabetical, a nullable field spells itself
    type: [T, "null"] instead of oneOf: [T, null], array arguments advertise
    "default": [], and an empty required is omitted rather than published as
    []. Property names, types, and constraints are unchanged.
  • AH_POSTGRES_TEST_SYSTEM_PATH no longer overrides psql resolution. It was
    named as a test seam but shipped in the plugin ahead of PATH itself, and no
    test referenced it. Resolution now follows PATH.
  • The released CLI surface and the stable JSON and MCP contracts remain
    backward compatible with v1.4.0. The C plugin ABI is unchanged: version 1,
    with the same exported symbols.

Downloads

Platform Archive
Windows x64 ah-windows-x64.zip
Linux x64 ah-linux-x64.zip
macOS ARM64 ah-macos-arm64.zip

Each archive contains the ah executable and its executable-relative plugins/
directory. Keep them together after extraction.

Full Changelog

v1.4.0...v1.5.0