@kybernesis/arp-scope-catalog 0.2.0

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.
Files changed (61) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +80 -0
  3. package/dist/index.cjs +518 -0
  4. package/dist/index.cjs.map +1 -0
  5. package/dist/index.d.cts +144 -0
  6. package/dist/index.d.ts +144 -0
  7. package/dist/index.js +501 -0
  8. package/dist/index.js.map +1 -0
  9. package/generated/manifest.json +1542 -0
  10. package/generated/scopes.json +1536 -0
  11. package/package.json +49 -0
  12. package/scopes/calendar.availability.read.yaml +35 -0
  13. package/scopes/calendar.events.cancel.yaml +24 -0
  14. package/scopes/calendar.events.create.yaml +31 -0
  15. package/scopes/calendar.events.modify.yaml +24 -0
  16. package/scopes/calendar.events.propose.yaml +35 -0
  17. package/scopes/calendar.events.read.yaml +38 -0
  18. package/scopes/connection.extend.yaml +28 -0
  19. package/scopes/connection.rescope.request.yaml +21 -0
  20. package/scopes/contacts.attributes.read.yaml +25 -0
  21. package/scopes/contacts.introduce.yaml +21 -0
  22. package/scopes/contacts.search.yaml +26 -0
  23. package/scopes/contacts.share.yaml +30 -0
  24. package/scopes/credentials.present.request.yaml +29 -0
  25. package/scopes/credentials.proof.zk.request.yaml +31 -0
  26. package/scopes/delegation.forward.task.yaml +36 -0
  27. package/scopes/files.project.files.delete.yaml +31 -0
  28. package/scopes/files.project.files.list.yaml +22 -0
  29. package/scopes/files.project.files.read.yaml +35 -0
  30. package/scopes/files.project.files.summarize.yaml +30 -0
  31. package/scopes/files.project.files.write.yaml +34 -0
  32. package/scopes/files.project.metadata.read.yaml +21 -0
  33. package/scopes/files.projects.list.yaml +18 -0
  34. package/scopes/files.share.external.yaml +39 -0
  35. package/scopes/identity.card.read.yaml +18 -0
  36. package/scopes/identity.introduction.request.yaml +24 -0
  37. package/scopes/identity.principal.verify.yaml +19 -0
  38. package/scopes/knowledge.query.yaml +31 -0
  39. package/scopes/messaging.chat.send.yaml +27 -0
  40. package/scopes/messaging.email.draft.compose.yaml +23 -0
  41. package/scopes/messaging.email.send.reviewed.yaml +36 -0
  42. package/scopes/messaging.email.summary.yaml +26 -0
  43. package/scopes/messaging.email.thread.read.yaml +29 -0
  44. package/scopes/messaging.relay.to_principal.yaml +22 -0
  45. package/scopes/notes.read.yaml +25 -0
  46. package/scopes/notes.search.yaml +24 -0
  47. package/scopes/notes.write.yaml +32 -0
  48. package/scopes/payments.authorize.capped.yaml +37 -0
  49. package/scopes/payments.history.read.yaml +28 -0
  50. package/scopes/payments.quote.request.yaml +18 -0
  51. package/scopes/payments.refund.request.yaml +24 -0
  52. package/scopes/tasks.assign.yaml +27 -0
  53. package/scopes/tasks.create.yaml +31 -0
  54. package/scopes/tasks.list.yaml +21 -0
  55. package/scopes/tasks.read.yaml +22 -0
  56. package/scopes/tasks.status.update.yaml +22 -0
  57. package/scopes/tools.invoke.mutating.yaml +37 -0
  58. package/scopes/tools.invoke.read.yaml +28 -0
  59. package/scopes/work.projects.list.yaml +18 -0
  60. package/scopes/work.reports.summary.yaml +29 -0
  61. package/scopes/work.status.read.yaml +18 -0
@@ -0,0 +1,1536 @@
1
+ [
2
+ {
3
+ "id": "calendar.availability.read",
4
+ "version": "1.0.0",
5
+ "label": "Check availability (free/busy only)",
6
+ "description": "Peer can see when you're free or busy, but no event titles, attendees, or details.",
7
+ "category": "calendar",
8
+ "risk": "low",
9
+ "parameters": [
10
+ {
11
+ "name": "days_ahead",
12
+ "type": "Integer",
13
+ "required": true,
14
+ "default": 14,
15
+ "validation": "1..90"
16
+ }
17
+ ],
18
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"check_availability\",\n resource == Calendar::\"primary\"\n) when {\n context.query_window_days <= {{days_ahead}}\n};\nforbid (\n principal == Agent::\"{{audience_did}}\",\n action,\n resource == Calendar::\"primary\"\n) when {\n action != Action::\"check_availability\"\n};\n",
19
+ "consent_text_template": "Check your free/busy (no details) up to {{days_ahead}} days ahead.",
20
+ "obligations_forced": [
21
+ {
22
+ "type": "redact_fields",
23
+ "params": {
24
+ "fields": [
25
+ "event.title",
26
+ "event.attendees",
27
+ "event.description",
28
+ "event.location"
29
+ ]
30
+ }
31
+ }
32
+ ],
33
+ "implies": [],
34
+ "conflicts_with": [],
35
+ "step_up_required": false
36
+ },
37
+ {
38
+ "id": "calendar.events.cancel",
39
+ "version": "1.0.0",
40
+ "label": "Cancel events",
41
+ "description": "Peer can cancel calendar events on your behalf.",
42
+ "category": "calendar",
43
+ "risk": "high",
44
+ "parameters": [],
45
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"cancel_event\",\n resource == Calendar::\"primary\"\n);\n",
46
+ "consent_text_template": "Cancel calendar events on your behalf.",
47
+ "obligations_forced": [
48
+ {
49
+ "type": "audit_level",
50
+ "params": {
51
+ "level": "verbose"
52
+ }
53
+ },
54
+ {
55
+ "type": "notify_principal",
56
+ "params": {}
57
+ }
58
+ ],
59
+ "implies": [
60
+ "calendar.events.read"
61
+ ],
62
+ "conflicts_with": [],
63
+ "step_up_required": true
64
+ },
65
+ {
66
+ "id": "calendar.events.create",
67
+ "version": "1.0.0",
68
+ "label": "Create events directly",
69
+ "description": "Peer can create calendar events on your primary calendar without extra confirmation, up to a daily cap.",
70
+ "category": "calendar",
71
+ "risk": "high",
72
+ "parameters": [
73
+ {
74
+ "name": "max_per_day",
75
+ "type": "Integer",
76
+ "required": true,
77
+ "default": 5,
78
+ "validation": "1..50"
79
+ }
80
+ ],
81
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"create_event\",\n resource == Calendar::\"primary\"\n) when {\n context.events_created_today < {{max_per_day}}\n};\n",
82
+ "consent_text_template": "Create calendar events directly, up to {{max_per_day}} per day.",
83
+ "obligations_forced": [
84
+ {
85
+ "type": "audit_level",
86
+ "params": {
87
+ "level": "verbose"
88
+ }
89
+ },
90
+ {
91
+ "type": "notify_principal",
92
+ "params": {}
93
+ }
94
+ ],
95
+ "implies": [
96
+ "calendar.availability.read"
97
+ ],
98
+ "conflicts_with": [],
99
+ "step_up_required": true
100
+ },
101
+ {
102
+ "id": "calendar.events.modify",
103
+ "version": "1.0.0",
104
+ "label": "Modify existing events",
105
+ "description": "Peer can modify existing calendar events (reschedule, update details).",
106
+ "category": "calendar",
107
+ "risk": "high",
108
+ "parameters": [],
109
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"modify_event\",\n resource == Calendar::\"primary\"\n);\n",
110
+ "consent_text_template": "Modify existing calendar events on your behalf.",
111
+ "obligations_forced": [
112
+ {
113
+ "type": "audit_level",
114
+ "params": {
115
+ "level": "verbose"
116
+ }
117
+ },
118
+ {
119
+ "type": "notify_principal",
120
+ "params": {}
121
+ }
122
+ ],
123
+ "implies": [
124
+ "calendar.events.read"
125
+ ],
126
+ "conflicts_with": [],
127
+ "step_up_required": true
128
+ },
129
+ {
130
+ "id": "calendar.events.propose",
131
+ "version": "1.0.0",
132
+ "label": "Propose a meeting",
133
+ "description": "Peer can propose a meeting. Creates a tentative event pending your confirmation.",
134
+ "category": "calendar",
135
+ "risk": "medium",
136
+ "parameters": [
137
+ {
138
+ "name": "max_attendees",
139
+ "type": "Integer",
140
+ "required": true,
141
+ "default": 10,
142
+ "validation": "1..50"
143
+ },
144
+ {
145
+ "name": "max_duration_min",
146
+ "type": "Integer",
147
+ "required": true,
148
+ "default": 60,
149
+ "validation": "15..480"
150
+ }
151
+ ],
152
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"propose_meeting\",\n resource == Calendar::\"primary\"\n) when {\n context.proposed_attendee_count <= {{max_attendees}} &&\n context.proposed_duration_min <= {{max_duration_min}}\n};\n",
153
+ "consent_text_template": "Propose meetings (up to {{max_attendees}} people, {{max_duration_min}} minutes). You confirm before it's booked.",
154
+ "obligations_forced": [
155
+ {
156
+ "type": "require_principal_confirmation",
157
+ "params": {
158
+ "max_age_seconds": 86400
159
+ }
160
+ }
161
+ ],
162
+ "implies": [
163
+ "calendar.availability.read"
164
+ ],
165
+ "conflicts_with": [],
166
+ "step_up_required": false
167
+ },
168
+ {
169
+ "id": "calendar.events.read",
170
+ "version": "1.0.0",
171
+ "label": "Read event details",
172
+ "description": "Peer can read the details of calendar events within a time window.",
173
+ "category": "calendar",
174
+ "risk": "medium",
175
+ "parameters": [
176
+ {
177
+ "name": "window_days",
178
+ "type": "Integer",
179
+ "required": true,
180
+ "default": 30,
181
+ "validation": "1..365"
182
+ },
183
+ {
184
+ "name": "include_private",
185
+ "type": "Enum",
186
+ "required": false,
187
+ "default": "no",
188
+ "validation": [
189
+ "yes",
190
+ "no"
191
+ ]
192
+ }
193
+ ],
194
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"read\",\n resource == Calendar::\"primary\"\n) when {\n context.query_window_days <= {{window_days}}\n {{#if include_private_flag}}\n {{else}}\n && !resource.tags.contains(\"private\")\n {{/if}}\n};\n",
195
+ "consent_text_template": "Read event details for the next {{window_days}} days.",
196
+ "obligations_forced": [
197
+ {
198
+ "type": "audit_level",
199
+ "params": {
200
+ "level": "verbose"
201
+ }
202
+ }
203
+ ],
204
+ "implies": [
205
+ "calendar.availability.read"
206
+ ],
207
+ "conflicts_with": [],
208
+ "step_up_required": false
209
+ },
210
+ {
211
+ "id": "connection.extend",
212
+ "version": "1.0.0",
213
+ "label": "Extend connection expiry",
214
+ "description": "Peer can request that you extend this connection's expiry by a bounded number of days.",
215
+ "category": "identity",
216
+ "risk": "medium",
217
+ "parameters": [
218
+ {
219
+ "name": "days",
220
+ "type": "Integer",
221
+ "required": true,
222
+ "default": 30,
223
+ "validation": "1..365"
224
+ }
225
+ ],
226
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"extend_connection\",\n resource == Connection::\"self\"\n) when {\n context.requested_extension_days <= {{days}}\n};\n",
227
+ "consent_text_template": "Allow Peer to request a connection extension up to {{days}} days.",
228
+ "obligations_forced": [
229
+ {
230
+ "type": "require_principal_confirmation",
231
+ "params": {
232
+ "max_age_seconds": 0
233
+ }
234
+ }
235
+ ],
236
+ "implies": [],
237
+ "conflicts_with": [],
238
+ "step_up_required": false
239
+ },
240
+ {
241
+ "id": "connection.rescope.request",
242
+ "version": "1.0.0",
243
+ "label": "Request new scopes",
244
+ "description": "Peer can ask you to add or adjust scopes on this connection (subject to your approval).",
245
+ "category": "identity",
246
+ "risk": "medium",
247
+ "parameters": [],
248
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"request_rescope\",\n resource == Connection::\"self\"\n);\n",
249
+ "consent_text_template": "Allow Peer to propose new scopes on this connection.",
250
+ "obligations_forced": [
251
+ {
252
+ "type": "require_principal_confirmation",
253
+ "params": {
254
+ "max_age_seconds": 0
255
+ }
256
+ }
257
+ ],
258
+ "implies": [],
259
+ "conflicts_with": [],
260
+ "step_up_required": false
261
+ },
262
+ {
263
+ "id": "contacts.attributes.read",
264
+ "version": "1.0.0",
265
+ "label": "Read specific contact attributes",
266
+ "description": "Peer can read specific attribute fields (e.g., phone, title) on contacts you've identified.",
267
+ "category": "contacts",
268
+ "risk": "medium",
269
+ "parameters": [
270
+ {
271
+ "name": "attributes",
272
+ "type": "AttributeList",
273
+ "required": true,
274
+ "validation": [
275
+ "name",
276
+ "email",
277
+ "phone",
278
+ "title",
279
+ "company",
280
+ "linkedin",
281
+ "twitter",
282
+ "notes"
283
+ ]
284
+ }
285
+ ],
286
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"read\",\n resource == Contact\n);\n",
287
+ "consent_text_template": "Read these contact attributes: {{attributes_display}}.",
288
+ "obligations_forced": [
289
+ {
290
+ "type": "redact_fields_except",
291
+ "params": {
292
+ "allowlist": "{{attributes_json}}"
293
+ }
294
+ }
295
+ ],
296
+ "implies": [],
297
+ "conflicts_with": [],
298
+ "step_up_required": false
299
+ },
300
+ {
301
+ "id": "contacts.introduce",
302
+ "version": "1.0.0",
303
+ "label": "Request contact introduction",
304
+ "description": "Peer can ask you to introduce them to one of your contacts.",
305
+ "category": "contacts",
306
+ "risk": "medium",
307
+ "parameters": [],
308
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"request_contact_introduction\",\n resource == Contact\n);\n",
309
+ "consent_text_template": "Let Peer ask you for introductions to your contacts.",
310
+ "obligations_forced": [
311
+ {
312
+ "type": "require_principal_confirmation",
313
+ "params": {
314
+ "max_age_seconds": 86400
315
+ }
316
+ }
317
+ ],
318
+ "implies": [],
319
+ "conflicts_with": [],
320
+ "step_up_required": false
321
+ },
322
+ {
323
+ "id": "contacts.search",
324
+ "version": "1.0.0",
325
+ "label": "Look up contacts",
326
+ "description": "Peer can search your contacts and receive only the attributes you specify.",
327
+ "category": "contacts",
328
+ "risk": "medium",
329
+ "parameters": [
330
+ {
331
+ "name": "attribute_allowlist",
332
+ "type": "AttributeList",
333
+ "required": true,
334
+ "default": [
335
+ "name",
336
+ "email"
337
+ ],
338
+ "validation": [
339
+ "name",
340
+ "email",
341
+ "phone",
342
+ "title",
343
+ "company",
344
+ "linkedin",
345
+ "twitter",
346
+ "notes"
347
+ ]
348
+ }
349
+ ],
350
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"search_contacts\",\n resource == Contact\n);\n",
351
+ "consent_text_template": "Search your contacts and see these fields: {{attribute_allowlist_display}}.",
352
+ "obligations_forced": [
353
+ {
354
+ "type": "redact_fields_except",
355
+ "params": {
356
+ "allowlist": "{{attribute_allowlist_json}}"
357
+ }
358
+ }
359
+ ],
360
+ "implies": [],
361
+ "conflicts_with": [],
362
+ "step_up_required": false
363
+ },
364
+ {
365
+ "id": "contacts.share",
366
+ "version": "1.0.0",
367
+ "label": "Share a contact card",
368
+ "description": "Peer can ask you to share a contact's vCard to an allowlisted recipient.",
369
+ "category": "contacts",
370
+ "risk": "high",
371
+ "parameters": [
372
+ {
373
+ "name": "recipient_allowlist",
374
+ "type": "EmailList",
375
+ "required": true,
376
+ "validation": "rfc5322-or-domain-glob"
377
+ }
378
+ ],
379
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"share_external\",\n resource == Contact\n) when {\n context.recipient_matches_allowlist({{recipient_allowlist_json}})\n};\n",
380
+ "consent_text_template": "Share contact cards externally to: {{recipient_allowlist_display}}.",
381
+ "obligations_forced": [
382
+ {
383
+ "type": "require_principal_confirmation",
384
+ "params": {
385
+ "max_age_seconds": 0
386
+ }
387
+ },
388
+ {
389
+ "type": "audit_level",
390
+ "params": {
391
+ "level": "verbose"
392
+ }
393
+ }
394
+ ],
395
+ "implies": [],
396
+ "conflicts_with": [],
397
+ "step_up_required": true
398
+ },
399
+ {
400
+ "id": "credentials.present.request",
401
+ "version": "1.0.0",
402
+ "label": "Request specific VCs",
403
+ "description": "Peer can ask your agent to present specific Verifiable Credentials (full disclosure, not ZK).",
404
+ "category": "credentials",
405
+ "risk": "medium",
406
+ "parameters": [
407
+ {
408
+ "name": "required_vcs",
409
+ "type": "AttributeList",
410
+ "required": true,
411
+ "validation": "vc-type-id"
412
+ }
413
+ ],
414
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"present_vc\",\n resource == Credential\n) when {\n resource.type in {{required_vcs_json}}\n};\n",
415
+ "consent_text_template": "Present these credentials: {{required_vcs_display}}.",
416
+ "obligations_forced": [
417
+ {
418
+ "type": "audit_level",
419
+ "params": {
420
+ "level": "verbose"
421
+ }
422
+ },
423
+ {
424
+ "type": "log_zk_disclosure",
425
+ "params": {}
426
+ }
427
+ ],
428
+ "implies": [],
429
+ "conflicts_with": [],
430
+ "step_up_required": false
431
+ },
432
+ {
433
+ "id": "credentials.proof.zk.request",
434
+ "version": "1.0.0",
435
+ "label": "Request ZK proof of an attribute",
436
+ "description": "Peer can ask your agent to present a zero-knowledge proof of a single attribute without revealing the underlying credential. Issuer is method-agnostic — any VC issuer that publishes a compatible predicate proof works.",
437
+ "category": "credentials",
438
+ "risk": "medium",
439
+ "parameters": [
440
+ {
441
+ "name": "attribute",
442
+ "type": "Enum",
443
+ "required": true,
444
+ "validation": [
445
+ "over_18",
446
+ "over_21",
447
+ "us_resident",
448
+ "verified_human",
449
+ "country"
450
+ ]
451
+ },
452
+ {
453
+ "name": "predicate",
454
+ "type": "Enum",
455
+ "required": false,
456
+ "default": "eq",
457
+ "validation": [
458
+ "eq",
459
+ "gte",
460
+ "lte",
461
+ "in"
462
+ ]
463
+ }
464
+ ],
465
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"request_zk_proof\",\n resource == Credential::\"{{attribute}}\"\n) when {\n context.predicate == \"{{predicate}}\"\n};\n",
466
+ "consent_text_template": "Prove to Peer, without revealing details, that you are {{attribute_human}}.",
467
+ "obligations_forced": [
468
+ {
469
+ "type": "log_zk_disclosure",
470
+ "params": {}
471
+ }
472
+ ],
473
+ "implies": [],
474
+ "conflicts_with": [],
475
+ "step_up_required": false
476
+ },
477
+ {
478
+ "id": "delegation.forward.task",
479
+ "version": "1.0.0",
480
+ "label": "Forward task to another agent",
481
+ "description": "Peer can re-delegate a task to a third agent, with automatically attenuated scopes.",
482
+ "category": "delegation",
483
+ "risk": "high",
484
+ "parameters": [
485
+ {
486
+ "name": "agent_allowlist",
487
+ "type": "AgentDIDList",
488
+ "required": true,
489
+ "validation": "at-least-one"
490
+ },
491
+ {
492
+ "name": "scope_attenuation",
493
+ "type": "Enum",
494
+ "required": true,
495
+ "default": "read_only",
496
+ "validation": [
497
+ "read_only",
498
+ "same_scopes",
499
+ "custom"
500
+ ]
501
+ }
502
+ ],
503
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"redelegate\",\n resource == Connection::\"self\"\n) when {\n context.delegate_target in {{agent_allowlist_json}} &&\n context.attenuation_mode == \"{{scope_attenuation}}\"\n};\n",
504
+ "consent_text_template": "Allow Peer to forward tasks to: {{agent_allowlist_display}}. Forwarded tasks get {{scope_attenuation_human}} access.",
505
+ "obligations_forced": [
506
+ {
507
+ "type": "audit_level",
508
+ "params": {
509
+ "level": "verbose"
510
+ }
511
+ },
512
+ {
513
+ "type": "notify_principal",
514
+ "params": {}
515
+ }
516
+ ],
517
+ "implies": [],
518
+ "conflicts_with": [],
519
+ "tier_gate": "self_xyz.verified_human",
520
+ "step_up_required": true
521
+ },
522
+ {
523
+ "id": "files.project.files.delete",
524
+ "version": "1.0.0",
525
+ "label": "Delete files",
526
+ "description": "Peer can delete files in a specific project.",
527
+ "category": "files",
528
+ "risk": "critical",
529
+ "parameters": [
530
+ {
531
+ "name": "project_id",
532
+ "type": "ProjectID",
533
+ "required": true
534
+ }
535
+ ],
536
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"delete\",\n resource in Project::\"{{project_id}}\"\n);\n",
537
+ "consent_text_template": "Delete files in project {{project_id}} (destructive).",
538
+ "obligations_forced": [
539
+ {
540
+ "type": "require_principal_confirmation",
541
+ "params": {
542
+ "max_age_seconds": 0
543
+ }
544
+ },
545
+ {
546
+ "type": "audit_level",
547
+ "params": {
548
+ "level": "verbose"
549
+ }
550
+ },
551
+ {
552
+ "type": "notify_principal",
553
+ "params": {}
554
+ }
555
+ ],
556
+ "implies": [],
557
+ "conflicts_with": [
558
+ "files.share.external"
559
+ ],
560
+ "tier_gate": "self_xyz.verified_human",
561
+ "step_up_required": true
562
+ },
563
+ {
564
+ "id": "files.project.files.list",
565
+ "version": "1.0.0",
566
+ "label": "List files in a project",
567
+ "description": "Peer can list the file names in a specific project, not their contents.",
568
+ "category": "files",
569
+ "risk": "low",
570
+ "parameters": [
571
+ {
572
+ "name": "project_id",
573
+ "type": "ProjectID",
574
+ "required": true
575
+ }
576
+ ],
577
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"list\",\n resource in Project::\"{{project_id}}\"\n);\n",
578
+ "consent_text_template": "List files in project {{project_id}}.",
579
+ "obligations_forced": [],
580
+ "implies": [
581
+ "files.project.metadata.read"
582
+ ],
583
+ "conflicts_with": [],
584
+ "step_up_required": false
585
+ },
586
+ {
587
+ "id": "files.project.files.read",
588
+ "version": "1.0.0",
589
+ "label": "Read file contents",
590
+ "description": "Peer can read the contents of files in a specific project.",
591
+ "category": "files",
592
+ "risk": "medium",
593
+ "parameters": [
594
+ {
595
+ "name": "project_id",
596
+ "type": "ProjectID",
597
+ "required": true
598
+ },
599
+ {
600
+ "name": "max_size_mb",
601
+ "type": "Integer",
602
+ "required": true,
603
+ "default": 10,
604
+ "validation": "1..100"
605
+ }
606
+ ],
607
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action in [Action::\"read\", Action::\"list\"],\n resource in Project::\"{{project_id}}\"\n) when {\n resource.size_bytes <= {{max_size_mb}} * 1048576 &&\n !resource.tags.contains(\"confidential\") &&\n !resource.tags.contains(\"do-not-share\")\n};\n",
608
+ "consent_text_template": "Read files in {{project.name}} (up to {{max_size_mb}} MB each; excludes items tagged confidential).",
609
+ "obligations_forced": [
610
+ {
611
+ "type": "audit_level",
612
+ "params": {
613
+ "level": "verbose"
614
+ }
615
+ }
616
+ ],
617
+ "implies": [
618
+ "files.project.files.list",
619
+ "files.project.metadata.read"
620
+ ],
621
+ "conflicts_with": [],
622
+ "step_up_required": false
623
+ },
624
+ {
625
+ "id": "files.project.files.summarize",
626
+ "version": "1.0.0",
627
+ "label": "Summaries only (derive)",
628
+ "description": "Peer receives model-generated summaries of files in a project, never the raw contents.",
629
+ "category": "files",
630
+ "risk": "low",
631
+ "parameters": [
632
+ {
633
+ "name": "project_id",
634
+ "type": "ProjectID",
635
+ "required": true
636
+ },
637
+ {
638
+ "name": "max_output_words",
639
+ "type": "Integer",
640
+ "required": true,
641
+ "default": 2000,
642
+ "validation": "100..10000"
643
+ }
644
+ ],
645
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"summarize\",\n resource in Project::\"{{project_id}}\"\n);\n",
646
+ "consent_text_template": "Summarize files in project {{project_id}} (up to {{max_output_words}} words).",
647
+ "obligations_forced": [
648
+ {
649
+ "type": "summarize_only",
650
+ "params": {
651
+ "max_words": "{{max_output_words}}"
652
+ }
653
+ }
654
+ ],
655
+ "implies": [
656
+ "files.project.files.read"
657
+ ],
658
+ "conflicts_with": [],
659
+ "step_up_required": false
660
+ },
661
+ {
662
+ "id": "files.project.files.write",
663
+ "version": "1.0.0",
664
+ "label": "Create/modify files",
665
+ "description": "Peer can create and modify files in a specific project, up to a maximum size per file.",
666
+ "category": "files",
667
+ "risk": "high",
668
+ "parameters": [
669
+ {
670
+ "name": "project_id",
671
+ "type": "ProjectID",
672
+ "required": true
673
+ },
674
+ {
675
+ "name": "max_size_mb",
676
+ "type": "Integer",
677
+ "required": true,
678
+ "default": 10,
679
+ "validation": "1..100"
680
+ }
681
+ ],
682
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action in [Action::\"write\", Action::\"update\"],\n resource in Project::\"{{project_id}}\"\n) when {\n context.written_size_bytes <= {{max_size_mb}} * 1048576\n};\n",
683
+ "consent_text_template": "Create or modify files in {{project_id}} (up to {{max_size_mb}} MB each).",
684
+ "obligations_forced": [
685
+ {
686
+ "type": "audit_level",
687
+ "params": {
688
+ "level": "verbose"
689
+ }
690
+ },
691
+ {
692
+ "type": "notify_principal",
693
+ "params": {}
694
+ }
695
+ ],
696
+ "implies": [
697
+ "files.project.files.read"
698
+ ],
699
+ "conflicts_with": [],
700
+ "step_up_required": true
701
+ },
702
+ {
703
+ "id": "files.project.metadata.read",
704
+ "version": "1.0.0",
705
+ "label": "Read project metadata",
706
+ "description": "Peer can read a specific project's metadata (name, description, tags), not its files.",
707
+ "category": "files",
708
+ "risk": "low",
709
+ "parameters": [
710
+ {
711
+ "name": "project_id",
712
+ "type": "ProjectID",
713
+ "required": true
714
+ }
715
+ ],
716
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"read_metadata\",\n resource == Project::\"{{project_id}}\"\n);\n",
717
+ "consent_text_template": "Read metadata for project {{project_id}}.",
718
+ "obligations_forced": [],
719
+ "implies": [],
720
+ "conflicts_with": [],
721
+ "step_up_required": false
722
+ },
723
+ {
724
+ "id": "files.projects.list",
725
+ "version": "1.0.0",
726
+ "label": "List projects",
727
+ "description": "Peer can list project names and IDs from your project registry.",
728
+ "category": "files",
729
+ "risk": "low",
730
+ "parameters": [],
731
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"list\",\n resource == ProjectRegistry::\"self\"\n);\n",
732
+ "consent_text_template": "See the list of your projects (names + IDs only).",
733
+ "obligations_forced": [],
734
+ "implies": [],
735
+ "conflicts_with": [],
736
+ "step_up_required": false
737
+ },
738
+ {
739
+ "id": "files.share.external",
740
+ "version": "1.0.0",
741
+ "label": "Share files outside circle",
742
+ "description": "Peer can share files from a project with an external recipient allowlist.",
743
+ "category": "files",
744
+ "risk": "critical",
745
+ "parameters": [
746
+ {
747
+ "name": "project_id",
748
+ "type": "ProjectID",
749
+ "required": true
750
+ },
751
+ {
752
+ "name": "recipient_allowlist",
753
+ "type": "EmailList",
754
+ "required": true,
755
+ "validation": "rfc5322-or-domain-glob"
756
+ }
757
+ ],
758
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"share_external\",\n resource in Project::\"{{project_id}}\"\n) when {\n context.recipient_matches_allowlist({{recipient_allowlist_json}})\n};\n",
759
+ "consent_text_template": "Share files from {{project_id}} externally to: {{recipient_allowlist_display}}.",
760
+ "obligations_forced": [
761
+ {
762
+ "type": "require_principal_confirmation",
763
+ "params": {
764
+ "max_age_seconds": 0
765
+ }
766
+ },
767
+ {
768
+ "type": "audit_level",
769
+ "params": {
770
+ "level": "verbose"
771
+ }
772
+ },
773
+ {
774
+ "type": "notify_principal",
775
+ "params": {}
776
+ },
777
+ {
778
+ "type": "insert_watermark",
779
+ "params": {}
780
+ }
781
+ ],
782
+ "implies": [],
783
+ "conflicts_with": [
784
+ "files.project.files.delete"
785
+ ],
786
+ "tier_gate": "self_xyz.verified_human",
787
+ "step_up_required": true
788
+ },
789
+ {
790
+ "id": "identity.card.read",
791
+ "version": "1.0.0",
792
+ "label": "Read agent card",
793
+ "description": "Allow the peer agent to fetch your agent card (name, supported protocols, public endpoints).",
794
+ "category": "identity",
795
+ "risk": "low",
796
+ "parameters": [],
797
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"read\",\n resource == AgentCard::\"self\"\n);\n",
798
+ "consent_text_template": "See your public agent card.",
799
+ "obligations_forced": [],
800
+ "implies": [],
801
+ "conflicts_with": [],
802
+ "step_up_required": false
803
+ },
804
+ {
805
+ "id": "identity.introduction.request",
806
+ "version": "1.0.0",
807
+ "label": "Request introduction",
808
+ "description": "Peer can ask your agent to introduce them to another agent you know.",
809
+ "category": "identity",
810
+ "risk": "medium",
811
+ "parameters": [
812
+ {
813
+ "name": "to_agent",
814
+ "type": "AgentDID",
815
+ "required": true
816
+ }
817
+ ],
818
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"request_introduction\",\n resource == Agent::\"{{to_agent}}\"\n);\n",
819
+ "consent_text_template": "Introduce Peer to {{to_agent}}.",
820
+ "obligations_forced": [
821
+ {
822
+ "type": "require_principal_confirmation",
823
+ "params": {
824
+ "max_age_seconds": 86400
825
+ }
826
+ }
827
+ ],
828
+ "implies": [],
829
+ "conflicts_with": [],
830
+ "step_up_required": false
831
+ },
832
+ {
833
+ "id": "identity.principal.verify",
834
+ "version": "1.0.0",
835
+ "label": "Verify owner binding",
836
+ "description": "Peer can fetch and verify your representation VC, confirming which human principal your agent represents.",
837
+ "category": "identity",
838
+ "risk": "low",
839
+ "parameters": [],
840
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"verify_principal\",\n resource == Principal::\"self\"\n);\n",
841
+ "consent_text_template": "Let Peer verify who your agent represents.",
842
+ "obligations_forced": [],
843
+ "implies": [
844
+ "identity.card.read"
845
+ ],
846
+ "conflicts_with": [],
847
+ "step_up_required": false
848
+ },
849
+ {
850
+ "id": "knowledge.query",
851
+ "version": "1.0.0",
852
+ "label": "Query knowledge base",
853
+ "description": "Peer can query a specific knowledge base and receive token-bounded answers.",
854
+ "category": "notes",
855
+ "risk": "medium",
856
+ "parameters": [
857
+ {
858
+ "name": "kb_id",
859
+ "type": "ProjectID",
860
+ "required": true
861
+ },
862
+ {
863
+ "name": "max_tokens",
864
+ "type": "Integer",
865
+ "required": true,
866
+ "default": 8000,
867
+ "validation": "100..50000"
868
+ }
869
+ ],
870
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"query\",\n resource == KnowledgeBase::\"{{kb_id}}\"\n) when {\n context.requested_tokens <= {{max_tokens}}\n};\n",
871
+ "consent_text_template": "Query knowledge base {{kb_id}} (up to {{max_tokens}} tokens/response).",
872
+ "obligations_forced": [
873
+ {
874
+ "type": "summarize_only",
875
+ "params": {
876
+ "max_words": "{{max_tokens}}"
877
+ }
878
+ }
879
+ ],
880
+ "implies": [],
881
+ "conflicts_with": [],
882
+ "step_up_required": false
883
+ },
884
+ {
885
+ "id": "messaging.chat.send",
886
+ "version": "1.0.0",
887
+ "label": "Send chat message",
888
+ "description": "Peer can send chat messages on your behalf within an allowlisted set of channels.",
889
+ "category": "messaging",
890
+ "risk": "medium",
891
+ "parameters": [
892
+ {
893
+ "name": "channel_allowlist",
894
+ "type": "AttributeList",
895
+ "required": true,
896
+ "validation": "at-least-one"
897
+ }
898
+ ],
899
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"send_chat\",\n resource == ChatChannel\n) when {\n resource.id in {{channel_allowlist_json}}\n};\n",
900
+ "consent_text_template": "Send chat messages on your behalf in: {{channel_allowlist_display}}.",
901
+ "obligations_forced": [
902
+ {
903
+ "type": "audit_level",
904
+ "params": {
905
+ "level": "verbose"
906
+ }
907
+ }
908
+ ],
909
+ "implies": [],
910
+ "conflicts_with": [],
911
+ "step_up_required": false
912
+ },
913
+ {
914
+ "id": "messaging.email.draft.compose",
915
+ "version": "1.0.0",
916
+ "label": "Compose drafts (no send)",
917
+ "description": "Peer can compose email drafts in your drafts folder without sending them.",
918
+ "category": "messaging",
919
+ "risk": "medium",
920
+ "parameters": [],
921
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"compose_draft\",\n resource == Email::\"drafts\"\n);\nforbid (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"send_email\",\n resource\n);\n",
922
+ "consent_text_template": "Compose email drafts for you to review (no sending).",
923
+ "obligations_forced": [],
924
+ "implies": [],
925
+ "conflicts_with": [],
926
+ "step_up_required": false
927
+ },
928
+ {
929
+ "id": "messaging.email.send.reviewed",
930
+ "version": "1.0.0",
931
+ "label": "Send email (after your review)",
932
+ "description": "Peer drafts emails on your behalf; each send requires your one-tap approval before going out.",
933
+ "category": "messaging",
934
+ "risk": "high",
935
+ "parameters": [
936
+ {
937
+ "name": "recipient_allowlist",
938
+ "type": "EmailList",
939
+ "required": false,
940
+ "default": [],
941
+ "validation": "rfc5322-or-domain-glob"
942
+ }
943
+ ],
944
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"send_email\",\n resource == Email::\"outbox\"\n) when {\n {{#if recipient_allowlist}}\n context.recipient_matches_allowlist({{recipient_allowlist_json}})\n {{else}}\n true\n {{/if}}\n};\n",
945
+ "consent_text_template": "Draft and (with your approval) send emails{{#if recipient_allowlist}} to: {{recipient_allowlist_display}}{{/if}}.",
946
+ "obligations_forced": [
947
+ {
948
+ "type": "require_principal_confirmation",
949
+ "params": {
950
+ "max_age_seconds": 0
951
+ }
952
+ },
953
+ {
954
+ "type": "audit_level",
955
+ "params": {
956
+ "level": "verbose"
957
+ }
958
+ }
959
+ ],
960
+ "implies": [
961
+ "messaging.email.draft.compose"
962
+ ],
963
+ "conflicts_with": [],
964
+ "step_up_required": true
965
+ },
966
+ {
967
+ "id": "messaging.email.summary",
968
+ "version": "1.0.0",
969
+ "label": "Email summaries only",
970
+ "description": "Peer receives only summaries of your email threads, never the raw content.",
971
+ "category": "messaging",
972
+ "risk": "medium",
973
+ "parameters": [
974
+ {
975
+ "name": "label_filter",
976
+ "type": "AttributeList",
977
+ "required": false,
978
+ "default": [],
979
+ "validation": "label-or-folder-name"
980
+ }
981
+ ],
982
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"summarize\",\n resource == Email\n);\n",
983
+ "consent_text_template": "Share email summaries (never raw content){{#if label_filter}} for labels: {{label_filter_display}}{{/if}}.",
984
+ "obligations_forced": [
985
+ {
986
+ "type": "summarize_only",
987
+ "params": {
988
+ "max_words": 250
989
+ }
990
+ }
991
+ ],
992
+ "implies": [],
993
+ "conflicts_with": [],
994
+ "step_up_required": false
995
+ },
996
+ {
997
+ "id": "messaging.email.thread.read",
998
+ "version": "1.0.0",
999
+ "label": "Read email threads",
1000
+ "description": "Peer can read the full contents of email threads matching optional label filters.",
1001
+ "category": "messaging",
1002
+ "risk": "high",
1003
+ "parameters": [
1004
+ {
1005
+ "name": "label_filter",
1006
+ "type": "AttributeList",
1007
+ "required": false,
1008
+ "default": [],
1009
+ "validation": "label-or-folder-name"
1010
+ }
1011
+ ],
1012
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"read\",\n resource == Email\n) {{#if label_filter}}when {\n resource.labels.containsAny({{label_filter_json}})\n}{{/if}};\n",
1013
+ "consent_text_template": "Read email thread contents{{#if label_filter}} for labels: {{label_filter_display}}{{/if}}.",
1014
+ "obligations_forced": [
1015
+ {
1016
+ "type": "audit_level",
1017
+ "params": {
1018
+ "level": "verbose"
1019
+ }
1020
+ }
1021
+ ],
1022
+ "implies": [
1023
+ "messaging.email.summary"
1024
+ ],
1025
+ "conflicts_with": [],
1026
+ "step_up_required": true
1027
+ },
1028
+ {
1029
+ "id": "messaging.relay.to_principal",
1030
+ "version": "1.0.0",
1031
+ "label": "Relay message to owner",
1032
+ "description": "Peer can ask your agent to relay a short message to you (the principal).",
1033
+ "category": "messaging",
1034
+ "risk": "low",
1035
+ "parameters": [],
1036
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"relay_to_principal\",\n resource == Principal::\"self\"\n);\n",
1037
+ "consent_text_template": "Let Peer send you short relayed messages.",
1038
+ "obligations_forced": [
1039
+ {
1040
+ "type": "rate_limit",
1041
+ "params": {
1042
+ "window": "hour",
1043
+ "max": 10
1044
+ }
1045
+ }
1046
+ ],
1047
+ "implies": [],
1048
+ "conflicts_with": [],
1049
+ "step_up_required": false
1050
+ },
1051
+ {
1052
+ "id": "notes.read",
1053
+ "version": "1.0.0",
1054
+ "label": "Read notes",
1055
+ "description": "Peer can read full note contents in a specific collection.",
1056
+ "category": "notes",
1057
+ "risk": "medium",
1058
+ "parameters": [
1059
+ {
1060
+ "name": "collection_id",
1061
+ "type": "ProjectID",
1062
+ "required": true
1063
+ }
1064
+ ],
1065
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"read\",\n resource in Collection::\"{{collection_id}}\"\n);\n",
1066
+ "consent_text_template": "Read notes in collection {{collection_id}}.",
1067
+ "obligations_forced": [
1068
+ {
1069
+ "type": "audit_level",
1070
+ "params": {
1071
+ "level": "verbose"
1072
+ }
1073
+ }
1074
+ ],
1075
+ "implies": [
1076
+ "notes.search"
1077
+ ],
1078
+ "conflicts_with": [],
1079
+ "step_up_required": false
1080
+ },
1081
+ {
1082
+ "id": "notes.search",
1083
+ "version": "1.0.0",
1084
+ "label": "Search notes",
1085
+ "description": "Peer can search notes within a collection and receive title+snippet matches.",
1086
+ "category": "notes",
1087
+ "risk": "medium",
1088
+ "parameters": [
1089
+ {
1090
+ "name": "collection_id",
1091
+ "type": "ProjectID",
1092
+ "required": true
1093
+ }
1094
+ ],
1095
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"search\",\n resource in Collection::\"{{collection_id}}\"\n);\n",
1096
+ "consent_text_template": "Search notes in collection {{collection_id}}.",
1097
+ "obligations_forced": [
1098
+ {
1099
+ "type": "summarize_only",
1100
+ "params": {
1101
+ "max_words": 100
1102
+ }
1103
+ }
1104
+ ],
1105
+ "implies": [],
1106
+ "conflicts_with": [],
1107
+ "step_up_required": false
1108
+ },
1109
+ {
1110
+ "id": "notes.write",
1111
+ "version": "1.0.0",
1112
+ "label": "Create/update notes",
1113
+ "description": "Peer can create and update notes in a collection, up to a daily cap.",
1114
+ "category": "notes",
1115
+ "risk": "medium",
1116
+ "parameters": [
1117
+ {
1118
+ "name": "collection_id",
1119
+ "type": "ProjectID",
1120
+ "required": true
1121
+ },
1122
+ {
1123
+ "name": "max_per_day",
1124
+ "type": "Integer",
1125
+ "required": true,
1126
+ "default": 100,
1127
+ "validation": "1..1000"
1128
+ }
1129
+ ],
1130
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action in [Action::\"write\", Action::\"update\"],\n resource in Collection::\"{{collection_id}}\"\n) when {\n context.notes_written_today < {{max_per_day}}\n};\n",
1131
+ "consent_text_template": "Create/update notes in {{collection_id}} (up to {{max_per_day}}/day).",
1132
+ "obligations_forced": [
1133
+ {
1134
+ "type": "audit_level",
1135
+ "params": {
1136
+ "level": "verbose"
1137
+ }
1138
+ }
1139
+ ],
1140
+ "implies": [
1141
+ "notes.read"
1142
+ ],
1143
+ "conflicts_with": [],
1144
+ "step_up_required": false
1145
+ },
1146
+ {
1147
+ "id": "payments.authorize.capped",
1148
+ "version": "1.0.0",
1149
+ "label": "Authorize payments up to a cap",
1150
+ "description": "Peer can trigger x402 payments up to the per-transaction and rolling 30-day caps you set.",
1151
+ "category": "payments",
1152
+ "risk": "high",
1153
+ "parameters": [
1154
+ {
1155
+ "name": "max_per_txn_usd",
1156
+ "type": "Decimal",
1157
+ "required": true,
1158
+ "default": 5,
1159
+ "validation": "0.01..1000"
1160
+ },
1161
+ {
1162
+ "name": "max_per_30d_usd",
1163
+ "type": "Decimal",
1164
+ "required": true,
1165
+ "default": 50,
1166
+ "validation": "0.01..10000"
1167
+ }
1168
+ ],
1169
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"authorize_payment\",\n resource == Wallet::\"primary\"\n) when {\n context.quoted_price_usd <= {{max_per_txn_usd}} &&\n context.spend_last_30d_usd + context.quoted_price_usd <= {{max_per_30d_usd}}\n};\n",
1170
+ "consent_text_template": "Pay up to ${{max_per_txn_usd}} per request, ${{max_per_30d_usd}} total per 30 days.",
1171
+ "obligations_forced": [
1172
+ {
1173
+ "type": "notify_principal",
1174
+ "params": {}
1175
+ },
1176
+ {
1177
+ "type": "audit_level",
1178
+ "params": {
1179
+ "level": "verbose"
1180
+ }
1181
+ }
1182
+ ],
1183
+ "implies": [],
1184
+ "conflicts_with": [],
1185
+ "tier_gate": "self_xyz.verified_human",
1186
+ "step_up_required": true
1187
+ },
1188
+ {
1189
+ "id": "payments.history.read",
1190
+ "version": "1.0.0",
1191
+ "label": "Read past transactions",
1192
+ "description": "Peer can read your payment history for the past N days.",
1193
+ "category": "payments",
1194
+ "risk": "medium",
1195
+ "parameters": [
1196
+ {
1197
+ "name": "days_back",
1198
+ "type": "Integer",
1199
+ "required": true,
1200
+ "default": 30,
1201
+ "validation": "1..365"
1202
+ }
1203
+ ],
1204
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"read\",\n resource == PaymentHistory::\"self\"\n) when {\n context.query_window_days <= {{days_back}}\n};\n",
1205
+ "consent_text_template": "Read payment history for the past {{days_back}} days.",
1206
+ "obligations_forced": [
1207
+ {
1208
+ "type": "audit_level",
1209
+ "params": {
1210
+ "level": "verbose"
1211
+ }
1212
+ }
1213
+ ],
1214
+ "implies": [],
1215
+ "conflicts_with": [],
1216
+ "step_up_required": false
1217
+ },
1218
+ {
1219
+ "id": "payments.quote.request",
1220
+ "version": "1.0.0",
1221
+ "label": "Request a price quote",
1222
+ "description": "Peer can request a price quote for an action or purchase (quote only, no payment).",
1223
+ "category": "payments",
1224
+ "risk": "low",
1225
+ "parameters": [],
1226
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"request_quote\",\n resource == Wallet::\"primary\"\n);\n",
1227
+ "consent_text_template": "Let Peer request a price quote (no payment).",
1228
+ "obligations_forced": [],
1229
+ "implies": [],
1230
+ "conflicts_with": [],
1231
+ "step_up_required": false
1232
+ },
1233
+ {
1234
+ "id": "payments.refund.request",
1235
+ "version": "1.0.0",
1236
+ "label": "Request refund",
1237
+ "description": "Peer can request a refund against a prior payment.",
1238
+ "category": "payments",
1239
+ "risk": "medium",
1240
+ "parameters": [],
1241
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"request_refund\",\n resource == Payment\n);\n",
1242
+ "consent_text_template": "Let Peer request a refund on a prior payment.",
1243
+ "obligations_forced": [
1244
+ {
1245
+ "type": "require_principal_confirmation",
1246
+ "params": {
1247
+ "max_age_seconds": 0
1248
+ }
1249
+ },
1250
+ {
1251
+ "type": "audit_level",
1252
+ "params": {
1253
+ "level": "verbose"
1254
+ }
1255
+ }
1256
+ ],
1257
+ "implies": [],
1258
+ "conflicts_with": [],
1259
+ "step_up_required": false
1260
+ },
1261
+ {
1262
+ "id": "tasks.assign",
1263
+ "version": "1.0.0",
1264
+ "label": "Assign tasks to humans",
1265
+ "description": "Peer can assign tasks in a project to specific people.",
1266
+ "category": "tasks",
1267
+ "risk": "high",
1268
+ "parameters": [
1269
+ {
1270
+ "name": "project_id",
1271
+ "type": "ProjectID",
1272
+ "required": true
1273
+ }
1274
+ ],
1275
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"assign\",\n resource in Project::\"{{project_id}}\"\n);\n",
1276
+ "consent_text_template": "Assign tasks to people in project {{project_id}}.",
1277
+ "obligations_forced": [
1278
+ {
1279
+ "type": "audit_level",
1280
+ "params": {
1281
+ "level": "verbose"
1282
+ }
1283
+ },
1284
+ {
1285
+ "type": "notify_principal",
1286
+ "params": {}
1287
+ }
1288
+ ],
1289
+ "implies": [
1290
+ "tasks.read"
1291
+ ],
1292
+ "conflicts_with": [],
1293
+ "step_up_required": true
1294
+ },
1295
+ {
1296
+ "id": "tasks.create",
1297
+ "version": "1.0.0",
1298
+ "label": "Create tasks",
1299
+ "description": "Peer can create tasks in a project, up to a daily cap.",
1300
+ "category": "tasks",
1301
+ "risk": "medium",
1302
+ "parameters": [
1303
+ {
1304
+ "name": "project_id",
1305
+ "type": "ProjectID",
1306
+ "required": true
1307
+ },
1308
+ {
1309
+ "name": "max_per_day",
1310
+ "type": "Integer",
1311
+ "required": true,
1312
+ "default": 50,
1313
+ "validation": "1..500"
1314
+ }
1315
+ ],
1316
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"create\",\n resource in Project::\"{{project_id}}\"\n) when {\n context.tasks_created_today < {{max_per_day}}\n};\n",
1317
+ "consent_text_template": "Create tasks in {{project_id}} (up to {{max_per_day}}/day).",
1318
+ "obligations_forced": [
1319
+ {
1320
+ "type": "audit_level",
1321
+ "params": {
1322
+ "level": "verbose"
1323
+ }
1324
+ }
1325
+ ],
1326
+ "implies": [],
1327
+ "conflicts_with": [],
1328
+ "step_up_required": false
1329
+ },
1330
+ {
1331
+ "id": "tasks.list",
1332
+ "version": "1.0.0",
1333
+ "label": "List tasks",
1334
+ "description": "Peer can list tasks within a project.",
1335
+ "category": "tasks",
1336
+ "risk": "low",
1337
+ "parameters": [
1338
+ {
1339
+ "name": "project_id",
1340
+ "type": "ProjectID",
1341
+ "required": true
1342
+ }
1343
+ ],
1344
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"list\",\n resource in Project::\"{{project_id}}\"\n);\n",
1345
+ "consent_text_template": "List tasks in project {{project_id}}.",
1346
+ "obligations_forced": [],
1347
+ "implies": [],
1348
+ "conflicts_with": [],
1349
+ "step_up_required": false
1350
+ },
1351
+ {
1352
+ "id": "tasks.read",
1353
+ "version": "1.0.0",
1354
+ "label": "Read task details",
1355
+ "description": "Peer can read details (title, status, assignee, due) of tasks within a project.",
1356
+ "category": "tasks",
1357
+ "risk": "low",
1358
+ "parameters": [
1359
+ {
1360
+ "name": "project_id",
1361
+ "type": "ProjectID",
1362
+ "required": true
1363
+ }
1364
+ ],
1365
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"read\",\n resource in Project::\"{{project_id}}\"\n);\n",
1366
+ "consent_text_template": "Read task details in project {{project_id}}.",
1367
+ "obligations_forced": [],
1368
+ "implies": [
1369
+ "tasks.list"
1370
+ ],
1371
+ "conflicts_with": [],
1372
+ "step_up_required": false
1373
+ },
1374
+ {
1375
+ "id": "tasks.status.update",
1376
+ "version": "1.0.0",
1377
+ "label": "Update task status",
1378
+ "description": "Peer can update the status (open/in-progress/done) of tasks in a project.",
1379
+ "category": "tasks",
1380
+ "risk": "medium",
1381
+ "parameters": [
1382
+ {
1383
+ "name": "project_id",
1384
+ "type": "ProjectID",
1385
+ "required": true
1386
+ }
1387
+ ],
1388
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"update_status\",\n resource in Project::\"{{project_id}}\"\n);\n",
1389
+ "consent_text_template": "Update task status in {{project_id}}.",
1390
+ "obligations_forced": [],
1391
+ "implies": [
1392
+ "tasks.read"
1393
+ ],
1394
+ "conflicts_with": [],
1395
+ "step_up_required": false
1396
+ },
1397
+ {
1398
+ "id": "tools.invoke.mutating",
1399
+ "version": "1.0.0",
1400
+ "label": "Invoke tools with side effects",
1401
+ "description": "Peer can invoke specific tools on your MCP server that cause changes (not just reads).",
1402
+ "category": "tools",
1403
+ "risk": "high",
1404
+ "parameters": [
1405
+ {
1406
+ "name": "tool_allowlist",
1407
+ "type": "ToolIDList",
1408
+ "required": true,
1409
+ "validation": "at-least-one"
1410
+ },
1411
+ {
1412
+ "name": "max_per_day",
1413
+ "type": "Integer",
1414
+ "required": true,
1415
+ "default": 20,
1416
+ "validation": "1..1000"
1417
+ }
1418
+ ],
1419
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"invoke_tool\",\n resource == Tool\n) when {\n resource.id in {{tool_allowlist_json}} &&\n context.requests_last_day <= {{max_per_day}}\n};\n",
1420
+ "consent_text_template": "Use these tools on your behalf (max {{max_per_day}}/day): {{tool_allowlist_display}}.",
1421
+ "obligations_forced": [
1422
+ {
1423
+ "type": "audit_level",
1424
+ "params": {
1425
+ "level": "verbose"
1426
+ }
1427
+ },
1428
+ {
1429
+ "type": "rate_limit",
1430
+ "params": {
1431
+ "window": "day",
1432
+ "max": "{{max_per_day}}"
1433
+ }
1434
+ }
1435
+ ],
1436
+ "implies": [],
1437
+ "conflicts_with": [],
1438
+ "step_up_required": true
1439
+ },
1440
+ {
1441
+ "id": "tools.invoke.read",
1442
+ "version": "1.0.0",
1443
+ "label": "Invoke read-only tools",
1444
+ "description": "Peer can invoke read-only (no-side-effect) tools on your MCP server, restricted to an allowlist.",
1445
+ "category": "tools",
1446
+ "risk": "medium",
1447
+ "parameters": [
1448
+ {
1449
+ "name": "tool_allowlist",
1450
+ "type": "ToolIDList",
1451
+ "required": true,
1452
+ "validation": "at-least-one"
1453
+ }
1454
+ ],
1455
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"invoke_tool\",\n resource == Tool\n) when {\n resource.id in {{tool_allowlist_json}} &&\n resource.readonly == true\n};\n",
1456
+ "consent_text_template": "Invoke these read-only tools on your behalf: {{tool_allowlist_display}}.",
1457
+ "obligations_forced": [
1458
+ {
1459
+ "type": "audit_level",
1460
+ "params": {
1461
+ "level": "verbose"
1462
+ }
1463
+ }
1464
+ ],
1465
+ "implies": [],
1466
+ "conflicts_with": [],
1467
+ "step_up_required": false
1468
+ },
1469
+ {
1470
+ "id": "work.projects.list",
1471
+ "version": "1.0.0",
1472
+ "label": "Current active projects",
1473
+ "description": "Peer can see the list of projects you're actively working on (names only).",
1474
+ "category": "work",
1475
+ "risk": "low",
1476
+ "parameters": [],
1477
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"list\",\n resource == WorkProjects::\"self\"\n);\n",
1478
+ "consent_text_template": "Share the list of your active projects.",
1479
+ "obligations_forced": [],
1480
+ "implies": [],
1481
+ "conflicts_with": [],
1482
+ "step_up_required": false
1483
+ },
1484
+ {
1485
+ "id": "work.reports.summary",
1486
+ "version": "1.0.0",
1487
+ "label": "Generate status summary",
1488
+ "description": "Peer can ask your agent to generate a status summary for a bounded time period.",
1489
+ "category": "work",
1490
+ "risk": "medium",
1491
+ "parameters": [
1492
+ {
1493
+ "name": "period",
1494
+ "type": "Enum",
1495
+ "required": true,
1496
+ "default": "week",
1497
+ "validation": [
1498
+ "day",
1499
+ "week",
1500
+ "month",
1501
+ "quarter"
1502
+ ]
1503
+ }
1504
+ ],
1505
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"summarize\",\n resource == WorkReport::\"self\"\n) when {\n context.period == \"{{period}}\"\n};\n",
1506
+ "consent_text_template": "Generate a {{period}} work status summary.",
1507
+ "obligations_forced": [
1508
+ {
1509
+ "type": "summarize_only",
1510
+ "params": {
1511
+ "max_words": 1000
1512
+ }
1513
+ }
1514
+ ],
1515
+ "implies": [
1516
+ "work.status.read"
1517
+ ],
1518
+ "conflicts_with": [],
1519
+ "step_up_required": false
1520
+ },
1521
+ {
1522
+ "id": "work.status.read",
1523
+ "version": "1.0.0",
1524
+ "label": "Current work status",
1525
+ "description": "Peer can see your current work status (available, busy, out-of-office).",
1526
+ "category": "work",
1527
+ "risk": "low",
1528
+ "parameters": [],
1529
+ "cedar_template": "permit (\n principal == Agent::\"{{audience_did}}\",\n action == Action::\"read\",\n resource == WorkStatus::\"self\"\n);\n",
1530
+ "consent_text_template": "Share your current work status (available/busy/OOO).",
1531
+ "obligations_forced": [],
1532
+ "implies": [],
1533
+ "conflicts_with": [],
1534
+ "step_up_required": false
1535
+ }
1536
+ ]