# Kipinä Agent Builder — Suunnitelma

Käyttäjä voi rakentaa omia agentteja "hahmolomakkeella": valitsee avatarin, roolin, kielimallin ja muokkaa prompteja. Agentit tallentuvat localStorageen ja ovat käytettävissä pipelineissa.

## Nykytila

```js
// Kovakoodattu agentPrompts-objekti
const agentPrompts = {
    manager: { name: 'Manageri', model: 'qwen2.5-coder:7b', default: '...' },
    coder:   { name: 'Koodari', model: 'qwen2.5-coder:7b', default: '...' },
    tofuist: { name: 'Tofuist', model: 'qwen2.5-coder:7b', docs: '/docs/tofu-cheatsheet.md', default: '...' },
    // ...
};
```

**Ongelma:** Uuden agentin lisääminen vaatii koodimuutoksen index.html:ään.

## Tavoite

```
┌─────────────────────────────────────────────────────┐
│  Agent Builder -lomake                              │
│                                                     │
│  ┌─────────┐  Nimi: [Tofuist          ]             │
│  │ 🦎      │  Rooli: [IaC / Infra    ▼]            │
│  │ avatar  │  Malli: [qwen2.5-coder:7b ▼]          │
│  └─────────┘  Docs:  [/docs/tofu-cheatsheet.md]    │
│                                                     │
│  System Prompt:                                     │
│  ┌─────────────────────────────────────────────┐    │
│  │ You are an OpenTofu/Terraform IaC specialist│    │
│  │ ...                                         │    │
│  └─────────────────────────────────────────────┘    │
│                                                     │
│  LLM-parametrit:                                    │
│  Temperature: [0.7]  Top-k: [40]  Max tokens: [512]│
│                                                     │
│  [💾 Tallenna]  [🗑️ Poista]  [📤 Export JSON]       │
└─────────────────────────────────────────────────────┘
```

## Building Blocks

### 1. Agenttiskeema

```js
{
    id: 'tofuist',                          // uniikki tunniste
    name: 'Tofuist',                        // näyttönimi
    avatar: '/avatars/gecko_notext.png',     // avatar-kuvan polku
    role: 'iac',                             // rooli-template
    model: 'qwen2.5-coder:7b',             // eksakti Ollama-mallinimi
    color: '#e3a336',                        // teemaväri UI:ssa
    docs: '/docs/tofu-cheatsheet.md',        // valinnainen referenssidokumentti
    prompt: 'You are an OpenTofu...',        // system prompt
    params: {                                // LLM-parametrit
        temperature: 0.7,
        top_k: 40,
        max_tokens: 512,
        repetition_penalty: 1.15
    }
}
```

### 2. Rooli-templatet (alasvetovalikko)

Valmiit pohjat jotka tuovat oletuspromptit ja parametrit:

| Rooli | Oletusprompt | Parametrit |
|-------|-------------|------------|
| Koodari | "Kirjoita selkeää, testattavaa koodia" | temp 0.7, max 512 |
| QA / Testaus | "Kirjoita testejä, etsi virheitä" | temp 0.4, max 512 |
| DevOps | "Dockerfile, Compose, CI/CD" | temp 0.5, max 512 |
| DevSecOps | "Tietoturva-auditointi, OWASP" | temp 0.3, max 512 |
| Arkkitehti | "Järjestelmäsuunnittelu, rajapinnat" | temp 0.6, max 512 |
| IaC / Infra | "OpenTofu/Terraform HCL-koodi" | temp 0.5, max 512 |
| Data | "Tietokannat, SQL, datamallit" | temp 0.5, max 512 |
| Manageri | "Tehtävien jako ja koordinointi" | temp 0.8, max 200 |
| Kirjoittaja | "Dokumentaatio, README, ohjeet" | temp 0.8, max 512 |
| Vapaa | (tyhjä, käyttäjä kirjoittaa) | temp 0.7, max 512 |

### 3. Malli-valitsin

Lista saatavilla olevista malleista — haetaan dynaamisesti:

```
Hub-kysely: GET /api/models → palauttaa yhdistettyjen solmujen mallit

Tai staattinen lista:
- qwen2.5-coder:7b    (oletus, natiivi GPU)
- qwen2.5-coder:1.5b  (kevyt)
- qwen2.5-coder:0.5b  (selain Wasm)
- deepseek-r1          (reasoning)
- llama3.2:3b          (yleiskäyttö)
```

Pitkän aikavälin tavoite: hub ilmoittaa WebSocketin kautta mitkä mallit ovat saatavilla.

### 4. Avatar-valitsin

Valmiit avatarit + mahdollisuus ladata oma:

| Hahmo | Tiedosto | Eläin |
|-------|----------|-------|
| Asiakas | kettu_notext.png | Kettu |
| Manageri | karhunpentu.png | Karhunpentu |
| Koodari | kipina_notext.png | Salamanteri |
| Data | pesukarhu_notext.png | Pesukarhu |
| QA | susi_notext.png | Pikkususi |
| DevOps | laiskiainen_notext.png | Laiskiainen |
| Tarkkailija | aikuinen_susi.png | Aikuinen susi |
| Tofuist | gecko_notext.png | Gecko/Lisko |
| Arkkitehti | ??? | (tulossa) |
| DevSecOps | ??? | (tulossa) |

### 5. Docs-kenttä (referenssidokumentti)

Agentti voi viitata ulkoiseen dokumenttiin joka ladataan promptiin:

```
docs: '/docs/tofu-cheatsheet.md'  →  haetaan fetch():llä, cachetetaan _docsCache-kenttään
```

**Toiminta:**
1. Ensimmäisellä `kpnRun`-kutsulla ladataan docs-URL
2. Sisältö cachetetaan `agent._docsCache`-kenttään
3. Liitetään promptiin: `"Reference:\n" + docsContent`
4. Ei ladata uudelleen saman session aikana

**Rajoitukset:**
- Max ~3000 tokenia (~10 KB) — pidempi docs tiivistetään
- Vain tekstitiedostot (.md, .txt)

### 6. Tallennus (localStorage)

```js
// Tallennusavain
'kpn-custom-agents' → JSON.stringify([ agentSkeema1, agentSkeema2, ... ])

// Ladattaessa
const customAgents = JSON.parse(localStorage.getItem('kpn-custom-agents') || '[]');
const defaultAgents = { manager: {...}, coder: {...}, ... };
const agentPrompts = { ...defaultAgents };
for (const agent of customAgents) {
    agentPrompts[agent.id] = agent;
}
```

**Oletusagentit** (manager, coder, tester, qa, data) ovat aina mukana — niitä ei voi poistaa, mutta prompteja voi muokata.

**Käyttäjäagentit** (tofuist, arkkitehti, devsecops, ...) tallentuvat localStorageen ja latautuvat käynnistyksessä.

### 7. Export / Import

```js
// Export — JSON-tiedosto
const blob = new Blob([JSON.stringify(agent, null, 2)], { type: 'application/json' });
// → agent-tofuist.json

// Import — tiedoston valinta tai drag & drop
// Validoidaan skeema, lisätään agentPrompts-objektiin
```

Mahdollistaa agenttien jakamisen tiimin kesken.

## Toteutusvaiheet

### Vaihe 1: Hahmolomake UI
- Avatar-grid valitsin
- Rooli-template alasvetovalikko (täyttää oletuspromptit)
- Malli-valitsin
- System prompt -tekstikenttä
- LLM-parametrit (temperature, top-k, max_tokens)
- Tallenna/Poista-napit

### Vaihe 2: Dynaaminen agenttirekisteri
- `agentPrompts` ladataan localStoragesta
- Oletusagentit + käyttäjän agentit yhdistetään
- Avatar-kortit renderöidään dynaamisesti (ei HTML:ssä)
- Värimapit generoidaan agenttiskeemasta

### Vaihe 3: Pipeline käyttää dynaamisia agentteja
- Pipeline-vaiheet viittaavat agentin id:hen (ei kovakoodattuun nimeen)
- Käyttäjä voi valita mitkä agentit osallistuvat pipelineen
- Tofuist voi korvata DevOpsin IaC-projekteissa

### Vaihe 4: Mallirekisteri (hub-integraatio)
- Hub tarjoaa `/api/models`-endpointin
- Saatavilla olevat mallit näkyvät valitsimessa reaaliajassa
- Solmun liittyessä/poistuessa mallit päivittyvät

## Arkkitehtuurikaavio

```
┌──────────────────────────────────────────────────┐
│  Agent Builder UI                                │
│  ┌──────────┐ ┌──────────┐ ┌──────────────────┐  │
│  │ Avatar   │ │ Rooli    │ │ Malli-valitsin   │  │
│  │ Grid     │ │ Template │ │ (hub/staattinen) │  │
│  └────┬─────┘ └────┬─────┘ └────────┬─────────┘  │
│       └─────────────┼───────────────┘             │
│                     ▼                             │
│  ┌──────────────────────────────────────────────┐ │
│  │  Agent Schema  { id, name, avatar, model,   │ │
│  │                  role, color, docs, prompt,  │ │
│  │                  params }                    │ │
│  └──────────────────┬───────────────────────────┘ │
│                     │                             │
│       ┌─────────────┼─────────────┐               │
│       ▼             ▼             ▼               │
│  localStorage   Org Chart    Pipeline             │
│  (persist)      (render)     (execute)            │
└──────────────────────────────────────────────────┘
```
