[{"name":"extensions","kind":"directory","size":0,"lastCommitHash":"2f43cb2da0aaeaff5bdef36f61fa5475e6c9ad2b","lastCommitWhen":"2026-10-02T21:59:35+03:00","lastCommitMessage":"links: link workspaces into one project, sharing memory and work items\n\n/link adds or removes peers in a workspace_links group. each member keeps writing its own memory and work items; reads cover the group (memory snapshot, grep and search; every work ledger read and change), so a gone member loses nothing and unlinking undoes nothing.\n\na member's folder is checked where it is: a remote one with one exists gather over the shared ControlMaster, every member at once. a host that doesn't answer reads as connecting, sign in or unreachable, never gone, and opening a session never waits on a host.\n\na link or unlink queues a note in every open session of the workspaces it touches; a link note carries the new members' memory snapshot, so an open session sees it without rebuilding its prompt.\n\nmemory moves daemon-side: the kernel's memory object calls the memory host route through a new blocking host_now, so a remote session's notes land in the daemon's ALBEDO_HOME instead of the host's.\n\nSigned-off-by: dawn <90008@klbr.net>\n"},{"name":"albedo_accounts.erl","kind":"file","size":4439,"lastCommitHash":"1a349ddd16133701346b474097cfdd60184ab8b4","lastCommitWhen":"2026-09-30T13:26:30Z","lastCommitMessage":"fix: make daemon the sole config writer\n"},{"name":"albedo_cache_ttl.erl","kind":"file","size":6740,"lastCommitHash":"7ba2cb0b90484182e4f8be21894576d00c5722f2","lastCommitWhen":"2026-10-01T10:12:57-04:00","lastCommitMessage":"perf(cache-ttl): make warm reads O(1) and globs O(p*v)\n\nCache typed tables and failed revisions; reject duplicate layer IDs.\n8,000-entry warm table: 34.4 ms -> 0.11 ms. 16-wildcard cold lookup: >2 s -> 13.4 ms.\n"},{"name":"albedo_cached_fetch.erl","kind":"file","size":3834,"lastCommitHash":"4fb0d3e353b2d137993abfa556251f94da625893","lastCommitWhen":"2026-09-28T11:24:53+03:00","lastCommitMessage":"Ship a reloadable prompt-cache TTL table\n\npriv/cache-ttl.json holds a prior per provider: whether a hit refreshes the\nlifetime, a fixed lifetime, or best-effort eviction; where the clock starts; the\nselectable TTL tiers with their write multipliers; the read multiplier; and how\nwell each value is known, with its source. An optional remote copy\n(extensions.json cacheTtl.url) and a local $ALBEDO_HOME/cache-ttl.json merge over\nit by id, reloaded when a layer file changes and on /reload. GET /cache-ttl\nserves the merged table or the entry a request resolves to.\n\nThe models catalog's bounded fetch-and-commit moves into albedo_cached_fetch,\nshared by both url-backed caches.\n"},{"name":"albedo_capabilities.erl","kind":"file","size":987,"lastCommitHash":"ae878c51158ae7f74bb60688d9e894fe9914fb6b","lastCommitWhen":"2026-10-01T10:12:03-04:00","lastCommitMessage":"perf(capabilities): cut preference reads from O(n) to O(1)\n\nReuse one snapshot per selection and share the 1 MiB read/write cap.\n128 checks on 198,914 bytes: 256.2 ms -> 2.8 ms.\n"},{"name":"albedo_capability_catalog.erl","kind":"file","size":349,"lastCommitHash":"0a8145a3fb14d3fb5bed4327f3bfb47bb8cbb86c","lastCommitWhen":"2026-10-01T23:09:45-04:00","lastCommitMessage":"feat(catalog): let the daemon own discovery\n\nShow every skill and instruction candidate, and guard saves with fresh revisions. Share preference resolution and bounded file fingerprints.\n"},{"name":"albedo_compaction.erl","kind":"file","size":539,"lastCommitHash":"1408fce8d01724a4b3f7aa27651091c263dc84a4","lastCommitWhen":"2026-09-28T06:34:04+03:00","lastCommitMessage":"Refactor Gleam and Erlang code across daemon, harness, and providers\n\nSigned-off-by: dawn <90008@klbr.net>\n"},{"name":"albedo_credentials.erl","kind":"file","size":16479,"lastCommitHash":"1a349ddd16133701346b474097cfdd60184ab8b4","lastCommitWhen":"2026-09-30T13:26:30Z","lastCommitMessage":"fix: make daemon the sole config writer\n"},{"name":"albedo_extension_settings.erl","kind":"file","size":2548,"lastCommitHash":"1a349ddd16133701346b474097cfdd60184ab8b4","lastCommitWhen":"2026-09-30T13:26:30Z","lastCommitMessage":"fix: make daemon the sole config writer\n"},{"name":"albedo_file_fingerprint.erl","kind":"file","size":1086,"lastCommitHash":"0a8145a3fb14d3fb5bed4327f3bfb47bb8cbb86c","lastCommitWhen":"2026-10-01T23:09:45-04:00","lastCommitMessage":"feat(catalog): let the daemon own discovery\n\nShow every skill and instruction candidate, and guard saves with fresh revisions. Share preference resolution and bounded file fingerprints.\n"},{"name":"albedo_http.erl","kind":"file","size":1761,"lastCommitHash":"1408fce8d01724a4b3f7aa27651091c263dc84a4","lastCommitWhen":"2026-09-28T06:34:04+03:00","lastCommitMessage":"Refactor Gleam and Erlang code across daemon, harness, and providers\n\nSigned-off-by: dawn <90008@klbr.net>\n"},{"name":"albedo_instruction_files.erl","kind":"file","size":7089,"lastCommitHash":"e6ecc04889c389332390fcb4a63921fba2253caf","lastCommitWhen":"2026-10-02T21:57:54+03:00","lastCommitMessage":"workspaces: remote locations ([user@]host:/abs/path) with host labels, refusals until kernels can run there, and the host in the tui header\n\nSigned-off-by: dawn <90008@klbr.net>\n"},{"name":"albedo_languages.erl","kind":"file","size":4321,"lastCommitHash":"3b601a9e0b5b086153a0641bbaa58e17030c0aa6","lastCommitWhen":"2026-09-28T22:22:54+03:00","lastCommitMessage":"Add /cd: a folder picker that moves a session, and descendants follow\n\n/cd opens a full-screen picker: recent workspaces ranked by frecency, or\na typed path listed through the daemon and fuzzy-filtered by its last\nsegment, beside a preview of the highlighted folder (breadcrumbs over a\nlanguage-share rule, the repository line, a two-level tree, the folder's\nsessions). /cd <path> moves at once; ~ and relative paths resolve on the\ndaemon. The picker replaces the workspace-recovery text box: a turn\nrefused because the folder went missing is sent again after picking.\n\nThe preview keeps its sessions on screen: the tree fits around a third\nof the pane kept for them, showing fewer children, then only the top\nlevel, then fewer top entries, and the sessions fill what it leaves. → steps into the highlighted\nfolder's sessions, where enter opens one. From the sessions view, ctrl+f\n(or ~ or / typed into an empty search) opens the same picker to browse\nsessions by folder; there enter starts a new session in the folder.\n\nThe daemon serves GET /fs/list, /fs/repo and /fs/preview, so the picker\nonly offers folders the daemon can see, remote or not. harness/vcs is a\nshared git + jj module: .jj wins over .git in a colocated repository, and\njj always runs with --ignore-working-copy so browsing never snapshots or\nwrites an operation. A jj repository's bookmark is the one @ works on,\nfound from the fork (the newest change in @'s history a bookmark\ncontains), so a bookmark that moved on is not replaced by an old backup\nbehind @. Language shares and file colors come from linguist's\nlanguages.yml, shipped in priv/linguist and parsed once with yamerl.\nInside a repository the preview tree shows only tracked or changed paths.\n\nMoving a session now moves every descendant that was in the same folder:\nidle ones before the POST answers, running ones when their turn ends.\n\nThe CLI colors languages with our own pastels, falling back to linguist's\nhex, lifted in OKLCH until they reach an APCA contrast target on the\nterminal's background. robot-docs/workspaces.md is the contract.\n"},{"name":"albedo_location.erl","kind":"file","size":1060,"lastCommitHash":"e6ecc04889c389332390fcb4a63921fba2253caf","lastCommitWhen":"2026-10-02T21:57:54+03:00","lastCommitMessage":"workspaces: remote locations ([user@]host:/abs/path) with host labels, refusals until kernels can run there, and the host in the tui header\n\nSigned-off-by: dawn <90008@klbr.net>\n"},{"name":"albedo_oauth.erl","kind":"file","size":12380,"lastCommitHash":"1a349ddd16133701346b474097cfdd60184ab8b4","lastCommitWhen":"2026-09-30T13:26:30Z","lastCommitMessage":"fix: make daemon the sole config writer\n"},{"name":"albedo_project_mirror.erl","kind":"file","size":1751,"lastCommitHash":"f8358641c2ec938eb1229f924f66595a38f651e9","lastCommitWhen":"2026-10-02T21:57:55+03:00","lastCommitMessage":"kernel: swap stale kernels at idle and run kernels on remote hosts over ssh\n\n#55: a kernel on an older bundle, protocol or module set is swapped at the next idle moment (snapshot, boot the new one beside it, restore, stop the old), with a note naming what carried; live jobs hold the swap until /kernel upgrade forces it.\n#56: sessions at host:/path boot their kernel there through the same bridge over ssh, on the ControlMasters remote.connect() uses; reaping runs on the host, heavy slots are per host, an unreachable host is a reattach rather than a lost kernel, and login profiles that print cannot corrupt the frames.\n#57: /fs routes, AGENTS.md and project skills read remote workspaces in one ssh round trip, interpreted by the local code path; GET /hosts lists recent and ssh-config hosts.\n\nSigned-off-by: dawn <90008@klbr.net>\n"},{"name":"albedo_protect.erl","kind":"file","size":320,"lastCommitHash":"d725d21cc7669d5724e71f7e69df869cd12e91d4","lastCommitWhen":"2026-09-26T06:02:32Z","lastCommitMessage":"daemon: a swarm can no longer take the BEAM down\n\nKernels boot four at a time off the runtime actor and answer by message. A\nsession waiting for its kernel parks the turn and keeps serving; interrupt\ndrops a parked turn. The registry never waits on a session: running state is\ncached from the bus, and interrupts, closes and workspace changes run off it.\nThe registry is a named, supervised child that adopts live sessions when it\nrestarts. Test: 52 sessions boot at once, every call stays under 0.1 s.\n"},{"name":"albedo_render.erl","kind":"file","size":3689,"lastCommitHash":"b2e29fd276eda1ce2e5549e543d93bbfc594de1f","lastCommitWhen":"2026-09-30T21:33:07+03:00","lastCommitMessage":"requests: fit history images over the provider's edge by appending image fit rows to the transcript\n\nSigned-off-by: dawn <90008@klbr.net>\n"},{"name":"albedo_retry.erl","kind":"file","size":98,"lastCommitHash":"9118ea835ab08578d56cadaa824983f7e7a1facf","lastCommitWhen":"2026-09-22T17:39:13-04:00","lastCommitMessage":"retries and ctrl j to view diff\n"},{"name":"albedo_settings_lock.erl","kind":"file","size":764,"lastCommitHash":"1a349ddd16133701346b474097cfdd60184ab8b4","lastCommitWhen":"2026-09-30T13:26:30Z","lastCommitMessage":"fix: make daemon the sole config writer\n"},{"name":"albedo_settings_store.erl","kind":"file","size":6111,"lastCommitHash":"0a8145a3fb14d3fb5bed4327f3bfb47bb8cbb86c","lastCommitWhen":"2026-10-01T23:09:45-04:00","lastCommitMessage":"feat(catalog): let the daemon own discovery\n\nShow every skill and instruction candidate, and guard saves with fresh revisions. Share preference resolution and bounded file fingerprints.\n"},{"name":"albedo_ssh.erl","kind":"file","size":8384,"lastCommitHash":"8679812f9a1556a9965ed134e65a17b95af7d3a1","lastCommitWhen":"2026-10-02T22:00:06+03:00","lastCommitMessage":"ssh: say when a probe is copying the kernel to a host, in the picker and the chat\n\nalbedo_ssh.py probe announces a staging step on its own line before it copies the bundle; albedo_ssh.erl passes lines on as they arrive and keeps the last as the answer. /hosts/:host carries step while warming, and the session status's kernel carries it while a remote kernel boots, so both read \"copying the kernel to chernobog…\" instead of \"connecting to\".\n\nSigned-off-by: dawn <90008@klbr.net>\n"},{"name":"albedo_usage_core.erl","kind":"file","size":8629,"lastCommitHash":"8fc7762e99184d9a906c8bd72cb3fa894a5a5801","lastCommitWhen":"2026-09-30T10:56:31Z","lastCommitMessage":"fix(usage): resolve kill from PATH for timeout cleanup\n"},{"name":"albedo_vcs.erl","kind":"file","size":1715,"lastCommitHash":"3b601a9e0b5b086153a0641bbaa58e17030c0aa6","lastCommitWhen":"2026-09-28T22:22:54+03:00","lastCommitMessage":"Add /cd: a folder picker that moves a session, and descendants follow\n\n/cd opens a full-screen picker: recent workspaces ranked by frecency, or\na typed path listed through the daemon and fuzzy-filtered by its last\nsegment, beside a preview of the highlighted folder (breadcrumbs over a\nlanguage-share rule, the repository line, a two-level tree, the folder's\nsessions). /cd <path> moves at once; ~ and relative paths resolve on the\ndaemon. The picker replaces the workspace-recovery text box: a turn\nrefused because the folder went missing is sent again after picking.\n\nThe preview keeps its sessions on screen: the tree fits around a third\nof the pane kept for them, showing fewer children, then only the top\nlevel, then fewer top entries, and the sessions fill what it leaves. → steps into the highlighted\nfolder's sessions, where enter opens one. From the sessions view, ctrl+f\n(or ~ or / typed into an empty search) opens the same picker to browse\nsessions by folder; there enter starts a new session in the folder.\n\nThe daemon serves GET /fs/list, /fs/repo and /fs/preview, so the picker\nonly offers folders the daemon can see, remote or not. harness/vcs is a\nshared git + jj module: .jj wins over .git in a colocated repository, and\njj always runs with --ignore-working-copy so browsing never snapshots or\nwrites an operation. A jj repository's bookmark is the one @ works on,\nfound from the fork (the newest change in @'s history a bookmark\ncontains), so a bookmark that moved on is not replaced by an old backup\nbehind @. Language shares and file colors come from linguist's\nlanguages.yml, shipped in priv/linguist and parsed once with yamerl.\nInside a repository the preview tree shows only tracked or changed paths.\n\nMoving a session now moves every descendant that was in the same folder:\nidle ones before the POST answers, running ones when their turn ends.\n\nThe CLI colors languages with our own pastels, falling back to linguist's\nhex, lifted in OKLCH until they reach an APCA contrast target on the\nterminal's background. robot-docs/workspaces.md is the contract.\n"},{"name":"cache_fade.gleam","kind":"file","size":5722,"lastCommitHash":"333046c0db5f647fe759d2e32974473ca906590d","lastCommitWhen":"2026-09-29T15:54:40+03:00","lastCommitMessage":"fade the footer's cached count as the prompt cache expires\n\nSigned-off-by: dawn <90008@klbr.net>\n"},{"name":"cache_ttl.gleam","kind":"file","size":18654,"lastCommitHash":"b585313526672d775b6b1fe54ba3b25ad150e62b","lastCommitWhen":"2026-10-01T12:34:16-04:00","lastCommitMessage":"refactor(gleam): clean up code and enforce focused lint checks\n"},{"name":"capabilities.gleam","kind":"file","size":3776,"lastCommitHash":"0a8145a3fb14d3fb5bed4327f3bfb47bb8cbb86c","lastCommitWhen":"2026-10-01T23:09:45-04:00","lastCommitMessage":"feat(catalog): let the daemon own discovery\n\nShow every skill and instruction candidate, and guard saves with fresh revisions. Share preference resolution and bounded file fingerprints.\n"},{"name":"capability_catalog.gleam","kind":"file","size":8157,"lastCommitHash":"d056d3200ec5fb33a79235d19c86649a57d5d585","lastCommitWhen":"2026-10-02T11:14:47-04:00","lastCommitMessage":"feat(mcp): skip servers that are offline and add them when they return\n\nA server that could not start used to fail the whole mcp extension for the\nsession, taking every other server's tools with it. It is now left out with a\nwarning, and the rest load.\n\nA missing server is probed when the session shows activity, never on a timer,\nwith doubling backoff from the new `retryMs` setting (default 30s). One found\nup asks the session to refresh at the end of a turn, which leaves the usual\n\"capabilities changed\" turn and pins the old prompt until compaction.\n`extension.Session` gains `refresh(reason)` for this.\n\nSaving or enabling a server through settings stays strict, so a mistyped\ncommand is still refused where it is typed.\n"},{"name":"command.gleam","kind":"file","size":16731,"lastCommitHash":"f8358641c2ec938eb1229f924f66595a38f651e9","lastCommitWhen":"2026-10-02T21:57:55+03:00","lastCommitMessage":"kernel: swap stale kernels at idle and run kernels on remote hosts over ssh\n\n#55: a kernel on an older bundle, protocol or module set is swapped at the next idle moment (snapshot, boot the new one beside it, restore, stop the old), with a note naming what carried; live jobs hold the swap until /kernel upgrade forces it.\n#56: sessions at host:/path boot their kernel there through the same bridge over ssh, on the ControlMasters remote.connect() uses; reaping runs on the host, heavy slots are per host, an unreachable host is a reattach rather than a lost kernel, and login profiles that print cannot corrupt the frames.\n#57: /fs routes, AGENTS.md and project skills read remote workspaces in one ssh round trip, interpreted by the local code path; GET /hosts lists recent and ssh-config hosts.\n\nSigned-off-by: dawn <90008@klbr.net>\n"},{"name":"compaction.gleam","kind":"file","size":17168,"lastCommitHash":"7f1ee85ff421f31f7bc0540853889e2cf3389e19","lastCommitWhen":"2026-10-01T19:29:08-04:00","lastCommitMessage":"feat(notes): let the model keep its own notes across every compaction\n\nA notes layer sits over whichever strategy is active. At each compaction it\nasks the model to rewrite its notes from the previous ones and the history\njust evicted, tells it the budget (2000 tokens by default), and puts the\nresult as plain text ahead of every later request. A failed rewrite keeps\nthe old notes and never fails the turn.\n\nThe summarizer now takes its instructions per request and reads assistant\nturns as text and calls rather than raw provider JSON, skipping encrypted\nreasoning. Strategies trigger at 80% by default, since the notes are not\ncounted in their estimates.\n"},{"name":"credentials.gleam","kind":"file","size":1976,"lastCommitHash":"d9a9fec0a6765f7c926b13847237c3bdecec2dcb","lastCommitWhen":"2026-09-29T13:11:55+03:00","lastCommitMessage":"move every secret into a daemon-owned creds.json\n\nSigned-off-by: dawn <90008@klbr.net>\n"},{"name":"extension.gleam","kind":"file","size":50623,"lastCommitHash":"d056d3200ec5fb33a79235d19c86649a57d5d585","lastCommitWhen":"2026-10-02T11:14:47-04:00","lastCommitMessage":"feat(mcp): skip servers that are offline and add them when they return\n\nA server that could not start used to fail the whole mcp extension for the\nsession, taking every other server's tools with it. It is now left out with a\nwarning, and the rest load.\n\nA missing server is probed when the session shows activity, never on a timer,\nwith doubling backoff from the new `retryMs` setting (default 30s). One found\nup asks the session to refresh at the end of a turn, which leaves the usual\n\"capabilities changed\" turn and pins the old prompt until compaction.\n`extension.Session` gains `refresh(reason)` for this.\n\nSaving or enabling a server through settings stays strict, so a mistyped\ncommand is still refused where it is typed.\n"},{"name":"extensions.gleam","kind":"file","size":3659,"lastCommitHash":"2f43cb2da0aaeaff5bdef36f61fa5475e6c9ad2b","lastCommitWhen":"2026-10-02T21:59:35+03:00","lastCommitMessage":"links: link workspaces into one project, sharing memory and work items\n\n/link adds or removes peers in a workspace_links group. each member keeps writing its own memory and work items; reads cover the group (memory snapshot, grep and search; every work ledger read and change), so a gone member loses nothing and unlinking undoes nothing.\n\na member's folder is checked where it is: a remote one with one exists gather over the shared ControlMaster, every member at once. a host that doesn't answer reads as connecting, sign in or unreachable, never gone, and opening a session never waits on a host.\n\na link or unlink queues a note in every open session of the workspaces it touches; a link note carries the new members' memory snapshot, so an open session sees it without rebuilding its prompt.\n\nmemory moves daemon-side: the kernel's memory object calls the memory host route through a new blocking host_now, so a remote session's notes land in the daemon's ALBEDO_HOME instead of the host's.\n\nSigned-off-by: dawn <90008@klbr.net>\n"},{"name":"instruction_files.gleam","kind":"file","size":6409,"lastCommitHash":"f8358641c2ec938eb1229f924f66595a38f651e9","lastCommitWhen":"2026-10-02T21:57:55+03:00","lastCommitMessage":"kernel: swap stale kernels at idle and run kernels on remote hosts over ssh\n\n#55: a kernel on an older bundle, protocol or module set is swapped at the next idle moment (snapshot, boot the new one beside it, restore, stop the old), with a note naming what carried; live jobs hold the swap until /kernel upgrade forces it.\n#56: sessions at host:/path boot their kernel there through the same bridge over ssh, on the ControlMasters remote.connect() uses; reaping runs on the host, heavy slots are per host, an unreachable host is a reattach rather than a lost kernel, and login profiles that print cannot corrupt the frames.\n#57: /fs routes, AGENTS.md and project skills read remote workspaces in one ssh round trip, interpreted by the local code path; GET /hosts lists recent and ssh-config hosts.\n\nSigned-off-by: dawn <90008@klbr.net>\n"},{"name":"languages.gleam","kind":"file","size":1107,"lastCommitHash":"3b601a9e0b5b086153a0641bbaa58e17030c0aa6","lastCommitWhen":"2026-09-28T22:22:54+03:00","lastCommitMessage":"Add /cd: a folder picker that moves a session, and descendants follow\n\n/cd opens a full-screen picker: recent workspaces ranked by frecency, or\na typed path listed through the daemon and fuzzy-filtered by its last\nsegment, beside a preview of the highlighted folder (breadcrumbs over a\nlanguage-share rule, the repository line, a two-level tree, the folder's\nsessions). /cd <path> moves at once; ~ and relative paths resolve on the\ndaemon. The picker replaces the workspace-recovery text box: a turn\nrefused because the folder went missing is sent again after picking.\n\nThe preview keeps its sessions on screen: the tree fits around a third\nof the pane kept for them, showing fewer children, then only the top\nlevel, then fewer top entries, and the sessions fill what it leaves. → steps into the highlighted\nfolder's sessions, where enter opens one. From the sessions view, ctrl+f\n(or ~ or / typed into an empty search) opens the same picker to browse\nsessions by folder; there enter starts a new session in the folder.\n\nThe daemon serves GET /fs/list, /fs/repo and /fs/preview, so the picker\nonly offers folders the daemon can see, remote or not. harness/vcs is a\nshared git + jj module: .jj wins over .git in a colocated repository, and\njj always runs with --ignore-working-copy so browsing never snapshots or\nwrites an operation. A jj repository's bookmark is the one @ works on,\nfound from the fork (the newest change in @'s history a bookmark\ncontains), so a bookmark that moved on is not replaced by an old backup\nbehind @. Language shares and file colors come from linguist's\nlanguages.yml, shipped in priv/linguist and parsed once with yamerl.\nInside a repository the preview tree shows only tracked or changed paths.\n\nMoving a session now moves every descendant that was in the same folder:\nidle ones before the POST answers, running ones when their turn ends.\n\nThe CLI colors languages with our own pastels, falling back to linguist's\nhex, lifted in OKLCH until they reach an APCA contrast target on the\nterminal's background. robot-docs/workspaces.md is the contract.\n"},{"name":"links.gleam","kind":"file","size":3790,"lastCommitHash":"2f43cb2da0aaeaff5bdef36f61fa5475e6c9ad2b","lastCommitWhen":"2026-10-02T21:59:35+03:00","lastCommitMessage":"links: link workspaces into one project, sharing memory and work items\n\n/link adds or removes peers in a workspace_links group. each member keeps writing its own memory and work items; reads cover the group (memory snapshot, grep and search; every work ledger read and change), so a gone member loses nothing and unlinking undoes nothing.\n\na member's folder is checked where it is: a remote one with one exists gather over the shared ControlMaster, every member at once. a host that doesn't answer reads as connecting, sign in or unreachable, never gone, and opening a session never waits on a host.\n\na link or unlink queues a note in every open session of the workspaces it touches; a link note carries the new members' memory snapshot, so an open session sees it without rebuilding its prompt.\n\nmemory moves daemon-side: the kernel's memory object calls the memory host route through a new blocking host_now, so a remote session's notes land in the daemon's ALBEDO_HOME instead of the host's.\n\nSigned-off-by: dawn <90008@klbr.net>\n"},{"name":"location.gleam","kind":"file","size":7002,"lastCommitHash":"f8358641c2ec938eb1229f924f66595a38f651e9","lastCommitWhen":"2026-10-02T21:57:55+03:00","lastCommitMessage":"kernel: swap stale kernels at idle and run kernels on remote hosts over ssh\n\n#55: a kernel on an older bundle, protocol or module set is swapped at the next idle moment (snapshot, boot the new one beside it, restore, stop the old), with a note naming what carried; live jobs hold the swap until /kernel upgrade forces it.\n#56: sessions at host:/path boot their kernel there through the same bridge over ssh, on the ControlMasters remote.connect() uses; reaping runs on the host, heavy slots are per host, an unreachable host is a reattach rather than a lost kernel, and login profiles that print cannot corrupt the frames.\n#57: /fs routes, AGENTS.md and project skills read remote workspaces in one ssh round trip, interpreted by the local code path; GET /hosts lists recent and ssh-config hosts.\n\nSigned-off-by: dawn <90008@klbr.net>\n"},{"name":"loop.gleam","kind":"file","size":23054,"lastCommitHash":"7f1ee85ff421f31f7bc0540853889e2cf3389e19","lastCommitWhen":"2026-10-01T19:29:08-04:00","lastCommitMessage":"feat(notes): let the model keep its own notes across every compaction\n\nA notes layer sits over whichever strategy is active. At each compaction it\nasks the model to rewrite its notes from the previous ones and the history\njust evicted, tells it the budget (2000 tokens by default), and puts the\nresult as plain text ahead of every later request. A failed rewrite keeps\nthe old notes and never fails the turn.\n\nThe summarizer now takes its instructions per request and reads assistant\nturns as text and calls rather than raw provider JSON, skipping encrypted\nreasoning. Strategies trigger at 80% by default, since the notes are not\ncounted in their estimates.\n"},{"name":"oauth.gleam","kind":"file","size":3505,"lastCommitHash":"d9a9fec0a6765f7c926b13847237c3bdecec2dcb","lastCommitWhen":"2026-09-29T13:11:55+03:00","lastCommitMessage":"move every secret into a daemon-owned creds.json\n\nSigned-off-by: dawn <90008@klbr.net>\n"},{"name":"page.gleam","kind":"file","size":4708,"lastCommitHash":"b585313526672d775b6b1fe54ba3b25ad150e62b","lastCommitWhen":"2026-10-01T12:34:16-04:00","lastCommitMessage":"refactor(gleam): clean up code and enforce focused lint checks\n"},{"name":"project_files.gleam","kind":"file","size":2865,"lastCommitHash":"f8358641c2ec938eb1229f924f66595a38f651e9","lastCommitWhen":"2026-10-02T21:57:55+03:00","lastCommitMessage":"kernel: swap stale kernels at idle and run kernels on remote hosts over ssh\n\n#55: a kernel on an older bundle, protocol or module set is swapped at the next idle moment (snapshot, boot the new one beside it, restore, stop the old), with a note naming what carried; live jobs hold the swap until /kernel upgrade forces it.\n#56: sessions at host:/path boot their kernel there through the same bridge over ssh, on the ControlMasters remote.connect() uses; reaping runs on the host, heavy slots are per host, an unreachable host is a reattach rather than a lost kernel, and login profiles that print cannot corrupt the frames.\n#57: /fs routes, AGENTS.md and project skills read remote workspaces in one ssh round trip, interpreted by the local code path; GET /hosts lists recent and ssh-config hosts.\n\nSigned-off-by: dawn <90008@klbr.net>\n"},{"name":"protect.gleam","kind":"file","size":588,"lastCommitHash":"a1d676a5418d8096c1c69ba76366f11f80c7a68e","lastCommitWhen":"2026-10-01T02:33:29Z","lastCommitMessage":"feat(extensions): refuse broken plugins instead of dying with them\n\nA tool that errors or raises used to end the turn, and an extension that\nfailed to load or prepare used to take the whole session. Third-party\nextensions run in our processes, so neither can stay fatal.\n\nTool invocation answers Result(Output, Failure): Refused(reason) becomes\nthe call's result and the turn continues, Fatal(reason) ends it, which\nonly the python tool uses when a cell's source or outcome will not store.\nA tool that raises is refused with its crash and an unknown-effects note.\n\nComposition leaves out a context plugin that will not load, a managed\nplugin that fails to prepare, and a contribution colliding with another's\ntool, command, module, or route, each with a warning the session shows.\nEnabling an extension by name still fails with its reason, and so does a\nsettings refresh that breaks something that was working. Observers, close\ncallbacks, command handlers, and compaction prepare are guarded too,\nthrough the new shared albedo/harness/protect.\n"},{"name":"rotation.gleam","kind":"file","size":8855,"lastCommitHash":"b585313526672d775b6b1fe54ba3b25ad150e62b","lastCommitWhen":"2026-10-01T12:34:16-04:00","lastCommitMessage":"refactor(gleam): clean up code and enforce focused lint checks\n"},{"name":"rpc.gleam","kind":"file","size":2440,"lastCommitHash":"1408fce8d01724a4b3f7aa27651091c263dc84a4","lastCommitWhen":"2026-09-28T06:34:04+03:00","lastCommitMessage":"Refactor Gleam and Erlang code across daemon, harness, and providers\n\nSigned-off-by: dawn <90008@klbr.net>\n"},{"name":"runtime.gleam","kind":"file","size":51978,"lastCommitHash":"f8358641c2ec938eb1229f924f66595a38f651e9","lastCommitWhen":"2026-10-02T21:57:55+03:00","lastCommitMessage":"kernel: swap stale kernels at idle and run kernels on remote hosts over ssh\n\n#55: a kernel on an older bundle, protocol or module set is swapped at the next idle moment (snapshot, boot the new one beside it, restore, stop the old), with a note naming what carried; live jobs hold the swap until /kernel upgrade forces it.\n#56: sessions at host:/path boot their kernel there through the same bridge over ssh, on the ControlMasters remote.connect() uses; reaping runs on the host, heavy slots are per host, an unreachable host is a reattach rather than a lost kernel, and login profiles that print cannot corrupt the frames.\n#57: /fs routes, AGENTS.md and project skills read remote workspaces in one ssh round trip, interpreted by the local code path; GET /hosts lists recent and ssh-config hosts.\n\nSigned-off-by: dawn <90008@klbr.net>\n"},{"name":"search.gleam","kind":"file","size":9636,"lastCommitHash":"a6513292e18cc255ede8c2d3da8a6c41f983dfc7","lastCommitWhen":"2026-10-01T11:35:46-04:00","lastCommitMessage":"perf(retrieval): page O(n) rows and retain O(k) results\n\nSparse search: 2 pages, 2 decodes.\n2200 matches: 20 retained; count remains exact.\nNode page: 7 of 45 summaries read.\nText page: 128 of 300 rows decoded.\n"},{"name":"session_settings.gleam","kind":"file","size":2613,"lastCommitHash":"d056d3200ec5fb33a79235d19c86649a57d5d585","lastCommitWhen":"2026-10-02T11:14:47-04:00","lastCommitMessage":"feat(mcp): skip servers that are offline and add them when they return\n\nA server that could not start used to fail the whole mcp extension for the\nsession, taking every other server's tools with it. It is now left out with a\nwarning, and the rest load.\n\nA missing server is probed when the session shows activity, never on a timer,\nwith doubling backoff from the new `retryMs` setting (default 30s). One found\nup asks the session to refresh at the end of a turn, which leaves the usual\n\"capabilities changed\" turn and pins the old prompt until compaction.\n`extension.Session` gains `refresh(reason)` for this.\n\nSaving or enabling a server through settings stays strict, so a mistyped\ncommand is still refused where it is typed.\n"},{"name":"settings.gleam","kind":"file","size":1096,"lastCommitHash":"b585313526672d775b6b1fe54ba3b25ad150e62b","lastCommitWhen":"2026-10-01T12:34:16-04:00","lastCommitMessage":"refactor(gleam): clean up code and enforce focused lint checks\n"},{"name":"ssh.gleam","kind":"file","size":8118,"lastCommitHash":"8679812f9a1556a9965ed134e65a17b95af7d3a1","lastCommitWhen":"2026-10-02T22:00:06+03:00","lastCommitMessage":"ssh: say when a probe is copying the kernel to a host, in the picker and the chat\n\nalbedo_ssh.py probe announces a staging step on its own line before it copies the bundle; albedo_ssh.erl passes lines on as they arrive and keeps the last as the answer. /hosts/:host carries step while warming, and the session status's kernel carries it while a remote kernel boots, so both read \"copying the kernel to chernobog…\" instead of \"connecting to\".\n\nSigned-off-by: dawn <90008@klbr.net>\n"},{"name":"tool.gleam","kind":"file","size":6431,"lastCommitHash":"a6513292e18cc255ede8c2d3da8a6c41f983dfc7","lastCommitWhen":"2026-10-01T11:35:46-04:00","lastCommitMessage":"perf(retrieval): page O(n) rows and retain O(k) results\n\nSparse search: 2 pages, 2 decodes.\n2200 matches: 20 retained; count remains exact.\nNode page: 7 of 45 summaries read.\nText page: 128 of 300 rows decoded.\n"},{"name":"usage_feed.gleam","kind":"file","size":8923,"lastCommitHash":"2d8bd884a98230586393724a57252da90edfc16f","lastCommitWhen":"2026-09-28T11:24:53+03:00","lastCommitMessage":"Record provider calls and account quota for cache-aware compaction\n\nPhase 1 of quota- and cache-aware compaction: record what later analysis cannot\nrecover from the transcript, with no behaviour change.\n\n- Usage carries cache writes split by TTL (5m/1h) and reasoning tokens, from\n  Anthropic's cache_creation, OpenAI's output/completion token details and\n  Antigravity's thought count.\n- request_ledger keeps one row per upstream attempt (turns and compaction\n  summaries): account label from rotation, timing, outcome with HTTP status and\n  a bounded error body, token counts, the transcript seq it produced, and a\n  prefix identity (head hash, projected inputs, replaced count, replacement\n  hash, strategy). Requests are hashed, never stored. GET /sessions/:id/ledger\n  reads it.\n- provide-usage (usage-core, Zig) is a pinned flake input linked as\n  priv/bin/usage. usage_feed drives it one stateless `usage advance -` round\n  at a time over stdin; albedo does the HTTP, and alibaba's `bl` runs with an\n  environment allowlist, a deadline that kills it, and a stdout cap.\n- One daemon-wide poller reads every account's quota on a 10 minute cadence,\n  2 minutes near a limit or reset, backing off on failure, into quota_sample\n  (plan, window and reset as reported). Only access tokens reach the core.\n  GET /quota reads the latest or the history.\n"},{"name":"vcs.gleam","kind":"file","size":11698,"lastCommitHash":"f8358641c2ec938eb1229f924f66595a38f651e9","lastCommitWhen":"2026-10-02T21:57:55+03:00","lastCommitMessage":"kernel: swap stale kernels at idle and run kernels on remote hosts over ssh\n\n#55: a kernel on an older bundle, protocol or module set is swapped at the next idle moment (snapshot, boot the new one beside it, restore, stop the old), with a note naming what carried; live jobs hold the swap until /kernel upgrade forces it.\n#56: sessions at host:/path boot their kernel there through the same bridge over ssh, on the ControlMasters remote.connect() uses; reaping runs on the host, heavy slots are per host, an unreachable host is a reattach rather than a lost kernel, and login profiles that print cannot corrupt the frames.\n#57: /fs routes, AGENTS.md and project skills read remote workspaces in one ssh round trip, interpreted by the local code path; GET /hosts lists recent and ssh-config hosts.\n\nSigned-off-by: dawn <90008@klbr.net>\n"}]