ScuttleBot

feat: add operator agent type for human users

lmata 2026-03-31 13:05 trunk
Commit 98cb896b9b596a6c5c714c2ebaaf84e75f5307854f9999ca3bbc27743b885890
--- internal/api/ui/index.html
+++ internal/api/ui/index.html
@@ -38,10 +38,11 @@
3838
th { text-align: left; padding: 8px 12px; font-size: 11px; text-transform: uppercase; letter-spacing: 0.06em; color: #8b949e; border-bottom: 1px solid #21262d; }
3939
td { padding: 10px 12px; border-bottom: 1px solid #21262d; color: #e6edf3; vertical-align: top; }
4040
tr:last-child td { border-bottom: none; }
4141
tr:hover td { background: #1c2128; }
4242
.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; }
4344
.tag.type-orchestrator { background: #8957e522; border-color: #8957e544; color: #d2a8ff; }
4445
.tag.type-worker { background: #1f6feb22; border-color: #1f6feb44; color: #79c0ff; }
4546
.tag.type-observer { background: #21262d; border-color: #30363d; color: #8b949e; }
4647
.tag.revoked { background: #f8514922; border-color: #f8514944; color: #ff7b72; }
4748
.actions { display: flex; gap: 6px; flex-wrap: wrap; }
@@ -132,10 +133,11 @@
132133
<input type="text" id="reg-nick" placeholder="my-agent-01" required>
133134
</div>
134135
<div>
135136
<label>type</label>
136137
<select id="reg-type">
138
+ <option value="operator">operator — human, +o + full permissions</option>
137139
<option value="worker">worker — gets +v in channels</option>
138140
<option value="orchestrator">orchestrator — gets +o in channels</option>
139141
<option value="observer">observer — read-only</option>
140142
</select>
141143
</div>
142144
--- 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
--- internal/mcp/mcp.go
+++ internal/mcp/mcp.go
@@ -365,11 +365,11 @@
365365
{
366366
"name": "register_agent",
367367
"description": "Register a new agent and receive IRC credentials.",
368368
"inputSchema": schema(map[string]any{
369369
"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."),
371371
"channels": map[string]any{
372372
"type": "array",
373373
"description": "Channels to join on connect.",
374374
"items": map[string]any{"type": "string"},
375375
},
376376
--- 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 @@
1818
1919
// AgentType describes an agent's role and authority level.
2020
type AgentType string
2121
2222
const (
23
+ AgentTypeOperator AgentType = "operator" // human operator — +o + full permissions
2324
AgentTypeOrchestrator AgentType = "orchestrator" // +o in channels
2425
AgentTypeWorker AgentType = "worker" // +v in channels
2526
AgentTypeObserver AgentType = "observer" // no special mode
2627
)
2728
2829
--- 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

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button