• v2.3.0 7f199f58ae

    v2.3.0 Stable

    github-actions[bot] released this 2026-07-29 13:13:06 -07:00 | 3 commits to main since this release

    Kaimon v2.3.0

    Diff since v2.2.0

    Kaimon 2.3.0

    Custom system images for managed sessions, a fix for restarts losing the gate
    when Julia was launched with a separated --sysimage flag, and two silent-data
    bugs: per-project launch config and session preferences were being dropped on
    load, and a clean shutdown ended in a stack trace.

    Requires Tachikoma 2.5 and bundles KaimonGate 1.2.

    Custom system images and launch config (#69)

    A project with a custom sysimage can now declare it, so a session Kaimon spawns
    boots the same way you start the project by hand instead of paying full
    compilation cost. LaunchConfig gains sysimage, julia_bin (a Julia binary,
    or a wrapper script that forwards its arguments to one), and startup_file
    (~/.julia/config/startup.jl was previously suppressed unconditionally).

    There are two places to set it. Per user, in projects.json — editable from the
    TUI Config tab, select a project and press e:

    "launch_config": { "sysimage": "MyProject-image.so", "heap_size_hint": "8G" }
    

    Or per project, checked into the repo, in the project's own kaimon.toml, so
    everyone working on it gets the same launch recipe with no local setup:

    [launch]
    sysimage = "MyProject-image.so"   # relative → resolved against the project root
    threads = "auto"
    

    The user's entry is overlaid field-wise on the project's, so a single field can
    be overridden locally while the rest is inherited. A configured sysimage that
    isn't on disk is logged and skipped — the session still starts, on the default
    image. Thanks to @ufechner7 for the report.

    Fix: restarting a REPL launched with --sysimage <path> (#69)

    Restarting a REPL you started yourself replays its original launch flags, so a
    custom sysimage, thread count, and heap hint survive. But the check for "was
    this launched with a script?" didn't know which flags take a value as a separate
    token, so the path in julia --sysimage /path/sys.so looked like a script
    argument. The restart then took the verbatim-replay branch and re-exec'd a plain
    interactive REPL that never called serve() — the session didn't come back at
    all. The attached forms (-J/path, --sysimage=/path) were unaffected.

    Value-taking flags are now recognized as a shared set, and -e/-E/-L are
    explicit user-code triggers rather than a side effect of the path check.

    Fix: launch config and session preferences were silently discarded

    Nested JSON objects parse as JSON.Object, which is an AbstractDict but not a
    Dict — and both projects.json readers guarded on isa Dict. Every
    per-project launch_config (threads, GC threads, heap hint, extra flags) and
    every persisted mirror_repl / allow_restart preference was dropped on load
    and silently replaced with defaults.

    Fix: clean shutdown no longer ends in a stack trace

    The managed-Qdrant atexit reaper read its child's pid after terminating it,
    to decide whether the PID file was its own. getpid throws ESRCH on a handle
    whose process has exited and been reaped — the expected state at that point — so
    the error escaped atexit on every clean exit.

    Downloads