Skip to content

Releases: cnmoro/rupi

v0.12.0

Choose a tag to compare

@github-actions github-actions released this 13 Sep 02:51
feat: let an agent start other agents, and bound what that can do

"Spawn two subagents for adversarial review" had no answer before this: the
system prompt never mentioned that the binary can run another agent, and there
was no way to run one that returns an answer a caller can read.

One shot
- `-p "<task>"` runs one prompt and prints the final answer to stdout, nothing
  else, so it can be read out of a pipe. Exit 0 with an answer, 1 with the
  reason on stderr, 2 for an empty prompt, 3 when the agent limit refused it.
- The answer is the last assistant message that carries no tool calls. Taking
  the last assistant message reported tool narration — "inspecting the parser" —
  as a finished answer with exit 0 when a run failed after a tool call.
- A turn that did not finish fails instead of printing what it had. A stalled
  stream, a cut stream, a token limit, an abort and a cancellation are all
  fragments, and a caller reading stdout cannot tell a short answer from half
  of one.
- `--list-sessions` and `--list-opencode-models` no longer pre-empt a prompt.

Cut streams
- A stream that ends with no `[DONE]` and no finish reason was cut off, and now
  says so: the turn ends as `truncated`, keeping the partial text. It used to be
  indistinguishable from a completed answer, so a dropped connection handed back
  half a sentence and every exit code said success. Measured: a socket closed
  mid-generation returned "partial thought that got cut off before", exit 0.

Subagents in the system prompt
- The agent is told how to start another with this binary's real path, how to
  run several at once, how to quote a task, what a failure looks like, and when
  not to bother. The bash ceiling and the agent limit are stated from the values
  actually in force.

Bounding it
- Every process the bash tool starts carries `RUPI_SUBAGENT=1`, and a starting
  agent also looks for a copy of itself among its parents. The marker alone was
  advisory: `env -i` stripped it and the grandchild was told it could start
  agents of its own, two levels deep and unaware.
- `--max-agents` (default 12, `RUPI_MAX_AGENTS`) refuses a start beyond that
  many live processes of the same binary. Prompt text is not a limit. Measured
  with a provider that made every agent start another: the chain stopped at 12.

511 tests.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TrSm1KU4eXBomuonnfDaRb

v0.11.0

Choose a tag to compare

@github-actions github-actions released this 12 Sep 23:14
fix: close what five adversarial reviews proved, and what the fixes b…

v0.10.2

Choose a tag to compare

@github-actions github-actions released this 12 Sep 21:18
v0.10.2 — compaction replay, descendant kill, index staleness

v0.10.0

Choose a tag to compare

@github-actions github-actions released this 12 Sep 20:18
v0.10.0 — close the defects found by eleven adversarial reviews

v0.9.0

Choose a tag to compare

@github-actions github-actions released this 12 Sep 16:35
v0.9.0 — action fusion, spill hardening, checkpoint validation

v0.8.2

Choose a tag to compare

@github-actions github-actions released this 06 Sep 23:32
Release v0.8.2: runtime reliability, incremental search, and live-pro…

v0.8.1

Choose a tag to compare

@github-actions github-actions released this 18 Aug 18:38
v0.8.1 — task anchor, cache-aligned compaction, goal rounds, todo, sp…

v0.7.24

Choose a tag to compare

@github-actions github-actions released this 21 Jul 19:04
perf: aggressive KV cache optimizations

- Pre-allocate messages_for_api Vec with exact capacity to avoid realloc
- Cache serialized tool definitions in OpenAIProvider (serialize once at
  construction, clone for each request instead of rebuilding)
- Add cache_control {"type": "ephemeral"} annotation to system
  ChatMessage so compatible servers (vLLM, llama.cpp, etc.) explicitly
  cache the KV state for the system prompt and all preceding messages
- Cap tool results at 4000 chars when storing in conversation history,
  keeping first ~70% + last ~30% with truncation marker. Full results
  still go to the event stream; only the stored copy is bounded.
  This reduces per-turn prefill work by preventing huge file reads
  from bloating every subsequent KV cache computation.

v0.7.23

Choose a tag to compare

@github-actions github-actions released this 21 Jul 18:59
chore: bump to v0.7.23

v0.7.22

Choose a tag to compare

@github-actions github-actions released this 15 Jun 14:48
feat: tree-sitter AST-aware chunking for code search

Replace line-based chunking with tree-sitter AST parsing (like seemb).
Chunks are now syntactically meaningful: whole functions, classes, structs.
10 languages supported: rust, python, javascript, typescript, go, c, cpp,
java, ruby, c-sharp. Falls back to line-based for unsupported languages.

Bump version to 0.2.0.