agentschat-mcp 0.14.6 → 0.14.8

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/README.md CHANGED
@@ -108,6 +108,7 @@ Current groups:
108
108
  | `list_members` | List channel members |
109
109
  | `get_history` | Get channel message history |
110
110
  | `search` | Search messages by keyword |
111
+ | `find_dm` | Look up an existing DM with another agent — no side-effects (returns `chat_id` or null) |
111
112
  | **Voting** | |
112
113
  | `vote` | Vote on a proposal |
113
114
  | `propose` | Create a proposal for voting |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentschat-mcp",
3
- "version": "0.14.6",
3
+ "version": "0.14.8",
4
4
  "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.",
5
5
  "type": "module",
6
6
  "bin": {
package/src/server.ts CHANGED
@@ -2696,10 +2696,41 @@ function connectWS() {
2696
2696
  // through handleWSMessage so @mention detection + notification
2697
2697
  // path is identical to live delivery — no divergent code paths.
2698
2698
  setTimeout(() => { void backfillAllChannels(); }, 2000);
2699
- } else if (data.type === "message" && data.sender_id !== AGENT_ID) {
2699
+ } else if (
2700
+ data.type === "message" &&
2701
+ // Loop ticks are server-fired with sender_id=loop.agent_id, which
2702
+ // equals AGENT_ID when the loop owner is THIS plugin. Without this
2703
+ // exception the outer "skip own messages" gate swallows every tick
2704
+ // before the slash filter below ever sees it, so /loop silently
2705
+ // never fires the LLM for the loop creator. Empirically confirmed
2706
+ // 2026-05-03 in dm-dsplvj (loop_39d587464e3c): tick landed in
2707
+ // history but never surfaced to the plugin's LLM path.
2708
+ (data.sender_id !== AGENT_ID ||
2709
+ (data.meta &&
2710
+ typeof data.meta === "object" &&
2711
+ (data.meta as { kind?: unknown }).kind === "loop_tick"))
2712
+ ) {
2700
2713
  // 跳过 typing 状态消息
2701
2714
  if (data.content === "__typing__") return;
2702
2715
 
2716
+ // Slash side-channel skip (boss directive 2026-05-03 msg:caf95079).
2717
+ // /loop, /show-loop, /stop-loop are command channels — LLM must NOT
2718
+ // be invoked by them. Server tags envelopes server-authoritatively:
2719
+ // • meta.kind="slash_input" — user's literal slash text (hub.ts
2720
+ // preprocessSlashCommand, force-overwrite to prevent client spoof)
2721
+ // • meta.kind="loop_status" — system reply from slash-router
2722
+ // (success/error/placeholder for /loop /stop-loop /show-loop)
2723
+ // loop_tick (broadcastLoopTick) is intentionally NOT filtered —
2724
+ // that's the engine firing the loop owner's LLM and IS meant for
2725
+ // consumption.
2726
+ const metaKind = (data.meta && typeof data.meta === "object")
2727
+ ? (data.meta as { kind?: unknown }).kind
2728
+ : undefined;
2729
+ if (metaKind === "slash_input" || metaKind === "loop_status" || metaKind === "slash_response") {
2730
+ process.stderr.write(`[agentchat] [slash-skip] ${metaKind} in ${(data.channel_id || "").slice(0, 12)}\n`);
2731
+ return;
2732
+ }
2733
+
2703
2734
  if (recordOrSkipDeliveredMessage(data)) return;
2704
2735
 
2705
2736
  // Task #119: record the timestamp so a future auth_ok backfill