ScuttleBot
feat: add operator agent type for human users
Commit
98cb896b9b596a6c5c714c2ebaaf84e75f5307854f9999ca3bbc27743b885890
Parent
21649aaf9e30737…
3 files changed
+2
+1
-1
+1
| --- internal/api/ui/index.html | ||
| +++ internal/api/ui/index.html | ||
| @@ -38,10 +38,11 @@ | ||
| 38 | 38 | th { text-align: left; padding: 8px 12px; font-size: 11px; text-transform: uppercase; letter-spacing: 0.06em; color: #8b949e; border-bottom: 1px solid #21262d; } |
| 39 | 39 | td { padding: 10px 12px; border-bottom: 1px solid #21262d; color: #e6edf3; vertical-align: top; } |
| 40 | 40 | tr:last-child td { border-bottom: none; } |
| 41 | 41 | tr:hover td { background: #1c2128; } |
| 42 | 42 | .tag { display: inline-block; background: #1f6feb22; border: 1px solid #1f6feb44; color: #79c0ff; border-radius: 4px; padding: 1px 6px; font-size: 11px; margin: 1px; } |
| 43 | + .tag.type-operator { background: #db613622; border-color: #db613644; color: #ffa657; } | |
| 43 | 44 | .tag.type-orchestrator { background: #8957e522; border-color: #8957e544; color: #d2a8ff; } |
| 44 | 45 | .tag.type-worker { background: #1f6feb22; border-color: #1f6feb44; color: #79c0ff; } |
| 45 | 46 | .tag.type-observer { background: #21262d; border-color: #30363d; color: #8b949e; } |
| 46 | 47 | .tag.revoked { background: #f8514922; border-color: #f8514944; color: #ff7b72; } |
| 47 | 48 | .actions { display: flex; gap: 6px; flex-wrap: wrap; } |
| @@ -132,10 +133,11 @@ | ||
| 132 | 133 | <input type="text" id="reg-nick" placeholder="my-agent-01" required> |
| 133 | 134 | </div> |
| 134 | 135 | <div> |
| 135 | 136 | <label>type</label> |
| 136 | 137 | <select id="reg-type"> |
| 138 | + <option value="operator">operator — human, +o + full permissions</option> | |
| 137 | 139 | <option value="worker">worker — gets +v in channels</option> |
| 138 | 140 | <option value="orchestrator">orchestrator — gets +o in channels</option> |
| 139 | 141 | <option value="observer">observer — read-only</option> |
| 140 | 142 | </select> |
| 141 | 143 | </div> |
| 142 | 144 |
| --- internal/api/ui/index.html | |
| +++ internal/api/ui/index.html | |
| @@ -38,10 +38,11 @@ | |
| 38 | th { text-align: left; padding: 8px 12px; font-size: 11px; text-transform: uppercase; letter-spacing: 0.06em; color: #8b949e; border-bottom: 1px solid #21262d; } |
| 39 | td { padding: 10px 12px; border-bottom: 1px solid #21262d; color: #e6edf3; vertical-align: top; } |
| 40 | tr:last-child td { border-bottom: none; } |
| 41 | tr:hover td { background: #1c2128; } |
| 42 | .tag { display: inline-block; background: #1f6feb22; border: 1px solid #1f6feb44; color: #79c0ff; border-radius: 4px; padding: 1px 6px; font-size: 11px; margin: 1px; } |
| 43 | .tag.type-orchestrator { background: #8957e522; border-color: #8957e544; color: #d2a8ff; } |
| 44 | .tag.type-worker { background: #1f6feb22; border-color: #1f6feb44; color: #79c0ff; } |
| 45 | .tag.type-observer { background: #21262d; border-color: #30363d; color: #8b949e; } |
| 46 | .tag.revoked { background: #f8514922; border-color: #f8514944; color: #ff7b72; } |
| 47 | .actions { display: flex; gap: 6px; flex-wrap: wrap; } |
| @@ -132,10 +133,11 @@ | |
| 132 | <input type="text" id="reg-nick" placeholder="my-agent-01" required> |
| 133 | </div> |
| 134 | <div> |
| 135 | <label>type</label> |
| 136 | <select id="reg-type"> |
| 137 | <option value="worker">worker — gets +v in channels</option> |
| 138 | <option value="orchestrator">orchestrator — gets +o in channels</option> |
| 139 | <option value="observer">observer — read-only</option> |
| 140 | </select> |
| 141 | </div> |
| 142 |
| --- internal/api/ui/index.html | |
| +++ internal/api/ui/index.html | |
| @@ -38,10 +38,11 @@ | |
| 38 | th { text-align: left; padding: 8px 12px; font-size: 11px; text-transform: uppercase; letter-spacing: 0.06em; color: #8b949e; border-bottom: 1px solid #21262d; } |
| 39 | td { padding: 10px 12px; border-bottom: 1px solid #21262d; color: #e6edf3; vertical-align: top; } |
| 40 | tr:last-child td { border-bottom: none; } |
| 41 | tr:hover td { background: #1c2128; } |
| 42 | .tag { display: inline-block; background: #1f6feb22; border: 1px solid #1f6feb44; color: #79c0ff; border-radius: 4px; padding: 1px 6px; font-size: 11px; margin: 1px; } |
| 43 | .tag.type-operator { background: #db613622; border-color: #db613644; color: #ffa657; } |
| 44 | .tag.type-orchestrator { background: #8957e522; border-color: #8957e544; color: #d2a8ff; } |
| 45 | .tag.type-worker { background: #1f6feb22; border-color: #1f6feb44; color: #79c0ff; } |
| 46 | .tag.type-observer { background: #21262d; border-color: #30363d; color: #8b949e; } |
| 47 | .tag.revoked { background: #f8514922; border-color: #f8514944; color: #ff7b72; } |
| 48 | .actions { display: flex; gap: 6px; flex-wrap: wrap; } |
| @@ -132,10 +133,11 @@ | |
| 133 | <input type="text" id="reg-nick" placeholder="my-agent-01" required> |
| 134 | </div> |
| 135 | <div> |
| 136 | <label>type</label> |
| 137 | <select id="reg-type"> |
| 138 | <option value="operator">operator — human, +o + full permissions</option> |
| 139 | <option value="worker">worker — gets +v in channels</option> |
| 140 | <option value="orchestrator">orchestrator — gets +o in channels</option> |
| 141 | <option value="observer">observer — read-only</option> |
| 142 | </select> |
| 143 | </div> |
| 144 |
+1
-1
| --- internal/mcp/mcp.go | ||
| +++ internal/mcp/mcp.go | ||
| @@ -365,11 +365,11 @@ | ||
| 365 | 365 | { |
| 366 | 366 | "name": "register_agent", |
| 367 | 367 | "description": "Register a new agent and receive IRC credentials.", |
| 368 | 368 | "inputSchema": schema(map[string]any{ |
| 369 | 369 | "nick": prop("string", "The agent's IRC nick (unique identifier)."), |
| 370 | - "type": prop("string", "Agent type: worker, orchestrator, or observer. Default: worker."), | |
| 370 | + "type": prop("string", "Agent type: operator, worker, orchestrator, or observer. Default: worker."), | |
| 371 | 371 | "channels": map[string]any{ |
| 372 | 372 | "type": "array", |
| 373 | 373 | "description": "Channels to join on connect.", |
| 374 | 374 | "items": map[string]any{"type": "string"}, |
| 375 | 375 | }, |
| 376 | 376 |
| --- internal/mcp/mcp.go | |
| +++ internal/mcp/mcp.go | |
| @@ -365,11 +365,11 @@ | |
| 365 | { |
| 366 | "name": "register_agent", |
| 367 | "description": "Register a new agent and receive IRC credentials.", |
| 368 | "inputSchema": schema(map[string]any{ |
| 369 | "nick": prop("string", "The agent's IRC nick (unique identifier)."), |
| 370 | "type": prop("string", "Agent type: worker, orchestrator, or observer. Default: worker."), |
| 371 | "channels": map[string]any{ |
| 372 | "type": "array", |
| 373 | "description": "Channels to join on connect.", |
| 374 | "items": map[string]any{"type": "string"}, |
| 375 | }, |
| 376 |
| --- internal/mcp/mcp.go | |
| +++ internal/mcp/mcp.go | |
| @@ -365,11 +365,11 @@ | |
| 365 | { |
| 366 | "name": "register_agent", |
| 367 | "description": "Register a new agent and receive IRC credentials.", |
| 368 | "inputSchema": schema(map[string]any{ |
| 369 | "nick": prop("string", "The agent's IRC nick (unique identifier)."), |
| 370 | "type": prop("string", "Agent type: operator, worker, orchestrator, or observer. Default: worker."), |
| 371 | "channels": map[string]any{ |
| 372 | "type": "array", |
| 373 | "description": "Channels to join on connect.", |
| 374 | "items": map[string]any{"type": "string"}, |
| 375 | }, |
| 376 |
| --- internal/registry/registry.go | ||
| +++ internal/registry/registry.go | ||
| @@ -18,10 +18,11 @@ | ||
| 18 | 18 | |
| 19 | 19 | // AgentType describes an agent's role and authority level. |
| 20 | 20 | type AgentType string |
| 21 | 21 | |
| 22 | 22 | const ( |
| 23 | + AgentTypeOperator AgentType = "operator" // human operator — +o + full permissions | |
| 23 | 24 | AgentTypeOrchestrator AgentType = "orchestrator" // +o in channels |
| 24 | 25 | AgentTypeWorker AgentType = "worker" // +v in channels |
| 25 | 26 | AgentTypeObserver AgentType = "observer" // no special mode |
| 26 | 27 | ) |
| 27 | 28 | |
| 28 | 29 |
| --- internal/registry/registry.go | |
| +++ internal/registry/registry.go | |
| @@ -18,10 +18,11 @@ | |
| 18 | |
| 19 | // AgentType describes an agent's role and authority level. |
| 20 | type AgentType string |
| 21 | |
| 22 | const ( |
| 23 | AgentTypeOrchestrator AgentType = "orchestrator" // +o in channels |
| 24 | AgentTypeWorker AgentType = "worker" // +v in channels |
| 25 | AgentTypeObserver AgentType = "observer" // no special mode |
| 26 | ) |
| 27 | |
| 28 |
| --- internal/registry/registry.go | |
| +++ internal/registry/registry.go | |
| @@ -18,10 +18,11 @@ | |
| 18 | |
| 19 | // AgentType describes an agent's role and authority level. |
| 20 | type AgentType string |
| 21 | |
| 22 | const ( |
| 23 | AgentTypeOperator AgentType = "operator" // human operator — +o + full permissions |
| 24 | AgentTypeOrchestrator AgentType = "orchestrator" // +o in channels |
| 25 | AgentTypeWorker AgentType = "worker" // +v in channels |
| 26 | AgentTypeObserver AgentType = "observer" // no special mode |
| 27 | ) |
| 28 | |
| 29 |