diff --git a/docs/HANDOFF.md b/docs/HANDOFF.md index cd2e43c..69d543c 100644 --- a/docs/HANDOFF.md +++ b/docs/HANDOFF.md @@ -1,131 +1,159 @@ # HANDOFF — Vauco OS -**Sist oppdatert:** 2026-06-13 14:45 CEST -**Skrevet av:** Perplexity (stand-in) via GitHub MCP -**Sprint:** Fase 2 — opax.html panel-fikser er neste prioritet +**Sist oppdatert:** 2026-06-13 17:00 CEST +**Skrevet av:** Perplexity (stand-in) +**Status:** Fase 2 pågår — opax.html paneler og Dockerfile-fix --- -## 🔴 Kritisk blokkering — fikses nå +## ⚠️ KRITISKE REGLER — les alltid først -### `google.cloud.devtools` krasjer `/run`-endepunktet -**Rotårsak:** `main.py` importerer `from google.cloud.devtools import cloudbuild_v1` inne i `/opax/build-status`. -Denne importen krasjer med HTTP 500 og blokkerer: -- Jason: alle verktøykall (`get_build_status`, `get_logs`, `deploy_service`) feiler -- Cloud Build-panel i opax.html: viser alltid ERROR -- `/run`-endepunktet krasjer hvis Jason prøver å bruke et ADK-verktøy - -**Fix:** Erstatt `cloudbuild_v1`-importen med REST API via `httpx` + `google.auth` (se Fase 2-oppdrag nedenfor) +- **Hovudapp:** `main.py` i rot — IKKE `agents/core-logic/app.py` +- **Dockerfile:** `agents/core-logic/Dockerfile` — skal ha `WORKDIR /app` og `CMD ["uvicorn", "main:app", ...]` +- **Region:** `us-central1` +- **Service:** `osvauco-agent` +- **Prosjekt:** `propane-will-491900-m5` +- **Test via proxy:** `gcloud run services proxy osvauco-agent --region=us-central1 --project=propane-will-491900-m5 --port=8080` +- **ALDRI `--audiences`-flag** +- **Smoke-test:** skal peke på `/health` (ikke `/debug-health`) --- -## 🧪 Panel-test 2026-06-13 — opax.vauco.no +## 🔴 Siste kjente problem — Dockerfile base-image -| Panel | Status | Problem | -|-------|--------|----------| -| Jason chat | ✅ Svarer | Enkle spørsmål fungerer — verktøykall gir HTTP 500 | -| CostGuard | 🔴 Spinner evig | Fetcher feil URL eller timeout | +Bygg `00401` og `00403` viste fortsatt: +``` +WORKDIR /app/agents/core-logic +CMD uvicorn app:app +``` +Selv etter at `agents/core-logic/Dockerfile` ble fikset. + +**Rotårsak:** `osvauco-base:latest` base-image inneholder gammel `WORKDIR` og `CMD` som arves. + +**Siste fix (commit `beb466e`):** +- `WORKDIR /app` satt eksplisitt først i Dockerfile +- `COPY docs/ ./docs/` lagt til +- `CMD ["uvicorn", "main:app", ...]` bekreftet +- Smoke-test tilbake til `/health` + +**Hvis neste bygg fortsatt feiler på `/health`:** +```bash +gcloud builds submit --config=cloudbuild.base.yaml +``` +Deretter trigger et nytt bygg. + +--- + +## 🧪 Panel-status opax.vauco.no (testet 2026-06-13 17:00) + +| Panel | Status | Problem / Merknad | +|-------|--------|-------------------| +| Jason chat | ✅ Svarer | Enkle spørsmål OK — verktøykall ga HTTP 500 (devtools-fix pushet) | +| CostGuard | ⚠️ Ingen data | Viser "Ingen data tilgjengelig" — løses når riktig app er oppe | | Kalkulator | ✅ Fungerer | Slider + ROI live | -| Cloud Build | 🔴 ERROR alltid | `devtools`-import krasjer — aldri fungert | +| Cloud Build | ⚠️ Ingen builds | REST-kall fungerer men returnerer tom liste — auth OK | | VM-er | ✅ Fungerer | RUNNING, IP, SSH-knapp til GCP | | Sites & Moduler | ✅ Fungerer | Alle 6 kort vises | -| Terminal | 🟡 Skall | Viser 5 hardkodede kommandoer, ingen output fra backend | -| MD | 🔴 Tom | Åpne-knappen gjør ingenting | -| Browser | 🔴 Ødelagt | Kun intern /docs/-proxy — externe URLer viser broken | +| Terminal | 🟡 Skall | JS kaller endepunkter direkte, ingen POST /terminal/exec backend | +| MD | ⚠️ HTTP 404 | Åpne-knappen feiler — løses når COPY docs/ er i prod | +| Docs Browser | ⚠️ HTTP 404 | Samme — løses med riktig Dockerfile i prod | --- -## 🔴 Fase 2 — Neste oppdrag (gi til Nemotron) +## 🔴 Nåværende oppdrag — gjør i denne rekkefølgen -### Fix 1 — Cloud Build REST (blokkerer Jason) -`/opax/build-status` i `main.py`: fjern `cloudbuild_v1`-import, bruk: -```python -import httpx, google.auth, google.auth.transport.requests +### Oppdrag 1 — Verifiser at Dockerfile-fix er i prod +```bash +# Sjekk siste revisjon +gcloud run services describe osvauco-agent --region=us-central1 \ + --format="value(status.latestReadyRevisionName)" -@app.get("/opax/build-status") -async def build_status(): - creds, project = google.auth.default() - creds.refresh(google.auth.transport.requests.Request()) - url = f"https://cloudbuild.googleapis.com/v1/projects/{project}/builds?pageSize=5" - r = httpx.get(url, headers={"Authorization": f"Bearer {creds.token}"}) - builds = r.json().get("builds", []) - return {"builds": [{"id": b["id"], "status": b["status"], - "branch": b.get("substitutions",{}).get("BRANCH_NAME",""), - "createTime": b["createTime"]} for b in builds]} +# Test /health +curl http://localhost:8080/health + +# Test /docs/ +curl http://localhost:8080/docs/MASTERPLAN.md | head -5 ``` +Hvis HTTP 404 på `/health` → rebuild base-image (se over). -### Fix 2 — MD-panel -`Åpne`-knappen på hvert MD-kort gjør ingenting. -Fiks: klikk → fetch `/docs/` → render markdown inline med `marked.js` +### Oppdrag 2 — Terminal backend (main.py) +Legg til: +```python +@app.post("/terminal/exec") +async def terminal_exec(body: dict): + cmd = body.get("cmd", "").strip() + whitelist = { + "health": lambda: {"output": "OK", "exit_code": 0}, + "billing": "GET /billing/summary", + "build": "GET /opax/build-status", + "help": lambda: {"output": "Kommandoer: health billing build logs help", "exit_code": 0}, + } + if cmd not in whitelist: + return {"output": f"Ukjent kommando: {cmd}", "exit_code": 1} + # kall internt og returner output som streng +``` +Koble `opax.html` terminal-input til `POST /terminal/exec` og vis output. -### Fix 3 — CostGuard-panel spinner -Finn fetch-URL i `opax.html` for CostGuard-seksjonen. -Verifiser at den peker på `/billing/credits?days=30`. -Legg til timeout 10s og vis "Ingen data" i stedet for evig spinner. - -### Fix 4 — Browser-panel -Fjern ekstern URL-støtte (fungerer ikke — CORS/iframe-blokkering). -Rename til "Docs Browser", placeholder `/docs/MASTERPLAN.md`. -Vis markdown rendret, ikke raw. - -**Commit:** `fix(opax): cloud-build REST, MD-render, CostGuard timeout, browser-panel` +### Oppdrag 3 — VM SSH-nøkkel modal (main.py + opax.html) +```python +@app.get("/vm/ssh-key") +async def vm_ssh_key(instance: str = "osvauco-dev-vm"): + # hent public key via Compute Engine metadata API + # google.auth + httpx GET + # https://compute.googleapis.com/compute/v1/projects/{project}/zones/us-central1-b/instances/{instance} + return {"public_key": str, "instance": str} +``` +Legg til "Vis SSH-nøkkel"-knapp på VM-kortet i `opax.html`. --- -## ✅ Levert 2026-06-13 -| Commit | Task | Detalj | -|--------|------|---------| -| `6611927` | **Hotfix** `requirements.txt` + BQ-migrering | `google-cloud-build>=3.24.0` lagt til. BQ-skript kjørt ✅ | -| `c114f6c` | **Frontend** `billing-dashboard.html` | Tre pool-bars, Free Trial topbar-banner, `Promise.allSettled()` | -| `bc501c1` | **OQ-31** `billing_agent.py` | `credit_pools[]`, `effective_days`, `badge_class`, `warning: bool` | -| `055a482` | **OQ-29** `main.py` | `GET /notify/channels` — verifisert i prod | -| `4693fea` | **CI-fix** `cloudbuild.yaml` | Fjernet `--audiences` fra smoke-test | +## ✅ Levert og bekreftet ---- - -## ✅ Manuelt utført 2026-06-13 -| Handling | Status | -|----------|--------| -| Kreditt env-vars satt i Cloud Run (rev `00469-p96`) | ✅ Ferdig | -| BQ-migrering kjørt — `caller_type`, `module_name`, `session_id` | ✅ Ferdig | -| `google-cloud-build` i `requirements.txt` | ✅ Pushet | +| Commit | Hva | +|--------|-----| +| `6611927` | `google-cloud-build` i requirements + BQ-migrering | +| `c114f6c` | billing-dashboard: tre pool-bars, banner, allSettled | +| `bc501c1` | credit_pools[], effective_days, badge_class | +| `055a482` | GET /notify/channels — verifisert i prod | +| `4693fea` | CI-fix: fjernet --audiences fra smoke-test | +| `39f714a` | MD-panel: marked.js + openMd() | +| `b5c03d4` | CostGuard: fetchWithTimeout 10s + fallback | +| `3cc6a83` | Docs Browser: dropdown, auto-load, marked.js | +| `beb466e` | Dockerfile: WORKDIR /app, COPY docs/, main:app | --- ## ✅ OQ-logg + | OQ | Beskrivelse | Status | |----|-------------|--------| -| **OQ-29** | `GET /notify/channels` | ✅ Verifisert i prod | -| **OQ-30** | Browser-panel `opax.html` | ✅ Løst (frontend) — backend /docs/ fungerer | -| **OQ-31** | `credit_pools[]` + kreditt env-vars | ✅ Komplett | +| OQ-29 | GET /notify/channels | ✅ Prod | +| OQ-30 | Browser-panel opax.html | ✅ Levert | +| OQ-31 | credit_pools[] | ✅ Komplett | --- -## ⚠️ Gjenstår for Chris -| # | Handling | Prioritet | -|---|----------|-----------| -| 1 | Gi Fase 2-oppdraget til Nemotron (Fix 1-4 over) | 🔴 Høy | -| 2 | Sett varslings-env-vars: `SENDGRID_API_KEY`, `NOTIFY_EMAIL_TO`, `TWILIO_ACCOUNT_SID` | Lav | -| 3 | Bestem CG7-scope | Venter på Chris | -| 4 | Aktiver Emma/Gemma — `docs/gemma/world.md` finnes allerede i repo | Medium | +## ⚠️ Gjenstår ---- - -## ⚠️ Regler (låst) -- **Test alltid via `cloud-run-proxy`** — IKKE `--audiences` -- `gcloud run services proxy osvauco-agent --region=us-central1 --project=propane-will-491900-m5 --port=8080` -- **Hovudapp:** `main.py` i rot — IKKE `agents/core-logic/app.py` -- **Region:** `us-central1` -- **Service:** `osvauco-agent` +| # | Oppgave | Prioritet | +|---|---------|----------| +| 1 | Verifiser Dockerfile-fix i prod (/health + /docs/) | 🔴 Høy | +| 2 | POST /terminal/exec backend + frontend kobling | Høy | +| 3 | GET /vm/ssh-key + modal i opax.html | Medium | +| 4 | Sett varslings env-vars: SENDGRID_API_KEY, TWILIO_ACCOUNT_SID | Lav | +| 5 | CG7-scope — venter på Chris | Venter | +| 6 | Emma/Gemma GPU VM — docs/gemma/world.md finnes | Medium | --- ## 🏗 Systemstatus + | Komponent | Status | |-----------|--------| -| Cloud Run `osvauco-agent` | ✅ Live `us-central1` rev `00469-p96` | +| Cloud Run `osvauco-agent` | ✅ Live us-central1 | | `opax.vauco.no` | ✅ Live — 5/9 paneler fungerer | -| `costguard.oss.vauco.no` | ✅ Innlogging fungerer | -| Jason (ADK) | 🔴 Verktøykall feiler — devtools-fix nødvendig | +| `costguard.oss.vauco.no` | ⚠️ 403 i inline-panel — åpne direkte i nettleser | +| Jason ADK | ⚠️ Verktøykall feilet — devtools-fix pushet, venter på deploy | | BQ billing export | ✅ Aktiv | | Gemma/Emma VM | ⏳ Ikke startet | +| Kreditt env-vars | ✅ Satt (INFRA 2911 NOK utløper 2026-07-10 ⚠️) |