Skip to content

Releases: mirasoth/flowjet

flowjet 2.1.9 — refreshed builtin skills bundle

Choose a tag to compare

@caesar0301 caesar0301 released this 27 Oct 09:41

Changed

  • Refreshed builtin skills bundle. Shipped two new research skills and
    retired a stale one: added autoresearch (an autonomous research loop with an
    orchestrator, scoring, and a security checklist) and oh-my-research (a
    structured evidence → synthesis pipeline with scripts and pattern presets),
    and removed the superseded research-bootstrap skill. The platonic-coding
    skill was reworked — its spec/IMPL/WORKFLOW references were tightened, a new
    specs-partition.md reference added, and the old coding-plan-template.md /
    impl-guide-template.md drafts dropped in favor of the consolidated template
    namespace. The top-level builtin_skills/README.md (a stale pointer) was
    removed; skills are still auto-registered via register_builtin_skill_root.

flowjet 2.1.8 — PostgreSQL checkpointer on the server surface

Choose a tag to compare

@caesar0301 caesar0301 released this 26 Oct 11:00

Fixed

  • PostgreSQL checkpointer is now wired for the server surface.
    Checkpointers.open() (the /v1/responses + ACP server path) used to warn
    “Checkpointer backend 'postgresql' is not wired for the flowjet server surface
    yet” and yield None, so thread state never survived a turn — a deployment
    whose persistence.default_backend is postgresql silently ran every turn as
    a fresh conversation. It now builds an AsyncPostgresSaver on nano's shared
    checkpoints pool (resolve_checkpointer() → (None, pool)), opens the pool,
    and runs setup() once per process under nano's advisory lock
    (SharedCheckpointerPool.setup_checkpointer), so concurrent workers cannot
    race LangGraph's DDL. The shared pool is deliberately not closed on exit
    (it is process-wide). Failure still degrades to “no persistence” with a
    warning instead of failing startup; unknown backends keep the old behavior.

flowjet 2.1.7 — configurable workspace watched subdirs + drop personal byline

Choose a tag to compare

@caesar0301 caesar0301 released this 24 Oct 16:25

Added

  • Configurable workspace watched subdirectories. A new
    workspace_watched_subdirs setting (env FLOWJET_WORKSPACE_WATCHED_SUBDIRS,
    comma-separated) flows from Settings →
    SyncAwareWorkspaceResolver(watched_subdirs=...) → WorkspaceManager, which
    pre-creates the configured subtrees at workspace open and wires them into the
    DirtyTracker. None/empty keeps the engine defaults (input/working/output)
    — behavior unchanged — and unsafe entries fail loud at workspace open rather
    than silently dropping sync coverage.

Changed

  • Default identity no longer carries a personal creator byline.
    FLOWJET_CREATOR is now empty (the soothe identity renderer omits
    "invented by {creator}" when the creator is blank) and
    FLOWJET_IDENTITY_FRAGMENT drops the byline lines, so identity answers name
    only ({assistant_name}). The vendor denylist (incl. Soothe/soothe-nano) is
    unchanged. Explicit agent.assistant_identity in deployment config still wins
    (e.g. MiraCloud branding).
  • Soothe dependency pin raised to >=1.2.3,<2.0.0 to match the coordinated
    release.

flowjet 2.1.6 — ArcBox sandbox survives recycles, crashes and restarts

Choose a tag to compare

@caesar0301 caesar0301 released this 24 Oct 11:32

Fixed

  • ArcBox tool sandboxes stay usable across recycles, crashes and restarts.
    The manager trusted its in-memory lease map, and the agent graph pinned its
    sandbox id at build time, so a guest that died behind a still-ready daemon
    record (host sleep, idle recycle, daemon restart) left the worker talking to a
    corpse: every file/shell tool failed and the agent reported an empty
    workspace even though the host tree was fully staged. open_workspace now
    probes readiness once per turn — a control-plane info() tier that catches a
    record outliving its VM plus terminal states, then a guest round-trip that
    catches a wedged guest — and kills, drops and replaces a lease that fails.
    Every new guest, whether spawned or adopted, is seeded from the host
    workspace, and in-flight run counts carry over so peer open/close pairs stay
    balanced. The agent cache key is now workspace + sandbox id, so a respawn
    rebuilds the graph against the live guest.
  • Crash and restart recovery. VMs are created with a labelled orphan
    deadline (idle_timeout + on_idle=kill) that the reaper re-arms every 60 s,
    so a process that dies leaves nothing behind — the daemon reaps it, with no
    cross-process coordination and no startup kill-list. On first use the manager
    scans owner-scoped sandboxes and adopts a surviving VM, pulling guest state to
    the host before pushing (recovering a crashed turn's artifacts) instead of
    spawning a duplicate; a failed create reconnects the client and retries once.
  • Every control-plane RPC is bounded (kill/set_lifecycle 15 s, connect
    by connect_timeout). The SDK's per-RPC deadline is opt-in and was
    unconfigured: one wedged call stalled the reaper loop, and a stalled heartbeat
    reads to the daemon exactly like a dead owner — which gets healthy, in-use VMs
    reaped at their deadlines.

Changed

  • sandbox.orphan_timeout_seconds defaults to max(900, 3 × idle_timeout_seconds)
    instead of a fixed 900, and an explicit value is validated only when the
    sandbox is enabled — existing configs keep parsing unchanged. New keys:
    recover_orphans (adopt surviving VMs after a restart) and owner (label
    namespace, env FLOWJET_SANDBOX_OWNER) so planes sharing one ArcBox daemon
    never adopt or reap each other's sandboxes. See RFC-005 §5.1/§5.2.

v2.1.5

Choose a tag to compare

@caesar0301 caesar0301 released this 23 Oct 17:09

Fixed

  • ask_user pauses render as Markdown on ACP/UI hosts. A clarification turn's reply reused the CLI terminal block (space-indented ⏸ Paused for input: followed by • option lines); Markdown-rendering hosts collapse the indentation, so the pause and its options displayed as one run-on paragraph. The ACP path now emits bold heading + bold question + - **label** — description bullets (Q1:/Q2: numbering for multiple questions, (Recommended) → ★ kept). The CLI keeps the plain-text block.

flowjet 2.1.4

Choose a tag to compare

@caesar0301 caesar0301 released this 23 Oct 15:54

Added

  • Resumable ask_user pauses via shared thread-state checkpointer. The server now persists agent thread state (LangGraph checkpoint) to a shared SQLite database (WAL mode + busy_timeout) so that ask_user pauses survive pool-worker switches and server restarts. A second turn on the same session resumes the paused interrupt and delivers the user's input text as the answer. The server_checkpointer setting (auto by default, off for legacy stateless behavior) controls the policy end-to-end.

Changed

  • CI now enforces mypy type compliance. A make typecheck (mypy) gate was added to the CI pipeline, and type annotations were fixed across the CLI, core, and server packages to achieve full compliance.

flowjet 2.1.3 — every failure path surfaces a message

Choose a tag to compare

@caesar0301 caesar0301 released this 23 Oct 13:07

Fixed

  • CLI: every failure path now surfaces a message — no more silent exits.
    The CLI could exit with no output (SIGTERM/SIGHUP, plugin sys.exit, broken
    pipes, empty answers) and destroyed the original error stack even with -v.
    This closes every identified gap in the error-to-output flow:

    • RunFailed now carries exc_type + traceback; stream_query raises
      AgentRunError so the CLI reports the real exception type and, with -v,
      the original in-run stack instead of a re-raise site.
    • SIGTERM/SIGHUP cancel the run gracefully: "interrupted by SIGTERM" with
      conventional 128+signal exit codes (was: instant silent death).
    • Empty-answer runs warn on stderr ("agent produced no output · N tool calls
      failed · last tool error") and exit 3.
    • Partial narration is flushed to stderr before any failure/timeout/interrupt
      message — a provider drop no longer loses the whole answer.
    • --timeout SECONDS cancels a stuck run, reporting the last activity.
    • FJ_LOG_FILE=<path> keeps WARNING+ with full tracebacks in a rotating log
      for post-mortem diagnosis (incl. logger.exception from plugins).
    • Multi-line errors truncated to one line now hint "run with -v".
    • BrokenPipeError: exit 141 with a message; shutdown flush noise silenced
      via devnull dup2 (fj q | head).
    • Teardown suppresses CancelledError so it cannot mask the real result.
    • Server parity: pool worker_error, OpenAI-compatible and ACP failures
      populate/render exc_type + traceback (ACP shows "Error: : ").
    • Minor: thread-snapshot check failures are logged; config-load errors
      honor -v with a traceback; plugin sys.exit(0) still fails loudly.

Changed

  • ArcBox tool sandbox: guest network is now off by default
    (sandbox.network defaults to false, was true). With true the guest is
    NAT'ed through the ArcBox host and the daemon only knows ENABLED|NONE, so
    everything the host can route to — internal network and corporate VPN
    included — was reachable from agent shell commands. With false the guest
    boots without a network device (no route, no DNS): shell/code execution can
    reach neither the public internet nor internal services. Web search/crawl is
    unaffected — web_search/fetch_url are host-placement tools and never run
    in the guest. Opt back in per deployment (sandbox.network: true in the
    nano.yml) when the guest really needs egress.

Full changelog: https://github.com/mirasoth/flowjet/blob/main/CHANGELOG.md

flowjet 2.1.2 — upgrade soothe to 1.2.1

Choose a tag to compare

@caesar0301 caesar0301 released this 21 Oct 15:04

Changed

  • Bump soothe to 1.2.1. The runtime dependency floor moves from >=1.2.0 to >=1.2.1,<2.0.0 to track the upstream fix release. No flowjet API or behavior changes; the locked dependency set is otherwise unchanged.

Verification: All 493 unit + 230 server tests pass; ruff lint/format clean. make build produces flowjet-2.1.2 wheel + sdist; twine check passes. Wheel metadata confirms Requires-Dist: soothe<2.0.0,>=1.2.1.

flowjet 2.1.1 — ACP ask_user surfacing + transitive arcbox

Choose a tag to compare

@caesar0301 caesar0301 released this 21 Oct 10:08

Highlights

  • ACP clarification turns no longer end empty. When the agent paused with ask_user questions over ACP, the questions were only surfaced as an intermediate agent thought — but hosts accumulate message chunks as the turn's reply, so a clarification turn ended with no content at all. The ACP agent now also emits the questions block as a message chunk (rendered via format_questions_block), so the user sees the questions in the host's reply surface and answers there.
  • format_questions_block supports non-CLI hosts. The resume footer ("Resume with: fjf -t ") was hardcoded for the CLI. ACP and other non-CLI hosts now pass resume_hint="" to omit the CLI-specific footer; the user answers in the host's own input surface. The CLI path is unchanged.
  • Drop the direct arcbox dependency from the server extra. The arcbox SDK ships transitively via soothe-nano (a dependency of soothe), so the explicit arcbox>=0.1.0 pin was redundant and could drift out of sync. The sandbox import error message is updated to point at the transitive path.

Full changelog: https://github.com/mirasoth/flowjet/blob/v2.1.1/CHANGELOG.md

flowjet 2.1.0 — core restructure + ArcBox tool sandbox (RFC-005)

Choose a tag to compare

@caesar0301 caesar0301 released this 18 Oct 14:44

Highlights

  • flowjet.core layout restructure. Runtime-protocol package regrouped by responsibility (runtime/, sandbox/, agent/, streaming/, bridges/); duplicated nano/soothe adapter lifecycle collapsed into AgentAdapterBase + IsolatingBackendBuilder; InteractionMode.from_metadata() is the single request-mode parser. Behavior unchanged.
  • ArcBox tool sandbox (RFC-005). Tool calls (shell + workspace file ops) run inside a per-workspace ArcBox Linux microVM via soothe-nano 2.0's ArcBoxBackend. Host workspace stays the integration point via SandboxAwareWorkspaceResolver (host→guest at open, guest→host at close, skipping unchanged files).
  • Dynamic max_sandboxes compute-sizing. None = 70% of CPU / vcpus (min 8); 0 = unlimited (no LRU eviction); env overrides FLOWJET_SANDBOX_MAX and FLOWJET_SANDBOX_MAX_PERCENT.
  • Removed whole-worker arcbox isolation (FLOWJET_ISOLATION_MODE=arcbox and all FLOWJET_ARCBOX_* settings) — superseded by the tool sandbox; thread pool is the only isolation pool.

Full changelog: https://github.com/mirasoth/flowjet/blob/v2.1.0/CHANGELOG.md