Repository navigation
Releases: mirasoth/flowjet
Releases · mirasoth/flowjet
Release list
flowjet 2.1.9 — refreshed builtin skills bundle
Changed
- Refreshed builtin skills bundle. Shipped two new research skills and
retired a stale one: addedautoresearch(an autonomous research loop with an
orchestrator, scoring, and a security checklist) andoh-my-research(a
structured evidence → synthesis pipeline with scripts and pattern presets),
and removed the supersededresearch-bootstrapskill. Theplatonic-coding
skill was reworked — its spec/IMPL/WORKFLOW references were tightened, a new
specs-partition.mdreference added, and the oldcoding-plan-template.md/
impl-guide-template.mddrafts dropped in favor of the consolidated template
namespace. The top-levelbuiltin_skills/README.md(a stale pointer) was
removed; skills are still auto-registered viaregister_builtin_skill_root.
flowjet 2.1.8 — PostgreSQL checkpointer on the server surface
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 yieldNone, so thread state never survived a turn — a deployment
whosepersistence.default_backendispostgresqlsilently ran every turn as
a fresh conversation. It now builds anAsyncPostgresSaveron nano's shared
checkpoints pool (resolve_checkpointer()→(None, pool)), opens the pool,
and runssetup()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
Added
- Configurable workspace watched subdirectories. A new
workspace_watched_subdirssetting (envFLOWJET_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_CREATORis now empty (the soothe identity renderer omits
"invented by {creator}" when the creator is blank) and
FLOWJET_IDENTITY_FRAGMENTdrops the byline lines, so identity answers name
only ({assistant_name}). The vendor denylist (incl. Soothe/soothe-nano) is
unchanged. Explicitagent.assistant_identityin deployment config still wins
(e.g. MiraCloud branding). - Soothe dependency pin raised to
>=1.2.3,<2.0.0to match the coordinated
release.
flowjet 2.1.6 — ArcBox sandbox survives recycles, crashes and restarts
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-readydaemon
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_workspacenow
probes readiness once per turn — a control-planeinfo()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_lifecycle15 s,connect
byconnect_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_secondsdefaults tomax(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) andowner(label
namespace, envFLOWJET_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
Fixed
ask_userpauses render as Markdown on ACP/UI hosts. A clarification turn's reply reused the CLI terminal block (space-indented⏸ Paused for input:followed by• optionlines); 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** — descriptionbullets (Q1:/Q2: numbering for multiple questions,(Recommended)→ ★ kept). The CLI keeps the plain-text block.
flowjet 2.1.4
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
Fixed
-
CLI: every failure path now surfaces a message — no more silent exits.
The CLI could exit with no output (SIGTERM/SIGHUP, pluginsys.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:RunFailednow carriesexc_type+ traceback;stream_queryraises
AgentRunErrorso 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
conventional128+signalexit 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 SECONDScancels 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.exceptionfrom plugins).- Multi-line errors truncated to one line now hint "run with -v".
BrokenPipeError: exit 141 with a message; shutdown flush noise silenced
viadevnulldup2 (fj q | head).- Teardown suppresses
CancelledErrorso it cannot mask the real result. - Server parity: pool
worker_error, OpenAI-compatible and ACP failures
populate/renderexc_type+ traceback (ACP shows "Error: : "). - Minor: thread-snapshot check failures are logged; config-load errors
honor-vwith a traceback; pluginsys.exit(0)still fails loudly.
Changed
- ArcBox tool sandbox: guest network is now off by default
(sandbox.networkdefaults tofalse, wastrue). Withtruethe 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. Withfalsethe 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_urlare host-placement tools and never run
in the guest. Opt back in per deployment (sandbox.network: truein 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
Changed
- Bump
sootheto 1.2.1. The runtime dependency floor moves from>=1.2.0to>=1.2.1,<2.0.0to 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
Highlights
- ACP clarification turns no longer end empty. When the agent paused with
ask_userquestions 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 viaformat_questions_block), so the user sees the questions in the host's reply surface and answers there. format_questions_blocksupports non-CLI hosts. The resume footer ("Resume with: fjf -t ") was hardcoded for the CLI. ACP and other non-CLI hosts now passresume_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
arcboxdependency from theserverextra. The arcbox SDK ships transitively via soothe-nano (a dependency of soothe), so the explicitarcbox>=0.1.0pin 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)
Highlights
flowjet.corelayout restructure. Runtime-protocol package regrouped by responsibility (runtime/, sandbox/, agent/, streaming/, bridges/); duplicated nano/soothe adapter lifecycle collapsed intoAgentAdapterBase+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 viaSandboxAwareWorkspaceResolver(host→guest at open, guest→host at close, skipping unchanged files). - Dynamic
max_sandboxescompute-sizing.None= 70% of CPU / vcpus (min 8);0= unlimited (no LRU eviction); env overridesFLOWJET_SANDBOX_MAXandFLOWJET_SANDBOX_MAX_PERCENT. - Removed whole-worker arcbox isolation (
FLOWJET_ISOLATION_MODE=arcboxand allFLOWJET_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