@bluefly/openstandardagents 0.3.0 → 0.3.1
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/CHANGELOG.md +1 -1
- package/README.md +58 -218
- package/dist/cli/commands/diff.command.d.ts +7 -0
- package/dist/cli/commands/diff.command.d.ts.map +1 -0
- package/dist/cli/commands/diff.command.js +181 -0
- package/dist/cli/commands/diff.command.js.map +1 -0
- package/dist/cli/commands/docs.command.d.ts +7 -0
- package/dist/cli/commands/docs.command.d.ts.map +1 -0
- package/dist/cli/commands/docs.command.js +274 -0
- package/dist/cli/commands/docs.command.js.map +1 -0
- package/dist/cli/commands/lint.command.d.ts +7 -0
- package/dist/cli/commands/lint.command.d.ts.map +1 -0
- package/dist/cli/commands/lint.command.js +342 -0
- package/dist/cli/commands/lint.command.js.map +1 -0
- package/dist/cli/commands/serve.command.d.ts +7 -0
- package/dist/cli/commands/serve.command.d.ts.map +1 -0
- package/dist/cli/commands/serve.command.js +232 -0
- package/dist/cli/commands/serve.command.js.map +1 -0
- package/dist/cli/index.js +4 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/di-container.d.ts.map +1 -1
- package/dist/di-container.js +3 -0
- package/dist/di-container.js.map +1 -1
- package/dist/services/git.service.d.ts +40 -0
- package/dist/services/git.service.d.ts.map +1 -0
- package/dist/services/git.service.js +122 -0
- package/dist/services/git.service.js.map +1 -0
- package/dist/spec/v0.3.1/UNIFIED-SCHEMA.md +120 -0
- package/dist/spec/v0.3.1/adapters/drupal.md +541 -0
- package/dist/spec/v0.3.1/adapters/symfony.md +659 -0
- package/dist/spec/v0.3.1/agent-test.schema.json +75 -0
- package/dist/spec/v0.3.1/examples/drupal-content-writer.ossa.yaml +110 -0
- package/dist/spec/v0.3.1/examples/drupal-moderation-assistant.ossa.yaml +96 -0
- package/dist/spec/v0.3.1/examples/quick-wins/complete-agent-with-quick-wins.ossa.yaml +144 -0
- package/dist/spec/v0.3.1/extensions/drupal.md +417 -0
- package/dist/spec/v0.3.1/ossa-0.3.0.schema.json +2787 -0
- package/dist/spec/v0.3.1/ossa-0.3.1.schema.json +2806 -0
- package/dist/spec/v0.3.1/protocols/sse.md +494 -0
- package/dist/spec/v0.3.1/protocols/webrtc.md +600 -0
- package/dist/spec/v0.3.1/protocols/websocket.md +362 -0
- package/dist/spec/v0.3.1/schemas/agent-unified.yaml +165 -0
- package/dist/spec/v0.3.1/schemas/capabilities.yaml +102 -0
- package/dist/spec/v0.3.1/schemas/functions.yaml +75 -0
- package/dist/spec/v0.3.1/schemas/messaging/channel.schema.json +245 -0
- package/dist/spec/v0.3.1/schemas/messaging/delivery-receipt.schema.json +192 -0
- package/dist/spec/v0.3.1/schemas/messaging/message.schema.json +205 -0
- package/dist/spec/v0.3.1/schemas/messaging/subscription.schema.json +214 -0
- package/dist/spec/v0.3.1/schemas/runtime.yaml +102 -0
- package/dist/spec/v0.3.1/schemas/taxonomy.yaml +533 -0
- package/dist/spec/v0.3.1/schemas/unified-llm.yaml +91 -0
- package/dist/spec/v0.3.1/taxonomy.yaml +256 -0
- package/dist/testing/fixtures.d.ts.map +1 -1
- package/dist/testing/fixtures.js +3 -2
- package/dist/testing/fixtures.js.map +1 -1
- package/package.json +3 -31
- package/spec/v0.3.1/UNIFIED-SCHEMA.md +120 -0
- package/spec/v0.3.1/adapters/drupal.md +541 -0
- package/spec/v0.3.1/adapters/symfony.md +659 -0
- package/spec/v0.3.1/agent-test.schema.json +75 -0
- package/spec/v0.3.1/examples/drupal-content-writer.ossa.yaml +110 -0
- package/spec/v0.3.1/examples/drupal-moderation-assistant.ossa.yaml +96 -0
- package/spec/v0.3.1/examples/quick-wins/complete-agent-with-quick-wins.ossa.yaml +144 -0
- package/spec/v0.3.1/extensions/drupal.md +417 -0
- package/spec/v0.3.1/ossa-0.3.0.schema.json +2787 -0
- package/spec/v0.3.1/ossa-0.3.1.schema.json +2806 -0
- package/spec/v0.3.1/protocols/sse.md +494 -0
- package/spec/v0.3.1/protocols/webrtc.md +600 -0
- package/spec/v0.3.1/protocols/websocket.md +362 -0
- package/spec/v0.3.1/schemas/agent-unified.yaml +165 -0
- package/spec/v0.3.1/schemas/capabilities.yaml +102 -0
- package/spec/v0.3.1/schemas/functions.yaml +75 -0
- package/spec/v0.3.1/schemas/messaging/channel.schema.json +245 -0
- package/spec/v0.3.1/schemas/messaging/delivery-receipt.schema.json +192 -0
- package/spec/v0.3.1/schemas/messaging/message.schema.json +205 -0
- package/spec/v0.3.1/schemas/messaging/subscription.schema.json +214 -0
- package/spec/v0.3.1/schemas/runtime.yaml +102 -0
- package/spec/v0.3.1/schemas/taxonomy.yaml +533 -0
- package/spec/v0.3.1/schemas/unified-llm.yaml +91 -0
- package/spec/v0.3.1/taxonomy.yaml +256 -0
- package/dist/types/generated/ossa-0.3.0.types.d.ts +0 -316
- package/dist/types/generated/ossa-0.3.0.types.d.ts.map +0 -1
- package/dist/types/generated/ossa-0.3.0.types.js +0 -8
- package/dist/types/generated/ossa-0.3.0.types.js.map +0 -1
- package/dist/types/generated/ossa-0.3.0.zod.d.ts +0 -17
- package/dist/types/generated/ossa-0.3.0.zod.d.ts.map +0 -1
- package/dist/types/generated/ossa-0.3.0.zod.js +0 -3
- package/dist/types/generated/ossa-0.3.0.zod.js.map +0 -1
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
# WebSocket Transport Protocol
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
WebSocket transport enables bidirectional, real-time communication between OSSA agents over persistent connections. This specification defines how agents use WebSocket connections for agent-to-agent messaging, capability calls, and status updates.
|
|
6
|
+
|
|
7
|
+
## Connection Lifecycle
|
|
8
|
+
|
|
9
|
+
### Connection Establishment
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
// Client initiates connection
|
|
13
|
+
const ws = new WebSocket('wss://agent.example.com/ws');
|
|
14
|
+
|
|
15
|
+
// Send agent registration on connect
|
|
16
|
+
ws.onopen = () => {
|
|
17
|
+
ws.send(JSON.stringify({
|
|
18
|
+
type: 'register',
|
|
19
|
+
agentId: 'agent://example.com/my-agent',
|
|
20
|
+
capabilities: ['process_data', 'analyze_content'],
|
|
21
|
+
version: 'ossa/v0.3.1'
|
|
22
|
+
}));
|
|
23
|
+
};
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Authentication
|
|
27
|
+
|
|
28
|
+
WebSocket connections MUST authenticate using one of:
|
|
29
|
+
|
|
30
|
+
1. **Bearer Token** - Include in initial HTTP upgrade request
|
|
31
|
+
2. **Query Parameter** - For restricted environments: `?token=<jwt>`
|
|
32
|
+
3. **Message-based Auth** - Send auth message after connection
|
|
33
|
+
|
|
34
|
+
```http
|
|
35
|
+
GET /ws HTTP/1.1
|
|
36
|
+
Host: agent.example.com
|
|
37
|
+
Upgrade: websocket
|
|
38
|
+
Connection: Upgrade
|
|
39
|
+
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
|
|
40
|
+
Sec-WebSocket-Version: 13
|
|
41
|
+
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Heartbeat/Keepalive
|
|
45
|
+
|
|
46
|
+
Agents MUST implement ping/pong to maintain connection health:
|
|
47
|
+
|
|
48
|
+
- Server sends `ping` every 30 seconds
|
|
49
|
+
- Client responds with `pong` within 5 seconds
|
|
50
|
+
- Connection closes after 3 missed pongs
|
|
51
|
+
|
|
52
|
+
```json
|
|
53
|
+
// Server ping
|
|
54
|
+
{"type": "ping", "timestamp": "2025-12-18T14:00:00Z"}
|
|
55
|
+
|
|
56
|
+
// Client pong
|
|
57
|
+
{"type": "pong", "timestamp": "2025-12-18T14:00:00Z"}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Message Format
|
|
61
|
+
|
|
62
|
+
### Base Message Structure
|
|
63
|
+
|
|
64
|
+
```typescript
|
|
65
|
+
interface WebSocketEvent {
|
|
66
|
+
type: 'message' | 'capability_call' | 'status_update' | 'error' | 'ack';
|
|
67
|
+
id: string; // Unique message ID (UUID)
|
|
68
|
+
timestamp: string; // ISO 8601 timestamp
|
|
69
|
+
payload: unknown; // Message-specific payload
|
|
70
|
+
metadata: {
|
|
71
|
+
agentId: string; // Sender agent URI
|
|
72
|
+
correlationId?: string; // For request/response matching
|
|
73
|
+
replyTo?: string; // WebSocket connection ID for responses
|
|
74
|
+
priority?: 'low' | 'normal' | 'high' | 'critical';
|
|
75
|
+
ttl?: number; // Time-to-live in seconds
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Message Types
|
|
81
|
+
|
|
82
|
+
#### 1. Message Event
|
|
83
|
+
|
|
84
|
+
Pub/sub style message broadcast:
|
|
85
|
+
|
|
86
|
+
```json
|
|
87
|
+
{
|
|
88
|
+
"type": "message",
|
|
89
|
+
"id": "msg-123e4567-e89b-12d3-a456-426614174000",
|
|
90
|
+
"timestamp": "2025-12-18T14:00:00Z",
|
|
91
|
+
"payload": {
|
|
92
|
+
"channel": "content.published",
|
|
93
|
+
"data": {
|
|
94
|
+
"contentId": "node-123",
|
|
95
|
+
"title": "New Article",
|
|
96
|
+
"status": "published"
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
"metadata": {
|
|
100
|
+
"agentId": "agent://example.com/publisher",
|
|
101
|
+
"priority": "normal"
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
#### 2. Capability Call
|
|
107
|
+
|
|
108
|
+
RPC-style capability invocation:
|
|
109
|
+
|
|
110
|
+
```json
|
|
111
|
+
{
|
|
112
|
+
"type": "capability_call",
|
|
113
|
+
"id": "call-456e7890-a12b-34c5-d678-901234567890",
|
|
114
|
+
"timestamp": "2025-12-18T14:00:00Z",
|
|
115
|
+
"payload": {
|
|
116
|
+
"capability": "analyze_content",
|
|
117
|
+
"input": {
|
|
118
|
+
"contentId": "node-123",
|
|
119
|
+
"analysisType": "sentiment"
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
"metadata": {
|
|
123
|
+
"agentId": "agent://example.com/analyzer",
|
|
124
|
+
"correlationId": "req-789",
|
|
125
|
+
"replyTo": "ws-conn-abc123"
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
#### 3. Status Update
|
|
131
|
+
|
|
132
|
+
Agent health and status broadcasts:
|
|
133
|
+
|
|
134
|
+
```json
|
|
135
|
+
{
|
|
136
|
+
"type": "status_update",
|
|
137
|
+
"id": "status-901e2345-f67g-89h0-i123-456789012345",
|
|
138
|
+
"timestamp": "2025-12-18T14:00:00Z",
|
|
139
|
+
"payload": {
|
|
140
|
+
"status": "healthy",
|
|
141
|
+
"load": 0.45,
|
|
142
|
+
"activeConnections": 12,
|
|
143
|
+
"capabilities": ["process_data", "analyze_content"]
|
|
144
|
+
},
|
|
145
|
+
"metadata": {
|
|
146
|
+
"agentId": "agent://example.com/worker-1"
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
#### 4. Error Event
|
|
152
|
+
|
|
153
|
+
Error notifications:
|
|
154
|
+
|
|
155
|
+
```json
|
|
156
|
+
{
|
|
157
|
+
"type": "error",
|
|
158
|
+
"id": "err-234f5678-g90h-12i3-j456-789012345678",
|
|
159
|
+
"timestamp": "2025-12-18T14:00:00Z",
|
|
160
|
+
"payload": {
|
|
161
|
+
"code": "CAPABILITY_NOT_FOUND",
|
|
162
|
+
"message": "Capability 'unknown_capability' not found",
|
|
163
|
+
"details": {
|
|
164
|
+
"requestedCapability": "unknown_capability",
|
|
165
|
+
"availableCapabilities": ["process_data", "analyze_content"]
|
|
166
|
+
}
|
|
167
|
+
},
|
|
168
|
+
"metadata": {
|
|
169
|
+
"agentId": "agent://example.com/agent",
|
|
170
|
+
"correlationId": "req-789"
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
#### 5. Acknowledgment
|
|
176
|
+
|
|
177
|
+
Message delivery confirmation:
|
|
178
|
+
|
|
179
|
+
```json
|
|
180
|
+
{
|
|
181
|
+
"type": "ack",
|
|
182
|
+
"id": "ack-567g8901-h23i-45j6-k789-012345678901",
|
|
183
|
+
"timestamp": "2025-12-18T14:00:00Z",
|
|
184
|
+
"payload": {
|
|
185
|
+
"messageId": "msg-123e4567-e89b-12d3-a456-426614174000",
|
|
186
|
+
"status": "received"
|
|
187
|
+
},
|
|
188
|
+
"metadata": {
|
|
189
|
+
"agentId": "agent://example.com/receiver"
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## Error Handling
|
|
195
|
+
|
|
196
|
+
### Reconnection Strategy
|
|
197
|
+
|
|
198
|
+
Clients MUST implement exponential backoff for reconnection:
|
|
199
|
+
|
|
200
|
+
```typescript
|
|
201
|
+
const reconnect = (attempt: number) => {
|
|
202
|
+
const delay = Math.min(1000 * Math.pow(2, attempt), 30000);
|
|
203
|
+
setTimeout(() => connectWebSocket(), delay);
|
|
204
|
+
};
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### Connection Loss
|
|
208
|
+
|
|
209
|
+
On connection loss:
|
|
210
|
+
|
|
211
|
+
1. Client buffers outgoing messages (up to configured limit)
|
|
212
|
+
2. Client attempts reconnection with exponential backoff
|
|
213
|
+
3. On reconnect, client reregisters and resends buffered messages
|
|
214
|
+
4. Messages older than TTL are discarded
|
|
215
|
+
|
|
216
|
+
### Error Codes
|
|
217
|
+
|
|
218
|
+
| Code | Description | Action |
|
|
219
|
+
|------|-------------|--------|
|
|
220
|
+
| `AUTH_FAILED` | Authentication failed | Refresh token and reconnect |
|
|
221
|
+
| `CAPABILITY_NOT_FOUND` | Unknown capability | Check capability registration |
|
|
222
|
+
| `RATE_LIMIT_EXCEEDED` | Too many messages | Implement backoff |
|
|
223
|
+
| `PAYLOAD_TOO_LARGE` | Message exceeds size limit | Reduce payload or use chunking |
|
|
224
|
+
| `PROTOCOL_ERROR` | Invalid message format | Fix message structure |
|
|
225
|
+
|
|
226
|
+
## Message Ordering
|
|
227
|
+
|
|
228
|
+
WebSocket transport provides **ordered delivery** per connection:
|
|
229
|
+
|
|
230
|
+
- Messages sent on the same connection arrive in order
|
|
231
|
+
- No ordering guarantees across different connections
|
|
232
|
+
- Use `correlationId` for request/response matching
|
|
233
|
+
|
|
234
|
+
## Reliability Features
|
|
235
|
+
|
|
236
|
+
### At-Least-Once Delivery
|
|
237
|
+
|
|
238
|
+
Implement using acknowledgments:
|
|
239
|
+
|
|
240
|
+
```typescript
|
|
241
|
+
// Sender waits for ACK
|
|
242
|
+
const sendWithAck = async (message: WebSocketEvent) => {
|
|
243
|
+
ws.send(JSON.stringify(message));
|
|
244
|
+
|
|
245
|
+
return new Promise((resolve, reject) => {
|
|
246
|
+
const timeout = setTimeout(() => {
|
|
247
|
+
reject(new Error('ACK timeout'));
|
|
248
|
+
}, 5000);
|
|
249
|
+
|
|
250
|
+
ackHandlers.set(message.id, () => {
|
|
251
|
+
clearTimeout(timeout);
|
|
252
|
+
resolve();
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
};
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### Message Deduplication
|
|
259
|
+
|
|
260
|
+
Receivers SHOULD track message IDs to prevent duplicate processing:
|
|
261
|
+
|
|
262
|
+
```typescript
|
|
263
|
+
const processedMessages = new Set<string>();
|
|
264
|
+
|
|
265
|
+
ws.onmessage = (event) => {
|
|
266
|
+
const message = JSON.parse(event.data);
|
|
267
|
+
|
|
268
|
+
if (processedMessages.has(message.id)) {
|
|
269
|
+
return; // Duplicate, skip
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
processedMessages.add(message.id);
|
|
273
|
+
processMessage(message);
|
|
274
|
+
|
|
275
|
+
// Send ACK
|
|
276
|
+
ws.send(JSON.stringify({
|
|
277
|
+
type: 'ack',
|
|
278
|
+
payload: { messageId: message.id, status: 'received' }
|
|
279
|
+
}));
|
|
280
|
+
};
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
## Security Considerations
|
|
284
|
+
|
|
285
|
+
1. **TLS Required** - MUST use `wss://` in production
|
|
286
|
+
2. **Token Expiry** - JWT tokens SHOULD have short expiry (15 minutes)
|
|
287
|
+
3. **Rate Limiting** - Server SHOULD limit messages per connection
|
|
288
|
+
4. **Message Size** - Server SHOULD enforce max message size (1MB default)
|
|
289
|
+
5. **Origin Validation** - Server MUST validate `Origin` header
|
|
290
|
+
|
|
291
|
+
## Performance Tuning
|
|
292
|
+
|
|
293
|
+
### Message Batching
|
|
294
|
+
|
|
295
|
+
For high-throughput scenarios, batch multiple messages:
|
|
296
|
+
|
|
297
|
+
```json
|
|
298
|
+
{
|
|
299
|
+
"type": "batch",
|
|
300
|
+
"messages": [
|
|
301
|
+
{"type": "message", "payload": {...}},
|
|
302
|
+
{"type": "message", "payload": {...}}
|
|
303
|
+
]
|
|
304
|
+
}
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
### Compression
|
|
308
|
+
|
|
309
|
+
Enable WebSocket compression (permessage-deflate):
|
|
310
|
+
|
|
311
|
+
```http
|
|
312
|
+
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
## Examples
|
|
316
|
+
|
|
317
|
+
### Agent-to-Agent Communication
|
|
318
|
+
|
|
319
|
+
```typescript
|
|
320
|
+
// Agent A sends capability call to Agent B
|
|
321
|
+
ws.send(JSON.stringify({
|
|
322
|
+
type: 'capability_call',
|
|
323
|
+
id: uuid(),
|
|
324
|
+
timestamp: new Date().toISOString(),
|
|
325
|
+
payload: {
|
|
326
|
+
capability: 'process_data',
|
|
327
|
+
input: { data: [1, 2, 3] }
|
|
328
|
+
},
|
|
329
|
+
metadata: {
|
|
330
|
+
agentId: 'agent://example.com/agent-a',
|
|
331
|
+
correlationId: 'req-123',
|
|
332
|
+
replyTo: 'ws-conn-abc'
|
|
333
|
+
}
|
|
334
|
+
}));
|
|
335
|
+
|
|
336
|
+
// Agent B responds
|
|
337
|
+
ws.send(JSON.stringify({
|
|
338
|
+
type: 'message',
|
|
339
|
+
id: uuid(),
|
|
340
|
+
timestamp: new Date().toISOString(),
|
|
341
|
+
payload: {
|
|
342
|
+
result: { processed: true, count: 3 }
|
|
343
|
+
},
|
|
344
|
+
metadata: {
|
|
345
|
+
agentId: 'agent://example.com/agent-b',
|
|
346
|
+
correlationId: 'req-123'
|
|
347
|
+
}
|
|
348
|
+
}));
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
## Compatibility
|
|
352
|
+
|
|
353
|
+
- WebSocket protocol version: RFC 6455
|
|
354
|
+
- Minimum TLS version: 1.2
|
|
355
|
+
- Supported subprotocols: `ossa.v0.3.1`
|
|
356
|
+
- JSON payload encoding: UTF-8
|
|
357
|
+
|
|
358
|
+
## References
|
|
359
|
+
|
|
360
|
+
- [RFC 6455 - The WebSocket Protocol](https://tools.ietf.org/html/rfc6455)
|
|
361
|
+
- [OSSA Message Envelope Specification](../messaging.md)
|
|
362
|
+
- [Agent Discovery Protocol](../discovery.md)
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# OSSA v0.3.1 - Unified Agent Schema
|
|
2
|
+
# Universal agent platform: OSSA + GitLab Duo + Google A2A + MCP
|
|
3
|
+
# Zero hardcoded models, runtime-agnostic, infrastructure-driven
|
|
4
|
+
|
|
5
|
+
apiVersion: ossa/v0.3.1
|
|
6
|
+
kind: Agent
|
|
7
|
+
|
|
8
|
+
metadata:
|
|
9
|
+
name: string
|
|
10
|
+
version: string # semver
|
|
11
|
+
description: string
|
|
12
|
+
labels:
|
|
13
|
+
domain: string
|
|
14
|
+
capability: string
|
|
15
|
+
runtime: string
|
|
16
|
+
|
|
17
|
+
spec:
|
|
18
|
+
# ============================================
|
|
19
|
+
# UNIFIED LLM CONFIGURATION
|
|
20
|
+
# No hardcoded models, runtime-configurable
|
|
21
|
+
# ============================================
|
|
22
|
+
llm:
|
|
23
|
+
provider: ${LLM_PROVIDER:-anthropic}
|
|
24
|
+
model: ${LLM_MODEL:-claude-sonnet}
|
|
25
|
+
profile: ${LLM_PROFILE:-balanced} # NEW: A2A compatible
|
|
26
|
+
temperature: ${LLM_TEMPERATURE:-0.1}
|
|
27
|
+
maxTokens: ${LLM_MAX_TOKENS:-16000}
|
|
28
|
+
topP: ${LLM_TOP_P:-0.9}
|
|
29
|
+
|
|
30
|
+
fallback_models:
|
|
31
|
+
- provider: ${LLM_FALLBACK_PROVIDER_1:-openai}
|
|
32
|
+
model: ${LLM_FALLBACK_MODEL_1:-gpt-4o}
|
|
33
|
+
condition: on_error
|
|
34
|
+
- provider: ${LLM_FALLBACK_PROVIDER_2:-google}
|
|
35
|
+
model: ${LLM_FALLBACK_MODEL_2:-gemini-2.0-flash}
|
|
36
|
+
condition: on_rate_limit
|
|
37
|
+
|
|
38
|
+
retry_config:
|
|
39
|
+
max_attempts: ${LLM_RETRY_ATTEMPTS:-3}
|
|
40
|
+
backoff_strategy: ${LLM_BACKOFF_STRATEGY:-exponential}
|
|
41
|
+
|
|
42
|
+
# ============================================
|
|
43
|
+
# EXECUTION PROFILES (Google A2A)
|
|
44
|
+
# Task-specific optimization
|
|
45
|
+
# ============================================
|
|
46
|
+
execution_profile:
|
|
47
|
+
default: ${LLM_PROFILE:-balanced}
|
|
48
|
+
profiles:
|
|
49
|
+
fast:
|
|
50
|
+
maxTokens: 4000
|
|
51
|
+
temperature: 0.0
|
|
52
|
+
description: "Quick responses for triage"
|
|
53
|
+
balanced:
|
|
54
|
+
maxTokens: 16000
|
|
55
|
+
temperature: 0.1
|
|
56
|
+
description: "General agent operations"
|
|
57
|
+
deep:
|
|
58
|
+
maxTokens: 32000
|
|
59
|
+
temperature: 0.2
|
|
60
|
+
reasoning_enabled: true
|
|
61
|
+
description: "Deep analysis and reasoning"
|
|
62
|
+
safe:
|
|
63
|
+
temperature: 0.0
|
|
64
|
+
validation_required: true
|
|
65
|
+
audit_log: true
|
|
66
|
+
description: "Compliance and security"
|
|
67
|
+
|
|
68
|
+
# ============================================
|
|
69
|
+
# RUNTIME DECLARATION (Multi-platform)
|
|
70
|
+
# ============================================
|
|
71
|
+
runtime:
|
|
72
|
+
type: ${AGENT_RUNTIME:-unified}
|
|
73
|
+
supports:
|
|
74
|
+
- google-a2a
|
|
75
|
+
- gitlab-duo
|
|
76
|
+
- ossa-mesh
|
|
77
|
+
- mcp
|
|
78
|
+
- local-execution
|
|
79
|
+
scheduling:
|
|
80
|
+
strategy: ${AGENT_SCHEDULING:-fair}
|
|
81
|
+
priority: ${AGENT_PRIORITY:-normal}
|
|
82
|
+
max_concurrent: ${AGENT_MAX_CONCURRENT:-10}
|
|
83
|
+
timeout_seconds: ${AGENT_TIMEOUT:-300}
|
|
84
|
+
resource_limits:
|
|
85
|
+
memory_mb: ${AGENT_MEMORY_MB:-512}
|
|
86
|
+
cpu_millicores: ${AGENT_CPU_MILLICORES:-500}
|
|
87
|
+
|
|
88
|
+
# ============================================
|
|
89
|
+
# CAPABILITIES (A2A/Duo compatible)
|
|
90
|
+
# ============================================
|
|
91
|
+
capabilities:
|
|
92
|
+
- name: ${CAPABILITY_SCAN:-security_scan}
|
|
93
|
+
type: action
|
|
94
|
+
runtime: llm
|
|
95
|
+
description: "Run security analysis"
|
|
96
|
+
input_schema:
|
|
97
|
+
type: object
|
|
98
|
+
required: [path]
|
|
99
|
+
properties:
|
|
100
|
+
path:
|
|
101
|
+
type: string
|
|
102
|
+
severity:
|
|
103
|
+
type: string
|
|
104
|
+
enum: [low, medium, high, critical]
|
|
105
|
+
|
|
106
|
+
# ============================================
|
|
107
|
+
# FUNCTIONS (A2A format)
|
|
108
|
+
# OpenAI-style function calling
|
|
109
|
+
# ============================================
|
|
110
|
+
functions:
|
|
111
|
+
- name: scan_security
|
|
112
|
+
description: "Run OSSA security analysis"
|
|
113
|
+
parameters:
|
|
114
|
+
type: object
|
|
115
|
+
properties:
|
|
116
|
+
path:
|
|
117
|
+
type: string
|
|
118
|
+
description: "Path to scan"
|
|
119
|
+
severity:
|
|
120
|
+
type: string
|
|
121
|
+
enum: [low, medium, high, critical]
|
|
122
|
+
required: [path]
|
|
123
|
+
returns:
|
|
124
|
+
type: object
|
|
125
|
+
properties:
|
|
126
|
+
findings:
|
|
127
|
+
type: array
|
|
128
|
+
score:
|
|
129
|
+
type: number
|
|
130
|
+
|
|
131
|
+
# ============================================
|
|
132
|
+
# EXTENSIONS (A2A compatible)
|
|
133
|
+
# ============================================
|
|
134
|
+
extensions:
|
|
135
|
+
- type: http
|
|
136
|
+
name: ossa-mesh
|
|
137
|
+
endpoint: ${OSSA_MESH_URL}
|
|
138
|
+
credentials_ref: OSSA_MESH_TOKEN
|
|
139
|
+
- type: mcp
|
|
140
|
+
name: gitlab-mcp
|
|
141
|
+
endpoint: ${GITLAB_MCP_URL}
|
|
142
|
+
credentials_ref: GITLAB_TOKEN
|
|
143
|
+
|
|
144
|
+
# ============================================
|
|
145
|
+
# EXISTING OSSA FEATURES
|
|
146
|
+
# ============================================
|
|
147
|
+
role: string
|
|
148
|
+
taxonomy:
|
|
149
|
+
domain: string
|
|
150
|
+
subdomain: string
|
|
151
|
+
capability: string
|
|
152
|
+
|
|
153
|
+
tools:
|
|
154
|
+
- name: string
|
|
155
|
+
description: string
|
|
156
|
+
source:
|
|
157
|
+
type: mcp
|
|
158
|
+
uri: string
|
|
159
|
+
|
|
160
|
+
knowledge_graph:
|
|
161
|
+
enabled: boolean
|
|
162
|
+
provider: string
|
|
163
|
+
connection:
|
|
164
|
+
endpoint: string
|
|
165
|
+
credentials_ref: string
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# OSSA v0.3.1 - Capabilities Schema
|
|
2
|
+
# Google A2A and GitLab Duo compatible capability declarations
|
|
3
|
+
|
|
4
|
+
$schema: http://json-schema.org/draft-07/schema#
|
|
5
|
+
$id: https://openstandardagents.org/schemas/v0.3.1/capabilities.yaml
|
|
6
|
+
|
|
7
|
+
title: Agent Capabilities
|
|
8
|
+
description: |
|
|
9
|
+
Structured capability declarations compatible with Google A2A and GitLab Duo.
|
|
10
|
+
Maps agent actions to callable functions.
|
|
11
|
+
|
|
12
|
+
type: array
|
|
13
|
+
items:
|
|
14
|
+
type: object
|
|
15
|
+
required:
|
|
16
|
+
- name
|
|
17
|
+
- type
|
|
18
|
+
properties:
|
|
19
|
+
name:
|
|
20
|
+
type: string
|
|
21
|
+
description: Capability identifier
|
|
22
|
+
pattern: ^[a-z][a-z0-9_]*$
|
|
23
|
+
examples:
|
|
24
|
+
- security_scan
|
|
25
|
+
- code_review
|
|
26
|
+
- deploy_service
|
|
27
|
+
- analyze_logs
|
|
28
|
+
|
|
29
|
+
type:
|
|
30
|
+
type: string
|
|
31
|
+
description: Capability type
|
|
32
|
+
enum:
|
|
33
|
+
- action
|
|
34
|
+
- query
|
|
35
|
+
- transform
|
|
36
|
+
- validation
|
|
37
|
+
- orchestration
|
|
38
|
+
|
|
39
|
+
runtime:
|
|
40
|
+
type: string
|
|
41
|
+
description: Execution runtime
|
|
42
|
+
enum:
|
|
43
|
+
- llm
|
|
44
|
+
- code
|
|
45
|
+
- hybrid
|
|
46
|
+
- external
|
|
47
|
+
default: llm
|
|
48
|
+
|
|
49
|
+
description:
|
|
50
|
+
type: string
|
|
51
|
+
description: Human-readable capability description
|
|
52
|
+
|
|
53
|
+
input_schema:
|
|
54
|
+
type: object
|
|
55
|
+
description: JSON Schema for input validation
|
|
56
|
+
|
|
57
|
+
output_schema:
|
|
58
|
+
type: object
|
|
59
|
+
description: JSON Schema for output validation
|
|
60
|
+
|
|
61
|
+
requires:
|
|
62
|
+
type: array
|
|
63
|
+
description: Required dependencies
|
|
64
|
+
items:
|
|
65
|
+
type: string
|
|
66
|
+
|
|
67
|
+
timeout_seconds:
|
|
68
|
+
type: integer
|
|
69
|
+
description: Capability-specific timeout
|
|
70
|
+
default: 60
|
|
71
|
+
|
|
72
|
+
retry_policy:
|
|
73
|
+
type: object
|
|
74
|
+
properties:
|
|
75
|
+
max_attempts:
|
|
76
|
+
type: integer
|
|
77
|
+
default: 3
|
|
78
|
+
backoff:
|
|
79
|
+
type: string
|
|
80
|
+
enum: [exponential, linear, constant]
|
|
81
|
+
|
|
82
|
+
examples:
|
|
83
|
+
- name: security_scan
|
|
84
|
+
type: action
|
|
85
|
+
runtime: hybrid
|
|
86
|
+
description: Run OSSA security analysis on codebase
|
|
87
|
+
input_schema:
|
|
88
|
+
type: object
|
|
89
|
+
required: [path]
|
|
90
|
+
properties:
|
|
91
|
+
path:
|
|
92
|
+
type: string
|
|
93
|
+
severity:
|
|
94
|
+
type: string
|
|
95
|
+
enum: [low, medium, high, critical]
|
|
96
|
+
output_schema:
|
|
97
|
+
type: object
|
|
98
|
+
properties:
|
|
99
|
+
findings:
|
|
100
|
+
type: array
|
|
101
|
+
score:
|
|
102
|
+
type: number
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# OSSA v0.3.1 - Functions Schema
|
|
2
|
+
# Google A2A compatible function declarations (OpenAI function calling format)
|
|
3
|
+
|
|
4
|
+
$schema: http://json-schema.org/draft-07/schema#
|
|
5
|
+
$id: https://openstandardagents.org/schemas/v0.3.1/functions.yaml
|
|
6
|
+
|
|
7
|
+
title: Agent Functions
|
|
8
|
+
description: |
|
|
9
|
+
Function declarations in Google A2A / OpenAI format.
|
|
10
|
+
Enables structured function calling across all runtimes.
|
|
11
|
+
|
|
12
|
+
type: array
|
|
13
|
+
items:
|
|
14
|
+
type: object
|
|
15
|
+
required:
|
|
16
|
+
- name
|
|
17
|
+
- description
|
|
18
|
+
- parameters
|
|
19
|
+
properties:
|
|
20
|
+
name:
|
|
21
|
+
type: string
|
|
22
|
+
description: Function name
|
|
23
|
+
pattern: ^[a-zA-Z_][a-zA-Z0-9_]*$
|
|
24
|
+
|
|
25
|
+
description:
|
|
26
|
+
type: string
|
|
27
|
+
description: What the function does
|
|
28
|
+
|
|
29
|
+
parameters:
|
|
30
|
+
type: object
|
|
31
|
+
description: JSON Schema for function parameters
|
|
32
|
+
required:
|
|
33
|
+
- type
|
|
34
|
+
- properties
|
|
35
|
+
properties:
|
|
36
|
+
type:
|
|
37
|
+
type: string
|
|
38
|
+
const: object
|
|
39
|
+
properties:
|
|
40
|
+
type: object
|
|
41
|
+
required:
|
|
42
|
+
type: array
|
|
43
|
+
items:
|
|
44
|
+
type: string
|
|
45
|
+
|
|
46
|
+
returns:
|
|
47
|
+
type: object
|
|
48
|
+
description: Return value schema
|
|
49
|
+
|
|
50
|
+
strict:
|
|
51
|
+
type: boolean
|
|
52
|
+
description: Enforce strict schema validation
|
|
53
|
+
default: true
|
|
54
|
+
|
|
55
|
+
examples:
|
|
56
|
+
- name: scan_security
|
|
57
|
+
description: Run OSSA security analysis
|
|
58
|
+
parameters:
|
|
59
|
+
type: object
|
|
60
|
+
properties:
|
|
61
|
+
path:
|
|
62
|
+
type: string
|
|
63
|
+
description: Path to scan
|
|
64
|
+
severity:
|
|
65
|
+
type: string
|
|
66
|
+
enum: [low, medium, high, critical]
|
|
67
|
+
description: Minimum severity level
|
|
68
|
+
required: [path]
|
|
69
|
+
returns:
|
|
70
|
+
type: object
|
|
71
|
+
properties:
|
|
72
|
+
findings:
|
|
73
|
+
type: array
|
|
74
|
+
score:
|
|
75
|
+
type: number
|