@dot-agent/cli 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +9 -0
- package/LICENSE +185 -0
- package/dist/{chunk-PSDRJRNL.js → chunk-BTLKCX2G.js} +1 -1
- package/dist/chunk-BTLKCX2G.js.map +1 -0
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/package.json +26 -1
- package/scripts/ensure-license-headers.sh +54 -0
- package/.github/workflows/publish.yml +0 -28
- package/dist/chunk-PSDRJRNL.js.map +0 -1
- package/file structure.md +0 -484
- package/plan.md +0 -665
- package/src/cli.ts +0 -97
- package/src/commands/init.ts +0 -103
- package/src/commands/pack.ts +0 -216
- package/src/commands/run.ts +0 -194
- package/src/commands/unpack.ts +0 -65
- package/src/core/envelope.ts +0 -69
- package/src/core/id.ts +0 -41
- package/src/core/lint.ts +0 -202
- package/src/core/types.ts +0 -46
- package/src/core/zip.ts +0 -76
- package/src/index.ts +0 -22
- package/src/types.kernel-dsl.d.ts +0 -21
- package/src/types.ts +0 -114
- package/src/types.wts.d.ts +0 -10
- package/tests/envelope.test.ts +0 -62
- package/tests/id.test.ts +0 -26
- package/tsconfig.json +0 -21
- package/tsup.config.ts +0 -10
- package/vitest.config.ts +0 -13
package/file structure.md
DELETED
|
@@ -1,484 +0,0 @@
|
|
|
1
|
-
# aboutme.json — Especificação e Comparativo com Open Standards
|
|
2
|
-
|
|
3
|
-
> Documento de trabalho
|
|
4
|
-
> ✅ = decidido | 🔲 = pendente | ⏳ = VNext
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## Estado atual do aboutme.json V1
|
|
9
|
-
|
|
10
|
-
```json
|
|
11
|
-
{
|
|
12
|
-
"schemaVersion": "dot-agent/1.0",
|
|
13
|
-
"id": "entelekheia.ai/doctor:v1.0~a1b2c3d",
|
|
14
|
-
|
|
15
|
-
"name": "Doctor",
|
|
16
|
-
"description": "Agente médico para triagem inicial de pacientes.",
|
|
17
|
-
"version": "v1.0",
|
|
18
|
-
|
|
19
|
-
"domain": "entelekheia.ai",
|
|
20
|
-
"license": "Apache-2.0",
|
|
21
|
-
"persona": "src/SOUL.md",
|
|
22
|
-
|
|
23
|
-
"compiler": "dot-agent/1.0.0",
|
|
24
|
-
"commit": "a1b2c3d",
|
|
25
|
-
|
|
26
|
-
"purpose": "https://www.wikidata.org/wiki/Q784111",
|
|
27
|
-
|
|
28
|
-
"skills": [
|
|
29
|
-
{
|
|
30
|
-
"id": "TriagePatient",
|
|
31
|
-
"description": "Triagem inicial de pacientes"
|
|
32
|
-
}
|
|
33
|
-
],
|
|
34
|
-
|
|
35
|
-
"requires": ["UserProfile"],
|
|
36
|
-
|
|
37
|
-
"integrity": {
|
|
38
|
-
"sha256": "e3b0c44298fc1c149afb...",
|
|
39
|
-
"types": ".agent/types.json",
|
|
40
|
-
"files": ".agent/files.json"
|
|
41
|
-
},
|
|
42
|
-
|
|
43
|
-
"⏳ did": "did:web:entelekheia.ai",
|
|
44
|
-
|
|
45
|
-
"⏳ proof": {
|
|
46
|
-
"type": "Ed25519Signature2020",
|
|
47
|
-
"created": "2026-01-01T00:00:00Z",
|
|
48
|
-
"verificationMethod": "did:web:entelekheia.ai#key-1",
|
|
49
|
-
"proofValue": "..."
|
|
50
|
-
},
|
|
51
|
-
|
|
52
|
-
"⏳ endpoints": {
|
|
53
|
-
"distribution": "https://entelekheia.ai/agents/doctor.agent",
|
|
54
|
-
"mcp": "https://api.entelekheia.ai/mcp",
|
|
55
|
-
"a2a": "https://api.entelekheia.ai/agent"
|
|
56
|
-
},
|
|
57
|
-
|
|
58
|
-
"⏳ securitySchemes": {
|
|
59
|
-
"bearer": { "type": "http", "scheme": "bearer" }
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
**types.json** — na raiz do ZIP, presente quando o agente declara tipos públicos:
|
|
65
|
-
|
|
66
|
-
```json
|
|
67
|
-
{
|
|
68
|
-
"input": [
|
|
69
|
-
{ "$ref": "https://dot-agent.dev/schema/std/v1/Prompt.json" }
|
|
70
|
-
],
|
|
71
|
-
"output": [
|
|
72
|
-
{ "$ref": "#/$defs/Diagnosis" }
|
|
73
|
-
],
|
|
74
|
-
"$defs": {
|
|
75
|
-
"Prontuario": {
|
|
76
|
-
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
77
|
-
"x-category": "https://www.wikidata.org/wiki/Q177719",
|
|
78
|
-
"x-concept": "https://schema.org/MedicalRecord",
|
|
79
|
-
"type": "object",
|
|
80
|
-
"properties": {
|
|
81
|
-
"patient": { "$ref": "#/$defs/Person" },
|
|
82
|
-
"exames": { "type": "array", "items": { "$ref": "#/$defs/Exam" } },
|
|
83
|
-
"status": { "type": "string", "enum": ["active", "archived"] },
|
|
84
|
-
"imagem": { "$ref": "#/$defs/Avatar" }
|
|
85
|
-
},
|
|
86
|
-
"required": ["patient", "exames", "status"]
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
**files.json** — na raiz do ZIP, presente quando o agente empacota fontes:
|
|
93
|
-
|
|
94
|
-
```json
|
|
95
|
-
{
|
|
96
|
-
"description": "src/agent.description",
|
|
97
|
-
"behavior": "src/agent.behavior",
|
|
98
|
-
"behaviors": ["src/behaviors/xpto.behavior"],
|
|
99
|
-
"guides": ["src/guides/ask-class-name.md"],
|
|
100
|
-
"knowledge": ["src/knowledge/swift-basics.md", "src/knowledge/swift-class-ref.md"]
|
|
101
|
-
}
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
---
|
|
105
|
-
|
|
106
|
-
---
|
|
107
|
-
|
|
108
|
-
## Seções de Design
|
|
109
|
-
|
|
110
|
-
### Domain / Provider — Tiers de Confiança
|
|
111
|
-
|
|
112
|
-
O `domain` é o namespace do publisher. A confiança da spec depende de quem garante a unicidade do namespace e se é possível verificação automática.
|
|
113
|
-
|
|
114
|
-
| Tier | Formato do `id` | Quem garante | Verificável | Selo |
|
|
115
|
-
|---|---|---|---|---|
|
|
116
|
-
| 1 — Domínio próprio | `entelekheia.ai/doctor:v1.0~a1b2c3d` | ICANN | ✅ via `.well-known` | ✅ verificado |
|
|
117
|
-
| 2 — Plataforma de código | `github.com/daniloborges/doctor:v1.0~a1b2c3d` | GitHub / GitLab / etc | ✅ via repo ou arquivo de config | ✅ verificado |
|
|
118
|
-
| 3 — Email | `contato@gmail.com` como namespace | Provedor de email | ❌ não dá para verificar programaticamente sem depender do provedor | ⚠️ tem contato, sem selo |
|
|
119
|
-
| 4 — Anônimo | sem namespace | ninguém | ❌ | 🚫 aviso ou bloqueio pela runtime |
|
|
120
|
-
|
|
121
|
-
**Por que email não tem verificação:**
|
|
122
|
-
Diferente de plataformas de código (onde a spec mantém lista de domínios conhecidos e estrutura `dominio/usuario`), provedores de email são impossíveis de enumerar e não expõem mecanismo padrão de autorização de arquivos por usuário. A consulta recairia sobre o domínio do provedor (`gmail.com`), não sobre o usuário — não é verificável. O email é útil como canal de contato no `aboutme.json`, não como namespace de identidade.
|
|
123
|
-
|
|
124
|
-
**Plataformas de código conhecidas pela spec** (lista mantida no compilador, atualizada via versão da CLI):
|
|
125
|
-
|
|
126
|
-
| Plataforma | Formato |
|
|
127
|
-
|---|---|
|
|
128
|
-
| GitHub | `github.com/<user>` |
|
|
129
|
-
| GitLab | `gitlab.com/<user>` |
|
|
130
|
-
| Codeberg | `codeberg.org/<user>` |
|
|
131
|
-
| Sourcehut | `srht.site/<user>` |
|
|
132
|
-
|
|
133
|
-
**Anônimo** — `id` válido localmente, não interoperável entre runtimes. A runtime que recebe um `.agent` sem namespace verificável pode executar mas não pode verificar autoria. Runtimes em ambientes seguros podem bloquear por política. Não há garantia de unicidade entre dois agentes anônimos com o mesmo nome — diferenciados apenas pelo hash do ZIP.
|
|
134
|
-
|
|
135
|
-
**Formato do `id` — separadores com semântica única:**
|
|
136
|
-
|
|
137
|
-
```
|
|
138
|
-
// Estrutura
|
|
139
|
-
namespace/name:version~digest
|
|
140
|
-
|
|
141
|
-
// Domínio próprio
|
|
142
|
-
entelekheia.ai/doctor:v1.0~a1b2c3d
|
|
143
|
-
|
|
144
|
-
// Plataforma de código
|
|
145
|
-
github.com/daniloborges/doctor:v1.0~a1b2c3d
|
|
146
|
-
|
|
147
|
-
// Email — @ exclusivo para este caso, sem ambiguidade com digest
|
|
148
|
-
contato@gmail.com/doctor:v1.0~a1b2c3d
|
|
149
|
-
|
|
150
|
-
// Links de compartilhamento — runtime prefixia o scheme
|
|
151
|
-
dot-agent://entelekheia.ai/doctor ← mais recente
|
|
152
|
-
dot-agent://entelekheia.ai/doctor:v1.0 ← versão específica
|
|
153
|
-
dot-agent://entelekheia.ai/doctor:v1.0~a1b2c3d ← imutável
|
|
154
|
-
|
|
155
|
-
// Identidade criptográfica do autor (VNext)
|
|
156
|
-
did:web:entelekheia.ai
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
Cada separador tem papel único — nenhum aparece em dois contextos:
|
|
160
|
-
|
|
161
|
-
| Separador | Papel | Justificativa |
|
|
162
|
-
|---|---|---|
|
|
163
|
-
| `/` | namespace | hierarquia de path, universal |
|
|
164
|
-
| `:` | versão | convenção de container registry |
|
|
165
|
-
| `~` | digest | único sem conflito: válido em URI sem encoding (RFC 3986), sem significado em email, não é alias de email (`+`), não é fragmento de URL (`#`), não é semver, não é query string (`;`) |
|
|
166
|
-
| `@` | email como namespace | exclusivo — presença antes do primeiro `/` identifica tier de email |
|
|
167
|
-
|
|
168
|
-
### Estrutura do ZIP — Raiz e Arquivos Opcionais
|
|
169
|
-
|
|
170
|
-
```
|
|
171
|
-
meu-agente.agent (ZIP)
|
|
172
|
-
│
|
|
173
|
-
│ # Metadados gerados — Layer 2 🤖
|
|
174
|
-
├── .agent/
|
|
175
|
-
│ ├── aboutme.json ← sempre presente
|
|
176
|
-
│ ├── types.json ← quando há tipos públicos
|
|
177
|
-
│ └── files.json ← quando há fontes
|
|
178
|
-
│
|
|
179
|
-
│ # Comportamento — Layer 1 👤
|
|
180
|
-
├── agent.description
|
|
181
|
-
├── agent.behavior
|
|
182
|
-
├── behaviors/
|
|
183
|
-
│ └── xpto.behavior
|
|
184
|
-
├── guides/
|
|
185
|
-
│ └── ask-class-name.md
|
|
186
|
-
├── knowledge/
|
|
187
|
-
│ └── swift-basics.md
|
|
188
|
-
├── SOUL.md
|
|
189
|
-
│
|
|
190
|
-
│ # Interface 🕵 em exploração
|
|
191
|
-
├── ui/
|
|
192
|
-
│ ├── index.html
|
|
193
|
-
│ ├── style.css
|
|
194
|
-
│ ├── app.tsx
|
|
195
|
-
│ └── components/
|
|
196
|
-
│ └── triagem-form.tsx
|
|
197
|
-
│
|
|
198
|
-
│ # Assets 🕵 em exploração
|
|
199
|
-
└── assets/
|
|
200
|
-
├── icon.svg
|
|
201
|
-
├── icon.png
|
|
202
|
-
└── images/
|
|
203
|
-
└── banner.png
|
|
204
|
-
```
|
|
205
|
-
|
|
206
|
-
O `aboutme.json` é o único arquivo obrigatório — dentro de `.agent/`. Agentes simples ou MCP-only podem ter só essa pasta. Os fontes ficam na raiz do ZIP como estão no projeto — quem abre o arquivo vê o código primeiro, não a geração. O `integrity{}` referencia os arquivos opcionais quando existirem:
|
|
207
|
-
|
|
208
|
-
```json
|
|
209
|
-
"integrity": {
|
|
210
|
-
"sha256": "...",
|
|
211
|
-
"types": ".agent/types.json",
|
|
212
|
-
"files": ".agent/files.json"
|
|
213
|
-
}
|
|
214
|
-
```
|
|
215
|
-
|
|
216
|
-
O `files.json` referencia arquivos relativos à raiz do ZIP:
|
|
217
|
-
|
|
218
|
-
```json
|
|
219
|
-
{
|
|
220
|
-
"description": "agent.description",
|
|
221
|
-
"behavior": "agent.behavior",
|
|
222
|
-
"behaviors": ["behaviors/xpto.behavior"],
|
|
223
|
-
"guides": ["guides/ask-class-name.md"],
|
|
224
|
-
"knowledge": ["knowledge/swift-basics.md"]
|
|
225
|
-
}
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
Essa separação serve dois propósitos: mantém o `aboutme.json` leve para descoberta e permite que a runtime carregue `types.json` só quando precisar fazer validação de adapter, e `files.json` só quando precisar de auditoria ou unpack.
|
|
229
|
-
|
|
230
|
-
### 🕵 Em Exploração — ui/ e assets/
|
|
231
|
-
|
|
232
|
-
Ainda sem decisão de spec. Três questões abertas:
|
|
233
|
-
|
|
234
|
-
**`ui/` no `files.json`** — faria sentido uma chave própria separada de `guides` e `knowledge`:
|
|
235
|
-
```json
|
|
236
|
-
{ "ui": ["ui/index.html", "ui/app.tsx", "ui/style.css"] }
|
|
237
|
-
```
|
|
238
|
-
Runtimes que suportam genUI sabem o que fazer; as que não suportam ignoram.
|
|
239
|
-
|
|
240
|
-
**`assets/icon.*` no `aboutme.json`** — ícone do agente merece campo próprio para descoberta, análogo ao `iconUrl` do A2A. Runtimes poderiam exibir o ícone sem parsear `files.json`:
|
|
241
|
-
```json
|
|
242
|
-
{ "icon": "assets/icon.svg" }
|
|
243
|
-
```
|
|
244
|
-
|
|
245
|
-
**`ui/app.tsx` — fonte ou bundle?** Se o ZIP empacota só fontes, `app.tsx` vai para a raiz e a runtime compila. Se empacotar também o bundle compilado, ele vai para `.agent/` como artefato gerado — sem poluir a view dos fontes.
|
|
246
|
-
|
|
247
|
-
Tipos `std.*` são definidos pela spec dot-agent e hospedados em URL canônico:
|
|
248
|
-
|
|
249
|
-
```
|
|
250
|
-
https://dot-agent.dev/schema/std/v1/Prompt.json
|
|
251
|
-
https://dot-agent.dev/schema/std/v1/Response.json
|
|
252
|
-
```
|
|
253
|
-
|
|
254
|
-
Na V1, hospedados no GitHub do projeto. Após domínio próprio, migram para `dot-agent.dev`.
|
|
255
|
-
|
|
256
|
-
A runtime mantém um dicionário interno de `std.*` para resolução offline. Tipos `schema.org` referenciados via `x-concept` são documentação — a runtime não precisa resolvê-los para executar.
|
|
257
|
-
|
|
258
|
-
### requires[] — Explorando Tipagem (VNext)
|
|
259
|
-
|
|
260
|
-
Na V1, `requires[]` é uma lista simples de nomes:
|
|
261
|
-
|
|
262
|
-
```json
|
|
263
|
-
"requires": ["UserProfile", "FileSystem", "PaymentGateway"]
|
|
264
|
-
```
|
|
265
|
-
|
|
266
|
-
A tipagem será explorada com calma no VNext. O problema com separar em camadas técnicas (`data:` / `service:` / `system:`) é que não reflete como humanos pensam sobre permissões — quando alguém diz "tem acesso a UserProfile", imagina acesso aos dados, à edição, e à interação com o sistema sobre isso, cruzando os domínios técnicos ao mesmo tempo.
|
|
267
|
-
|
|
268
|
-
Formatos em exploração:
|
|
269
|
-
|
|
270
|
-
```
|
|
271
|
-
// Opção A — prefixo de camada técnica (sugerido, descartado por ser pouco humano)
|
|
272
|
-
data:UserProfile
|
|
273
|
-
service:PaymentGateway
|
|
274
|
-
system:FileSystem
|
|
275
|
-
|
|
276
|
-
// Opção B — ação explícita (mais granular, mais próximo de permissões reais)
|
|
277
|
-
Read:UserProfile
|
|
278
|
-
Edit:UserProfile
|
|
279
|
-
Create:Agents
|
|
280
|
-
Edit:SelfAgent
|
|
281
|
-
Read:MedicalData
|
|
282
|
-
|
|
283
|
-
// Opção C — recurso com escopo de ação implícito (mais humano, menos preciso)
|
|
284
|
-
UserProfile ← implica leitura
|
|
285
|
-
UserProfile.write ← explicita escrita
|
|
286
|
-
MedicalData.read
|
|
287
|
-
|
|
288
|
-
// Opção D — declaração livre com registro público
|
|
289
|
-
UserProfile ← definido no registro dot-agent.dev/registry/requires
|
|
290
|
-
o registro define quais ações estão implícitas
|
|
291
|
-
```
|
|
292
|
-
|
|
293
|
-
A questão central: granularidade de ação (Read/Edit/Create/Delete) deve estar no `requires` do agente ou é política da runtime? Um agente que declara `UserProfile` pode estar pedindo só leitura — mas quem garante isso é a spec do `requires` ou o comportamento declarado no `.behavior`?
|
|
294
|
-
|
|
295
|
-
### purpose — Vocabulário Wikidata
|
|
296
|
-
|
|
297
|
-
`purpose` é um QID Wikidata derivado pelo compilador dos `category` dos tipos de interface pública. Não é string livre — permite navegação hierárquica por orquestradores e sistemas de descoberta.
|
|
298
|
-
|
|
299
|
-
```json
|
|
300
|
-
"purpose": "https://www.wikidata.org/wiki/Q784111"
|
|
301
|
-
```
|
|
302
|
-
|
|
303
|
-
Hierarquia navegável: `Q784111` (triagem médica) ⊂ `Q11190` (medicina) ⊂ `Q336` (ciência da saúde). Um orquestrador que busca agentes de saúde encontra todos os subníveis.
|
|
304
|
-
|
|
305
|
-
### Coleção de Agentes — Agent Pack
|
|
306
|
-
|
|
307
|
-
Um link `dot-agent://` pode apontar para um único agente ou para uma coleção. A coleção é um arquivo JSON simples — um array de `id` — hospedado pelo publisher.
|
|
308
|
-
|
|
309
|
-
```
|
|
310
|
-
// Link de coleção
|
|
311
|
-
dot-agent://entelekheia.ai/collection ← coleção nomeada
|
|
312
|
-
dot-agent://github.com/daniloborges/agents ← coleção de um dev
|
|
313
|
-
|
|
314
|
-
// Arquivo resolvido pela runtime
|
|
315
|
-
{
|
|
316
|
-
"name": "Meus Agentes",
|
|
317
|
-
"publisher": "entelekheia.ai",
|
|
318
|
-
"agents": [
|
|
319
|
-
"entelekheia.ai/doctor:v1.0~a1b2c3d",
|
|
320
|
-
"entelekheia.ai/receptionist:v1.2~e5f6g7h",
|
|
321
|
-
"entelekheia.ai/billing:v1.0~x9y8z7w"
|
|
322
|
-
]
|
|
323
|
-
}
|
|
324
|
-
```
|
|
325
|
-
|
|
326
|
-
A runtime ao receber uma coleção baixa e instala cada `id` listado, disponibiliza todos no contexto do usuário, respeita version + commit quando especificados, e instala a mais recente quando omitidos.
|
|
327
|
-
|
|
328
|
-
⏳ VNext — decisões pendentes:
|
|
329
|
-
|
|
330
|
-
| Decisão | |
|
|
331
|
-
|---|---|
|
|
332
|
-
| Nome do arquivo de coleção | `agents.json`, `pack.json`, `.agent-pack`? |
|
|
333
|
-
| Localização | Well-known do publisher ou path arbitrário? |
|
|
334
|
-
| Instalação | Runtime instala todos automaticamente ou pede confirmação por agente? |
|
|
335
|
-
|
|
336
|
-
### schemaVersion vs @context
|
|
337
|
-
|
|
338
|
-
`schemaVersion` = versão do formato do `aboutme.json` (para parsers da CLI).
|
|
339
|
-
`@context` W3C DID = ontologia linked-data (semântica de campos).
|
|
340
|
-
São conceitos distintos que coexistirão na VNext se o `aboutme.json` virar JSON-LD nativo.
|
|
341
|
-
|
|
342
|
-
### Transport
|
|
343
|
-
|
|
344
|
-
Transport = como as mensagens chegam ao agente em runtime. O `.agent` é pacote estático — transport é responsabilidade da runtime. Ausente no `aboutme.json` V1 por design.
|
|
345
|
-
|
|
346
|
-
---
|
|
347
|
-
|
|
348
|
-
## Campos Ausentes na V1
|
|
349
|
-
|
|
350
|
-
| Campo | Status | Motivo |
|
|
351
|
-
|---|---|---|
|
|
352
|
-
| `inputModes` / `outputModes` em `skills[]` | ⏳ VNext | Runtime converte tipos estruturados para o formato de transporte. Explorar compatibilidade A2A completa no VNext. |
|
|
353
|
-
| `url` / `endpoints` | ⏳ VNext | Host preenche no deploy; VNext: `endpoints{}` tipado |
|
|
354
|
-
| `did` | ⏳ VNext | Identidade criptográfica do autor |
|
|
355
|
-
| `proof` | ⏳ VNext | Assinatura Ed25519 do hash SHA-256 do ZIP |
|
|
356
|
-
| `securitySchemes` / `auth` | ⏳ VNext | Autenticação entre agentes |
|
|
357
|
-
| `domain_type` | ⏳ VNext | Política de confiança para subdomínios |
|
|
358
|
-
| `transport` | ✅ ausente por design | Responsabilidade da runtime |
|
|
359
|
-
| `tags` em `skills[]` | ✅ fora da spec | Responsabilidade de registry futuro — gerado a partir de `purpose` + `skills[].description` |
|
|
360
|
-
|
|
361
|
-
---
|
|
362
|
-
|
|
363
|
-
## Caminho de Evolução
|
|
364
|
-
|
|
365
|
-
```
|
|
366
|
-
V1 aboutme.json — leve, para descoberta e instalação
|
|
367
|
-
id + purpose (Wikidata) + skills[] + requires[] + integrity{}
|
|
368
|
-
types.json — opcional, na raiz do ZIP
|
|
369
|
-
JSON Schema 2020-12 dos tipos públicos + input[] + output[]
|
|
370
|
-
std.* em dot-agent.dev/schema/std/v1/
|
|
371
|
-
files.json — opcional, na raiz do ZIP
|
|
372
|
-
manifesto de fontes individuais (behavior, guides, knowledge)
|
|
373
|
-
|
|
374
|
-
V2 + domain_type (org / user / subdomain)
|
|
375
|
-
+ endpoints{} reservado
|
|
376
|
-
|
|
377
|
-
VNext + endpoints{} distribution / mcp / a2a
|
|
378
|
-
+ did did:web ou did:key do autor
|
|
379
|
-
+ proof{} assinatura Ed25519 do ZIP
|
|
380
|
-
+ @context JSON-LD nativo para interop DID/A2A
|
|
381
|
-
+ dot-agent:// scheme de resolução e compartilhamento
|
|
382
|
-
+ agent pack coleção de agentes via array de ids
|
|
383
|
-
→ publicável como Agent Card completo no /.well-known/
|
|
384
|
-
```
|
|
385
|
-
|
|
386
|
-
---
|
|
387
|
-
|
|
388
|
-
---
|
|
389
|
-
|
|
390
|
-
## Tabela Comparativa
|
|
391
|
-
|
|
392
|
-
Linhas com semântica diferente entre padrões aparecem em linhas próprias.
|
|
393
|
-
Célula vazia = o padrão não cobre esse campo.
|
|
394
|
-
|
|
395
|
-
| Campo | dot-agent `aboutme.json` | A2A Agent Card | MCP Server | W3C DID Document | Notas |
|
|
396
|
-
|---|---|---|---|---|---|
|
|
397
|
-
| **Identidade** | | | | | |
|
|
398
|
-
| Identificador do pacote | `id` — `namespace/name:version~digest`; `dot-agent://namespace/name` como link gerado pela runtime | — | — | — | ✅ Separadores únicos por papel: `/` namespace, `:` versão, `~` digest (semver), `@` exclusivo para email como namespace. |
|
|
399
|
-
| Identidade criptográfica do autor | — | — | — | `id` (DID URI) | ⏳ VNext: `did:web` ou `did:key`. |
|
|
400
|
-
| Nome legível | `name` | `name` ✱ | `name` | — | ✅ Extraído do `agent_decl`. |
|
|
401
|
-
| Descrição | `description` | `description` ✱ | `description` | — | ✅ Extraído do `description_block`. |
|
|
402
|
-
| Versão do agente | `version` | `version` ✱ | `version` | `versionId` | ✅ Versão semântica do agente. |
|
|
403
|
-
| Versão do schema do envelope | `schemaVersion` | — | — | — | ✅ Versão do formato do envelope, não do agente. ≠ `@context` W3C (que é ontologia). |
|
|
404
|
-
| Vocabulário linked-data | — | — | — | `@context` | ⏳ VNext: se envelope virar JSON-LD nativo. |
|
|
405
|
-
| Publisher / namespace | `domain` | `provider.organization` | — | — | ✅ Namespace para `id` e well-known (VNext). Ver seção Domain. |
|
|
406
|
-
| Controle criptográfico | — | — | — | `controller` | ⏳ VNext: `controller` referencia o `domain`. |
|
|
407
|
-
| Licença | `license` | — | — | — | ✅ Campo próprio. |
|
|
408
|
-
| Persona / voz | `persona` | — | — | — | ✅ Campo próprio — aponta para `SOUL.md`. |
|
|
409
|
-
| Versão do compilador | `compiler` | — | — | — | ✅ Campo próprio — proveniência de build. |
|
|
410
|
-
| Hash do commit Git | `commit` | — | — | — | ✅ Campo próprio — rastreabilidade de build. Deve ser idêntico ao sufixo do `id`. |
|
|
411
|
-
| **O que o agente faz** | | | | | |
|
|
412
|
-
| Categoria semântica derivada | `purpose` — QID Wikidata derivado dos `category` dos tipos de interface | — | — | — | ✅ QID Wikidata permite navegação hierárquica — subclasses agrupáveis por orquestradores. Ex: `Q784111` (triagem médica) ⊂ `Q11190` (medicina). |
|
|
413
|
-
| Entry points públicos | `skills[]` — `id` + `description`, traduzido das `capabilities` do `.description` | `skills[]` ✱ — `id`, `name`, `description`, `inputModes`, `outputModes`, `tags`, `examples` | `tools[]` — JSON Schema por tool | — | ✅ `capabilities` na DSL → `skills[]` no envelope. `inputModes`/`outputModes` omitidos — runtime converte tipos estruturados para o formato de transporte (JSON, XML, etc). ⏳ VNext: compatibilidade A2A completa. |
|
|
414
|
-
| Schema de dados (tipos públicos) | `types.json` — arquivo separado na raiz do ZIP; apenas tipos de interface pública (`input`/`output`/`capabilities`); JSON Schema 2020-12 com `x-category` e `x-concept` | — | `inputSchema` JSON Schema 2020-12 por tool | — | ✅ Padrão separado quando existir — agentes simples ou MCP-only não precisam de `types.json`. Compilador gera baseado nos tipos declarados. |
|
|
415
|
-
| MIME types de input | — | `defaultInputModes[]` | — | — | — |
|
|
416
|
-
| MIME types de output | — | `defaultOutputModes[]` | — | — | — |
|
|
417
|
-
| Input tipado (tipos estruturados) | `input[]` em `types.json` — refs para `$defs` ou URL canônico `std.*` | — | — | — | ✅ `std.*` resolvidos via `https://dot-agent.dev/schema/std/v1/`. Tipos custom em `#/$defs/`. |
|
|
418
|
-
| Output tipado (tipos estruturados) | `output[]` em `types.json` — refs para `$defs` | — | — | — | ✅ Linha própria: tipos estruturados da DSL ≠ MIME types do A2A. |
|
|
419
|
-
| Dependências | `requires[]` — string simples, replicado do `.description` | — | — | — | ✅ V1: nomes simples (`UserProfile`, `FileSystem`). Tipagem e granularidade de ação exploradas no VNext. |
|
|
420
|
-
| Features de protocolo | — | `capabilities{}` — streaming, pushNotifications | — | — | — |
|
|
421
|
-
| Primitivos do servidor | — | — | `capabilities{}` — tools, resources, prompts | — | — |
|
|
422
|
-
| **Confiança e descoberta** | | | | | |
|
|
423
|
-
| Integridade do pacote | `integrity.sha256` — hash do ZIP inteiro | Signed Agent Card (v1.0) | — | `proof{}` | ✅ V1: hash SHA-256 do ZIP. VNext: `proof{}` assina esse mesmo hash com chave Ed25519. |
|
|
424
|
-
| Descoberta web | — | `/.well-known/agent-card.json` | — | `/.well-known/did.json` | ⏳ VNext: `/.well-known/dot-agent.json`. |
|
|
425
|
-
| Autenticação | — | `securitySchemes{}` | `auth{}` | `verificationMethod[]` | ⏳ VNext. |
|
|
426
|
-
| **Fontes empacotados** | | | | | |
|
|
427
|
-
| Mapa de fontes | `files.json` — arquivo separado na raiz do ZIP; arquivos individuais listados explicitamente | — | — | — | ✅ Padrão separado quando existir — agentes MCP-only sem fontes não precisam de `files.json`. Arquivos individuais, não pastas. |
|
|
428
|
-
| Guias procedimentais | `files.json` → `guides[]` — lista de arquivos | — | — | — | ✅ Campo próprio. Carregamento lazy por state, não automático. |
|
|
429
|
-
| Base de conhecimento / RAG | `files.json` → `knowledge[]` — lista de arquivos | — | — | — | ✅ Campo próprio. Carregamento requisitado durante execução dos states, nunca automático. |
|
|
430
|
-
| **Transporte** | | | | | |
|
|
431
|
-
| Endpoints de execução | — | `url` ✱ | `url` | `service[].serviceEndpoint` | ⏳ VNext: `endpoints{}` tipado (distribution / mcp / a2a). |
|
|
432
|
-
| Transport | — | HTTP / SSE / JSON-RPC 2.0 / gRPC | STDIO / HTTP | — | ✅ Ausente — responsabilidade da runtime. |
|
|
433
|
-
| Governança | Danilo Borges (open, a doar) | Linux Foundation | Linux Foundation (AAIF) | W3C | ✅ Independente, intenção de doação futura. |
|
|
434
|
-
|
|
435
|
-
---
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
## Perguntas e Respostas
|
|
439
|
-
|
|
440
|
-
Registro de questões levantadas durante o design — respondidas ou encaminhadas.
|
|
441
|
-
|
|
442
|
-
**O `commit` no campo `id` e o campo `commit` separado são redundantes. Em caso de conflito, qual prevalece?**
|
|
443
|
-
O compilador garante que são sempre idênticos no momento do `pack`. O `commit` separado existe para leitura direta sem precisar fazer parse do `id`. Em conflito (pacote corrompido ou editado manualmente), o `id` prevalece — é o identificador imutável do pacote. A runtime deve rejeitar envelopes onde os dois divergem.
|
|
444
|
-
|
|
445
|
-
**`$ref` de `std.*` — como a runtime resolve tipos que não estão em `types{}`?**
|
|
446
|
-
Resolvidos via URL canônico `https://dot-agent.dev/schema/std/v1/`. A runtime mantém um dicionário interno de `std.*` para resolução offline. `$ref` com URL absoluto é JSON Schema padrão — sem tratamento especial no parser.
|
|
447
|
-
|
|
448
|
-
**`files.guides[]` e `files.knowledge[]` — pasta inteira ou arquivos individuais?**
|
|
449
|
-
Arquivos individuais listados explicitamente no `aboutme.json`. A pasta no ZIP é organização interna; o manifesto precisa ser explícito para verificação de integridade por arquivo. Carregamento é lazy — requisitado durante execução dos states, nunca automático na inicialização.
|
|
450
|
-
|
|
451
|
-
**`requires[]` como string plana — a runtime consegue distinguir o tipo de dependência?**
|
|
452
|
-
Na V1 não precisa — `requires[]` é lista simples de nomes (`UserProfile`, `FileSystem`). Tipagem e granularidade de ação são exploradas no VNext. O problema com prefixos técnicos (`data:` / `service:` / `system:`) é que cruzam domínios de forma pouco natural — "acesso a UserProfile" implica dados, edição e interação com o sistema ao mesmo tempo. Formatos alternativos em exploração: ação explícita (`Read:UserProfile`, `Edit:UserProfile`), escopo pontual (`UserProfile.write`), ou nome simples com semântica definida em registro público. Ver seção **requires[] — Explorando Tipagem**.
|
|
453
|
-
|
|
454
|
-
**`purpose` como string livre cria problema de descoberta — dois agentes médicos teriam valores diferentes.**
|
|
455
|
-
Resolvido usando QID Wikidata como valor de `purpose`. Derivado automaticamente pelo compilador dos `category` dos tipos de interface. Permite navegação hierárquica — orquestradores encontram agentes por categoria e subcategorias.
|
|
456
|
-
|
|
457
|
-
**`types.json` e `files.json` — inline no `aboutme.json` ou arquivos separados?**
|
|
458
|
-
Separados por padrão quando existirem — na raiz do ZIP ao lado do `aboutme.json`. O `aboutme.json` referencia via `integrity.types` e `integrity.files`. Mantém o envelope leve para descoberta. Runtime carrega `types.json` só para validação de adapter, `files.json` só para auditoria ou unpack. Agentes simples ou MCP-only não geram nem um nem outro — só `aboutme.json`. Mesma decisão resolve o problema de crescimento: tipos internos ficam só nos fontes, `types.json` contém apenas interface pública.
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
**`tags` em `skills[]` — por agente, por skill, ou fora da spec?**
|
|
463
|
-
Fora da spec. Para runtimes que conhecem seus agentes, tags são micro-gestão sem benefício real. Tags geradas por LLM são inconsistentes entre autores diferentes. Se um registry surgir, ele gera tags a partir de `purpose` + `skills[].description` — não o autor, não o envelope.
|
|
464
|
-
|
|
465
|
-
**O que o `proof` VNext assina — o `aboutme.json`, arquivos individuais, ou o ZIP inteiro?**
|
|
466
|
-
O ZIP inteiro, via o hash já existente em `integrity.sha256`. Assinar arquivo por arquivo permite que um atacante substitua um arquivo sem invalidar os outros. O `proof` VNext é a assinatura Ed25519 do `integrity.sha256` — consistente com o que já existe na V1.
|
|
467
|
-
|
|
468
|
-
**`dot-agent://` implica que há um servidor respondendo — cria expectativa de HTTP que nem sempre existe.**
|
|
469
|
-
O `://` é o scheme URI, não implica HTTP. A runtime registra `dot-agent://` como handler no SO — ela que decide como resolver (busca local, download, cache). O agente em si é um pacote estático; o scheme é só o protocolo de endereçamento.
|
|
470
|
-
|
|
471
|
-
**O `id` com `:` em série é opaco para sistemas externos — qualquer um precisa de parser específico.**
|
|
472
|
-
Resolvido adotando separadores com papel único: `/` namespace, `:` versão, `~` digest (consistente com semver build metadata), `@` exclusivo para email como namespace. `entelekheia.ai/doctor:v1.0~a1b2c3d` é legível sem parser específico. Email: `contato@gmail.com/doctor:v1.0~a1b2c3d` — o `@` antes do `/` identifica inequivocamente o namespace como email.
|
|
473
|
-
|
|
474
|
-
**Como a runtime diferencia dois agentes anônimos com o mesmo nome?**
|
|
475
|
-
Pelo hash do ZIP — é o único identificador disponível sem namespace. Dois anônimos com `doctor:v1.0` e hashes diferentes são pacotes distintos. Não há garantia de unicidade entre runtimes: um anônimo é válido localmente, não interoperável. Runtimes em ambientes seguros podem bloquear agentes sem namespace verificável por política. A spec não tenta resolver identidade anônima — é um tier de confiança zero por natureza.
|
|
476
|
-
|
|
477
|
-
**Por que email não entra como namespace verificável?**
|
|
478
|
-
Diferente de plataformas de código, provedores de email são impossíveis de enumerar e não expõem mecanismo padrão de autorização de arquivos por usuário. A verificação recairia sobre o domínio do provedor (`gmail.com`), não sobre o usuário — o spec ficaria dependendo de cada provedor configurar seus servidores. Email é útil como campo de contato no `aboutme.json`, não como namespace de identidade verificável.
|
|
479
|
-
|
|
480
|
-
**`knowledge/` — como a runtime decide se carrega via RAG ou injeta direto no contexto?**
|
|
481
|
-
Não é responsabilidade do `aboutme.json` na V1. O state no `.behavior` requisita o arquivo; a runtime decide a estratégia de carregamento baseada em tamanho, tipo e capacidade disponível. Metadata de `knowledge/` (tamanho, idioma, domínio) é candidata a VNext para guiar essa decisão.
|
|
482
|
-
|
|
483
|
-
**Agent Pack — runtime instala automaticamente ou pede confirmação?**
|
|
484
|
-
Decisão pendente para VNext. Opções: instalação automática silenciosa (melhor UX, menor controle), confirmação por agente (mais seguro, mais fricção), ou confirmação da coleção inteira de uma vez (meio-termo). Relacionado à política de confiança do `domain` do publisher.
|