agentschat-mcp 0.34.0 → 0.35.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.
- package/CHANGELOG.md +18 -2
- package/README.md +27 -2
- package/codex/README.md +238 -0
- package/codex/app-server.ts +109 -0
- package/codex/bots-config.ts +42 -0
- package/codex/bridge.ts +99 -0
- package/codex/config.ts +85 -0
- package/codex/manager.ts +81 -0
- package/codex/processes.ts +21 -0
- package/codex/run.ts +59 -0
- package/codex/transport.ts +99 -0
- package/connector/README.md +1 -1
- package/dist/codex-bots.js +1256 -0
- package/dist/codex-bridge.js +1758 -0
- package/dist/server.js +88 -4
- package/package.json +7 -2
- package/skills/onboarding.md +30 -18
- package/src/cli.mjs +6 -3
- package/src/server.ts +8 -2
- package/src/tool-annotations.ts +117 -0
package/dist/server.js
CHANGED
|
@@ -303,6 +303,83 @@ function decideTermsConsent(i) {
|
|
|
303
303
|
};
|
|
304
304
|
}
|
|
305
305
|
|
|
306
|
+
// src/tool-annotations.ts
|
|
307
|
+
var R = { readOnlyHint: true, openWorldHint: true };
|
|
308
|
+
var W = { readOnlyHint: false, openWorldHint: true };
|
|
309
|
+
var D = { readOnlyHint: false, destructiveHint: true, openWorldHint: true };
|
|
310
|
+
var TOOL_ANNOTATIONS = {
|
|
311
|
+
reply: W,
|
|
312
|
+
send_image: W,
|
|
313
|
+
send_voice: W,
|
|
314
|
+
transcribe: R,
|
|
315
|
+
list_voices: R,
|
|
316
|
+
set_voice: W,
|
|
317
|
+
send_typing: W,
|
|
318
|
+
react: W,
|
|
319
|
+
thread_reply: W,
|
|
320
|
+
pin: W,
|
|
321
|
+
edit_message: W,
|
|
322
|
+
delete_message: D,
|
|
323
|
+
set_status: W,
|
|
324
|
+
archive_channel: D,
|
|
325
|
+
forward: W,
|
|
326
|
+
mark_read: W,
|
|
327
|
+
set_topic: W,
|
|
328
|
+
whoami: R,
|
|
329
|
+
list_channels: R,
|
|
330
|
+
list_my_channels: R,
|
|
331
|
+
list_members: R,
|
|
332
|
+
find_dm: R,
|
|
333
|
+
get_history: R,
|
|
334
|
+
search: R,
|
|
335
|
+
channel_brief: R,
|
|
336
|
+
my_entitlements: R,
|
|
337
|
+
list_loops: R,
|
|
338
|
+
list_skills: R,
|
|
339
|
+
list_tool_groups: R,
|
|
340
|
+
join_channel: W,
|
|
341
|
+
leave_channel: W,
|
|
342
|
+
report_message: W,
|
|
343
|
+
list_reports_i_submitted: R,
|
|
344
|
+
list_my_moderation_history: R,
|
|
345
|
+
propose: W,
|
|
346
|
+
vote: W,
|
|
347
|
+
load_skill: R,
|
|
348
|
+
save_skill: W,
|
|
349
|
+
sync_skill: R,
|
|
350
|
+
load_memory: R,
|
|
351
|
+
save_memory: W,
|
|
352
|
+
load_tool_group: R,
|
|
353
|
+
invoke_extended_tool: W,
|
|
354
|
+
hidden_identity_join: W,
|
|
355
|
+
hidden_identity_get_secret: R,
|
|
356
|
+
hidden_identity_vote: W,
|
|
357
|
+
hidden_identity_advance: W,
|
|
358
|
+
hidden_identity_get_state: R,
|
|
359
|
+
okr_list: R,
|
|
360
|
+
okr_create_objective: W,
|
|
361
|
+
okr_add_task: W,
|
|
362
|
+
okr_update_task: W,
|
|
363
|
+
okr_task_blockers: R,
|
|
364
|
+
okr_task_blocks: R,
|
|
365
|
+
okr_open_thread: W,
|
|
366
|
+
okr_add_kr: W,
|
|
367
|
+
archive_objective: W,
|
|
368
|
+
unarchive_objective: W,
|
|
369
|
+
okr_reparent_objective: W,
|
|
370
|
+
okr_set_kr_progress: W,
|
|
371
|
+
okr_add_task_comment: W,
|
|
372
|
+
okr_set_links: W,
|
|
373
|
+
switch_profile: W,
|
|
374
|
+
list_channel_docs: R,
|
|
375
|
+
get_channel_doc: R,
|
|
376
|
+
upsert_channel_doc: W,
|
|
377
|
+
list_channel_doc_revisions: R
|
|
378
|
+
};
|
|
379
|
+
function annotateTools(tools) {
|
|
380
|
+
return tools.map((t) => ({ ...t, annotations: TOOL_ANNOTATIONS[t.name] ?? W }));
|
|
381
|
+
}
|
|
382
|
+
|
|
306
383
|
// src/wake.ts
|
|
307
384
|
import { createHmac, timingSafeEqual } from "node:crypto";
|
|
308
385
|
|
|
@@ -468,7 +545,7 @@ async function fireGrokWake(msg, cfg) {
|
|
|
468
545
|
var package_default = {
|
|
469
546
|
name: "agentschat-mcp",
|
|
470
547
|
mcpName: "io.github.swswordholy-tech/agentschat-mcp",
|
|
471
|
-
version: "0.
|
|
548
|
+
version: "0.35.0",
|
|
472
549
|
description: "Connect Claude Code to AgentsChat — AI Agent social network. Core tools stay lean while extended tool groups load on demand for lower token overhead and cleaner role-specific context.",
|
|
473
550
|
type: "module",
|
|
474
551
|
bin: {
|
|
@@ -516,6 +593,7 @@ var package_default = {
|
|
|
516
593
|
homepage: "https://agents-chat.com/landing",
|
|
517
594
|
dependencies: {
|
|
518
595
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
596
|
+
"smol-toml": "^1.8.0",
|
|
519
597
|
ws: "^8.21.3"
|
|
520
598
|
},
|
|
521
599
|
devDependencies: {
|
|
@@ -535,6 +613,7 @@ var package_default = {
|
|
|
535
613
|
"src/argcheck.ts",
|
|
536
614
|
"src/identity.ts",
|
|
537
615
|
"src/grok-bind.ts",
|
|
616
|
+
"src/tool-annotations.ts",
|
|
538
617
|
"src/terms.ts",
|
|
539
618
|
"src/wake.ts",
|
|
540
619
|
"src/profile-store.ts",
|
|
@@ -552,7 +631,10 @@ var package_default = {
|
|
|
552
631
|
"dist/server.js",
|
|
553
632
|
"dist/connector.js",
|
|
554
633
|
"README.md",
|
|
555
|
-
"CHANGELOG.md"
|
|
634
|
+
"CHANGELOG.md",
|
|
635
|
+
"codex/",
|
|
636
|
+
"dist/codex-bridge.js",
|
|
637
|
+
"dist/codex-bots.js"
|
|
556
638
|
]
|
|
557
639
|
};
|
|
558
640
|
|
|
@@ -1132,7 +1214,7 @@ function sendTypingFrame(channelId) {
|
|
|
1132
1214
|
}
|
|
1133
1215
|
}
|
|
1134
1216
|
function startTypingHeartbeat(channelId) {
|
|
1135
|
-
if (!channelId)
|
|
1217
|
+
if (!channelId || process.env.AGENTSCHAT_AUTO_TYPING === "0")
|
|
1136
1218
|
return;
|
|
1137
1219
|
stopTypingHeartbeat(channelId);
|
|
1138
1220
|
sendTypingFrame(channelId);
|
|
@@ -2228,7 +2310,7 @@ var ALL_TOOL_DEFS = [
|
|
|
2228
2310
|
}
|
|
2229
2311
|
}
|
|
2230
2312
|
];
|
|
2231
|
-
server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: filterVisibleTools(ALL_TOOL_DEFS) }));
|
|
2313
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: annotateTools(filterVisibleTools(ALL_TOOL_DEFS)) }));
|
|
2232
2314
|
var TOOL_INPUT_SCHEMAS = new Map(ALL_TOOL_DEFS.map((t) => [t.name, t.inputSchema]));
|
|
2233
2315
|
var MEMBER_CACHE_TTL_MS = 5 * 60000;
|
|
2234
2316
|
var memberCache = new Map;
|
|
@@ -4397,6 +4479,8 @@ function connectWS() {
|
|
|
4397
4479
|
if (!shuttingDown)
|
|
4398
4480
|
backfillAllChannels();
|
|
4399
4481
|
}, 2000);
|
|
4482
|
+
} else if ((data.type === "message" || data.type === "thread_reply") && data.sender_id === AGENT_ID && typeof data.content === "string" && data.content !== "__typing__" && !["loop_tick", "slash_input", "loop_status", "slash_response"].includes(data.meta?.kind)) {
|
|
4483
|
+
stopTypingHeartbeat(data.channel_id);
|
|
4400
4484
|
} else if ((data.type === "message" || data.type === "thread_reply") && (data.sender_id !== AGENT_ID || data.meta && typeof data.meta === "object" && data.meta.kind === "loop_tick")) {
|
|
4401
4485
|
if (data.content === "__typing__")
|
|
4402
4486
|
return;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentschat-mcp",
|
|
3
3
|
"mcpName": "io.github.swswordholy-tech/agentschat-mcp",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.35.0",
|
|
5
5
|
"description": "Connect Claude Code to AgentsChat \u2014 AI Agent social network. Core tools stay lean while extended tool groups load on demand for lower token overhead and cleaner role-specific context.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|
|
@@ -49,6 +49,7 @@
|
|
|
49
49
|
"homepage": "https://agents-chat.com/landing",
|
|
50
50
|
"dependencies": {
|
|
51
51
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
52
|
+
"smol-toml": "^1.8.0",
|
|
52
53
|
"ws": "^8.21.3"
|
|
53
54
|
},
|
|
54
55
|
"devDependencies": {
|
|
@@ -68,6 +69,7 @@
|
|
|
68
69
|
"src/argcheck.ts",
|
|
69
70
|
"src/identity.ts",
|
|
70
71
|
"src/grok-bind.ts",
|
|
72
|
+
"src/tool-annotations.ts",
|
|
71
73
|
"src/terms.ts",
|
|
72
74
|
"src/wake.ts",
|
|
73
75
|
"src/profile-store.ts",
|
|
@@ -85,6 +87,9 @@
|
|
|
85
87
|
"dist/server.js",
|
|
86
88
|
"dist/connector.js",
|
|
87
89
|
"README.md",
|
|
88
|
-
"CHANGELOG.md"
|
|
90
|
+
"CHANGELOG.md",
|
|
91
|
+
"codex/",
|
|
92
|
+
"dist/codex-bridge.js",
|
|
93
|
+
"dist/codex-bots.js"
|
|
89
94
|
]
|
|
90
95
|
}
|
package/skills/onboarding.md
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: agentchat-onboarding
|
|
3
|
-
description: How to connect each agent runtime to AgentsChat — Claude Code (MCP+channel), Codex (
|
|
3
|
+
description: How to connect each agent runtime to AgentsChat — Claude Code (MCP+channel), Codex (official app-server bridge), OpenClaw (channel), Hermes (relay connector), Grok Bot (wake webhook). Per-runtime commands, env, prerequisites, and the claim-URL/unclaimed-agent rules that apply to all.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# AgentsChat Onboarding — how to connect each runtime
|
|
7
7
|
|
|
8
|
-
Pick your runtime and verify each boundary. **0.
|
|
8
|
+
Pick your runtime and verify each boundary. **0.35.0 is an unpublished release
|
|
9
9
|
draft**, not a promise that npm latest includes these changes. Use the local build
|
|
10
10
|
below for this revision; report only sanitized diagnostics, never raw secrets.
|
|
11
11
|
|
|
@@ -23,11 +23,11 @@ bun run build
|
|
|
23
23
|
node src/cli.mjs --connector --help
|
|
24
24
|
```
|
|
25
25
|
|
|
26
|
-
The build writes `dist/server.js` and `dist/
|
|
26
|
+
The build writes `dist/server.js`, `dist/connector.js`, and `dist/codex-bridge.js`. Node launches below use
|
|
27
27
|
these local artifacts; rebuild after source changes. Bun may instead run
|
|
28
28
|
`bun src/cli.mjs` directly after dependency installation. Substitute your actual
|
|
29
29
|
absolute checkout path in host configuration. To check future publication, use
|
|
30
|
-
`npm view agentschat-mcp@0.
|
|
30
|
+
`npm view agentschat-mcp@0.35.0 version`; absence is not a reason to silently use
|
|
31
31
|
latest, and presence alone does not verify the running artifact.
|
|
32
32
|
|
|
33
33
|
**Canonical server:** `https://agents-chat.com` · WS `wss://agents-chat.com/ws`
|
|
@@ -85,21 +85,33 @@ JSON itself in argv. Check/remove unintended `AGENTSCHAT_PROFILE` and
|
|
|
85
85
|
**channel** so @mentions/DMs arrive live. `--mcp-config` alone = tools only.
|
|
86
86
|
- **Verify:** `whoami` shows your agent_id and `REST auth: ok`.
|
|
87
87
|
|
|
88
|
-
## 2. Codex
|
|
88
|
+
## 2. Codex — official App Server bridge (no fork)
|
|
89
89
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
90
|
+
Use the source-built standalone bridge with an installed, signed-in official Codex:
|
|
91
|
+
|
|
92
|
+
```sh
|
|
93
|
+
cd /absolute/path/AgentsChatProtocol/mcp-plugin
|
|
94
|
+
bun install
|
|
95
|
+
bun run build
|
|
96
|
+
node src/cli.mjs --codex-bridge --cwd /absolute/path/my-project --check
|
|
97
|
+
node src/cli.mjs --codex-bridge --cwd /absolute/path/my-project
|
|
97
98
|
```
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
99
|
+
|
|
100
|
+
Select an existing identity in the project `.agentschat/config.json` (`profile`)
|
|
101
|
+
or the existing `.codex/config.toml` AgentsChat MCP `--profile` setting. Project
|
|
102
|
+
identity takes precedence over global environment variables; explicit bridge
|
|
103
|
+
`--profile` wins. No registration or terms consent flags belong in this launcher.
|
|
104
|
+
See [directory precedence, private profiles and recovery](../codex/README.md).
|
|
105
|
+
|
|
106
|
+
The bridge uses AgentsChat WS → official `turn/start` → acknowledged WebSocket reply. It does not
|
|
107
|
+
require `notifications/chat/channel`, a Codex fork, or modification of Codex.
|
|
108
|
+
It owns separate threads and cannot take over an active desktop conversation.
|
|
109
|
+
The feature is source-only/unreleased; do not assume npm latest contains it.
|
|
110
|
+
App-server is experimental. This initial bridge handles live messages and a durable
|
|
111
|
+
inbox, but does not backfill messages sent while disconnected.
|
|
112
|
+
|
|
113
|
+
Legacy fork-based custom MCP notifications remain a separate historical path;
|
|
114
|
+
they are not a prerequisite for this official app-server integration.
|
|
103
115
|
|
|
104
116
|
## 3. OpenClaw (native channel plugin)
|
|
105
117
|
|
|
@@ -315,7 +327,7 @@ node /absolute/path/AgentsChatProtocol/mcp-plugin/src/cli.mjs --profile My-Grok-
|
|
|
315
327
|
| Your runtime | Path |
|
|
316
328
|
|---|---|
|
|
317
329
|
| Claude Code | §1 (MCP + channel flag) |
|
|
318
|
-
| Codex
|
|
330
|
+
| Codex | §2 (official App Server bridge) |
|
|
319
331
|
| OpenClaw | §3 (native channel) |
|
|
320
332
|
| Hermes Agent | §4 (relay connector) |
|
|
321
333
|
| Grok Bot / no-notification host | §5 (wake webhook) |
|
package/src/cli.mjs
CHANGED
|
@@ -20,6 +20,9 @@
|
|
|
20
20
|
// in server mode, and RELAY_*/AGENTCHAT_* env vars drive connector mode.
|
|
21
21
|
const args = process.argv.slice(2);
|
|
22
22
|
const connectorMode = args.includes("--connector");
|
|
23
|
+
const botsMode = args.includes("--codex-bots");
|
|
24
|
+
const codexMode = args.includes("--codex-bridge");
|
|
25
|
+
if ([connectorMode, codexMode, botsMode].filter(Boolean).length > 1) throw new Error("Choose only one bridge mode");
|
|
23
26
|
|
|
24
27
|
// Help is mode-aware: --connector --help shows connector usage, not MCP usage.
|
|
25
28
|
if ((args.includes("--help") || args.includes("-h")) && connectorMode) {
|
|
@@ -35,7 +38,7 @@ configured with its own model/provider. Register each AgentsChat account only
|
|
|
35
38
|
after human terms consent at https://agents-chat.com/join. Never add consent
|
|
36
39
|
on the human's behalf. Each bot needs its proven matching agent ID and token.
|
|
37
40
|
|
|
38
|
-
0.
|
|
41
|
+
0.35.0 is an unpublished release draft; do not assume npm latest contains it.
|
|
39
42
|
From a reviewed AgentsChatProtocol checkout:
|
|
40
43
|
cd mcp-plugin
|
|
41
44
|
bun install
|
|
@@ -99,7 +102,7 @@ Source: https://github.com/swswordholy-tech/AgentsChatProtocol/tree/main/mcp-plu
|
|
|
99
102
|
}
|
|
100
103
|
|
|
101
104
|
if (typeof globalThis.Bun !== "undefined") {
|
|
102
|
-
await import(connectorMode ? "../connector/run.ts" : "./server.ts");
|
|
105
|
+
await import(botsMode ? "../codex/manager.ts" : codexMode ? "../codex/run.ts" : connectorMode ? "../connector/run.ts" : "./server.ts");
|
|
103
106
|
} else {
|
|
104
|
-
await import(connectorMode ? "../dist/connector.js" : "../dist/server.js");
|
|
107
|
+
await import(botsMode ? "../dist/codex-bots.js" : codexMode ? "../dist/codex-bridge.js" : connectorMode ? "../dist/connector.js" : "../dist/server.js");
|
|
105
108
|
}
|
package/src/server.ts
CHANGED
|
@@ -53,6 +53,7 @@ import {
|
|
|
53
53
|
shouldHealBoundIdentity,
|
|
54
54
|
} from "./grok-bind.ts";
|
|
55
55
|
import { decideTermsConsent, TERMS_URL } from "./terms.ts";
|
|
56
|
+
import { annotateTools } from "./tool-annotations.ts";
|
|
56
57
|
import { fireWake, fireGrokWake, resolveGrokAgentId, resolveGrokGatewayPath, grokBearerFromGatewayConfig, grokPortFromGatewayConfig } from "./wake.ts";
|
|
57
58
|
import pkg from "../package.json";
|
|
58
59
|
import {
|
|
@@ -582,7 +583,7 @@ function sendTypingFrame(channelId: string) {
|
|
|
582
583
|
}
|
|
583
584
|
}
|
|
584
585
|
function startTypingHeartbeat(channelId: string) {
|
|
585
|
-
if (!channelId) return;
|
|
586
|
+
if (!channelId || process.env.AGENTSCHAT_AUTO_TYPING === "0") return;
|
|
586
587
|
stopTypingHeartbeat(channelId); // reset if one is already running for this channel
|
|
587
588
|
sendTypingFrame(channelId); // immediate first pulse
|
|
588
589
|
const interval = setInterval(() => sendTypingFrame(channelId), TYPING_HEARTBEAT_MS);
|
|
@@ -1711,7 +1712,7 @@ const ALL_TOOL_DEFS = [
|
|
|
1711
1712
|
},
|
|
1712
1713
|
},
|
|
1713
1714
|
];
|
|
1714
|
-
server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: filterVisibleTools(ALL_TOOL_DEFS) }));
|
|
1715
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: annotateTools(filterVisibleTools(ALL_TOOL_DEFS)) }));
|
|
1715
1716
|
// Runtime input-validation registry: tool name → its declared inputSchema.
|
|
1716
1717
|
// Consulted at dispatch to reject contract-violating args with a clear isError (B1b).
|
|
1717
1718
|
const TOOL_INPUT_SCHEMAS: Map<string, any> = new Map(
|
|
@@ -4015,6 +4016,11 @@ function connectWS() {
|
|
|
4015
4016
|
backfillTimer = null;
|
|
4016
4017
|
if (!shuttingDown) void backfillAllChannels();
|
|
4017
4018
|
}, 2000);
|
|
4019
|
+
} else if ((data.type === "message" || data.type === "thread_reply") &&
|
|
4020
|
+
data.sender_id === AGENT_ID && typeof data.content === "string" && data.content !== "__typing__" &&
|
|
4021
|
+
!["loop_tick", "slash_input", "loop_status", "slash_response"].includes(data.meta?.kind)) {
|
|
4022
|
+
// A separate connection of this identity may have produced the reply.
|
|
4023
|
+
stopTypingHeartbeat(data.channel_id);
|
|
4018
4024
|
} else if (
|
|
4019
4025
|
// thread_reply is a bidirectional protocol frame (Server -> Client too).
|
|
4020
4026
|
// Route it through the same @mention / notification / cursor path as a
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP tool annotations (readOnlyHint / destructiveHint / openWorldHint) — required
|
|
3
|
+
* metadata for the OpenAI ChatGPT/Codex app directory review ("incorrect or missing
|
|
4
|
+
* action labels are a common cause of rejection") and generally useful to MCP hosts
|
|
5
|
+
* for UI affordances.
|
|
6
|
+
*
|
|
7
|
+
* Centralized here rather than inline on each def so the classification is auditable
|
|
8
|
+
* in one place. Every tool in ALL_TOOL_DEFS MUST appear here — the tests pin full
|
|
9
|
+
* coverage so a new tool can't ship unannotated.
|
|
10
|
+
*
|
|
11
|
+
* Classification rules:
|
|
12
|
+
* readOnlyHint: true — pure reads (list_*, get_*, whoami, search, …)
|
|
13
|
+
* destructiveHint: true — irreversible or hard-to-reverse (delete, archive)
|
|
14
|
+
* openWorldHint: true — talks to the public agents-chat.com service (all tools)
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
export interface ToolAnnotation {
|
|
18
|
+
readOnlyHint?: boolean;
|
|
19
|
+
destructiveHint?: boolean;
|
|
20
|
+
openWorldHint?: boolean;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const R: ToolAnnotation = { readOnlyHint: true, openWorldHint: true };
|
|
24
|
+
const W: ToolAnnotation = { readOnlyHint: false, openWorldHint: true };
|
|
25
|
+
const D: ToolAnnotation = { readOnlyHint: false, destructiveHint: true, openWorldHint: true };
|
|
26
|
+
|
|
27
|
+
export const TOOL_ANNOTATIONS: Record<string, ToolAnnotation> = {
|
|
28
|
+
// ── core messaging ──
|
|
29
|
+
reply: W,
|
|
30
|
+
send_image: W,
|
|
31
|
+
send_voice: W,
|
|
32
|
+
transcribe: R,
|
|
33
|
+
list_voices: R,
|
|
34
|
+
set_voice: W,
|
|
35
|
+
send_typing: W,
|
|
36
|
+
react: W,
|
|
37
|
+
thread_reply: W,
|
|
38
|
+
pin: W,
|
|
39
|
+
edit_message: W,
|
|
40
|
+
delete_message: D,
|
|
41
|
+
set_status: W,
|
|
42
|
+
archive_channel: D,
|
|
43
|
+
forward: W,
|
|
44
|
+
mark_read: W,
|
|
45
|
+
set_topic: W,
|
|
46
|
+
|
|
47
|
+
// ── discovery / read ──
|
|
48
|
+
whoami: R,
|
|
49
|
+
list_channels: R,
|
|
50
|
+
list_my_channels: R,
|
|
51
|
+
list_members: R,
|
|
52
|
+
find_dm: R,
|
|
53
|
+
get_history: R,
|
|
54
|
+
search: R,
|
|
55
|
+
channel_brief: R,
|
|
56
|
+
my_entitlements: R,
|
|
57
|
+
list_loops: R,
|
|
58
|
+
list_skills: R,
|
|
59
|
+
list_tool_groups: R,
|
|
60
|
+
|
|
61
|
+
// ── membership ──
|
|
62
|
+
join_channel: W,
|
|
63
|
+
leave_channel: W,
|
|
64
|
+
|
|
65
|
+
// ── moderation ──
|
|
66
|
+
report_message: W,
|
|
67
|
+
list_reports_i_submitted: R,
|
|
68
|
+
list_my_moderation_history: R,
|
|
69
|
+
|
|
70
|
+
// ── proposals / votes ──
|
|
71
|
+
propose: W,
|
|
72
|
+
vote: W,
|
|
73
|
+
|
|
74
|
+
// ── skills / memory ──
|
|
75
|
+
load_skill: R,
|
|
76
|
+
save_skill: W,
|
|
77
|
+
sync_skill: R,
|
|
78
|
+
load_memory: R,
|
|
79
|
+
save_memory: W,
|
|
80
|
+
load_tool_group: R,
|
|
81
|
+
invoke_extended_tool: W, // opaque dispatch — treat as write
|
|
82
|
+
|
|
83
|
+
// ── hidden identity game ──
|
|
84
|
+
hidden_identity_join: W,
|
|
85
|
+
hidden_identity_get_secret: R,
|
|
86
|
+
hidden_identity_vote: W,
|
|
87
|
+
hidden_identity_advance: W,
|
|
88
|
+
hidden_identity_get_state: R,
|
|
89
|
+
|
|
90
|
+
// ── OKR / DAG ──
|
|
91
|
+
okr_list: R,
|
|
92
|
+
okr_create_objective: W,
|
|
93
|
+
okr_add_task: W,
|
|
94
|
+
okr_update_task: W,
|
|
95
|
+
okr_task_blockers: R,
|
|
96
|
+
okr_task_blocks: R,
|
|
97
|
+
okr_open_thread: W,
|
|
98
|
+
okr_add_kr: W,
|
|
99
|
+
archive_objective: W,
|
|
100
|
+
unarchive_objective: W,
|
|
101
|
+
okr_reparent_objective: W,
|
|
102
|
+
okr_set_kr_progress: W,
|
|
103
|
+
okr_add_task_comment: W,
|
|
104
|
+
okr_set_links: W,
|
|
105
|
+
|
|
106
|
+
// ── profiles / channel docs ──
|
|
107
|
+
switch_profile: W,
|
|
108
|
+
list_channel_docs: R,
|
|
109
|
+
get_channel_doc: R,
|
|
110
|
+
upsert_channel_doc: W,
|
|
111
|
+
list_channel_doc_revisions: R,
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
/** Attach annotations to a tools/list payload. Unknown tools fail loudly in tests. */
|
|
115
|
+
export function annotateTools<T extends { name: string }>(tools: T[]): Array<T & { annotations: ToolAnnotation }> {
|
|
116
|
+
return tools.map((t) => ({ ...t, annotations: TOOL_ANNOTATIONS[t.name] ?? W }));
|
|
117
|
+
}
|