commits on main

← newer commits

2026-10-01

9fc076a4 Aly Raffauf fix(tui): preserve editor results when terminal restoration fails

fix(tui): preserve editor results when terminal restoration fails

Own the temporary prompt file through completion and retain saved edits while reporting restoration errors.

open commit browse files
f1fe20c2 Aly Raffauf refactor(cli): centralize HTTP response ownership

refactor(cli): centralize HTTP response ownership

Keep bounded reads and stream cleanup in shared helpers while preserving endpoint limits and status handling.

open commit browse files
6e3c4baf nekomimi.pet feat(extensions): quarantine an extension the daemon cannot run

feat(extensions): quarantine an extension the daemon cannot run

One broken extension used to stop the daemon: a failing initialiser, a blank or repeated name, a missing requirement, or a default selection it made invalid all aborted the boot. Loading extensions nobody here wrote makes that the wrong trade. install now answers the extensions that work and the ones it quarantined with their reasons. Quarantine cascades through requirements, so what needed an absent extension goes with it, and only storage the host owns still stops the boot. A quarantined extension is in no session's selection, is listed by /extensions with its reason, and enabling it is refused with that reason. The picker shows it as bad and will not toggle it.

open commit browse files
a1d676a5 nekomimi.pet feat(extensions): refuse broken plugins instead of dying with them

feat(extensions): refuse broken plugins instead of dying with them

A tool that errors or raises used to end the turn, and an extension that failed to load or prepare used to take the whole session. Third-party extensions run in our processes, so neither can stay fatal. Tool invocation answers Result(Output, Failure): Refused(reason) becomes the call's result and the turn continues, Fatal(reason) ends it, which only the python tool uses when a cell's source or outcome will not store. A tool that raises is refused with its crash and an unknown-effects note. Composition leaves out a context plugin that will not load, a managed plugin that fails to prepare, and a contribution colliding with another's tool, command, module, or route, each with a warning the session shows. Enabling an extension by name still fails with its reason, and so does a settings refresh that breaks something that was working. Observers, close callbacks, command handlers, and compaction prepare are guarded too, through the new shared albedo/harness/protect.

open commit browse files
341e5693 Aly Raffauf refactor(cli): migrate commands to Cobra

refactor(cli): migrate commands to Cobra

Separate CLI workflows, terminal interaction, and storage cleanup.

open commit browse files
2e2394f6 Aly Raffauf fix(tui): capture background command inputs

fix(tui): capture background command inputs

open commit browse files
bc1fd461 nekomimi.pet lcm: dont error on nonexistent IDs

lcm: dont error on nonexistent IDs

open commit browse files
1ed27be9 Aly Raffauf fix(cli): share strict JSON decoding for live previews

fix(cli): share strict JSON decoding for live previews

Use encoding/json for escapes and surrogate pairs. Keep incremental boundary tracking and TUI tab formatting.

open commit browse files
85b721f7 Aly Raffauf fix(tui): close clipboard stdout on cancellation

fix(tui): close clipboard stdout on cancellation

open commit browse files
618d797d Aly Raffauf fix(tui): enforce markdown cache admission budget

fix(tui): enforce markdown cache admission budget

Bound retained key and rendered text to 1 MiB per generation. Rejecting a 4 MiB entry now allocates zero bytes instead of copying 4 MiB.

open commit browse files

2026-09-30

7427f6e3 Aly Raffauf docs: require full gopls analysis for Go changes

docs: require full gopls analysis for Go changes

open commit browse files
5958fb08 Aly Raffauf refactor(cli): resolve remaining gopls diagnostics

refactor(cli): resolve remaining gopls diagnostics

open commit browse files
b58c2c8a Aly Raffauf perf(tui): render only visible session rows

perf(tui): render only visible session rows

Full view: O(n²) -> O(n+v). Temporary list output: O(n) -> O(v). 5,000 sessions, 16 visible rows: list rendering 124 ms -> 0.23 ms, allocations 3.8 MB -> 11 KB.

open commit browse files
a15dc730 Aly Raffauf perf(tui): index session and archive lookups

perf(tui): index session and archive lookups

Session lookup: O(n) -> expected O(1). Archive membership across a rebuild: O(n*a) -> O(n+a). Sorting is unchanged.

open commit browse files
9c28796b nekomimi.pet feat(cli): add albedo -p, albedo models, and a readable sessions list

feat(cli): add albedo -p, albedo models, and a readable sessions list

albedo -p <prompt> runs one turn in a new session in the current directory, or in an existing one with --session, and prints only the final assistant text. A failed or interrupted turn exits non-zero with its error; ctrl-c and the opt-in --timeout stop the turn they started. --model takes exact ids the way agent spawn does: provider/model, or a bare id from the active provider, else the one provider offering it. albedo models lists every provider/model. On an existing session the switch goes through the new POST /sessions/:id/model (capability session_model), which unlike /model leaves the default for new sessions alone. albedo sessions hides archived sessions and prints an aligned table.

open commit browse files
e2ba50ec nekomimi.pet feat(paperclips): let the model resolve a vent it fixed, with a note

feat(paperclips): let the model resolve a vent it fixed, with a note

open commit browse files
5709f646 nekomimi.pet docs: say how to get ruff outside nix

docs: say how to get ruff outside nix

open commit browse files
055c4167 nekomimi.pet properly tell model to await jobs

properly tell model to await jobs

open commit browse files
863e38a3 Aly Raffauf perf(tui): cache visible agent tail rows

perf(tui): cache visible agent tail rows

Unchanged tail wrapping: O(B) -> O(1), for B retained bytes.

open commit browse files
451756dd Aly Raffauf perf(tui): bound agent previews and decode streams incrementally

perf(tui): bound agent previews and decode streams incrementally

Stream accumulation and argument decoding: O(n²) -> O(n) time. Preview storage: O(n) -> O(1) per agent with fixed limits.

open commit browse files
3922552b Aly Raffauf perf(cli): reduce struct padding

perf(cli): reduce struct padding

open commit browse files
8499f484 Aly Raffauf refactor(tui): replace pick helpers with explicit branches

refactor(tui): replace pick helpers with explicit branches

UTF-16 counting uses O(1) auxiliary space instead of O(n). Time remains O(n).

open commit browse files
226adf3f Aly Raffauf test(cli): declare Unix requirements and check scanner errors

test(cli): declare Unix requirements and check scanner errors

open commit browse files
831aceeb Aly Raffauf refactor(cli): simplify validation and error handling

refactor(cli): simplify validation and error handling

open commit browse files
c2aa1bc5 Aly Raffauf fix(cli): handle clipboard exits and reap subprocesses

fix(cli): handle clipboard exits and reap subprocesses

Kill oversized clipboard writers before waiting and report exit failures.

open commit browse files
1ff81f1b Aly Raffauf perf(cli): select sessions with constant space

perf(cli): select sessions with constant space

Use O(1) auxiliary space instead of O(n), with O(n) time. Copy the selected session so the chat does not retain the whole list.

open commit browse files
7a6a1dce dawn cli: look for a starting daemon every 10ms instead of every 100ms

cli: look for a starting daemon every 10ms instead of every 100ms

Signed-off-by: dawn <90008@klbr.net>

open commit browse files
b11674de dawn e2e: hold the live toggles test's busy turn on an event instead of a two-second reply

e2e: hold the live toggles test's busy turn on an event instead of a two-second reply

Signed-off-by: dawn <90008@klbr.net>

open commit browse files
2a0204df dawn quota: test the backoff's growth and caps as arithmetic, and keep only one backoff wait in the e2e cadence test

quota: test the backoff's growth and caps as arithmetic, and keep only one backoff wait in the e2e cadence test

Signed-off-by: dawn <90008@klbr.net>

open commit browse files
5757b401 dawn cli: start the daemon on the open-file limit the CLI raised, not macOS's 256

cli: start the daemon on the open-file limit the CLI raised, not macOS's 256

Signed-off-by: dawn <90008@klbr.net>

open commit browse files

full history: git clone https://git.klbr.net/okami.mom/albedo-2