Skip to content

Releases: vincemakes/kiso

kiso 0.51.1

Choose a tag to compare

@vincemakes vincemakes released this 22 Oct 07:51

A patch release for one bug.

Fixed: a session lock left by a killed process that had the same pid as the next one is taken over instead of refused for ever (#333). In a container node is pid 1, so after a SIGKILL (an OOM kill, docker rm -f) the next container on the same volume read the old lock as "another store in this process" and every later message on that session failed with "locked by another writer". The process now keeps the tokens its live lock handles hold; a lock naming this pid with a token it never issued is a previous process's and is taken over like a dead holder. No protocol change, no change to the lock file format, no kernel change.

Not fixed: a dead holder whose pid is alive in the new pid namespace as an unrelated process (a pid other than 1). That needs a lease or a boot identity.

Tests: the probe cases in state-probe-lock.test.ts now hold the lock with a sleep process (a cold node start timed out under load).

17 packages, all at 0.51.1.

kiso 0.51.0

Choose a tag to compare

@vincemakes vincemakes released this 20 Oct 11:04

kiso 0.51.0

A model-table release, plus one new SDK seam. The table now knows the 2026-10 models and the effort levels of the gateways that serve them, a host can choose what a checkpoint records, and two small terminal fixes.

  • Host-defined checkpoint sections (contextPolicy.checkpointSections, ADR-0055 Amendment 3). A static list of { heading, instruction } replaces the coding outline in every checkpoint a session writes: the run-start summary, the in-run tiers, and the manual compact. Every listed heading must appear as its own ## line or the checkpoint is rejected on the existing route (serialized retry, then the breaker). Kiso keeps the mechanics: when a checkpoint is written, its boundary, validation and retries. Absent, the coding outline of 0.50.1 is used byte for byte; the kiso CLI never sets the field.
  • The model table. First-party rows for claude-opus-5-5, claude-sonnet-5-5, claude-haiku-5-5, gpt-6.1-sol, gpt-6-sol and gpt-6-luna; OpenRouter route rows generated from the list (never a default, no price); Command Code rows from a live probe, with none sent as off (the gateway refuses none). A gateway or a model newer than the table no longer resolves to the default only, so the effort picker appears. Effort, price and max output are facts about a route and have no fallback by model identity; only the context window does.
  • A profile can declare its own effort levels (models.<name>.effort { levels, default?, values? } in the user config), for a route the table does not cover; shown as levels declared in your profile. See docs/configuration.md.
  • Headings in the theme gold. ## headings in rendered markdown are gold; inline code stays blue, so the two no longer look alike.
  • One decode rate on screen. The working row no longer repeats the tok/s the status row shows.

For hosts

  • Observable:
    • AgentDefinition.contextPolicy.checkpointSections and SessionConfig.contextPolicy.checkpointSections (new, optional); the root exports DEFAULT_CHECKPOINT_SECTIONS and the type CheckpointSection (the public surface goes from 42 to 44 names);
    • the list is validated and copied when an agent (or a directly built session) is constructed; an invalid list throws Invalid contextPolicy.checkpointSections: ... at that point; later edits to your array change nothing;
    • passing DEFAULT_CHECKPOINT_SECTIONS explicitly takes the custom path (one added rule: a section with nothing to record says so, and every-section validation), not the 0.50.1 default;
    • ModelMetadata rows gain an optional effort.values (a wire-spelling map).
  • Tool schemas and descriptions: byte-identical to 0.50.1; the first request is unchanged.
  • Packages: 4 of the 17 differ beyond package.json: kiso-runtime, kiso-code, kiso-tui, kiso-tui-cells. kiso-core is byte-identical to 0.50.1.
  • Action required: none.

The release gate

Against the published 0.50.1, on the mini:

  • The first request: identical bytes and tokens (delta 0), in the probe and in all 6 paired sets.
  • T6 paired, 6 pairs: PASS, verify on both arms in every pair; median cost −6.0%, median wall −7.5% (one anomaly note: pair 6, +69.8%).
  • The smoke: every gate; 27,632.0 over 32 requests.
  • The full check: CI on the release commit, green. On the workstation the same check exited 1 once, on one timeout (apps/cli/tests/at-files.test.ts, 13.7 s against a 5 s limit, while another process held the machine at load 6); the file passes alone in 322 ms.
  • T3 and T5 were not run (the request bytes the coding agent sends did not change); two instrument faults in the T6 run are recorded in the kit.

kiso 0.50.1

Choose a tag to compare

@vincemakes vincemakes released this 15 Oct 08:20

kiso 0.50.1

A patch for 0.50.0's foreground ceiling. A kiso -p run keeps the wait the model asked for, a background task reports how long it really ran, and a wait cut short at the ceiling says so.

  • No foreground ceiling under kiso -p (ADR-0058 Amendment 16). A -p run has nobody watching and stops its tasks when it ends, so 0.50.0's five-minute ceiling could promote a long check and then stop it with the turn. Under -p the model's own foregroundMs is kept again. The interactive CLI, the library default and every host are unchanged.
  • A promoted task's runtime counts from the command's start. task_stop, the end notice and /tasks now include the foreground part: a task promoted at 60 s and stopped at once reads "it ran 63.1s", where 0.50.0 said about 3 s.
  • A wait cut at the ceiling says so. The shell result adds (the limit; you asked N ms), and the terminal draws one TASK row: t3 · moved to the background at the 5m limit · asked 6m 40s.

For hosts

  • Observable:
    • kiso -p passes limits.maxForegroundMs: 0; a host that embeds the runtime sets its own;
    • a promoted task's reported runtime includes its foreground part;
    • a promotion at the ceiling of a longer asked wait adds (the limit; you asked N ms) to the shell result (re-check any host that parses it).
  • Tool schemas and descriptions: byte-identical to 0.50.0; the first request is unchanged.
  • Packages: 3 of the 17 differ beyond package.json: kiso-code, kiso-runtime, kiso-tools-node. kiso-core is byte-identical to 0.50.0.
  • Action required: none.

The release gate

Against the published 0.50.0, on the mini:

  • The first request: identical bytes and tokens (delta 0), in the probe and in all 32 paired sets.
  • T3 paired, 16 pairs: PASS.
  • T5 paired, 16 pairs (informational): median cost −4.1%, median wall +1.9%. One verify miss on each arm, the same task ambiguity on both; not the change.
  • The kill -9 demo: pass. The smoke: every gate.
  • The full check: 4,420 tests.
  • A Terminal-Bench reproduction (3 attempts, report-only): 1/3; both misses are an answer-form fault unrelated to the change, and no command ran past five minutes.

kiso 0.50.0

Choose a tag to compare

@vincemakes vincemakes released this 15 Oct 01:36

kiso 0.50.0

Tools that recover less and say what happened. A model that names a file by its absolute path inside the workspace is no longer refused. A refused edit says that nothing was written. A long foreground command moves to the background at five minutes. The base prompt is the leaner P1.3, and the edit tools no longer ask the model for a revision. The first request is 81 tokens smaller than 0.49.0's.

  • An absolute path inside the workspace is admitted. read_file, write_file, edit_file, list_dir and search_text take it as the relative path it names. The usual checks still apply: .., symlinks and protected files. A path outside the workspace is still refused, and the refusal names the workspace root. On a 17-task regression this removed every in-workspace refusal (19 → 0), with no task lost.
  • A refused edit batch says nothing was written: (hunk 2, matched after hunk 1) — nothing was written, <path> is unchanged. The old "after hunk 1 applied" read as if hunk 1 had landed.
  • The overwrite refusal names its requirement. To replace a file, read the whole file first (a ranged read is not enough), or change part of it with edit_file.
  • The foreground wait has a ceiling (ADR-0058 Amendment 15). A command still running after five minutes continues as a background task. It is never killed, and the model is notified when it ends. Waits under five minutes are unchanged.
  • The P1.3 prompt and the observed revision. The base prompt states scope, evidence and stopping once. With the CLI's binding, edit_file and write_file no longer take expectedRevision: the revision the model last saw is bound for it, and an unseen file is refused.
  • Skills:
    • read_skill reads a skill's own files;
    • a broken skill's diagnostics stay out of the model's prompt;
    • the skills index fits in 3,000 characters and never drops a name.
  • The terminal: a command that changed something leaves a labelled row, MODEL first.

For hosts

  • New optional:
    • WorkspaceToolsOptions.limits.maxForegroundMs: default 300,000; 0 keeps the model's value;
    • WorkspaceToolsOptions.observedRevision: when supplied, the edit and write schemas drop expectedRevision and the host binds the observed revision.
  • Observable:
    • absolute in-workspace paths are admitted;
    • a foreground wait over five minutes promotes at five;
    • the overwrite and batch refusal texts changed (re-check any host that parses them);
    • the P1.3 base prompt;
    • the skills index budget.
  • Packages: 5 of the 17 differ beyond package.json: kiso-code, kiso-tools-node, kiso-tui, kiso-tui-cells, kiso-skills-ext. kiso-core and kiso-runtime are byte-identical to 0.49.0.
  • Action required: none.

The release gate

Against the published 0.49.0, on the mini:

  • T3 and T5 paired: 16 pairs each, both PASS. The first request is 81 tokens smaller in 32/32 pairs.
  • The chain test: every candidate leg passes.
  • The writers' adoption path: 3/4. The miss had a complete handoff, and the parent applied the patch without apply-patch.
  • The kill -9 demo: 2/2.
  • The smoke: 14/14.
  • The full check: 4,417 tests.
  • The published tarballs: byte-identical to the gated set, and the read path matches 17/17 (sha512).

kiso 0.49.0

Choose a tag to compare

@vincemakes vincemakes released this 10 Oct 07:33

kiso 0.49.0

Subagents that do not block, and a tool surface that costs less. A delegated reader no longer holds your session for minutes; a writer works in its own isolated copy and you adopt its patch with one command; a child agent runs on the model you picked. The first request is 282 tokens smaller than 0.48.0's.

  • The bounded join (ADR-0058 Amendment 13): explorers and reviewers always run in the background under a turn budget, and their result arrives as a task notice.
  • Writers (Amendment 14): a background implementer in an isolated workspace; the parent collects its patch and adopts it with kiso apply-patch, with a crash-honest record of the adoption. A writer's turn budget defaults to 128 requests.
  • A child follows your model (the child contract): the task, then subagents.model, then the conversation's current profile, then the environment. The delegation config now reaches the subagent extension before it loads.
  • edit_file takes oldText / newText (ADR-0061), so the model no longer writes search and replace the wrong way round.
  • The tool descriptions say each fact once: delegate −691 B, edit_file −77 B, shell −75 B on the bench's profile.
  • A spent chain budget is said everywhere: to the model on a subagent group's end too, and once to you as a chain budget spent row.
  • The unknown-window fallback is 200K again.

For hosts

  • Action required: none for a host that passes its delegation config through the CLI's path. A host that built the subagent extension itself and read its config at load time should make sure the config exists before the extension loads.
  • Observable: reader delegations return at once and report through a task notice; writer delegations return a handoff and the patch is adopted with apply-patch; a child's model follows the precedence above; edit_file's parameters are oldText / newText; the tool descriptions are shorter; a spent chain budget reaches the model on a group's end and the person once; the unknown-window fallback is 200K. 8 of the 17 packages differ beyond package.json (kiso-ask-ext, kiso-code, kiso-runtime, kiso-skills-ext, kiso-subagent-ext, kiso-tools-node, kiso-tui, kiso-tui-cells); kiso-core is byte-identical to 0.48.0.
  • New optional: onBudgetSpent on useTasks; writer delegation and apply-patch; subagents.model (per role); writerMaxTurns.

The release gate — T3 and T5 paired against 0.48.0 (16 pairs each, both PASS, the first request 282 tokens smaller in 32/32 pairs), the chain budget's two-round test, the writers' adoption path (4/4), the kill -9 demo (2/2), the full check and a live sol session — is summarised in the release report.

kiso 0.48.0

Choose a tag to compare

@vincemakes vincemakes released this 09 Oct 14:00

kiso 0.48.0

Background work can keep the agent moving. A task the agent starts while it is answering a wake now wakes it again when it ends — two rounds of background subagents run to the end without you. A chain budget bounds it: up to 20 autonomous wakes after each message of yours (maxWakes); past that, a task's end becomes a notice that waits for you.

  • The chain budget (#245, #271; ADR-0058 Amendment 9) replaces 0.47's one-wake guard. An experimental wait tool from the same work was withdrawn before release: tasks already cover it.
  • A refused tool call names the argument it refused (#262), so the model drops the right one instead of guessing.
  • A task stopped right after it starts always leaves its record (#270): the task runner handles TERM from its first act.
  • The shell's foreground wait has a 60 s floor when tasks are wired (#290): a shorter wait only pushed a command to the background sooner.
  • Budgeted walks never starve a shallow file (#291): list_dir globs and search_text on deep trees return shallow files first (a 0.47.2 regression).
  • gpt-6.1-sol on the ChatGPT subscription (#292): requests carry your remembered reasoning level with summary: "auto", and thinking summaries arrive.
  • The trace's rent ledger counts what the first request carries (#266).

For hosts

  • Action required: a host that relied on a task's end waking the session at most once per person message now gets up to 20. Keep one with session.useTasks(manager, { maxWakes: 1 }), or "maxWakes": 1 in the CLI config.
  • Observable: task wakes chain up to maxWakes (default 20); a refused call names the undeclared argument; with tasks wired, a foreground wait under 60 s is raised to 60 s; a task stopped at once leaves its terminal record; budgeted walks return shallow files first; gpt-6.1-sol requests carry reasoning; the trace rent ledger gains a system:tools row. Four packages differ beyond package.json: kiso-core, kiso-runtime, kiso-tools-node, kiso-code.
  • New optional: useTasks(manager, { maxWakes }) / config maxWakes; limits.minForegroundMs in kiso-tools-node (default 60 s; 0 keeps the model's value).

Request bytes are unchanged from 0.47.3 on a pipe, a terminal, a folder with an over-size AGENTS.md, and the Responses path. The release gate — T3 and T5 paired against 0.47.3 (16 pairs each, both PASS), the chain budget's own two-round test, the kill -9 demo (2/2), the full check and a live sol session — is summarised in the release report.

kiso 0.47.3

Choose a tag to compare

@vincemakes vincemakes released this 08 Oct 16:06
3f1cae3

kiso 0.47.3

Three changes on 0.47.2, all from GPT-model sessions.

  • GPT models stop filling every tool field (#285). kiso sent its Responses-API tools without a strict flag. The ChatGPT backend then forced every declared property into each call, and the model filled the optional ones with placeholders. As a result:

    • every edit_file call carried both edit forms and was refused;
    • an empty readyWhen turned one-shot shell commands into background tasks.

    Each tool now says strict: false, as the vendor's own client does. The model then sends only the fields it means.

  • Thinking reads cleanly (#286). A reasoning summary's **title** renders bold inside the grey italic, as do code spans and links. Thinking is still grey italic, and a pipe is unchanged.

  • kiso's own tools have names on screen (#287). Their cards read STOP TASK, SUBAGENTS, READ SKILL and ASK USER. A third party's or an MCP server's tool still shows its own name. The names the model sees are unchanged.

For hosts

  • Action required: none.

  • Observable:

    • in @vincemakes/kiso-provider-openai-responses, every tool carries "strict": false (+15 bytes a tool, the schema unchanged);
    • in @vincemakes/kiso-tui-cells, thinking renders inline markdown, and displayVerb names task_stop, delegate, read_skill and ask_user.

    Only these two packages differ from 0.47.2 beyond their package.json.

  • New optional: none.

Chat-completions request bytes are unchanged from 0.47.2 on a pipe, on a terminal, and in a folder with an AGENTS.md. The release report is bench/rd1/0.47.3-release-report.md. It covers the smoke (IN BAND), the kill -9 demo (2/2), and a live session on a GPT model.

kiso 0.47.2

Choose a tag to compare

@vincemakes vincemakes released this 08 Oct 11:34
62f92a5

kiso 0.47.2

One fix on 0.47.1.

  • A glob from a big folder no longer freezes kiso (#279, #280). list_dir with a glob walked the tree on the main thread: from a home directory it held kiso for 11 s, with no redraw, no esc and the working mark standing still. The walk now runs on the search worker search_text already uses, under the same budget: it stops after 20,000 visited files or 10 s and says where it stopped, and esc aborts it. Under a symlinked workspace its paths no longer read ../../….

For hosts

  • Action required: none.
  • Observable: in @vincemakes/kiso-tools-node, list_dir with a glob no longer blocks the host's event loop. It honours limits.searchMaxFiles and limits.searchMaxMs (the limits search_text already honoured), says in its result when either stopped the walk, and honours the call's abort signal. Of the 17 packages, only kiso-tools-node differs from 0.47.1 beyond its package.json.
  • New optional: none.

Request bytes are unchanged from 0.47.1 on a pipe, on a terminal, and in a folder with an AGENTS.md. The release report, with the smoke (IN BAND) and the kill -9 demo (2/2), is bench/rd1/0.47.2-release-report.md.

kiso 0.47.1

Choose a tag to compare

@vincemakes vincemakes released this 08 Oct 06:49
411df66

kiso 0.47.1

0.47.0's polish, from the first dogfood of the Graphite TUI. What a pipe prints is unchanged.

  • Dark terminals look right (#273, #275). On a black ground the cards, the selected row of a list, code, diff rows and the hairlines rose a step: cards stand off the terminal, and the composer's rules are visible on Apple Terminal's Pro profile. Every text colour still clears 4.5:1 on every surface. Light terminals are unchanged.
  • Windows Terminal gets 24-bit colour (#269). It renders 24-bit without setting COLORTERM, so kiso drew it in the 256 tier, where your own block turned pink and its edge green. Windows Terminal, iTerm2, WezTerm, Ghostty, kitty, VS Code, Warp, Alacritty, JetBrains and any Windows console now get 24-bit. Inside tmux or screen, only COLORTERM counts.
  • Small things, said right (#265).
    • A cut note counts output lines, and says when the cut passes through one (… the start of this line).
    • A manual /compact ends on its COMPACTED row, with no raw boundary row under it, and reads 1 round for one.
    • A refusal you gave no words for reads denied by you once.

For hosts

  • Action required: none.
  • Observable: in @vincemakes/kiso-tui-cells, GRAPHITE.dark carries the new black column, and a light ground's surfaces derive from the white column alone. kiso-runtime is byte-identical to 0.47.0.
  • New optional: terminalTier(env, platform) in kiso-tui-cells, the tier decision the palette makes.

Request bytes are unchanged from 0.47.0 on a pipe, on a terminal, and in a folder with an AGENTS.md. The release report, with the smoke (IN BAND) and the kill -9 demo (2/2), is bench/rd1/0.47.1-release-report.md.

kiso 0.47.0

Choose a tag to compare

@vincemakes vincemakes released this 07 Oct 11:45
01cee2d

kiso 0.47.0 — the Graphite TUI

The terminal is redrawn end to end. What a pipe prints is unchanged.

  • The transcript. Your words sit on a warm block, and the answer is plain text. Each tool call is one card whose ground is its state: blue while it runs and when it worked, red when it failed, gold when it waits for you. Its outcome (exit 0 · 4 lines · 1.2s) sits at the head's right. A long command folds under its head; long output shows its tail with … N earlier lines ctrl+o expands. An edit shows its diff in its card.
  • The opening and the title. The wordmark and the version, beside what loaded: SESSION, RULES, SKILLS, MCP, EXTENSIONS. The window's title reads kiso — <folder>, kiso · needs you — <folder> while kiso waits for you, and carries the session's /name.
  • The bar and the live row. Under the input: the mode, the model and effort, ctx as cells that fill, tok/s, the branch and the folder. Above it while a run is live: working Ns · ↓ tokens and its keys.
  • Panels and sheets. /model, /mode, /settings, the approval and question panels, the command list and the @ picker share one band shape. /status, /context, /skills, the keys and /help are sheets over the input. /resume is a table, and a task's output is a sheet.
  • Replies in one form. Command replies, /think and /last, and a task's end (TASK t1 exited 0 · sleep 30) are one-row facts in the transcript.
  • Compaction you can watch. /compact, and a summary in the middle of a run, draw compacting with its progress, then a COMPACTED row with the numbers (for example mid-run · ~180k → ~22k · ctx now 11%).
  • Colour. Surfaces derive from your terminal's own background (24-bit and 256-colour), with a contrast floor.
  • Sign-in. The ChatGPT sign-in page looks like kiso.work, and a declined sign-in fails at once with its reason.

For hosts

  • Action required, only if you draw with @vincemakes/kiso-tui or @vincemakes/kiso-tui-cells: both are rewritten. kiso-tui removes idleStatus, runningStatus, StatusMeter, sessionRow, sessionCounterRow, atWindow and PANEL_KEYS_ROW (the bar is statusBar; the live row is workingRow / liveRow), and many kept exports of both change type. Stay on 0.46.x, or move to the new names.
  • Observable: a session named with /name lists under that name (SessionStore's title). A session no one named reads as before.
  • New optional: contextPolicy.tiers.onSummary, an in-run summary told to the host (start, progress, end). Display only: requests are byte-identical with and without it.

Request bytes are unchanged from 0.46.2: on a pipe, on a terminal, and in a folder with an AGENTS.md. The release report, with the smoke (IN BAND) and the kill -9 demo (2/2), is bench/rd1/0.47.0-release-report.md.