Skip to content

Releases

1.6.0-beta.0

1.6.0-beta.0 Pre-release
Pre-release

Choose a tag to compare

@geminixiang geminixiang released this 11 Nov 07:29
560e872

This minor release has breaking changes, listed under Changed and Removed. Back up the state
directory (~/.mikan) before upgrading: once this version opens it, an earlier version cannot.

Added

  • In a Slack channel, the model can hand long work to a background task, as it already could in a
    direct message: mikan acknowledges at the top level and works in that message's thread, and other
    mentions in the channel are answered meanwhile. A mention in the task thread asks for status or,
    from the requester, steers the task.
  • read resizes and converts images it could not return before: those over 2000x2000 pixels or
    4.5 MB, and formats such as BMP.

Changed

  • Upgraded Pi to 1.5.2, with all Pi packages pinned to that exact version. Pi migrates the state
    directory's storage on first start, which is what makes the upgrade one-way. A crash now loses up
    to one second of streamed text instead of 100 ms, and a task cut off five times in a row ends with
    a failure instead of staying busy.
  • The model browses with the agent-browser CLI through bash. The jev_browser tool is removed,
    and with it the desktop page's "Take control" and hand-back; the desktop still shows the sandbox.
  • Each firing of a scheduled event on Telegram and Discord runs in a new session, as on Slack.
    Before, a periodic event carried every earlier run in its context.
  • Codemode and tool_search are Pi's. A script survives a restart without rerunning the calls it
    finished, and bash resolves to { output, exitCode } inside a script.
  • Model spend by the jev tool counts toward session usage and budgets.

Removed

  • The subagent tool, its profiles in <workspace>/agents/*.md, and its progress dashboard
    (ADR 0028). A conversation does the work itself; Slack keeps background tasks for long work.
  • Memory capture, which rewrote MEMORY.md after a run (ADR 0029). The agent updates MEMORY.md
    itself during a run. Lines captured earlier stay as they are.
  • The tool loop guard, which appended a notice after repeated identical tool calls.
  • For embedders: ConversationRuntimeOptions.memoryCapture, CreateRunnerOptions.desktop,
    ConversationResponder.respondToolResult, and the ChatToolResult type. Delete the option or
    method where you pass it.

Fixed

  • /pi-login typed as a slash command in a Slack channel opened a link to the channel's shared
    vault while calling it "your vault". It now refuses and asks for a direct message, as documented.
  • A run that produced messages faster than the platform could show them lost some of them.
  • After a restart, a tool call that was running is shown again with its arguments.
  • Requests to OpenRouter no longer name Pi as the calling app.

1.5.2

Choose a tag to compare

@geminixiang geminixiang released this 11 Nov 03:24
74a6c88

Fixed

  • A clean install of 1.5.1 failed to start, because its Pi packages were declared as version ranges and a later Pi minor release removed exports mikan imports. The Pi packages are now pinned to the exact versions 1.5.1 was tested with. Nothing else changes.

1.5.1

Choose a tag to compare

@geminixiang geminixiang released this 14 Oct 08:34

What's changed

Highlights

  • Slack runs continue after a restart (ADR 0027): a reply or task that a deploy or crash interrupts now continues after the restart. mikan posts "Restarted for an update; continuing." in the conversation where the run was replying, and pi-durable continues the same turn; the model is told that the step in progress was interrupted, checks what it already did, and reruns it when that is safe. Only the conversations whose run was interrupted get the notice.
  • Faster deploys: shutdown no longer waits up to five minutes for Slack runs, because they continue after the restart. Telegram, Discord, and GitHub keep the five-minute drain.
  • codemode scripts have no default deadline, as in Pi. mikan stopped every script after 60 seconds, which cut off slow tool calls; an agent then often sent the same work again while the first attempt was still running on the other side. A script's own timeout_ms still applies.

Notable changes

  • Tasks continue the same way as other runs, without the earlier limit of two automatic resumes.
  • jev_browser with only url opens the page and returns its final URL and title.
  • jev_browser no longer refuses a call whose handOff is an empty string; an empty handOff and frame: "main" count as not given.

Upgrade steps

  • The first deploy of 1.5.1 still stops a 1.5.0 process, which waits for its runs as before; later deploys stop in about a second.
  • An interrupted tool call may run twice: the model sees that it was interrupted and decides whether to repeat it.
  • A message waiting behind a running reply, not yet started when the process stops, is lost, as before. Offices idle for more than 24 hours still abort interrupted work when next opened.

Verification

  • CI and the Slack E2E suite pass on the merged changes. Continuation was measured with a real model (5 trials per case) and run against a local Slack workspace: channel thread, channel top level, direct message, and SIGTERM, each interrupted during a 90-second command and answered after the restart.

1.5.0

Choose a tag to compare

@geminixiang geminixiang released this 13 Oct 01:13

What's changed

Highlights

  • Office desktop (/pi-desktop): a private 24-hour link to the conversation's desktop in the managed oci sandbox. Watch or use the browser the agent drives, open its tabs, DevTools, or a terminal. "Take control" pauses the agent's browser until you hand it back, and the agent can hand you a step such as signing in with jev_browser's handOff (direct messages only), which posts the step with a link and ends its turn. The desktop starts on the first link, stops with the sandbox's idle stop, and keeps the sandbox running while someone has it open.
  • mikan keeps its Slack app configured (ADR 0026): with a Slack app configuration token, every start replaces the app's configuration with the manifest of the running release, so new slash commands, scopes, and events need no edit in Slack's settings. mikan onboard can create the app, mikan slack token connects an existing one, and mikan slack set --name … --description … customizes it. When a release adds a scope, mikan DMs the token's owner a reinstall link. Without a token nothing changes.
  • Pi 1.2.0: Pi 1.2 removed an export mikan 1.4.0 imports, so a fresh install of 1.4.0 fails to start; this release works with it. Upgrade from 1.4.0 now.

Notable changes

  • A nonzero bash exit is now an error result that carries the output and the exit code, instead of a thrown error.
  • jev_browser closes only tabs it opened when it passes its three-tab limit, so tabs a person opened stay open.
  • The sandbox image adds sway, wayvnc, and foot (about 1 MB) and the mikan-desktop script.
  • mikan slack set --name also names the bot user when Slack accepts the name (letters, digits, spaces, ., _, -); other names, such as Chinese ones, keep the bot named mikan.

Removed

  • The Slack App Home tab, which listed running tasks and scheduled jobs with force-stop buttons. The manifest turns the tab off; a synced app loses it on the next start, and an app configured by hand keeps an empty tab until it is turned off in Slack's App Home settings. Use the stop command or the Admin portal to stop work.

Upgrade steps

  • The desktop needs this release's sandbox image. An office whose container still runs an older image gets it after the container idles out and is replaced.
  • Register /pi-desktop in your Slack app, or store a configuration token with mikan slack token and let mikan do it on the next start.
  • Storing a token replaces the whole app configuration: settings added by hand in Slack's pages are removed, and an app built from the agent manifest loses the agent surface. Give one token to one mikan install, because every rotation revokes the previous token.
  • Desktop links are bearer links like /session and /admin links: anyone holding one can open the desktop until it expires.

Verification

  • CI and the Slack E2E suite pass on the merged changes; acceptance evals for the desktop and for the Slack app sync ran against real containers and a real Slack app.

1.5.0-beta.0

1.5.0-beta.0 Pre-release
Pre-release

Choose a tag to compare

@geminixiang geminixiang released this 12 Oct 23:42

What's changed

Highlights

  • Office desktop (/pi-desktop): a private 24-hour link to the conversation's desktop in the managed oci sandbox. Watch or use the browser the agent drives, open its tabs, DevTools, or a terminal. "Take control" pauses the agent's browser until you hand it back, and the agent can hand you a step such as signing in with jev_browser's handOff (direct messages only), which posts the step with a link and ends its turn. The desktop starts on the first link, stops with the sandbox's idle stop, and keeps the sandbox running while someone has it open.
  • mikan keeps its Slack app configured (ADR 0026): with a Slack app configuration token, every start replaces the app's configuration with the manifest of the running release, so new slash commands, scopes, and events need no edit in Slack's settings. mikan onboard can create the app, mikan slack token connects an existing one, and mikan slack set --name … --description … customizes it. When a release adds a scope, mikan DMs the token's owner a reinstall link. Without a token nothing changes.
  • Pi 1.2.0: Pi 1.2 removed an export mikan 1.4.0 imports, so a fresh install of 1.4.0 fails to start; this release works with it.

Notable changes

  • A nonzero bash exit is now an error result that carries the output and the exit code, instead of a thrown error.
  • jev_browser closes only tabs it opened when it passes its three-tab limit, so tabs a person opened stay open.
  • The sandbox image adds sway, wayvnc, and foot (about 1 MB) and the mikan-desktop script.
  • mikan slack set --name also names the bot user when Slack accepts the name (letters, digits, spaces, ., _, -); other names, such as Chinese ones, keep the bot named mikan.

Upgrade steps

  • The desktop needs this release's sandbox image. An office whose container still runs an older image gets it after the container idles out and is replaced.
  • Register /pi-desktop in your Slack app, or store a configuration token with mikan slack token and let mikan do it on the next start.
  • Storing a token replaces the whole app configuration: settings added by hand in Slack's pages are removed, and an app built from the agent manifest loses the agent surface. Give one token to one mikan install, because every rotation revokes the previous token.
  • Desktop links are bearer links like /session and /admin links: anyone holding one can open the desktop until it expires.

Verification

  • CI and the Slack E2E suite pass on the merged changes; acceptance evals for the desktop and for the Slack app sync ran against real containers and a real Slack app.

1.4.0

Choose a tag to compare

@geminixiang geminixiang released this 11 Oct 14:44

What's changed

Highlights

  • web_fetch: the agent reads a public web page or API and checks versions, releases, and dates against the official source instead of answering from memory. HTML comes back as Markdown without navigation; long results are bounded with the full text saved in the workspace. No key needed; private, loopback, and link-local addresses are refused, including through redirects.
  • OCI sandbox on nerdctl, Podman, or Docker: mikan detects the engine (nerdctl → Podman → Docker); CONTAINER_ENGINE pins one.
  • Sandbox image follows mikan: --sandbox=oci without an image uses ghcr.io/geminixiang/mikan-sandbox:<mikan version>. mikan pulls it in the background at startup, replaces a stopped office's container when the image changed, and after any replacement removes the previous image once no container uses it, keeping an image that still has another name.

Notable changes

  • --sandbox=image:<image> is renamed --sandbox=oci:<image>. image: still works with a deprecation warning until the next major release.
  • Container tools run through Pi's pi-env daemon: operations take about 1 ms instead of 40–180 ms, and commands end when mikan disconnects. String commands use bash when available.
  • Each office with a running container keeps one <engine> exec -i client process on the host for its pi-env connection.
  • Containers get the host's time zone; the sandbox image no longer hardcodes Asia/Taipei and is about 390 MB smaller (no vim, nano, less, and similar interactive tools).

Security

  • With a vault resolver, a tool call that arrives before the conversation's environment is resolved fails instead of running on the host.
  • Container credentials travel over the pi-env connection, not command arguments or a host-side env file.

Upgrade steps

  • Existing containers are recreated once on first use. Workspace and vault mounts are kept; packages installed inside the container are not.
  • On a host running more than one container engine, mikan may switch engines; set CONTAINER_ENGINE=docker to keep Docker.
  • Replace image: with oci: in PM2 ecosystem files or start scripts, or use --sandbox=oci to follow mikan's version.
  • Deployments that reach the web only through an HTTP proxy cannot use web_fetch.

Verification

  • CI passes on the release commit; the Slack E2E suite passed on the 1.4.0-beta.0 commit.
  • 1.4.0-beta.0 ran on a production deployment: no new errors or restarts; web_fetch, the browser tool, codemode with MCP, and sandbox commands completed in real conversations.
  • web_fetch: 10 current-fact questions with a real model went from 2 correct to 10 correct.
  • Sandbox: Pi environment conformance and real-container tests pass on Docker, Podman, and nerdctl.

See CHANGELOG.md for details.

1.4.0-beta.0

1.4.0-beta.0 Pre-release
Pre-release

Choose a tag to compare

@geminixiang geminixiang released this 11 Oct 13:35

What's changed

Highlights

  • web_fetch: the agent reads a public web page or API and checks versions, releases, and dates against the official source instead of answering from memory. HTML comes back as Markdown without navigation; long results are bounded with the full text saved in the workspace. No key needed; private, loopback, and link-local addresses are refused, including through redirects.
  • OCI sandbox on nerdctl, Podman, or Docker: mikan detects the engine (nerdctl → Podman → Docker); CONTAINER_ENGINE pins one.
  • Sandbox image follows mikan: --sandbox=oci without an image uses ghcr.io/geminixiang/mikan-sandbox:<mikan version>. mikan pulls it in the background at startup, replaces a stopped office's container when the image changed, and removes the old image once unused.

Notable changes

  • --sandbox=image:<image> is renamed --sandbox=oci:<image>. image: still works with a deprecation warning until the next major release.
  • Container tools run through Pi's pi-env daemon: operations take about 1 ms instead of 40–180 ms, and commands end when mikan disconnects. String commands use bash when available.
  • Each office with a running container keeps one <engine> exec -i client process on the host for its pi-env connection.
  • Containers get the host's time zone; the sandbox image no longer hardcodes Asia/Taipei and is about 390 MB smaller (no vim, nano, less, and similar interactive tools).

Security

  • With a vault resolver, a tool call that arrives before the conversation's environment is resolved fails instead of running on the host.
  • Container credentials travel over the pi-env connection, not command arguments or a host-side env file.

Upgrade steps

  • Existing containers are recreated once on first use. Workspace and vault mounts are kept; packages installed inside the container are not.
  • On a host running more than one container engine, mikan may switch engines; set CONTAINER_ENGINE=docker to keep Docker.
  • Replace image: with oci: in PM2 ecosystem files or start scripts, or use --sandbox=oci to follow mikan's version.
  • Deployments that reach the web only through an HTTP proxy cannot use web_fetch.

Verification

  • CI and the Slack E2E suite pass on the release commit's parent.
  • web_fetch: 10 current-fact questions with a real model went from 2 correct to 10 correct.
  • Sandbox: Pi environment conformance and real-container tests pass on Docker, Podman, and nerdctl.

See CHANGELOG.md for details.

1.3.0

Choose a tag to compare

@geminixiang geminixiang released this 09 Oct 16:35

What's changed

Highlights

  • /compact [instructions] (/pi-compact in Slack) summarizes a session's older messages with pi-durable's compaction to free up context, in DMs and at a channel's top level, and reports the context size before and after. Earlier messages stay in the session history.
  • Codemode store(key, value) and load(key) keep JSON values across scripts in a conversation, as in Pi. Values survive a restart, a thread started from a run sees the values as of that run, and /new clears them.

Upgrade steps

  • Run mikan migrate after upgrading. The new step 0013-session-usage records the spend of sessions imported from 0.5.3 in pi-durable's usage ledger; the daemon does not start while it is pending.
  • Existing Slack apps must add /pi-compact to their slash commands. The example manifests include it.

Notable changes

  • MCP tool results reach the model through pi-mcp's toLlmContent, so an image embedded as a resource is passed to the model as an image.
  • Slack DM tasks are found, and their status and acknowledgement read, from pi-durable's task records instead of log.jsonl, so task status keeps working after a lost or rotated log. Task threads started before 1.1.0 are no longer recognized as tasks, and tasks started from 1.1.0 to 1.2.2 list without their acknowledgement.

Fixes

  • The Admin portal's usage views count each session's own spend: a thread started from the run that caused it no longer repeats its parent's spend. Totals now include failed attempts and compaction.
  • /new in a DM no longer waits for running background tasks or other DM threads (#158).

Verification

  • CI and the Slack E2E workflow pass for each change.
  • Each change was checked with an acceptance eval against the previous main, and on a local Slack daemon.
  • 1.3.0-beta.1 ran on a production deployment: mikan migrate completed, and /pi-compact worked in a DM.

See CHANGELOG.md for details.

1.3.0-beta.1

1.3.0-beta.1 Pre-release
Pre-release

Choose a tag to compare

@geminixiang geminixiang released this 09 Oct 16:11

What's changed

Fixes

  • mikan migrate step 0013-session-usage no longer stops with Cannot read properties of undefined (reading 'input') on an answer imported from 0.5.3 that recorded no usage, and the Admin portal's daily usage chart no longer drops a session holding one; such answers count as no spend. A partial run of the step from 1.3.0-beta.0 is safe to repeat.

Upgrade steps

Same as 1.3.0-beta.0: run mikan migrate after upgrading, and add /pi-compact to existing Slack apps.

Verification

  • CI passes; a test reproduces the failing migration with an imported answer that has no usage record.

See CHANGELOG.md for details.

1.3.0-beta.0

1.3.0-beta.0 Pre-release
Pre-release

Choose a tag to compare

@geminixiang geminixiang released this 09 Oct 15:50

What's changed

Highlights

  • /compact [instructions] (/pi-compact in Slack) summarizes a session's older messages with pi-durable's compaction to free up context, in DMs and at a channel's top level, and reports the context size before and after. Earlier messages stay in the session history.
  • Codemode store(key, value) and load(key) keep JSON values across scripts in a conversation, as in Pi. Values survive a restart, a thread started from a run sees the values as of that run, and /new clears them.

Upgrade steps

  • Run mikan migrate after upgrading. The new step 0013-session-usage records the spend of sessions imported from 0.5.3 in pi-durable's usage ledger; the daemon does not start while it is pending.
  • Existing Slack apps must add /pi-compact to their slash commands. The example manifests include it.

Notable changes

  • MCP tool results reach the model through pi-mcp's toLlmContent, so an image embedded as a resource is passed to the model as an image.
  • Slack DM tasks are found, and their status and acknowledgement read, from pi-durable's task records instead of log.jsonl, so task status keeps working after a lost or rotated log. Task threads started before 1.1.0 are no longer recognized as tasks, and tasks started from 1.1.0 to 1.2.2 list without their acknowledgement.

Fixes

  • The Admin portal's usage views count each session's own spend: a thread started from the run that caused it no longer repeats its parent's spend. Totals now include failed attempts and compaction.
  • /new in a DM no longer waits for running background tasks or other DM threads (#158).

Verification

  • CI and the Slack E2E workflow pass for each change.
  • Each change was checked with an acceptance eval against the previous main, and on a local Slack daemon.

See CHANGELOG.md for details.