16 Commits

Author SHA1 Message Date
3e7152a884 Update NTFS note in README: repos moved to /home/brasse/repos (btrfs)
All checks were successful
build-and-push / build (push) Successful in 42s
release-client / build-release (push) Successful in 40s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 19:15:50 +02:00
b3204de62e daemon: fixa TDZ-dispatch + hook-port-per-instans (flera klienter/host)
All checks were successful
build-and-push / build (push) Successful in 9s
release-client / build-release (push) Successful in 46s
Två buggar som hittades vid test mot riktiga servern:

1. Dispatchen (`void runConnect()`) låg överst i filen, ovanför module-level
   const CONFIG_DIR/CRED_FILE. runConnect:s synkrona del (fram till första
   await) kördes då under modul-init medan de const:erna var i TDZ → loadCreds()
   fick undefined path → returnerade null → klienten körde alltid nytt
   device-flöde istället för att återuppta. Flyttad sist i filen.

2. Hook-porten var hårdkodad (8788) → flera daemon-instanser på samma host
   krockade (EADDRINUSE) och kraschade. Nu: bind hook-porten FÖRST på en
   ephemeral port (om AGENT_HELM_HOOK_PORT ej satt) och skicka faktiska porten
   till agenten; bind-fel är icke-fatalt (kör vidare utan hook).

Verifierat mot rcai.brasse-pc.eu: resume återupptar rätt session, --new ger en
parallell session, två instanser kör samtidigt med var sin hook-port.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U68YyHsxU91ecsen84WQV4
2026-06-29 01:42:39 +02:00
94259b3456 auth: OIDC/lokal inloggning + device-flow för klienter, sessioner per användare
All checks were successful
build-and-push / build (push) Successful in 18s
release-client / build-release (push) Successful in 48s
Ersätter den delade AGENT_HELM_TOKEN med en riktig auth-modell:

- Webben loggar in med lokala konton ELLER OIDC (Authentik/Keycloak/…), valt
  per server. Inloggning ger en HMAC-signerad cookie; WS autentiseras via cookien.
- Klienten (daemon) kopplas via device-flödet (RFC 8628-likt): `agent-helm connect`
  skriver ut en URL, du loggar in + godkänner i webben, och får ett klient-token
  som identifierar din användare. Token sparas i ~/.config/agent-helm/.
- Sessioner är per användare (web ser bara sina egna; admin ser alla). Flera
  klient-instanser = flera parallella sessioner; --new tvingar ny, annars resume.
- Identitet är utbytbar (lokal/OIDC) men device-flödet + sessionerna är alltid
  agent-helms egna → funkar för vem som helst som hostar detta, med eller utan IdP.
- Bootstrap-admin via env (engångs) eller first-run-setup i UI:t. Klient-creds
  kan listas/återkallas; minimal admin-UI (skapa användare, konfigurera OIDC).

Nya filer: server/store.ts (JSON-store, scrypt, cookies), server/oidc.ts
(auth-code+PKCE), web/lib/api.ts. Verifierat end-to-end lokalt (login → device
→ approve → daemon-WS → web ser sessionen; web utan cookie nekas).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U68YyHsxU91ecsen84WQV4
2026-06-29 01:21:29 +02:00
98c4d13360 BeforeTool-hook + kort-vy (strukturerade godkännanden) + release på master-push
All checks were successful
build-and-push / build (push) Successful in 22s
release-client / build-release (push) Successful in 48s
Feature: strukturerade verktygsgodkännanden
- shared: protokoll för approval (daemon:approval, server:approval[-resolved],
  web:approval-decision, server:approval-decision)
- daemon: hook-läge ('agent-helm hook' — samma binär), lokal 127.0.0.1-endpoint
  som hooken POST:ar till, long-poll tills beslut; graceful default (allow) när
  ingen UI; timeout-fallback; skickar AGENT_HELM_HOOK_PORT till agentens env
- server: routar daemon:approval -> prenumeranter, beslut -> daemon + döljer kort
- web: reaktiv approvals-lista + kort-overlay (Tillåt/Neka), mobilanpassad

CI:
- release.yaml triggar nu även på master-push -> rullande 'latest'-release
  (versionerade releaser kvar på v*-taggar); install.sh hämtar 'latest'

Docs: hook-konfig (gemini settings.json) + hook-env i .env.example + DEPLOY.md.
Säkerhet: hook-endpoint binder endast 127.0.0.1; inga hemligheter i repot.

Verifierat lokalt: hook->daemon->server->kort->beslut->hook ger {"decision":"allow"};
alla paket typecheckar; web bygger.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
latest
2026-06-28 18:03:12 +02:00
a06a02927c release: bygg pkg med --no-bytecode (cross-arch utan QEMU) + idempotent asset-upload
All checks were successful
build-and-push / build (push) Successful in 9s
release-client / build-release (push) Successful in 50s
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
v0.1.1
2026-06-28 17:30:53 +02:00
1c14a59764 install.sh: ingen sudo (mkdir bin först; ~/.local/bin-fallback; sudo sh för system-wide)
All checks were successful
build-and-push / build (push) Successful in 10s
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 17:28:49 +02:00
a6e304fb53 Klient-distribution: självständiga binärer + curl|sh-installer
All checks were successful
build-and-push / build (push) Successful in 26s
release-client / build-release (push) Successful in 1m3s
- daemon: byt node-pty -> @homebridge/node-pty-prebuilt-multiarch (N-API-
  prebuilds för x64+arm64, ingen kompilering); esbuild-bundle av daemonen
- .gitea/workflows/release.yaml: på tag v* bygger pkg båda arkitekturerna på
  Pi-runnern (utan QEMU — prebuilds för båda finns) och publicerar som
  Gitea-release-assets via API
- install.sh: 'curl -fsSL .../install.sh | sh' — detekterar arch, hämtar rätt
  binär från senaste releasen, lägger agent-helm i PATH, skapar config.env +
  valfri systemd-user-service (Arch/Ubuntu)
- deploy/client-build/package.json: pkg-config (assets för prebuilds)
- DEPLOY.md: klient-installationssektion

Verifierat lokalt: pkg-binär (x64, 83 MB) startar, node-pty spawnar pty,
ansluter och input/output funkar end-to-end.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
v0.1.0
2026-06-28 17:24:21 +02:00
c3972d76df Fixa Docker-bygge: kopiera in tsconfig.base.json (web/server extends den)
All checks were successful
build-and-push / build (push) Successful in 39s
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 16:46:39 +02:00
f6c2420af3 Fixa runner: ta bort egen docker.sock-mount (act_runner auto-monterar -> Duplicate mount point)
Some checks failed
build-and-push / build (push) Failing after 41s
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 16:39:50 +02:00
4803b3ac05 DEPLOY: explicit katalog-/ägarskapssteg (uid 1000) före deploy
Some checks failed
build-and-push / build (push) Failing after 40s
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 16:25:58 +02:00
062e02b417 CI/CD + deploy: Gitea Actions -> registry -> Dockge -> NPM (rcai.brasse-pc.eu)
Some checks failed
build-and-push / build (push) Has been cancelled
Server:
- serverar byggd web-frontend statiskt + SPA-fallback (WEB_DIST)
- host-mountad persistent katalog via DATA_DIR (/srv/docker/agent-helm -> /app/data),
  förberedd för framtida db/auth enligt övriga appars konvention
- esbuild-bundle -> dist/server.cjs (en fil, inga node_modules i runtime)
Web:
- WS-URL defaultar till samma origin i prod (wss://rcai.brasse-pc.eu), localhost i dev

Deploy-artefakter:
- Dockerfile: multi-stage, bygger web + bundlar server; --filter utesluter daemon
  (ingen node-pty-kompilering); kör som uid 1000 (= brasse på host)
- .gitea/workflows/build.yaml: push master -> bygg arm64 -> push localhost:5000
- deploy/act-runner.{compose,config}.yaml: Gitea Actions-runner i Docker (docker.sock,
  job-containrar får värdens docker for build/push)
- deploy/agent-helm.compose.yaml: Dockge-stack (srv_default, expose 8787, data-mount,
  x-dockge.urls)
- deploy/DEPLOY.md: full runbook (runner, bygge, stack, NPM, uppdatering, felsökning)

Verifierat lokalt: typecheck rent, server-bundle serverar UI+health+assets+SPA-fallback,
data-dir skapas. Docker-bygget validerat så långt daemonen är nere (filter bekräftat).
2026-06-28 16:03:14 +02:00
09f1168c17 README: kom igång-guide (med NTFS/btrfs-fallgrop) + slice markerad klar
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 14:43:19 +02:00
8af5fd9972 Fixa native builds + CJS-interop; lås beroenden; verifierad slice
- pnpm-workspace.yaml: allowBuilds för esbuild + node-pty (pnpm 11 ersätter
  onlyBuiltDependencies-listan)
- pnpm-lock.yaml: committa låsfilen
- server: @xterm/headless + @xterm/addon-serialize är CommonJS — default-
  importera värdet och ta typen via 'import type' (annars ESM-named-export-fel
  i runtime trots att typecheck passerar)
- daemon: städa pty-processen även vid SIGTERM

Verifierat lokalt: alla paket typecheckar, web bundlar (vite), och rök-test av
server<->daemon<->klient passerar (token-auth, registrering, snapshot,
input->pty->output).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 14:42:01 +02:00
c58f73626e Scaffolda tunn vertikal slice: pnpm-monorepo (shared/daemon/server/web)
- shared: typat WebSocket-protokoll (daemon/server/web som enda sanning)
- daemon: node-pty kör agenten (default gemini), strömmar pty över WS,
  auto-reconnect; fast pty-storlek
- server: WS-mux + token-auth + session-registry + headless-xterm scrollback
  (SerializeAddon) + routing av input till rätt session
- web: Vue 3 + Vite + xterm.js, session-lista, mobil-layout och
  fallback-tangentbord (piltangenter/Enter/Esc/Tab/Ctrl-C) som skickar
  escape-sekvenser rakt till pty:n -> styr sessionen även utan hooks
- workspace: pnpm-workspace.yaml (onlyBuiltDependencies: node-pty, esbuild),
  tsconfig.base, .npmrc (retry-inställningar), .env.example

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 14:28:04 +02:00
0c75d94812 Initial commit: arkitektur, dataflöde och fallback-navigering
README beskriver agent-helm — fjärrstyrning av Gemini CLI-sessioner från
mobil/webb. Dokumenterar komponenter (daemon/server/web/hooks), repo-struktur,
dataflöde, de två åtskilda input-kanalerna, samt fallback-navigering
(piltangenter + Enter rakt till pty) så att sessioner kan styras oavsett om
BeforeTool/Notification-hooks är uppsatta eller fungerar.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 01:59:54 +02:00
9b87955dc3 Initial commit 2026-06-28 01:56:25 +02:00