Commit Graph

235 Commits

Author SHA1 Message Date
ffc9b331ea feat(pikachu): manage ssh keys 2026-08-02 21:34:20 -04:00
729c8fdd5f feat(ssh): add host aliases 2026-08-02 21:06:39 -04:00
e56b710344 feat(pikachu): add initial NixOS host 2026-08-02 19:20:56 -04:00
d782308b42 fix(pi): expire terminal subagents automatically 2026-08-02 14:23:24 -04:00
8e8752e519 fix: eliminate configuration evaluation warnings 2026-08-02 13:20:59 -04:00
58f6b108c3 docs(pi): clarify subagent completion behavior 2026-08-02 08:23:57 -04:00
cb26a044d3 fix(pi): prevent oversized subagent result crashes 2026-08-02 07:24:52 -04:00
af643c452d feat(pi): manage global subagent configuration 2026-08-02 07:04:28 -04:00
1e80216b07 feat(steam): add Steam desktop module 2026-08-02 00:05:45 -04:00
eb67944e68 Revert "feat(pi): add read-only subagent attach view"
This reverts commit 7bc0d0772c.
2026-08-01 23:24:16 -04:00
7bc0d0772c feat(pi): add read-only subagent attach view 2026-08-01 23:06:55 -04:00
ede3c0583f feat(pi): capture subagent activity events 2026-08-01 22:56:50 -04:00
aafc68e911 feat(pi): render subagent monitor views 2026-08-01 22:41:25 -04:00
8c85c00ae9 feat(pi): retain terminal subagent work 2026-08-01 22:33:34 -04:00
c5828e0591 feat(pi): label subagent work items 2026-08-01 22:24:04 -04:00
5fd8de031d feat(pi): patch prompt layout spacer 2026-08-01 20:43:06 -04:00
de99b4a89e feat(pi): add compact status extension 2026-08-01 19:45:52 -04:00
f5d799c64b fix(pi): load subagent extension in child sessions 2026-08-01 19:23:46 -04:00
e143495d6c feat(pi): expire recent subagent statuses 2026-08-01 18:25:43 -04:00
3c4eaec76b feat(pi): add subagent wait tool 2026-08-01 18:25:43 -04:00
007ba81c02 feat(pi): finish subagent runtime surfaces 2026-08-01 18:25:43 -04:00
3977ed6822 feat(pi): add subagent config and agents 2026-08-01 18:25:43 -04:00
289ea1344c feat(pi): harden subagent lifecycle 2026-08-01 18:25:43 -04:00
63da676b5a feat(pi): add subagent tracer bullet 2026-08-01 18:25:43 -04:00
8fc816bcd9 feat(agents): enable subagents skill 2026-08-01 18:22:59 -04:00
585d4919e7 feat(agents): add implementation workflow skills 2026-08-01 13:40:11 -04:00
6544d3d8a0 feat(agents): add slice skill 2026-07-31 23:39:46 -04:00
2fed687a00 feat(agents): enable Herdr tooling 2026-07-31 22:49:05 -04:00
36d7a53029 feat(pi): install Herdr integration declaratively 2026-07-31 22:48:43 -04:00
6422bb96f2 chore(agents): stop installing retired skills 2026-07-31 18:47:43 -04:00
9ed4809837 feat(agents): add wayfinding skills 2026-07-31 14:44:13 -04:00
6945c29a47 feat(agents): add design skill 2026-07-30 19:15:02 -04:00
521e4c7fb6 chore(pi): use gpt-5.6-sol by default 2026-07-30 09:03:48 -04:00
b8bb26da75 feat(firefox): pin signed browser extensions 2026-07-30 08:31:11 -04:00
ef1eebda58 chore(agents): migrate project artifacts to store 2026-07-30 00:39:08 -04:00
06e327ed85 feat(direnv): silence directory change logs 2026-07-29 22:48:46 -04:00
adcb7bfd77 fix(agents): keep project skills visible to Pi 2026-07-29 19:19:30 -04:00
2b957c7f09 feat(agents): make Pi a first-class agent 2026-07-29 12:04:21 -04:00
7a97ee4e31 chore(agents): remove obsolete guest scaffolding 2026-07-29 09:28:12 -04:00
3e3975c724 feat(pi): point Pi at the Codex subscription
Switch the default provider from Anthropic to OpenAI and the default
model to gpt-5.3-codex, so Pi runs on a ChatGPT Plus/Pro (Codex)
subscription. The OAuth login stays unmanaged in ~/.pi/agent/auth.json,
as before.
2026-07-28 22:36:32 -04:00
f218e47814 docs: note the repo pins no formatter and nix files aren't nixfmt-clean
Record a gotcha so a future change does not run nixfmt across a file and
reflow untouched code, injecting churn unrelated to the change.
2026-07-26 00:01:10 -04:00
53a070a59a fix(guests): keep a networked guest's resolver and order it after its bridge (task 0010)
A guest placed on a VLAN runs its own networkd, which default-enables
systemd-resolved. That conflicts with the nested-container default of
inheriting the host's resolv.conf, so its toplevel failed to build; keep the
guest's own resolver with networking.useHostResolvConf = false.

The same guest's container enslaves its veth to the VLAN bridge at start,
but the container backend orders the unit only after the network is up, not
after that specific bridge exists — a race the veth enslavement could lose.
Order container@<name> after the br-vlan<id> device so the bridge is there
first.

Both were surfaced by a VM integration test that was explored and then
dropped as not worth its regression cost; the task file records the call.
2026-07-26 00:01:10 -04:00
969737b6b5 feat(guests): let a guest nest OCI containers (task 0009)
Add a `nesting` placement field to the Host-side guest interface, a bool
off by default. On, it grants the guest's container the prerequisites its
interior needs to run Podman and other OCI containers: the `CAP_NET_ADMIN`
capability an OCI runtime uses to build its bridges and firewall rules,
and the `/dev/net/tun` and `/dev/fuse` device nodes it reaches for to
network those containers and back their overlay storage. Off, both the
capability and device lists are empty, so a non-nesting guest is untouched.

cgroup delegation, the other nested prerequisite, the NixOS container
backend already grants every container unconditionally, so the Skeleton
records it with an absence pointer rather than re-emitting it.

Add a nesting-sample guest whose interior defines an `oci-containers`
workload on Podman, and enable it on neogaia with `nesting` on, so the
path builds end to end through the Host's `nix flake check` — which pulls
in podman and the generated container unit for the nested system.
2026-07-25 22:10:46 -04:00
0b7d409fbc feat(guests): cap guest resources and gate boot-start (task 0008)
Give the Host-side placement a `limits` field — `memory`, `cpu`, and
`tasksMax` — that caps the guest's `container@<name>.service` unit via
`MemoryMax`, `CPUQuota`, and `TasksMax`, uncapped by default so an unset
limit contributes no key and systemd keeps its default.

Add an `autoStart` placement option, on by default, driving the
container's boot-start so a Host can define a guest without starting it
at boot.

Give neogaia's skeleton guest modest demonstrative caps.
2026-07-25 21:26:53 -04:00
d637d3e7f6 feat(guests): give guests only the host-decrypted secrets they name
Add a `secrets` placement option to the guest builder: a list of secret
names. The host declares each as one of its own sops secrets, so the host
is the sole decryptor from the sops files it already holds, and the
decrypted file is bind-mounted into the guest read-only at the same
`/run/secrets/<name>` path it occupies on a host. A service inside the
guest reads its credentials at a predictable location while the guest
carries no age key and decrypts nothing itself.

Ownership needs no new code: the container already runs in the host's uid
and gid space one to one, so the decrypted file's host owner is its owner
inside the guest.

Assert that no in-guest path is claimed by both a mount and a secret, so
the attribute-set merge fails loudly rather than resolving a collision
silently in the secret's favour.
2026-07-25 20:46:08 -04:00
ab9b9e9f8f feat(guests): bind-mount host pool paths into guests
Add a `mounts` placement option to the guest builder: a Host maps guest
interior paths to host paths, each read-write by default or read-only per
mount, realized as the nested container's bind mounts. A guest sees exactly the
data it should, at any granularity from a single folder to a whole pool.

Pin the container to the host's uid and gid space with `privateUsers = "no"`,
so a guest process writing as the shared storage group lands on a bind-mounted
pool as that same group without permission juggling.
2026-07-25 17:53:14 -04:00
78ab95922f feat(agent-skills): add the grill skill
Install the grill skill globally from the skills flake, alongside wiki and
consume. It interviews the operator relentlessly about a plan or design,
resolving every branch to an explicit decision before any implementation.
2026-07-25 17:38:58 -04:00
7edc1ce94b feat(zfs): import ZFS pools and add the shared write group
Add `modules.zfs`, the host-level pool import: a host declares its ZFS host id
and the pools to import with their dataset mountpoints, and the module imports
those pools as durable state rather than recreating them, so a service's data
survives any rebuild or reimage.

Add a shared `storage` group with a fixed gid to the base config both the host
base and the guest-base build on, so a host and every guest carry the same
number and an identity-mapped container write lands on the pool as that group
without per-service permission juggling.

No host enables the module: the only host is a laptop with no pools and a
kernel with no ZFS build, so the enabled build was verified by ad-hoc
enablement against a ZFS-supported kernel while the committed tree stays inert.
2026-07-25 17:26:36 -04:00
e6ea8a0060 feat(guests): place networked guests on tagged VLANs (task 0004)
A guest sets `vlan` to attach to its host's `br-vlan<id>` bridge, `mac`
to reuse an existing address (else a stable one is derived from its
namespace path and read back via `nix eval`), and `address` for a static
IP (else DHCP). The MAC and address are pinned inside the guest by its
own networkd, the only stable MAC pin for a nested container. A guest
naming a VLAN its host has not declared fails the build with an
actionable message.

The `br-vlan<id>` naming moves into a shared `bridgeName` in the lib, so
the bridge a guest attaches to and the bridge the host emits have one
source.
2026-07-25 16:45:26 -04:00
83106239d4 chore(agent-skills): update skills input, drop grill and domain-modeling
Bump the skills flake input and remove the grill and domain-modeling
skills, which are no longer carried in the agent toolset.
2026-07-25 16:36:33 -04:00