a2acalling 0.6.58 → 0.6.59

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.
@@ -18,7 +18,7 @@
18
18
  <sl-tab-group id="main-tabs">
19
19
  <sl-tab slot="nav" panel="contacts" active>Contacts</sl-tab>
20
20
  <sl-tab slot="nav" panel="calls">Calls</sl-tab>
21
- <sl-tab slot="nav" panel="settings">Settings</sl-tab>
21
+ <sl-tab slot="nav" panel="permissions">Permissions</sl-tab>
22
22
  <sl-tab slot="nav" panel="invites">Invites</sl-tab>
23
23
  <sl-tab slot="nav" panel="logs">Logs</sl-tab>
24
24
 
@@ -64,22 +64,29 @@
64
64
  <div id="call-detail"></div>
65
65
  </sl-tab-panel>
66
66
 
67
- <sl-tab-panel name="settings">
68
- <h2>Tier Settings</h2>
67
+ <sl-tab-panel name="permissions">
68
+ <h2>Permission Tiers</h2>
69
69
  <div class="row">
70
70
  <label for="tier-select">Tier</label>
71
71
  <sl-select id="tier-select" size="small" style="min-width:200px;"></sl-select>
72
72
  <sl-button id="new-tier-btn" size="small">New Tier</sl-button>
73
+ <sl-button id="preview-caller-btn" size="small" variant="neutral">&NewLine;&#x1F441; Preview as Caller</sl-button>
73
74
  </div>
74
75
 
76
+ <div id="tier-warnings" class="tier-warnings"></div>
77
+
78
+ <sl-checkbox id="show-drag-columns">Show all tiers side-by-side</sl-checkbox>
79
+ <div id="tier-columns" class="tier-columns"></div>
80
+
75
81
  <form id="tier-form">
76
- <sl-input id="tier-id" label="Tier ID" readonly></sl-input>
77
82
  <sl-input id="tier-name" label="Name"></sl-input>
78
83
  <sl-input id="tier-description" label="Description"></sl-input>
79
- <sl-input id="tier-disclosure" label="Disclosure" placeholder="minimal"></sl-input>
80
- <sl-textarea id="tier-tools" label="Allowed Tools (one per line)" rows="5" placeholder="Read&#10;Grep&#10;Glob"></sl-textarea>
81
- <sl-textarea id="tier-topics" label="Topics (one per line)" rows="6"></sl-textarea>
82
- <sl-textarea id="tier-goals" label="Goals (one per line)" rows="6"></sl-textarea>
84
+ <label>Allowed Tools</label>
85
+ <div id="tier-tools-list" class="tools-checklist"></div>
86
+ <label>Topics</label>
87
+ <div id="tier-topics-list"></div>
88
+ <label>Goals</label>
89
+ <div id="tier-goals-list"></div>
83
90
  <div class="row">
84
91
  <sl-button type="submit" variant="primary">Save Tier</sl-button>
85
92
  </div>
@@ -158,6 +165,11 @@
158
165
  <tbody></tbody>
159
166
  </table>
160
167
  </sl-card>
168
+
169
+ <sl-dialog id="preview-dialog" label="Caller Preview" style="--width: 540px;">
170
+ <div id="preview-content"></div>
171
+ <sl-button slot="footer" variant="primary" id="preview-close-btn">Close</sl-button>
172
+ </sl-dialog>
161
173
  </sl-tab-panel>
162
174
 
163
175
  <sl-tab-panel name="invites">
@@ -201,8 +201,227 @@ sl-tab-panel::part(base) {
201
201
  padding: 1rem;
202
202
  }
203
203
 
204
+ /* ── A2A-41: Topic/Goal list rows ──────────────────────────── */
205
+ .topic-row {
206
+ display: flex;
207
+ align-items: flex-start;
208
+ gap: 0.5rem;
209
+ padding: 0.5rem 0.6rem;
210
+ border: 1px solid var(--line);
211
+ border-radius: 6px;
212
+ margin-bottom: 0.4rem;
213
+ background: var(--panel);
214
+ cursor: grab;
215
+ transition: box-shadow 0.15s ease, border-color 0.15s ease;
216
+ }
217
+
218
+ .topic-row:hover {
219
+ border-color: var(--accent);
220
+ box-shadow: 0 1px 4px rgba(20, 102, 193, 0.1);
221
+ }
222
+
223
+ .topic-row.dragging {
224
+ opacity: 0.5;
225
+ border-style: dashed;
226
+ }
227
+
228
+ .topic-row.inherited {
229
+ opacity: 0.55;
230
+ background: #f8fafc;
231
+ cursor: default;
232
+ border-style: dashed;
233
+ border-color: #c5cfd9;
234
+ }
235
+
236
+ .topic-row.inherited .drag-handle,
237
+ .topic-row.inherited .topic-delete-btn {
238
+ display: none;
239
+ }
240
+
241
+ .drag-handle {
242
+ color: #9ca8b5;
243
+ cursor: grab;
244
+ user-select: none;
245
+ font-size: 1.1rem;
246
+ line-height: 1;
247
+ padding-top: 2px;
248
+ }
249
+
250
+ .topic-content {
251
+ flex: 1;
252
+ min-width: 0;
253
+ }
254
+
255
+ .topic-header {
256
+ display: flex;
257
+ align-items: center;
258
+ gap: 0.4rem;
259
+ }
260
+
261
+ .topic-label {
262
+ flex: 1;
263
+ font-size: 0.9rem;
264
+ }
265
+
266
+ .topic-description {
267
+ margin-top: 0.35rem;
268
+ padding-left: 0.1rem;
269
+ }
270
+
271
+ .topic-desc-text {
272
+ font-size: 0.82rem;
273
+ color: #4b5d73;
274
+ margin: 0 0 0.3rem;
275
+ line-height: 1.4;
276
+ }
277
+
278
+ .inherited-badge {
279
+ font-size: 0.72rem;
280
+ color: #7a8da0;
281
+ font-style: italic;
282
+ margin-left: auto;
283
+ }
284
+
285
+ .add-item-btn {
286
+ width: 100%;
287
+ margin-top: 0.3rem;
288
+ border: 1px dashed var(--line);
289
+ border-radius: 6px;
290
+ padding: 0.4rem;
291
+ background: transparent;
292
+ color: #7a8da0;
293
+ cursor: pointer;
294
+ font-size: 0.85rem;
295
+ transition: border-color 0.15s, color 0.15s;
296
+ }
297
+
298
+ .add-item-btn:hover {
299
+ border-color: var(--accent);
300
+ color: var(--accent);
301
+ }
302
+
303
+ /* ── A2A-41: Tools checklist ───────────────────────────────── */
304
+ .tools-checklist {
305
+ display: flex;
306
+ flex-direction: column;
307
+ gap: 0.35rem;
308
+ }
309
+
310
+ .tools-checklist sl-checkbox {
311
+ margin-bottom: 0;
312
+ }
313
+
314
+ .tools-checklist sl-checkbox::part(label) {
315
+ font-size: 0.88rem;
316
+ }
317
+
318
+ .tool-desc {
319
+ color: #4b5d73;
320
+ font-weight: normal;
321
+ }
322
+
323
+ /* ── A2A-41: Three-column tier layout ──────────────────────── */
324
+ .tier-columns {
325
+ display: grid;
326
+ grid-template-columns: 1fr 1fr 1fr;
327
+ gap: 0.8rem;
328
+ margin-bottom: 1.2rem;
329
+ }
330
+
331
+ .tier-column {
332
+ border: 1px solid var(--line);
333
+ border-radius: 8px;
334
+ padding: 0.6rem;
335
+ background: #fbfdff;
336
+ min-height: 120px;
337
+ }
338
+
339
+ .tier-column h4 {
340
+ margin: 0 0 0.5rem;
341
+ font-size: 0.9rem;
342
+ color: var(--ink);
343
+ padding-bottom: 0.4rem;
344
+ border-bottom: 1px solid var(--line);
345
+ }
346
+
347
+ .tier-drop-zone {
348
+ min-height: 60px;
349
+ transition: background 0.15s ease;
350
+ border-radius: 4px;
351
+ padding: 0.2rem;
352
+ }
353
+
354
+ .tier-drop-zone.drag-over {
355
+ background: rgba(20, 102, 193, 0.06);
356
+ outline: 2px dashed var(--accent);
357
+ outline-offset: -2px;
358
+ }
359
+
360
+ /* ── A2A-41: Validation warnings ───────────────────────────── */
361
+ .tier-warnings {
362
+ margin-bottom: 0.8rem;
363
+ }
364
+
365
+ .tier-warning {
366
+ display: flex;
367
+ align-items: center;
368
+ gap: 0.5rem;
369
+ padding: 0.45rem 0.7rem;
370
+ border-radius: 6px;
371
+ font-size: 0.82rem;
372
+ margin-bottom: 0.3rem;
373
+ }
374
+
375
+ .tier-warning.warn {
376
+ background: #fef3c7;
377
+ border: 1px solid #f59e0b;
378
+ color: #92400e;
379
+ }
380
+
381
+ .tier-warning.danger {
382
+ background: #fee2e2;
383
+ border: 1px solid #ef4444;
384
+ color: #991b1b;
385
+ }
386
+
387
+ .tier-warning.info {
388
+ background: #dbeafe;
389
+ border: 1px solid #3b82f6;
390
+ color: #1e40af;
391
+ }
392
+
393
+ /* ── A2A-41: Preview dialog ────────────────────────────────── */
394
+ #preview-content h4 {
395
+ font-size: 0.88rem;
396
+ margin: 0.8rem 0 0.3rem;
397
+ color: var(--ink);
398
+ }
399
+
400
+ #preview-content h4:first-child {
401
+ margin-top: 0;
402
+ }
403
+
404
+ #preview-content ul {
405
+ margin: 0;
406
+ padding-left: 1.2rem;
407
+ }
408
+
409
+ #preview-content li {
410
+ font-size: 0.85rem;
411
+ margin-bottom: 0.25rem;
412
+ line-height: 1.4;
413
+ }
414
+
415
+ #preview-content li strong {
416
+ color: var(--ink);
417
+ }
418
+
204
419
  @media (max-width: 720px) {
205
420
  sl-tab-group::part(nav) {
206
421
  overflow-x: auto;
207
422
  }
423
+ /* A2A-41: collapse three-column layout to single column on narrow screens */
424
+ .tier-columns {
425
+ grid-template-columns: 1fr;
426
+ }
208
427
  }
package/src/lib/config.js CHANGED
@@ -106,17 +106,8 @@ function validateTierPatch(tierName, tierConfig) {
106
106
  out.description = sanitizeString(tierConfig.description, 300);
107
107
  }
108
108
 
109
- if (tierConfig.disclosure !== undefined) {
110
- if (typeof tierConfig.disclosure !== 'string') {
111
- throw configValidationError(
112
- 'A2A_CONFIG_INVALID_TIER_DISCLOSURE',
113
- `Invalid tier disclosure for "${tierName}": expected string`,
114
- null,
115
- { tier: tierName, received_type: typeof tierConfig.disclosure }
116
- );
117
- }
118
- out.disclosure = sanitizeString(tierConfig.disclosure, 40) || 'minimal';
119
- }
109
+ // A2A-41: disclosure field intentionally removed. If present in input,
110
+ // it is silently ignored for backward compatibility with older clients.
120
111
 
121
112
  if (tierConfig.capabilities !== undefined) {
122
113
  out.capabilities = validateStringArray(tierConfig.capabilities, `${tierName}.capabilities`, {
@@ -183,6 +174,9 @@ const DEFAULT_CONFIG = {
183
174
  },
184
175
 
185
176
  // Permission tiers
177
+ // A2A-41: disclosure field removed from tiers. It was intended to control
178
+ // HOW info is shared (freely/minimally/none) but was never consumed by
179
+ // prompt templates. The disclosure SYSTEM (disclosure.js, manifest) remains.
186
180
  tiers: {
187
181
  public: {
188
182
  name: 'Public',
@@ -191,7 +185,6 @@ const DEFAULT_CONFIG = {
191
185
  allowed_tools: ['Read', 'Grep', 'Glob'],
192
186
  topics: ['chat'],
193
187
  goals: [],
194
- disclosure: 'minimal',
195
188
  examples: ['calendar availability', 'public social posts', 'general questions']
196
189
  },
197
190
  friends: {
@@ -201,7 +194,6 @@ const DEFAULT_CONFIG = {
201
194
  allowed_tools: ['Bash(readonly)', 'Read', 'Grep', 'Glob', 'WebSearch', 'WebFetch'],
202
195
  topics: ['chat', 'search', 'openclaw', 'a2a'],
203
196
  goals: [],
204
- disclosure: 'public',
205
197
  examples: ['email summaries', 'schedule meetings', 'project discussions']
206
198
  },
207
199
  family: {
@@ -211,7 +203,6 @@ const DEFAULT_CONFIG = {
211
203
  allowed_tools: ['Bash', 'Read', 'Grep', 'Glob', 'WebSearch', 'WebFetch'],
212
204
  topics: ['chat', 'search', 'openclaw', 'a2a', 'tools', 'memory'],
213
205
  goals: [],
214
- disclosure: 'public',
215
206
  examples: ['deep collaboration', 'private project context', 'personal notes']
216
207
  },
217
208
  custom: {
@@ -221,7 +212,6 @@ const DEFAULT_CONFIG = {
221
212
  allowed_tools: ['Read', 'Grep', 'Glob'],
222
213
  topics: [],
223
214
  goals: [],
224
- disclosure: 'minimal',
225
215
  examples: []
226
216
  }
227
217
  },
package/src/lib/tokens.js CHANGED
@@ -189,12 +189,14 @@ class TokenStore {
189
189
  * - Timeout: 5-300 seconds (enforced server-side)
190
190
  */
191
191
  create(options = {}) {
192
+ // A2A-41: disclosure field removed from tokens. Was never used by
193
+ // prompt generation. Existing tokens with disclosure field are harmless
194
+ // — the field is simply not read.
192
195
  const {
193
196
  name = 'unnamed',
194
197
  owner = null,
195
198
  expires = '1d',
196
199
  permissions = 'public',
197
- disclosure = 'minimal',
198
200
  notify = 'all',
199
201
  maxCalls = 100, // Default limit, not unlimited
200
202
  capabilities = null, // Array of capability strings, snapshotted at creation
@@ -273,7 +275,6 @@ class TokenStore {
273
275
  allowed_tools: allowedTools || defaultTools[tier] || TokenStore.DEFAULT_ALLOWED_TOOLS.public,
274
276
  timeout_ms: parsePositiveTimeoutMs(timeoutMs),
275
277
  tier_settings: tierSettings || {}, // Snapshot of settings at creation
276
- disclosure,
277
278
  notify,
278
279
  max_calls: maxCalls,
279
280
  calls_made: 0,
@@ -359,7 +360,6 @@ class TokenStore {
359
360
  allowed_tools: record.allowed_tools || TokenStore.DEFAULT_ALLOWED_TOOLS[tier] || TokenStore.DEFAULT_ALLOWED_TOOLS.public,
360
361
  timeout_ms: timeoutMs,
361
362
  tier_settings: record.tier_settings || {},
362
- disclosure: record.disclosure,
363
363
  notify: record.notify,
364
364
  calls_remaining: record.max_calls ? record.max_calls - record.calls_made : null
365
365
  };
package/src/routes/a2a.js CHANGED
@@ -350,7 +350,6 @@ function createRoutes(options = {}) {
350
350
  allowed_goals: validation.allowed_goals,
351
351
  allowed_tools: validation.allowed_tools,
352
352
  timeout_ms: validation.timeout_ms,
353
- disclosure: validation.disclosure,
354
353
  caller: sanitizedCaller,
355
354
  conversation_id: conversation_id || `conv_${Date.now()}_${crypto.randomBytes(6).toString('hex')}`,
356
355
  trace_id: traceId,
@@ -1276,7 +1276,6 @@ function createDashboardApiRouter(options = {}) {
1276
1276
  allowed_tools: sanitizeStringArray(configTier.allowed_tools || [], 30, 80),
1277
1277
  topics: sanitizeStringArray(configTier.topics || []),
1278
1278
  goals: sanitizeStringArray(configTier.goals || []),
1279
- disclosure: configTier.disclosure || 'minimal',
1280
1279
  examples: sanitizeStringArray(configTier.examples || [], 20, 120),
1281
1280
  manifest: {
1282
1281
  topics: manifestTier.topics || [],
@@ -1310,7 +1309,6 @@ function createDashboardApiRouter(options = {}) {
1310
1309
  const update = {};
1311
1310
  if (body.name !== undefined) update.name = sanitizeString(body.name, 120);
1312
1311
  if (body.description !== undefined) update.description = sanitizeString(body.description, 300);
1313
- if (body.disclosure !== undefined) update.disclosure = sanitizeString(body.disclosure, 40) || 'minimal';
1314
1312
  if (body.capabilities !== undefined) update.capabilities = sanitizeStringArray(body.capabilities, 100, 120);
1315
1313
  if (body.allowed_tools !== undefined) update.allowed_tools = sanitizeStringArray(body.allowed_tools, 30, 80);
1316
1314
  if (body.examples !== undefined) update.examples = sanitizeStringArray(body.examples, 20, 120);
@@ -1375,7 +1373,6 @@ function createDashboardApiRouter(options = {}) {
1375
1373
  allowed_tools: sanitizeStringArray(body.allowed_tools || [], 30, 80),
1376
1374
  topics: sanitizeStringArray(body.topics || []),
1377
1375
  goals: sanitizeStringArray(body.goals || []),
1378
- disclosure: sanitizeString(body.disclosure || 'minimal', 40),
1379
1376
  examples: sanitizeStringArray(body.examples || [], 20, 120)
1380
1377
  });
1381
1378
  } catch (err) {
@@ -1,47 +0,0 @@
1
- {
2
- "version": "0.6.57",
3
- "installed_at": "2026-02-18T08:14:45.764Z",
4
- "files": [
5
- {
6
- "path": "CLAUDE.md",
7
- "action": "skipped"
8
- },
9
- {
10
- "path": ".claude/a2a-skill-reference.md",
11
- "action": "skipped"
12
- },
13
- {
14
- "path": ".claude/commands/a2a-call.md",
15
- "action": "skipped"
16
- },
17
- {
18
- "path": ".claude/commands/a2a-invite.md",
19
- "action": "skipped"
20
- },
21
- {
22
- "path": ".claude/commands/a2a-contacts.md",
23
- "action": "skipped"
24
- },
25
- {
26
- "path": ".claude/commands/a2a-status.md",
27
- "action": "skipped"
28
- },
29
- {
30
- "path": ".claude/commands/a2a-setup.md",
31
- "action": "skipped"
32
- },
33
- {
34
- "path": ".codex/AGENTS.md",
35
- "action": "error",
36
- "detail": "Source file not found"
37
- },
38
- {
39
- "path": ".a2a-manifest.json",
40
- "action": "created"
41
- },
42
- {
43
- "path": ".a2a-install.log",
44
- "action": "created"
45
- }
46
- ]
47
- }