From c0fbeee4a6fdd515b4beda7451f8a06fb73941eb Mon Sep 17 00:00:00 2001 From: Alexandre Vieira Date: Sat, 20 Jun 2026 01:59:54 +0100 Subject: [PATCH 1/8] =?UTF-8?q?feat(landing):=20LANDING=20frame=20?= =?UTF-8?q?=E2=80=94=20white=20theme,=20editable=20hero=20image,=20drops?= =?UTF-8?q?=20generator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - New LANDING.widget: white theme default (black/grey text), dark toggle kept - Simplified iNFT concept (agent + NFT = one token); removed marketing copy - Hero image is now a customisable upload slot - Drops section: "Generate a drop" button (unlocks CLONE FRAME tools in Venice) - Staking lowered 100k -> 10k iCLONE (widget + README) - Removed "What it is" nav link Co-Authored-By: Claude Opus 4.8 --- README.md | 2 +- frames/LANDING.widget | 211 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 212 insertions(+), 1 deletion(-) create mode 100644 frames/LANDING.widget diff --git a/README.md b/README.md index 3219366..b36b4c9 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ mockups/ mockups HTML da plataforma ## Token utility (iCLONE) -- Staking de **100k iCLONE** (lock 6 meses, cooldown 1 mês) para publicar coleções. +- Staking de **10k iCLONE** (lock 6 meses, cooldown 1 mês) para publicar coleções. - Coleções prontas vendidas pela plataforma dispensam staking. --- diff --git a/frames/LANDING.widget b/frames/LANDING.widget new file mode 100644 index 0000000..d6524c5 --- /dev/null +++ b/frames/LANDING.widget @@ -0,0 +1,211 @@ +
+ +
+
+
[ > clone-frame / home
+
+
+ +
+
+
+
iCLONE · Base 8453
+

An AI agent that automates your tasks — minted as one iNFT.

+

CLONE FRAME is where you create an iCLONE agent and mint it as an iNFT. Customisable skills, and fully tokenisable.

+
+
Enter the Frames
+
Mint an agent
+
+
+
iNFTagent + NFT, one token
+
Basechain 8453
+
ERC-721A+ 2981 + 6551
+
+
+
+
+
+
+ +
click to set your image
+
+ +
one iNFT · token #000912
+
+
+ +
+
// what it is
+

An AI automation agent, tokenised

+

Three things, fused into one token. You hold it, it works for you, and it lives on-chain.

+
+
It automates
An AI agent that runs your tasks — flows, tools, jobs, on its own.
+
It's one iNFT
The agent and the NFT are a single token. Inseparable — never two parts.
+
It's tokenised
Owned, held and traded on-chain on Base. You control the agent by holding it.
+
+
+ +
+
// the frames
+

Four Frames

+

Each surface is a Frame — same terminal, your wallet across all of them.

+
+
marketplace
PLAZA FRAME
Discover, acquire and trade agent iNFTs and skills. Rarity tiers: rare · superrare · iclone.
open frame
+
mint studio
iCLONE FRAME
Create an agent and mint it as an iNFT — image, base soul, contract. Deploy to Base.
open frame
+
skills
SKILL FRAME
Add skills to an agent — automation, flows, tools. Published from your wallet.
open frame
+
generator
IMAGE BANK
The iNFT builder — background, image slots, identity, skills and the collection mint.
open frame
+
+
+ +
+
// on-chain economy
+

The 3×10% split

+

Each mint routes a transparent split through the treasury contract. The creator keeps the majority; the rest compounds in three reserves.

+
+
70%creator / owner
+
10%BTC
+
10%VIRT
+
10%iCLONE
+
+
+ BTC reserve + VIRTUALS treasury + iCLONE buyback & burn +
+
+
// fees
+

How it earns

+

Tools are free. A thin perpetual royalty on iNFT resale, a one-time cut on a skill's first sale.

+
+
5%
Perpetual royalty
on every iNFT resale (2981)
+
1%
First skill sale
once, never again
+
$0
Tools
free to build & mint
+
+
+ +
Stake 10k iCLONE to publish your own collections — lock 6m, cooldown 1m.
ready-made collections need no stake · token launched on the Virtuals launchpad (1B supply)
+
+
+ +
+
// drops
+

Drops to the community

+

Generate gated drops that unlock access to the CLONE FRAME tools inside Venice.

+
+
Generate a drop
+
Enter the Frames
+
+
clone-frame · iclone agent interfaceBase · 8453 · iNFT
+
+
+
+ +
From c4dfaae35d00cc777b023375e20154c9a94c0886 Mon Sep 17 00:00:00 2001 From: Alexandre Vieira Date: Sat, 20 Jun 2026 08:02:34 +0100 Subject: [PATCH 2/8] refactor(landing): grey theme, remove login, rename to iNFT Configuration - All blue accents -> grey (text, icons, buttons, hero figure, split bar) - Removed Login button (presentation-only site) - Renamed "IMAGE BANK" -> "iNFT Configuration" (landing card + generator label + README) - Hero headline -> "Automate any tasks with your agent iCLONE." Co-Authored-By: Claude Opus 4.8 --- README.md | 4 +-- frames/LANDING.widget | 34 ++++++++----------- .../BACKGROUND.widget | 2 +- 3 files changed, 18 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index b36b4c9..19a4105 100644 --- a/README.md +++ b/README.md @@ -20,8 +20,8 @@ frames/ widgets .widget dos frames (rascunhos de UI) PLAZA FRAME.widget SKILL FRAME.widget iCLONE FRAME.widget - gerador de banco de nft imagem/ - BACKGROUND.widget construtor de NFT (Background/Accessories/ID/Skill/iNFT) + gerador de banco de nft imagem/ (iNFT Configuration) + BACKGROUND.widget iNFT Configuration (Background/Accessories/ID/Skill/iNFT) SILUETAS.widget mockups/ mockups HTML da plataforma ``` diff --git a/frames/LANDING.widget b/frames/LANDING.widget index d6524c5..0af235a 100644 --- a/frames/LANDING.widget +++ b/frames/LANDING.widget @@ -1,39 +1,36 @@
-
[ > clone-frame / home
+
[ > clone-frame / home
-
iCLONE · Base 8453
-

An AI agent that automates your tasks — minted as one iNFT.

+

Automate any tasks with your agent iCLONE.

CLONE FRAME is where you create an iCLONE agent and mint it as an iNFT. Customisable skills, and fully tokenisable.

Enter the Frames
@@ -114,7 +110,7 @@
- +
click to set your image
@@ -141,7 +137,7 @@
marketplace
PLAZA FRAME
Discover, acquire and trade agent iNFTs and skills. Rarity tiers: rare · superrare · iclone.
open frame
mint studio
iCLONE FRAME
Create an agent and mint it as an iNFT — image, base soul, contract. Deploy to Base.
open frame
skills
SKILL FRAME
Add skills to an agent — automation, flows, tools. Published from your wallet.
open frame
-
generator
IMAGE BANK
The iNFT builder — background, image slots, identity, skills and the collection mint.
open frame
+
generator
iNFT Configuration
The iNFT builder — background, image slots, identity, skills and the collection mint.
open frame
@@ -150,14 +146,14 @@

The 3×10% split

Each mint routes a transparent split through the treasury contract. The creator keeps the majority; the rest compounds in three reserves.

-
70%creator / owner
+
70%creator / owner
10%BTC
-
10%VIRT
+
10%VIRT
10%iCLONE
BTC reserve - VIRTUALS treasury + VIRTUALS treasury iCLONE buyback & burn
diff --git a/frames/gerador de banco de nft imagem/BACKGROUND.widget b/frames/gerador de banco de nft imagem/BACKGROUND.widget index e39bdee..f307242 100644 --- a/frames/gerador de banco de nft imagem/BACKGROUND.widget +++ b/frames/gerador de banco de nft imagem/BACKGROUND.widget @@ -50,7 +50,7 @@ #bgw .save:hover{background:#2d6fa0;color:#fff}
-
[ > iclone / nft-image-bank
+
[ > iclone / inft-config
Background
Image
From c872efa45b0d027887dd77bb25d286068e564840 Mon Sep 17 00:00:00 2001 From: Alexandre Vieira Date: Sat, 20 Jun 2026 08:17:55 +0100 Subject: [PATCH 3/8] fix(economy): correct project revenue allocation; drop banned wording - Economy section now reflects PROJECT revenue, not a creator/mint split - 30% of all CLONE FRAME revenue -> on-chain reserves: 10% BTC (buy + reserve staking), 10% VIRTUALS (reserve staking), 10% iCLONE (buyback & burn); 70% funds development - Removed the phrase "3x10% split" everywhere (landing, iCLONE FRAME, code comments) - README: added project economy / reserves section - Reordered: how it earns -> where revenue goes Co-Authored-By: Claude Opus 4.8 --- README.md | 10 +++++++++- frames/LANDING.widget | 36 ++++++++++++++++++------------------ frames/iCLONE FRAME.widget | 4 ++-- 3 files changed, 29 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 19a4105..86b15c3 100644 --- a/README.md +++ b/README.md @@ -32,12 +32,20 @@ mockups/ mockups HTML da plataforma - **Token do agente:** lançado **nativamente na Virtuals** (supply 1B, regras da Virtuals). - Arte 100% on-chain (SVG determinístico). Rarity tiers: `rare` · `superrare` · `iclone`. -## Receita +## Receita (como a CLONE FRAME ganha) - **iNFT:** 5% perpétuo sobre todas as vendas (on-chain). - **Skills:** 1% na 1ª venda. - **Ferramentas:** grátis. +## Economia do projeto (alocação de receita, on-chain) + +De **toda a receita** que a CLONE FRAME ganha, **30%** compõe três reservas on-chain — o restante financia o desenvolvimento. Economia segura por desenho, auditável e reportada periodicamente. + +- **10% → BTC:** compra + reserva em staking (fundo de garantia do token e do projeto). +- **10% → VIRTUALS:** reserva em staking (liquidez e tesouraria). +- **10% → iCLONE:** buyback & burn (queima). + ## Token utility (iCLONE) - Staking de **10k iCLONE** (lock 6 meses, cooldown 1 mês) para publicar coleções. diff --git a/frames/LANDING.widget b/frames/LANDING.widget index 0af235a..514a4f5 100644 --- a/frames/LANDING.widget +++ b/frames/LANDING.widget @@ -56,7 +56,7 @@ #cf .frd{font-size:11px;color:var(--mut);line-height:1.55;max-width:250px} #cf .frgo{margin-top:12px;font-family:var(--font-mono);font-size:10px;color:var(--bt);display:flex;align-items:center;gap:5px;opacity:0;transition:opacity .15s} #cf .frc:hover .frgo{opacity:1} -#cf .split{display:flex;border-radius:9px;overflow:hidden;border:1px solid var(--bd);margin-bottom:14px;height:46px} +#cf .alloc{display:flex;border-radius:9px;overflow:hidden;border:1px solid var(--bd);margin-bottom:14px;height:46px} #cf .sp{display:flex;flex-direction:column;align-items:center;justify-content:center;font-family:var(--font-mono);border-right:1px solid var(--bg)} #cf .sp:last-child{border-right:0} #cf .sp .pc{font-size:13px}#cf .sp .pl{font-size:8.5px;margin-top:2px;letter-spacing:.04em} @@ -142,28 +142,28 @@
-
// on-chain economy
-

The 3×10% split

-

Each mint routes a transparent split through the treasury contract. The creator keeps the majority; the rest compounds in three reserves.

-
-
70%creator / owner
+
// how clone frame earns
+

How the protocol earns

+

Tools are free. CLONE FRAME earns a thin perpetual royalty on every iNFT resale, and a one-time cut on a skill's first sale.

+
+
5%
Perpetual royalty
on every iNFT resale (2981)
+
1%
First skill sale
once, never again
+
$0
Tools
free to build & mint
+
+
+
// revenue allocation · on-chain
+

A treasury built for security

+

Of all the revenue CLONE FRAME earns, 30% compounds on-chain into three reserves — the rest funds development. Every move is auditable and reported.

+
+
70%protocol & development
10%BTC
10%VIRT
10%iCLONE
- BTC reserve - VIRTUALS treasury - iCLONE buyback & burn -
-
-
// fees
-

How it earns

-

Tools are free. A thin perpetual royalty on iNFT resale, a one-time cut on a skill's first sale.

-
-
5%
Perpetual royalty
on every iNFT resale (2981)
-
1%
First skill sale
once, never again
-
$0
Tools
free to build & mint
+ BTC — buy & reserve staking + VIRTUALS — reserve staking + iCLONE — buyback & burn
diff --git a/frames/iCLONE FRAME.widget b/frames/iCLONE FRAME.widget index b19430b..ca42444 100644 --- a/frames/iCLONE FRAME.widget +++ b/frames/iCLONE FRAME.widget @@ -230,7 +230,7 @@ ['8','contract iCloneAgent is ERC721URIStorage, Ownable {'], ['9',' uint256 public nextId;'], ['10',' uint256 public mintPrice = 0.08 ether;'], - ['11',' address public treasury; // 3×10% split'], + ['11',' address public treasury; // 30% of revenue → reserves'], ['12',''], ['13',' event AgentMinted(uint256 indexed id, address indexed owner, string soul);'], ['14',''], @@ -315,7 +315,7 @@ ['ok','✓ tokenURI ipfs://bafy…a91/metadata.json'], ['in','$ mintAgent(uri, soul) value='+price+' '+cur], ['ok','✓ '+name+' minted · token #000912'], - ['wn','↳ treasury split 3×10% queued (BTC · VIRTUAL · iCLONE)'], + ['wn','↳ treasury 30% → reserves queued (BTC · VIRTUAL · iCLONE)'], ['ok','✓ tx 0x7be4…c20 confirmed on Base'] ]; c.innerHTML=''; var i=0; From 1fc1c4e6ba3e7b10917fc26ad9cda252eda1eae9 Mon Sep 17 00:00:00 2001 From: Alexandre Vieira Date: Sat, 20 Jun 2026 08:34:00 +0100 Subject: [PATCH 4/8] copy(landing): tighten hero headline and tagline - Headline: "Automate any tasks with your iCLONE." - Tagline: "Automate, tokenise and sell your iNFT clone." Co-Authored-By: Claude Opus 4.8 --- docs/odysseus-adaptation.md | 78 +++++++++++++++++++++++++++++++++++++ frames/LANDING.widget | 4 +- 2 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 docs/odysseus-adaptation.md diff --git a/docs/odysseus-adaptation.md b/docs/odysseus-adaptation.md new file mode 100644 index 0000000..288d02d --- /dev/null +++ b/docs/odysseus-adaptation.md @@ -0,0 +1,78 @@ +# Odysseus → CLONE FRAME — guia de adaptação + +> O Odysseus (AGPL, clonado em `~/odysseus`) é só **referência de código**. Nada dele é embebido. +> Reconstruímos 4 capacidades nativamente no CLONE FRAME, adaptadas à stack do projeto +> (frames HTML/JS · agente = NFT na Base · neural_soul · Virtuals · privacidade). + +Referências apontam para `~/odysseus/:`. + +--- + +## 1. Skills dentro da plataforma → **SKILL FRAME** + +**Como o Odysseus faz** +- Formato `SKILL.md`: frontmatter YAML (`name, description, category, tags, when_to_use, requires_toolsets, owner, version, status`) + corpo estruturado (When to Use / Procedure / Pitfalls / Verification). — `services/memory/skills.py`, `services/memory/skill_format.py` +- Contadores de uso em sidecar `_usage.json` (não suja o SKILL.md). +- **Injeção no prompt** (divulgação progressiva): o *índice* de skills (nome + when_to_use) está sempre no prompt; os **3 mais relevantes** à última mensagem são injetados na íntegra, com `trusted=False` para bloquear prompt-injection. — `src/agent_loop.py:1204` (e `:417` para a tool). +- Tool `manage_skills` (`list|view|search|add|edit|publish|delete`) — o agente consulta skills ANTES de fazer trabalho de domínio. + +**Adaptação CLONE FRAME** +- Manter o formato `SKILL.md` **tal e qual** (portável e legível por humanos e agentes). +- Tornar a skill um **artefacto possuível**: conteúdo `SKILL.md` → IPFS/Arweave (CID); a *listagem/venda* é on-chain. Royalty de **1% na 1ª venda** via o splitter (ver arquitetura). +- Portar o motor de parsing + injeção (índice + top-3 semântico + `trusted=False`) para o runtime do agente iCLONE: prompt = `neural_soul.md` + índice de skills + top-3. +- Estender a tool para o marketplace: `manage_skills` + `buy` / `equip` (on-chain). +- **Reutilização direta:** lógica Python do `SkillsManager` (parse, índice, injeção). **Novo:** camada de listagem/venda Web3. + +--- + +## 2. Email + resposta por IA (o "agradável") + +**Como o Odysseus faz** +- Poller IMAP/SMTP + triage/tags/resumos. — `src/email_pollers.py`, `routes/email_routes.py` +- `POST /ai-reply` gera rascunho **no estilo de escrita do utilizador**, com cache por `message_id` (tabela `email_ai_replies`), `user_hint` para orientar, e "style mechanics". — `routes/email_routes.py:2742` +- Tarefa agendada `draft_email_replies` (cron) + fluxo **human-in-the-loop**: agente rascunha → utilizador aprova/cancela. — `src/task_scheduler.py:241`, `routes/email_routes.py:2169` (pending drafts / approve / cancel) + +**Adaptação CLONE FRAME** +- Tornar isto uma **skill equipável** ("Email agent") que um agente-NFT adquire no SKILL FRAME. +- Credenciais IMAP/SMTP vêm do **cofre por-agente** (ERC-6551 + secret store Fernet), não de config global. +- "Estilo do utilizador" → derivado do `neural_soul.md` do agente. +- **Privacidade:** o modelo que redige corre **local ou Venice** (ver §4) — o conteúdo do email nunca toca cloud centralizada. +- **Reutilização direta:** draft + cache + style-mechanics + fluxo aprovar/cancelar. **Trocar:** fonte de credenciais (→ cofre do agente) e endpoint do modelo (→ privado). + +--- + +## 3. Painéis soltos → arrastar para o lado → split-screen com tabs + +**Como o Odysseus faz** (frontend puro, sem framework — portável tal e qual) +- `Modals` (registry de janelas): `register / unregister / minimize / restore / toggle / close / isRegistered / isMinimized / injectMinimizeButton`. — `static/app.js` +- Snap-dock à borda: arrastar até ≤60px da borda (`SNAP_PX=60`) → encaixa em meio-ecrã redimensionável; arrastar 80px para fora (`UNSNAP_PX=80`) → volta a flutuar centrado. Largura do dock persiste em `localStorage` (`odysseus-edge-dock-width::`). Hint visual (zona tracejada) durante o drag. Modo "email+doc split". — `static/js/modalSnap.js` +- Janelas minimizadas viram **chips no dock = tabs**; restauram ao clicar/hover. Focus-trap (Tab). — `static/js/ui.js`, CSS em `static/style.css` + +**Adaptação CLONE FRAME** +- Portar os 3 ficheiros (`app.js` Modals, `modalSnap.js`, `ui.js`) + CSS relevante — é vanilla JS, encaixa direto nos `.widget`/HTML dos frames. +- Cada "tabela solta" = um Modal (`Modals.register`). Arrastar para a borda → split redimensionável; minimizar → chip/tab. +- **Twist nativo:** persistir o layout das janelas **por wallet/agente** (cada utilizador retoma o seu workspace). O "ecrã principal dividido em tabs" = painéis encaixados + barra de chips. +- **Menor esforço, maior impacto visual** — já é framework-free. + +--- + +## 4. Correr localmente / privacidade → alinhado com Venice + blockchain + +**Como o Odysseus faz** +- Camada de modelos **agnóstica, OpenAI-compatible**: LM Studio, llama.cpp, vLLM, Ollama, qualquer base custom. — `src/endpoint_resolver.py:216`, `src/llm_core.py` +- `ModelEndpoint` em DB: base_url + chave + modelos. Serving local via Cookbook (GPU da própria máquina). + +**Adaptação CLONE FRAME** +- Adicionar **Venice** como endpoint (`https://api.venice.ai/api/v1`, OpenAI-compatible, no-logging) e/ou **local** (Ollama/Cookbook) — os dados ficam na máquina do utilizador. +- **Política de modelo por agente** guardada com o NFT: flag `privacy_mode` que restringe inferência a *local/Venice only*. +- Narrativa de produto: agente (NFT) + inferência privada (Venice/local) + posse on-chain = soberania ponta-a-ponta — exatamente o que o CLONE FRAME propõe. +- **Reutilização direta:** routing OpenAI-compatible do `endpoint_resolver`. **Novo:** flag de privacidade ligada ao agente. + +--- + +## Ordem de implementação sugerida + +1. **Windowing** (§3) — frontend puro, payoff visual imediato, sem backend. +2. **Skills runtime** (§1) — parsing + injeção (motor do agente). Venda on-chain depois. +3. **Privacidade/modelos** (§4) — endpoint Venice + local + flag por agente. +4. **Email skill** (§2) — junta cofre + skill + modelo privado (integra §1, §4). diff --git a/frames/LANDING.widget b/frames/LANDING.widget index 514a4f5..3b3a6b3 100644 --- a/frames/LANDING.widget +++ b/frames/LANDING.widget @@ -94,8 +94,8 @@
iCLONE · Base 8453
-

Automate any tasks with your agent iCLONE.

-

CLONE FRAME is where you create an iCLONE agent and mint it as an iNFT. Customisable skills, and fully tokenisable.

+

Automate any tasks with your iCLONE.

+

Automate, tokenise and sell your iNFT clone.

Enter the Frames
Mint an agent
From 12323e8151f4b92955e02294df707598610681c2 Mon Sep 17 00:00:00 2001 From: Alexandre Vieira Date: Sat, 20 Jun 2026 08:50:56 +0100 Subject: [PATCH 5/8] =?UTF-8?q?copy(landing):=20correct=20concept=20?= =?UTF-8?q?=E2=80=94=20agent=20with=20integrated=20NFT;=20Clone=20Frames?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Concept fix: an iNFT is an AI agent with a built-in NFT (NOT "one token" / not "fused into a token"); iCLONE is one category of iNFT - "Four Frames" -> "Clone Frames"; now 3 surfaces - iNFT Configuration folded into iCLONE FRAME (no longer a separate Frame) - Presentation-stage framing: "building in public" - Reworked "what it is" cards: automates / NFT built in / yours to trade Co-Authored-By: Claude Opus 4.8 --- frames/LANDING.widget | 55 +++++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/frames/LANDING.widget b/frames/LANDING.widget index 3b3a6b3..9cde1db 100644 --- a/frames/LANDING.widget +++ b/frames/LANDING.widget @@ -10,6 +10,8 @@ #cf .nav{display:flex;align-items:center;gap:10px;padding:11px 22px;border-bottom:1px solid var(--bd)} #cf .brand{display:flex;align-items:center;gap:8px;font-family:var(--font-mono);font-size:12px;letter-spacing:.14em;color:var(--tx)} #cf .brand b{color:var(--bt);font-weight:400} +#cf .tag{font-family:var(--font-mono);font-size:9px;letter-spacing:.06em;color:var(--mut);border:1px solid var(--bd);border-radius:6px;padding:3px 8px;display:flex;align-items:center;gap:5px} +#cf .tag i{width:5px;height:5px;border-radius:50%;background:#5a9e6f;display:inline-block} #cf .nlinks{margin-left:auto;display:flex;gap:4px} #cf .nl{font-family:var(--font-mono);font-size:11px;color:var(--mut);padding:6px 11px;border-radius:7px;cursor:pointer;border:1px solid transparent} #cf .nl:hover{color:var(--tx);background:var(--s1)} @@ -40,21 +42,21 @@ #cf .sec{padding:30px 22px;border-top:1px solid var(--bd)} #cf .sh{font-family:var(--font-mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--mut);margin-bottom:6px} #cf .st{font-size:20px;font-weight:500;color:var(--tx);letter-spacing:-.01em;margin:0 0 4px} -#cf .ss{font-size:12px;color:var(--mut);max-width:470px;line-height:1.6;margin:0 0 20px} +#cf .ss{font-size:12px;color:var(--mut);max-width:480px;line-height:1.6;margin:0 0 20px} #cf .what{display:grid;grid-template-columns:repeat(3,1fr);gap:11px} #cf .wc{background:var(--s1);border:1px solid var(--bd);border-radius:10px;padding:16px 14px} #cf .wc:hover{border-color:var(--bl)} #cf .wi{font-size:21px;color:var(--bt);margin-bottom:10px} #cf .wn{font-size:13px;color:var(--tx);font-weight:500;margin-bottom:4px} #cf .wd{font-size:11px;color:var(--mut);line-height:1.55} -#cf .frames{display:grid;grid-template-columns:1fr 1fr;gap:12px} -#cf .frc{background:var(--s1);border:1px solid var(--bd);border-radius:11px;padding:17px 17px 15px;cursor:pointer;transition:border-color .14s,transform .1s;position:relative;overflow:hidden} +#cf .frames{display:grid;grid-template-columns:repeat(3,1fr);gap:12px} +#cf .frc{background:var(--s1);border:1px solid var(--bd);border-radius:11px;padding:16px 15px 14px;cursor:pointer;transition:border-color .14s,transform .1s;position:relative;overflow:hidden} #cf .frc:hover{border-color:var(--bt);transform:translateY(-2px)} -#cf .frbadge{position:absolute;top:13px;right:14px;font-family:var(--font-mono);font-size:8px;letter-spacing:.1em;color:var(--mut);border:1px solid var(--bd);border-radius:5px;padding:2px 7px} -#cf .fri{font-size:22px;color:var(--bt);margin-bottom:12px} -#cf .frn{font-family:var(--font-mono);font-size:13px;letter-spacing:.06em;color:var(--tx);margin-bottom:5px} -#cf .frd{font-size:11px;color:var(--mut);line-height:1.55;max-width:250px} -#cf .frgo{margin-top:12px;font-family:var(--font-mono);font-size:10px;color:var(--bt);display:flex;align-items:center;gap:5px;opacity:0;transition:opacity .15s} +#cf .frbadge{position:absolute;top:12px;right:12px;font-family:var(--font-mono);font-size:7.5px;letter-spacing:.08em;color:var(--mut);border:1px solid var(--bd);border-radius:5px;padding:2px 6px} +#cf .fri{font-size:21px;color:var(--bt);margin-bottom:11px} +#cf .frn{font-family:var(--font-mono);font-size:12px;letter-spacing:.05em;color:var(--tx);margin-bottom:5px} +#cf .frd{font-size:10.5px;color:var(--mut);line-height:1.5} +#cf .frgo{margin-top:11px;font-family:var(--font-mono);font-size:9.5px;color:var(--bt);display:flex;align-items:center;gap:5px;opacity:0;transition:opacity .15s} #cf .frc:hover .frgo{opacity:1} #cf .alloc{display:flex;border-radius:9px;overflow:hidden;border:1px solid var(--bd);margin-bottom:14px;height:46px} #cf .sp{display:flex;flex-direction:column;align-items:center;justify-content:center;font-family:var(--font-mono);border-right:1px solid var(--bg)} @@ -85,6 +87,7 @@
// what it is
-

An AI automation agent, tokenised

-

Three things, fused into one token. You hold it, it works for you, and it lives on-chain.

+

An AI agent, with an NFT built in

+

An iNFT is an AI automation agent with an integrated NFT — the NFT gives it identity and ownership. iCLONE is one category of iNFT: your automation clone.

-
It automates
An AI agent that runs your tasks — flows, tools, jobs, on its own.
-
It's one iNFT
The agent and the NFT are a single token. Inseparable — never two parts.
-
It's tokenised
Owned, held and traded on-chain on Base. You control the agent by holding it.
+
It automates
An AI agent that runs your tasks — flows, tools and jobs, on its own.
+
NFT built in
The agent carries an integrated NFT — its on-chain identity and ownership.
+
Yours to trade
Held and traded on Base. Own it, automate with it, sell it.
-
// the frames
-

Four Frames

-

Each surface is a Frame — same terminal, your wallet across all of them.

+
// the surfaces
+

Clone Frames

+

Each surface is a Frame — same terminal, one wallet across all of them.

-
marketplace
PLAZA FRAME
Discover, acquire and trade agent iNFTs and skills. Rarity tiers: rare · superrare · iclone.
open frame
-
mint studio
iCLONE FRAME
Create an agent and mint it as an iNFT — image, base soul, contract. Deploy to Base.
open frame
-
skills
SKILL FRAME
Add skills to an agent — automation, flows, tools. Published from your wallet.
open frame
-
generator
iNFT Configuration
The iNFT builder — background, image slots, identity, skills and the collection mint.
open frame
+
marketplace
PLAZA FRAME
Discover, acquire and trade iCLONE agents and skills. Tiers: rare · superrare · iclone.
open frame
+
create
iCLONE FRAME
Create your agent and give it a built-in NFT. Includes the iNFT Configuration — image, identity, skills, collection.
open frame
+
skills
SKILL FRAME
Add skills to an agent — automation, flows and tools. Published from your wallet.
open frame
@@ -148,7 +150,7 @@
5%
Perpetual royalty
on every iNFT resale (2981)
1%
First skill sale
once, never again
-
$0
Tools
free to build & mint
+
$0
Tools
free to build & create
// revenue allocation · on-chain
@@ -165,6 +167,7 @@ VIRTUALS — reserve staking iCLONE — buyback & burn
+
Stake 10k iCLONE to publish your own collections — lock 6m, cooldown 1m.
ready-made collections need no stake · token launched on the Virtuals launchpad (1B supply)
@@ -179,7 +182,7 @@
Generate a drop
Enter the Frames
-
clone-frame · iclone agent interfaceBase · 8453 · iNFT
+
clone-frame · building in publicBase · 8453 · iNFT
From b40b9d755bf56d047a1b1b3039367cf98ec0c100 Mon Sep 17 00:00:00 2001 From: Alexandre Vieira Date: Sat, 20 Jun 2026 09:00:43 +0100 Subject: [PATCH 6/8] copy(landing): drop-gated access CTA; soften iCLONE wording - Hero primary CTA -> "Generate a drop" with caption "Generate a drop to access the frames." - iCLONE meta: "a category of iNFT" -> "works for you" - "what it is": iCLONE described as your agent that works for you Co-Authored-By: Claude Opus 4.8 --- docs/blueprint-construir.md | 131 ++++++++++++++++++++++++++++++++++++ frames/LANDING.widget | 8 ++- 2 files changed, 136 insertions(+), 3 deletions(-) create mode 100644 docs/blueprint-construir.md diff --git a/docs/blueprint-construir.md b/docs/blueprint-construir.md new file mode 100644 index 0000000..f3eef77 --- /dev/null +++ b/docs/blueprint-construir.md @@ -0,0 +1,131 @@ +# CLONE FRAME — blueprint de construção (clean-room) + +> **Abordagem:** estudamos o Odysseus só para extrair a *técnica* (algoritmos, fluxos, parâmetros). +> Reimplementamos de raiz na nossa stack. Não copiamos código → sem obrigação AGPL. +> Cada secção: **como funciona** (ideia destilada) → **como construímos** → **parâmetros-chave**. + +Referências de estudo: `~/odysseus/:` (só leitura, para perceber). + +--- + +## 1. Workspace shell — painéis soltos → snap/split → tabs + +**Como funciona** (estudo: `static/app.js` Modals, `static/js/modalSnap.js`, `static/js/ui.js`) +- Um *registry* de janelas com API mínima: `register / unregister / minimize / restore / toggle / close / isMinimized`. +- Cada janela é arrastável. Máquina de estados de docking por distância à borda: + - arrastar até **≤60px** de uma borda lateral → encaixa em meio-ecrã (split) redimensionável; + - arrastar **>80px** para dentro → desencaixa e volta a flutuar centrado. +- Durante o drag mostra-se um *hint* (faixa tracejada na borda alvo). +- Largura do dock é redimensionável (handle) e **persiste em `localStorage`** por `lado:id`; mínimo ~320px (280 mobile). +- Janela minimizada vira **chip** numa barra de dock = a nossa "tab"; restaura ao clicar/hover. + +**Como construímos** +- `WindowManager` em JS puro (sem framework): cada "tabela solta" do frame regista-se. Estado por janela: `{id, x, y, w, h, dock: null|'left'|'right', minimized}`. +- Drag com `pointer events`; ao soltar, calcular distância às bordas e aplicar a regra 60/80. +- Split = CSS grid/flex de 2 colunas (dock + main); handle de resize escreve a largura em `localStorage`. +- Barra de chips para minimizadas. **Twist nativo:** guardar o layout por **wallet/agente** (não só localStorage) → o utilizador retoma o seu workspace em qualquer dispositivo. +- O agente pode abrir/arranjar painéis (ver §2, `ui_control`). + +**Parâmetros-chave:** snap 60px · unsnap 80px · min dock 320/280px · persistência por `lado:id` (+ por wallet). + +--- + +## 2. Núcleo do agente iClone + +### 2a. Loop do agente (estudo: `src/agent_loop.py`) +**Como funciona** — loop multi-ronda, *dual-mode* de tools: +- Cada ronda: montar prompt → chamar modelo → extrair ações → executar → devolver resultados ao histórico → repetir. +- O parser aceita **duas formas** no mesmo fluxo: `tool_calls` nativos (modelos API) **e** blocos ```` ```bash/```python/```json ```` (modelos locais sem function-calling). Isto é o que dá portabilidade total (API + local). +- Sem timer rígido: o **modelo declara** o fim (escreve resposta final sem chamar tools), ou BLOCKED, ou continua. Mensagens de resultado são reanexadas como turnos `tool`/`assistant` (com cuidado: alguns backends rejeitam `tool_calls` em mensagens — normalizar). + +**Como construímos** — função `runAgentTurn(messages, tools, model)`: +1. monta prompt (system = neural_soul + índice skills + memória relevante; ver §2c/§3); +2. chama o modelo (router §2d); +3. `resolveActions(resposta)` → normaliza nativo OU fenced para uma lista uniforme `{name, args, id}`; +4. executa cada ação (§2b), recolhe resultados; +5. reanexa ao histórico; volta a 2 até "done/blocked". +- Guardar cada execução (`agent_runs`) para auditoria e para o ACP (§5). + +### 2b. Tools & MCP (estudo: `src/mcp_manager.py`, `src/tool_*`) +**Como funciona** — tools são funções com schema; MCP = servidores externos que expõem tools descobríveis; cada tool passa por *policy/security* antes de correr (allow/deny, sandbox, validação de args). +**Como construímos** — registo de tools com `{name, schema, run}`; cliente MCP para descobrir/ligar servidores OSS (a "descoberta OSS" do SKILL FRAME); **gate de segurança** obrigatório por tool (§6). Tool especial `ui_control` para o agente abrir painéis, trocar modelo/tema, abrir draft de email. + +### 2c. Skills engine (estudo: `services/memory/skills.py`, `src/agent_loop.py:1204`) +**Como funciona** +- Skill = ficheiro `SKILL.md`: frontmatter (`name, description, category, tags, when_to_use, requires_toolsets, owner, version, status, confidence`) + corpo (When to Use / Procedure / Pitfalls / Verification). Contadores de uso em sidecar. +- **Divulgação progressiva:** o *índice* (nome + when_to_use) está sempre no prompt; só os **relevantes** são injetados na íntegra. +- **Seleção de relevância = Jaccard token-match** entre a última mensagem do utilizador e (name+description+when_to_use+procedure). `threshold≈0.25`, `max=3`. Gate de confiança separa rascunhos de publicados. Marca `trusted=false` → conteúdo de skill nunca injeta instruções de sistema. +**Como construímos** — `getRelevantSkills(lastUserMsg, skills)`: tokenizar, calcular Jaccard, filtrar ≥0.25, ordenar, top-3. Injetar como bloco não-confiável. **No CLONE FRAME:** conteúdo da skill em IPFS (CID); listagem/venda on-chain (1%); `equip` adiciona ao set do agente-NFT. +**Parâmetros-chave:** threshold 0.25 · max 3 · trusted=false · uso contado ao *surgir*. + +### 2d. Router de modelos / privacidade (estudo: `src/endpoint_resolver.py`, `src/llm_core.py`) +**Como funciona** — camada agnóstica OpenAI-compatible; resolve endpoint por provider (Anthropic, OpenAI, Ollama, vLLM, LM Studio…); deteta capacidades. +**Como construímos** — `resolveEndpoint(agentModelPolicy)`; suportar **Venice** (`api.venice.ai/api/v1`) e **local** (Ollama/serving próprio). **Flag `privacy_mode` no NFT** → restringe a local/Venice. É a narrativa: posse on-chain + inferência privada. + +--- + +## 3. Brains — memória & conhecimento (o pilar central) + +**Como funciona** (estudo: `src/rag_manager.py`, `src/memory_vector.py`, `src/memory.py`, `src/deep_research.py`, `src/context_compactor.py`) +- **RAG:** `add_document(text, meta)` → chunk + embed + upsert no vector store (Chroma). `search(query, k=5)` → top-k por similaridade → injetar como contexto. +- **Memória semântica:** factos/preferências como entradas (`add_entry(text, source, category, owner)`); recuperação por `search(query, k=8)`. Distinta de RAG: memória = sobre o utilizador/agente; RAG = sobre documentos. +- **Deep research:** pesquisa web multi-passo → ler fontes → sintetizar relatório (`visual_report`). +- **Contexto:** quando a conversa cresce, `compactor` sumariza turnos antigos e `budget` controla tokens. +**Como construímos** +- Vector store próprio (Chroma/pgvector/Qdrant) + embeddings locais (ex.: `all-MiniLM`) para privacidade. +- Dois espaços separados: `memory` (utilizador/agente) e `rag` (documentos), cada um com `add` + `search(k)`. +- Pipeline de ingestão: documento → chunk (~500–1000 tokens, overlap) → embed → upsert com metadata (owner, source). +- No prompt: injetar top-k memória + top-k RAG relevantes + índice de skills (§2c). +- Compactação: ao exceder X tokens, sumarizar histórico antigo num bloco e preservar. +**No CLONE FRAME:** a memória é a **alma persistente do agente-NFT** — ponteiro on-chain (6551) + vetores off-chain privados. Embeddings locais = dados nunca saem da máquina. +**Parâmetros-chave:** RAG k=5 · memória k=8 · chunk c/ overlap · embeddings locais. + +--- + +## 4. Apps como skills equipáveis + +**Padrão geral:** cada "app" (email, docs, calendário, pesquisa, imagem, voz) é uma **skill equipável** que traz: (a) tools próprias, (b) credenciais do cofre do agente (§6), (c) opcionalmente um modelo privado. + +**Exemplo trabalhado — Email IA** (estudo: `routes/email_routes.py:2742` `/ai-reply`, `src/task_scheduler.py` `draft_email_replies`) +- **Como funciona:** poller IMAP/SMTP; endpoint gera rascunho **no estilo do utilizador**, com cache por `message_id` e `user_hint` opcional; tarefa agendada rascunha em lote; fluxo **human-in-the-loop** (aprovar/cancelar antes de enviar). +- **Como construímos:** serviço IMAP/SMTP + `draftReply({original, hint, style})` → modelo privado → cache → fila de drafts pendentes que o utilizador aprova na UI. Estilo derivado do `neural_soul`. Nunca envia sem aprovação. +- **Outras apps seguem o mesmo molde:** Docs/editor (office/pdf + edição IA), Calendário/Tarefas (CalDAV + scheduler), Pesquisa/Compare (multi-fonte + teste lado-a-lado), Galeria/Imagem (gerador → SVG on-chain), Voz (STT/TTS). + +--- + +## 5. Automação & jobs → ACP (Virtuals) + +**Como funciona** (estudo: `src/task_scheduler.py`, `src/bg_jobs.py`, `src/agent_runs.py`, crew em `routes/assistant_routes.py`) +- Tarefas agendadas (cron) + jobs em background + "crew" (agentes/check-ins). Cada run é registado. +**Como construímos** — `scheduler` (cron) + fila de jobs + registo de runs. **Ligação CLONE FRAME:** cada job autónomo = um **ACP job na Virtuals** (o agente-NFT publica/executa/vende serviços). Webhooks para notificar estado. + +--- + +## 6. Dados & segurança + +**Como funciona** (estudo: `src/secret_storage.py`, `src/api_key_manager.py` Fernet, `src/prompt_security.py`, `src/tool_security.py`, `src/url_safety.py`) +- Segredos encriptados (Fernet) por provider/agente; chave de encriptação com permissões 0600. +- Guardas: sanitização de prompt (anti-injection), policy de tools, validação de URLs (anti-SSRF). +**Como construímos** — cofre encriptado por-agente (espelhado pelo 6551 para custódia on-chain). **Guardas obrigatórios** antes de qualquer tool/URL/conteúdo de skill (lembrar `trusted=false`). DB relacional + vector store. + +--- + +## 7. Web3 on-chain (nativo — construir de raiz) + +Não vem do Odysseus. Seams de integração com o motor: +- **Agente NFT** (ERC-721A + 2981 + 6551): o mint (iCLONE FRAME) cria a TBA que é o cofre (§6). +- **Arte SVG on-chain** determinística (a partir do gerador de imagem, §4). +- **Token Virtuals** (1B) + **ACP** (§5). +- **Registry + indexer** (PLAZA): indexa agentes/skills on-chain para o marketplace. +- **Royalty splitter** (5% iNFT / 1% skill) + **staking** (10k iCLONE para publicar). + +--- + +## Ordem de construção + +1. **Workspace shell** (§1) — JS puro, payoff visual imediato, sem backend. +2. **Núcleo do agente + Brains** (§2,§3) — o motor; tudo pendura aqui. +3. **1ª app equipável: Email IA** (§4) — prova skill + cofre + modelo privado. +4. **Automação/ACP** (§5) e **Web3** (§7) — monetização e posse. + +Segurança (§6) é transversal — construída desde o primeiro commit, não no fim. diff --git a/frames/LANDING.widget b/frames/LANDING.widget index 9cde1db..1806f77 100644 --- a/frames/LANDING.widget +++ b/frames/LANDING.widget @@ -27,6 +27,7 @@ #cf .btn{display:inline-flex;align-items:center;gap:8px;font-family:var(--font-mono);font-size:12px;padding:11px 18px;border-radius:9px;cursor:pointer;border:1px solid var(--bl)} #cf .btn.pri{background:var(--bt);color:#fff;border-color:var(--bt)}#cf .btn.pri:hover{background:#363b41} #cf .btn.gho{background:transparent;color:var(--mut);border-color:var(--bd)}#cf .btn.gho:hover{color:var(--tx);border-color:var(--bl)} +#cf .ctahint{margin-top:12px;font-family:var(--font-mono);font-size:10px;color:var(--mut);display:flex;align-items:center;gap:6px} #cf .meta{margin-top:20px;display:flex;gap:22px;font-family:var(--font-mono);font-size:10px;color:var(--mut)} #cf .meta b{color:var(--tx);font-weight:500;font-size:15px;display:block;margin-bottom:2px} #cf .stage{position:relative;display:flex;align-items:center;justify-content:center;min-height:260px} @@ -100,12 +101,13 @@

Automate any tasks with your iCLONE.

Automate, tokenise and sell your iNFT clone.

-
Enter the Frames
+
Generate a drop
Create an agent
+
Generate a drop to access the frames.
iNFTagent with built-in NFT
-
iCLONEa category of iNFT
+
iCLONEworks for you
Basechain 8453
@@ -124,7 +126,7 @@
// what it is

An AI agent, with an NFT built in

-

An iNFT is an AI automation agent with an integrated NFT — the NFT gives it identity and ownership. iCLONE is one category of iNFT: your automation clone.

+

An iNFT is an AI automation agent with an integrated NFT — the NFT gives it identity and ownership. iCLONE is your agent: it works for you.

It automates
An AI agent that runs your tasks — flows, tools and jobs, on its own.
NFT built in
The agent carries an integrated NFT — its on-chain identity and ownership.
From c990a50db237bb3c820481c941cb07ab1391a00b Mon Sep 17 00:00:00 2001 From: Alexandre Vieira Date: Sat, 20 Jun 2026 09:08:12 +0100 Subject: [PATCH 7/8] =?UTF-8?q?copy(landing):=20spelling=20pass=20?= =?UTF-8?q?=E2=80=94=20tokenise=20->=20tokenize=20(US,=20Web3=20standard)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 --- frames/LANDING.widget | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frames/LANDING.widget b/frames/LANDING.widget index 1806f77..e7daa07 100644 --- a/frames/LANDING.widget +++ b/frames/LANDING.widget @@ -99,7 +99,7 @@
iCLONE · Base 8453

Automate any tasks with your iCLONE.

-

Automate, tokenise and sell your iNFT clone.

+

Automate, tokenize and sell your iNFT clone.

Generate a drop
Create an agent
From 358ea0b6804141feed25ff6034362d419a96a919 Mon Sep 17 00:00:00 2001 From: Alexandre Vieira Date: Sat, 20 Jun 2026 09:21:50 +0100 Subject: [PATCH 8/8] refactor(frames): isolate frames folder; nest iNFT Configuration in iCLONE FRAME MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - LANDING: removed "Automate any tasks…" headline; tagline is now the H1 - frames/ is now an isolated folder with only the frames - iCLONE FRAME is a folder containing its widget + iNFT Configuration/ (was top-level "gerador de banco de nft imagem") - README structure updated Co-Authored-By: Claude Opus 4.8 --- README.md | 16 +++++++++------- frames/LANDING.widget | 3 +-- frames/{ => iCLONE FRAME}/iCLONE FRAME.widget | 0 .../iNFT Configuration}/BACKGROUND.widget | 0 .../iNFT Configuration}/SILUETAS.widget | 0 5 files changed, 10 insertions(+), 9 deletions(-) rename frames/{ => iCLONE FRAME}/iCLONE FRAME.widget (100%) rename frames/{gerador de banco de nft imagem => iCLONE FRAME/iNFT Configuration}/BACKGROUND.widget (100%) rename frames/{gerador de banco de nft imagem => iCLONE FRAME/iNFT Configuration}/SILUETAS.widget (100%) diff --git a/README.md b/README.md index 86b15c3..3fe3b8b 100644 --- a/README.md +++ b/README.md @@ -16,13 +16,15 @@ Base partilhada em todos: menu retrátil, Wallet (Login/Online/Sign out), Settin ## Estrutura ``` -frames/ widgets .widget dos frames (rascunhos de UI) - PLAZA FRAME.widget - SKILL FRAME.widget - iCLONE FRAME.widget - gerador de banco de nft imagem/ (iNFT Configuration) - BACKGROUND.widget iNFT Configuration (Background/Accessories/ID/Skill/iNFT) - SILUETAS.widget +frames/ pasta isolada — só os frames (rascunhos de UI .widget) + LANDING.widget página de apresentação do projeto + PLAZA FRAME.widget marketplace + SKILL FRAME.widget skills + iCLONE FRAME/ criar agente com NFT integrado + iCLONE FRAME.widget + iNFT Configuration/ (dentro do iCLONE FRAME) + BACKGROUND.widget construtor de iNFT (Background/Image/ID/Skill/iNFT) + SILUETAS.widget mockups/ mockups HTML da plataforma ``` diff --git a/frames/LANDING.widget b/frames/LANDING.widget index e7daa07..8a556e1 100644 --- a/frames/LANDING.widget +++ b/frames/LANDING.widget @@ -98,8 +98,7 @@
iCLONE · Base 8453
-

Automate any tasks with your iCLONE.

-

Automate, tokenize and sell your iNFT clone.

+

Automate, tokenize and sell your iNFT clone.

Generate a drop
Create an agent
diff --git a/frames/iCLONE FRAME.widget b/frames/iCLONE FRAME/iCLONE FRAME.widget similarity index 100% rename from frames/iCLONE FRAME.widget rename to frames/iCLONE FRAME/iCLONE FRAME.widget diff --git a/frames/gerador de banco de nft imagem/BACKGROUND.widget b/frames/iCLONE FRAME/iNFT Configuration/BACKGROUND.widget similarity index 100% rename from frames/gerador de banco de nft imagem/BACKGROUND.widget rename to frames/iCLONE FRAME/iNFT Configuration/BACKGROUND.widget diff --git a/frames/gerador de banco de nft imagem/SILUETAS.widget b/frames/iCLONE FRAME/iNFT Configuration/SILUETAS.widget similarity index 100% rename from frames/gerador de banco de nft imagem/SILUETAS.widget rename to frames/iCLONE FRAME/iNFT Configuration/SILUETAS.widget