commits on main
← newer commits2026-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.
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.
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.
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.
341e5693 Aly Raffauf refactor(cli): migrate commands to Cobra
refactor(cli): migrate commands to Cobra
Separate CLI workflows, terminal interaction, and storage cleanup.
2e2394f6 Aly Raffauf fix(tui): capture background command inputs
fix(tui): capture background command inputs
bc1fd461 nekomimi.pet lcm: dont error on nonexistent IDs
lcm: dont error on nonexistent IDs
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.
85b721f7 Aly Raffauf fix(tui): close clipboard stdout on cancellation
fix(tui): close clipboard stdout on cancellation
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.
2026-09-30
7427f6e3 Aly Raffauf docs: require full gopls analysis for Go changes
docs: require full gopls analysis for Go changes
5958fb08 Aly Raffauf refactor(cli): resolve remaining gopls diagnostics
refactor(cli): resolve remaining gopls diagnostics
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.
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.
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.
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
5709f646 nekomimi.pet docs: say how to get ruff outside nix
docs: say how to get ruff outside nix
055c4167 nekomimi.pet properly tell model to await jobs
properly tell model to await jobs
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.
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.
3922552b Aly Raffauf perf(cli): reduce struct padding
perf(cli): reduce struct padding
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).
226adf3f Aly Raffauf test(cli): declare Unix requirements and check scanner errors
test(cli): declare Unix requirements and check scanner errors
831aceeb Aly Raffauf refactor(cli): simplify validation and error handling
refactor(cli): simplify validation and error handling
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.
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.
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>
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>
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>
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>
full history: git clone https://git.klbr.net/okami.mom/albedo-2