macro-agent 0.0.14 → 0.0.16
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/.claude/settings.local.json +59 -0
- package/dist/acp/index.d.ts +1 -1
- package/dist/acp/index.d.ts.map +1 -1
- package/dist/acp/index.js.map +1 -1
- package/dist/acp/macro-agent.d.ts +21 -0
- package/dist/acp/macro-agent.d.ts.map +1 -1
- package/dist/acp/macro-agent.js +182 -0
- package/dist/acp/macro-agent.js.map +1 -1
- package/dist/acp/types.d.ts +31 -2
- package/dist/acp/types.d.ts.map +1 -1
- package/dist/acp/types.js.map +1 -1
- package/dist/agent/agent-manager.d.ts.map +1 -1
- package/dist/agent/agent-manager.js +10 -4
- package/dist/agent/agent-manager.js.map +1 -1
- package/dist/cli/acp.d.ts +6 -0
- package/dist/cli/acp.d.ts.map +1 -1
- package/dist/cli/acp.js +16 -2
- package/dist/cli/acp.js.map +1 -1
- package/dist/map/adapter/acp-over-map.d.ts +5 -0
- package/dist/map/adapter/acp-over-map.d.ts.map +1 -1
- package/dist/map/adapter/acp-over-map.js +47 -4
- package/dist/map/adapter/acp-over-map.js.map +1 -1
- package/dist/map/utils/address-translation.d.ts +99 -0
- package/dist/map/utils/address-translation.d.ts.map +1 -0
- package/dist/map/utils/address-translation.js +285 -0
- package/dist/map/utils/address-translation.js.map +1 -0
- package/dist/map/utils/index.d.ts +7 -0
- package/dist/map/utils/index.d.ts.map +1 -0
- package/dist/map/utils/index.js +7 -0
- package/dist/map/utils/index.js.map +1 -0
- package/dist/store/event-store.js +9 -2
- package/dist/store/event-store.js.map +1 -1
- package/dist/store/types/agents.d.ts +2 -0
- package/dist/store/types/agents.d.ts.map +1 -1
- package/package.json +4 -4
- package/references/acp-factory-ref/CHANGELOG.md +33 -0
- package/references/acp-factory-ref/LICENSE +21 -0
- package/references/acp-factory-ref/README.md +341 -0
- package/references/acp-factory-ref/package-lock.json +3102 -0
- package/references/acp-factory-ref/package.json +96 -0
- package/references/acp-factory-ref/python/CHANGELOG.md +33 -0
- package/references/acp-factory-ref/python/LICENSE +21 -0
- package/references/acp-factory-ref/python/Makefile +57 -0
- package/references/acp-factory-ref/python/README.md +253 -0
- package/references/acp-factory-ref/python/pyproject.toml +73 -0
- package/references/acp-factory-ref/python/tests/__init__.py +0 -0
- package/references/acp-factory-ref/python/tests/e2e/__init__.py +1 -0
- package/references/acp-factory-ref/python/tests/e2e/test_codex_e2e.py +349 -0
- package/references/acp-factory-ref/python/tests/e2e/test_gemini_e2e.py +165 -0
- package/references/acp-factory-ref/python/tests/e2e/test_opencode_e2e.py +296 -0
- package/references/acp-factory-ref/python/tests/test_client_handler.py +543 -0
- package/references/acp-factory-ref/python/tests/test_pushable.py +199 -0
- package/references/claude-code-acp/.github/workflows/ci.yml +45 -0
- package/references/claude-code-acp/.github/workflows/publish.yml +34 -0
- package/references/claude-code-acp/.prettierrc.json +4 -0
- package/references/claude-code-acp/CHANGELOG.md +249 -0
- package/references/claude-code-acp/LICENSE +222 -0
- package/references/claude-code-acp/README.md +53 -0
- package/references/claude-code-acp/docs/RELEASES.md +24 -0
- package/references/claude-code-acp/eslint.config.js +48 -0
- package/references/claude-code-acp/package-lock.json +4570 -0
- package/references/claude-code-acp/package.json +88 -0
- package/references/claude-code-acp/scripts/release.sh +119 -0
- package/references/claude-code-acp/src/acp-agent.ts +2079 -0
- package/references/claude-code-acp/src/index.ts +26 -0
- package/references/claude-code-acp/src/lib.ts +38 -0
- package/references/claude-code-acp/src/mcp-server.ts +911 -0
- package/references/claude-code-acp/src/settings.ts +522 -0
- package/references/claude-code-acp/src/tests/.claude/commands/quick-math.md +5 -0
- package/references/claude-code-acp/src/tests/.claude/commands/say-hello.md +6 -0
- package/references/claude-code-acp/src/tests/acp-agent-fork.test.ts +479 -0
- package/references/claude-code-acp/src/tests/acp-agent.test.ts +1502 -0
- package/references/claude-code-acp/src/tests/extract-lines.test.ts +103 -0
- package/references/claude-code-acp/src/tests/fork-session.test.ts +335 -0
- package/references/claude-code-acp/src/tests/replace-and-calculate-location.test.ts +334 -0
- package/references/claude-code-acp/src/tests/settings.test.ts +617 -0
- package/references/claude-code-acp/src/tests/skills-options.test.ts +187 -0
- package/references/claude-code-acp/src/tests/tools.test.ts +318 -0
- package/references/claude-code-acp/src/tests/typescript-declarations.test.ts +558 -0
- package/references/claude-code-acp/src/tools.ts +819 -0
- package/references/claude-code-acp/src/utils.ts +171 -0
- package/references/claude-code-acp/tsconfig.json +18 -0
- package/references/claude-code-acp/vitest.config.ts +19 -0
- package/references/multi-agent-protocol/.sudocode/issues.jsonl +111 -0
- package/references/multi-agent-protocol/.sudocode/specs.jsonl +13 -0
- package/references/multi-agent-protocol/LICENSE +21 -0
- package/references/multi-agent-protocol/README.md +113 -0
- package/references/multi-agent-protocol/docs/00-design-specification.md +496 -0
- package/references/multi-agent-protocol/docs/01-open-questions.md +1050 -0
- package/references/multi-agent-protocol/docs/02-wire-protocol.md +296 -0
- package/references/multi-agent-protocol/docs/03-streaming-semantics.md +252 -0
- package/references/multi-agent-protocol/docs/04-error-handling.md +231 -0
- package/references/multi-agent-protocol/docs/05-connection-model.md +244 -0
- package/references/multi-agent-protocol/docs/06-visibility-permissions.md +243 -0
- package/references/multi-agent-protocol/docs/07-federation.md +259 -0
- package/references/multi-agent-protocol/docs/08-macro-agent-migration.md +253 -0
- package/references/multi-agent-protocol/docs/09-authentication.md +680 -0
- package/references/multi-agent-protocol/docs/10-mail-protocol.md +553 -0
- package/references/multi-agent-protocol/docs/agent-iam-integration.md +877 -0
- package/references/multi-agent-protocol/docs/agentic-mesh-integration-draft.md +459 -0
- package/references/multi-agent-protocol/docs/git-transport-draft.md +251 -0
- package/references/multi-agent-protocol/docs-site/Gemfile +22 -0
- package/references/multi-agent-protocol/docs-site/README.md +82 -0
- package/references/multi-agent-protocol/docs-site/_config.yml +91 -0
- package/references/multi-agent-protocol/docs-site/_includes/head_custom.html +20 -0
- package/references/multi-agent-protocol/docs-site/_sass/color_schemes/map.scss +42 -0
- package/references/multi-agent-protocol/docs-site/_sass/custom/custom.scss +34 -0
- package/references/multi-agent-protocol/docs-site/examples/full-integration.md +510 -0
- package/references/multi-agent-protocol/docs-site/examples/index.md +138 -0
- package/references/multi-agent-protocol/docs-site/examples/simple-chat.md +282 -0
- package/references/multi-agent-protocol/docs-site/examples/task-queue.md +399 -0
- package/references/multi-agent-protocol/docs-site/getting-started/index.md +98 -0
- package/references/multi-agent-protocol/docs-site/getting-started/installation.md +219 -0
- package/references/multi-agent-protocol/docs-site/getting-started/overview.md +172 -0
- package/references/multi-agent-protocol/docs-site/getting-started/quickstart.md +237 -0
- package/references/multi-agent-protocol/docs-site/index.md +136 -0
- package/references/multi-agent-protocol/docs-site/protocol/authentication.md +391 -0
- package/references/multi-agent-protocol/docs-site/protocol/connection-model.md +376 -0
- package/references/multi-agent-protocol/docs-site/protocol/design.md +284 -0
- package/references/multi-agent-protocol/docs-site/protocol/error-handling.md +312 -0
- package/references/multi-agent-protocol/docs-site/protocol/federation.md +449 -0
- package/references/multi-agent-protocol/docs-site/protocol/index.md +129 -0
- package/references/multi-agent-protocol/docs-site/protocol/permissions.md +398 -0
- package/references/multi-agent-protocol/docs-site/protocol/streaming.md +353 -0
- package/references/multi-agent-protocol/docs-site/protocol/wire-protocol.md +369 -0
- package/references/multi-agent-protocol/docs-site/sdk/api/agent.md +357 -0
- package/references/multi-agent-protocol/docs-site/sdk/api/client.md +380 -0
- package/references/multi-agent-protocol/docs-site/sdk/api/index.md +62 -0
- package/references/multi-agent-protocol/docs-site/sdk/api/server.md +453 -0
- package/references/multi-agent-protocol/docs-site/sdk/api/types.md +468 -0
- package/references/multi-agent-protocol/docs-site/sdk/guides/agent.md +375 -0
- package/references/multi-agent-protocol/docs-site/sdk/guides/authentication.md +405 -0
- package/references/multi-agent-protocol/docs-site/sdk/guides/client.md +352 -0
- package/references/multi-agent-protocol/docs-site/sdk/guides/index.md +89 -0
- package/references/multi-agent-protocol/docs-site/sdk/guides/server.md +360 -0
- package/references/multi-agent-protocol/docs-site/sdk/guides/testing.md +446 -0
- package/references/multi-agent-protocol/docs-site/sdk/guides/transports.md +363 -0
- package/references/multi-agent-protocol/docs-site/sdk/index.md +206 -0
- package/references/multi-agent-protocol/package-lock.json +3886 -0
- package/references/multi-agent-protocol/package.json +56 -0
- package/references/multi-agent-protocol/schema/meta.json +467 -0
- package/references/multi-agent-protocol/schema/schema.json +2558 -0
- package/src/acp/__tests__/history.test.ts +526 -0
- package/src/acp/__tests__/integration.test.ts +2 -1
- package/src/acp/index.ts +4 -0
- package/src/acp/macro-agent.ts +329 -85
- package/src/acp/types.ts +39 -2
- package/src/agent/__tests__/agent-manager.test.ts +67 -1
- package/src/agent/agent-manager.ts +10 -4
- package/src/cli/__tests__/stable-instance-id.test.ts +57 -0
- package/src/cli/acp.ts +17 -2
- package/src/map/adapter/acp-over-map.ts +57 -2
- package/src/store/event-store.ts +10 -3
- package/src/store/types/agents.ts +2 -0
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Permissions
|
|
3
|
+
parent: Protocol
|
|
4
|
+
nav_order: 7
|
|
5
|
+
description: "4-layer visibility and permission model"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Visibility & Permissions
|
|
9
|
+
{: .no_toc }
|
|
10
|
+
|
|
11
|
+
The 4-layer permission model controlling visibility and actions.
|
|
12
|
+
{: .fs-6 .fw-300 }
|
|
13
|
+
|
|
14
|
+
## Table of contents
|
|
15
|
+
{: .no_toc .text-delta }
|
|
16
|
+
|
|
17
|
+
1. TOC
|
|
18
|
+
{:toc}
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Design Principles
|
|
23
|
+
|
|
24
|
+
1. **Layered control** - Permissions are checked at multiple levels, most restrictive wins
|
|
25
|
+
2. **Explicit over implicit** - Default to restricted, explicitly grant access
|
|
26
|
+
3. **Separation of concerns** - Client permissions vs agent permissions are distinct
|
|
27
|
+
4. **Flexibility** - System implementations can choose how strict to be
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Visibility Layers
|
|
32
|
+
|
|
33
|
+
```mermaid
|
|
34
|
+
flowchart TB
|
|
35
|
+
subgraph Stack["Visibility Stack"]
|
|
36
|
+
L4["Layer 4: Agent Permissions<br/>What can this agent see/do?"]
|
|
37
|
+
L3["Layer 3: Scope Permissions<br/>What's visible in this scope?"]
|
|
38
|
+
L2["Layer 2: Client Permissions<br/>What can this client see/do?"]
|
|
39
|
+
L1["Layer 1: System Configuration<br/>What does the system expose?"]
|
|
40
|
+
|
|
41
|
+
L4 --> L3
|
|
42
|
+
L3 --> L2
|
|
43
|
+
L2 --> L1
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
Request["Request"] --> L4
|
|
47
|
+
L1 --> Result["Result: Most restrictive wins"]
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**Evaluation:** Check Layer 1 → Layer 2 → Layer 3 → Layer 4. All layers must allow.
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## Layer 1: System Configuration
|
|
55
|
+
|
|
56
|
+
Global system-level exposure settings:
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
interface MAPSystemConfig {
|
|
60
|
+
exposure: {
|
|
61
|
+
agents: {
|
|
62
|
+
publicByDefault: boolean;
|
|
63
|
+
publicAgents: string[]; // Always visible
|
|
64
|
+
hiddenAgents: string[]; // Never visible externally
|
|
65
|
+
};
|
|
66
|
+
events: {
|
|
67
|
+
exposedTypes: string[]; // Event types to expose
|
|
68
|
+
hiddenTypes: string[]; // Event types to hide
|
|
69
|
+
};
|
|
70
|
+
scopes: {
|
|
71
|
+
publicByDefault: boolean;
|
|
72
|
+
publicScopes: string[];
|
|
73
|
+
hiddenScopes: string[];
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
limits: {
|
|
78
|
+
maxConnections: number;
|
|
79
|
+
maxConnectionsPerClient: number;
|
|
80
|
+
maxSubscriptionsPerConnection: number;
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
// Permissions for unauthenticated connections
|
|
84
|
+
anonymousPermissions: MAPClientPermissions;
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Layer 2: Client Permissions
|
|
91
|
+
|
|
92
|
+
Per-client permissions granted during authentication:
|
|
93
|
+
|
|
94
|
+
```typescript
|
|
95
|
+
interface MAPClientPermissions {
|
|
96
|
+
visibility: {
|
|
97
|
+
// What can this client see?
|
|
98
|
+
agents: "all" | "none" | { include: string[] } | { roles: string[] };
|
|
99
|
+
scopes: "all" | "none" | { include: string[] };
|
|
100
|
+
events: "all" | "none" | { include: string[] };
|
|
101
|
+
structure: boolean; // Can see hierarchy/relationships
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
actions: {
|
|
105
|
+
// What can this client do?
|
|
106
|
+
sendMessages: boolean | { to: MAPAddress[]; priorities: string[] };
|
|
107
|
+
registerAgents: boolean | { roles: string[]; maxAgents: number };
|
|
108
|
+
unregisterAgents: boolean | { own: boolean; any: boolean };
|
|
109
|
+
createScopes: boolean;
|
|
110
|
+
deleteScopes: boolean | { own: boolean };
|
|
111
|
+
modifyScopes: boolean | { own: boolean; member: boolean };
|
|
112
|
+
steerAgents: boolean | { agents: string[]; methods: string[] };
|
|
113
|
+
federationConnect: boolean;
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
limits: {
|
|
117
|
+
subscriptions: number;
|
|
118
|
+
messagesPerMinute: number;
|
|
119
|
+
agentsRegistered: number;
|
|
120
|
+
scopesCreated: number;
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### Permission Presets
|
|
126
|
+
|
|
127
|
+
```typescript
|
|
128
|
+
// Observer: read-only access
|
|
129
|
+
const OBSERVER_PERMISSIONS: MAPClientPermissions = {
|
|
130
|
+
visibility: {
|
|
131
|
+
agents: "all",
|
|
132
|
+
scopes: "all",
|
|
133
|
+
events: "all",
|
|
134
|
+
structure: true
|
|
135
|
+
},
|
|
136
|
+
actions: {
|
|
137
|
+
sendMessages: false,
|
|
138
|
+
registerAgents: false,
|
|
139
|
+
unregisterAgents: false,
|
|
140
|
+
createScopes: false,
|
|
141
|
+
deleteScopes: false,
|
|
142
|
+
modifyScopes: false,
|
|
143
|
+
steerAgents: false,
|
|
144
|
+
federationConnect: false
|
|
145
|
+
},
|
|
146
|
+
limits: {
|
|
147
|
+
subscriptions: 10,
|
|
148
|
+
messagesPerMinute: 0,
|
|
149
|
+
agentsRegistered: 0,
|
|
150
|
+
scopesCreated: 0
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
// Operator: full access
|
|
155
|
+
const OPERATOR_PERMISSIONS: MAPClientPermissions = {
|
|
156
|
+
visibility: {
|
|
157
|
+
agents: "all",
|
|
158
|
+
scopes: "all",
|
|
159
|
+
events: "all",
|
|
160
|
+
structure: true
|
|
161
|
+
},
|
|
162
|
+
actions: {
|
|
163
|
+
sendMessages: true,
|
|
164
|
+
registerAgents: true,
|
|
165
|
+
unregisterAgents: { own: true, any: true },
|
|
166
|
+
createScopes: true,
|
|
167
|
+
deleteScopes: { own: true },
|
|
168
|
+
modifyScopes: { own: true, member: true },
|
|
169
|
+
steerAgents: true,
|
|
170
|
+
federationConnect: true
|
|
171
|
+
},
|
|
172
|
+
limits: {
|
|
173
|
+
subscriptions: 100,
|
|
174
|
+
messagesPerMinute: 1000,
|
|
175
|
+
agentsRegistered: 100,
|
|
176
|
+
scopesCreated: 50
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## Layer 3: Scope Permissions
|
|
184
|
+
|
|
185
|
+
Per-scope visibility and access control:
|
|
186
|
+
|
|
187
|
+
```typescript
|
|
188
|
+
interface MAPScopePermissions {
|
|
189
|
+
// Who can discover this scope exists?
|
|
190
|
+
discoverability: "public" | "members" | "owners";
|
|
191
|
+
|
|
192
|
+
// Who can see messages in this scope?
|
|
193
|
+
messageVisibility: "public" | "members" | "participants";
|
|
194
|
+
|
|
195
|
+
// Who can join this scope?
|
|
196
|
+
joinPolicy: "open" | "invite" | "owner-invite" | "closed";
|
|
197
|
+
|
|
198
|
+
// Who can send messages to this scope?
|
|
199
|
+
sendPolicy: "anyone" | "members" | "owners";
|
|
200
|
+
|
|
201
|
+
// Inherit from parent scope?
|
|
202
|
+
inheritFrom?: string;
|
|
203
|
+
}
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### Scope Examples
|
|
207
|
+
|
|
208
|
+
**Public channel:**
|
|
209
|
+
```typescript
|
|
210
|
+
{
|
|
211
|
+
discoverability: "public",
|
|
212
|
+
messageVisibility: "members",
|
|
213
|
+
joinPolicy: "open",
|
|
214
|
+
sendPolicy: "members"
|
|
215
|
+
}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
**Private room:**
|
|
219
|
+
```typescript
|
|
220
|
+
{
|
|
221
|
+
discoverability: "members",
|
|
222
|
+
messageVisibility: "members",
|
|
223
|
+
joinPolicy: "owner-invite",
|
|
224
|
+
sendPolicy: "members"
|
|
225
|
+
}
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
**Broadcast channel:**
|
|
229
|
+
```typescript
|
|
230
|
+
{
|
|
231
|
+
discoverability: "public",
|
|
232
|
+
messageVisibility: "public",
|
|
233
|
+
joinPolicy: "closed",
|
|
234
|
+
sendPolicy: "owners"
|
|
235
|
+
}
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## Layer 4: Agent Permissions
|
|
241
|
+
|
|
242
|
+
Individual agent visibility and capabilities:
|
|
243
|
+
|
|
244
|
+
```typescript
|
|
245
|
+
interface MAPAgentPermissions {
|
|
246
|
+
canSee: {
|
|
247
|
+
// What agents can this agent see?
|
|
248
|
+
agents: "all" | "hierarchy" | "scoped" | "direct" | { include: string[] };
|
|
249
|
+
|
|
250
|
+
// What scopes can this agent see?
|
|
251
|
+
scopes: "all" | "member" | { include: string[] };
|
|
252
|
+
|
|
253
|
+
// How much structure is visible?
|
|
254
|
+
structure: "full" | "local" | "none";
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
canMessage: {
|
|
258
|
+
// Who can this agent send messages to?
|
|
259
|
+
agents: "all" | "hierarchy" | "scoped" | { include: string[] };
|
|
260
|
+
scopes: "all" | "member" | { include: string[] };
|
|
261
|
+
};
|
|
262
|
+
|
|
263
|
+
acceptsFrom: {
|
|
264
|
+
// Who can send messages to this agent?
|
|
265
|
+
agents: "all" | "hierarchy" | "scoped" | { include: string[] };
|
|
266
|
+
clients: "all" | "none" | { include: string[] };
|
|
267
|
+
systems: "all" | "none" | { include: string[] };
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
capabilities: {
|
|
271
|
+
registerAgents: boolean;
|
|
272
|
+
createScopes: boolean;
|
|
273
|
+
steerAgents: boolean;
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
### Agent Visibility Modes
|
|
279
|
+
|
|
280
|
+
| Mode | Description |
|
|
281
|
+
|:-----|:------------|
|
|
282
|
+
| `all` | Can see all agents in the system |
|
|
283
|
+
| `hierarchy` | Can see parent, siblings, and descendants |
|
|
284
|
+
| `scoped` | Can see agents in shared scopes |
|
|
285
|
+
| `direct` | Can only see agents it directly interacts with |
|
|
286
|
+
|
|
287
|
+
---
|
|
288
|
+
|
|
289
|
+
## Permission Resolution
|
|
290
|
+
|
|
291
|
+
```typescript
|
|
292
|
+
function canPerformAction(
|
|
293
|
+
client: MAPClient,
|
|
294
|
+
agent: MAPAgent | null,
|
|
295
|
+
action: MAPAction
|
|
296
|
+
): boolean {
|
|
297
|
+
// Layer 1: System allows?
|
|
298
|
+
if (!systemAllows(action)) {
|
|
299
|
+
return false;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// Layer 2: Client permissions allow?
|
|
303
|
+
if (!clientAllows(client, action)) {
|
|
304
|
+
return false;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// Layer 3: Scope permissions allow?
|
|
308
|
+
if (action.scope && !scopeAllows(action.scope, client, agent, action)) {
|
|
309
|
+
return false;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
// Layer 4: Agent permissions allow?
|
|
313
|
+
if (agent && !agentAllows(agent, action)) {
|
|
314
|
+
return false;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
return true;
|
|
318
|
+
}
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
### Resolution Example
|
|
322
|
+
|
|
323
|
+
```
|
|
324
|
+
Client wants to send message to agent_B in scope_X:
|
|
325
|
+
|
|
326
|
+
Layer 1: System
|
|
327
|
+
✓ Messages enabled
|
|
328
|
+
✓ scope_X not hidden
|
|
329
|
+
|
|
330
|
+
Layer 2: Client
|
|
331
|
+
✓ sendMessages: true
|
|
332
|
+
✓ scope_X in visible scopes
|
|
333
|
+
|
|
334
|
+
Layer 3: Scope
|
|
335
|
+
✓ sendPolicy: "members"
|
|
336
|
+
✓ Client is member
|
|
337
|
+
|
|
338
|
+
Layer 4: Agent (agent_B)
|
|
339
|
+
✓ acceptsFrom.clients: "all"
|
|
340
|
+
|
|
341
|
+
Result: ALLOWED
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
---
|
|
345
|
+
|
|
346
|
+
## Dynamic Permissions
|
|
347
|
+
|
|
348
|
+
Permissions can change during runtime:
|
|
349
|
+
|
|
350
|
+
```typescript
|
|
351
|
+
// Server updates client permissions
|
|
352
|
+
{
|
|
353
|
+
"method": "map/permissions/update",
|
|
354
|
+
"params": {
|
|
355
|
+
"clientId": "client_001",
|
|
356
|
+
"permissions": {
|
|
357
|
+
"actions": {
|
|
358
|
+
"steerAgents": true
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
// Client receives notification
|
|
365
|
+
{
|
|
366
|
+
"method": "map/permissions.changed",
|
|
367
|
+
"params": {
|
|
368
|
+
"changes": {
|
|
369
|
+
"actions.steerAgents": {
|
|
370
|
+
"previous": false,
|
|
371
|
+
"current": true
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
---
|
|
379
|
+
|
|
380
|
+
## Security Considerations
|
|
381
|
+
|
|
382
|
+
{: .warning }
|
|
383
|
+
> Always follow the principle of least privilege. Grant only the minimum permissions required for the task.
|
|
384
|
+
|
|
385
|
+
### Best Practices
|
|
386
|
+
|
|
387
|
+
1. **Start restrictive** - Begin with minimal permissions, expand as needed
|
|
388
|
+
2. **Audit regularly** - Review granted permissions periodically
|
|
389
|
+
3. **Use scopes** - Isolate sensitive operations in restricted scopes
|
|
390
|
+
4. **Layer defense** - Don't rely on a single permission layer
|
|
391
|
+
5. **Log access** - Record permission checks for security auditing
|
|
392
|
+
|
|
393
|
+
---
|
|
394
|
+
|
|
395
|
+
## Next Steps
|
|
396
|
+
|
|
397
|
+
- [Federation](./federation.html) - Cross-system permissions
|
|
398
|
+
- [Authentication](./authentication.html) - How permissions are granted
|