@studiomopoke/crosschat 1.8.2 → 2.0.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.
Files changed (82) hide show
  1. package/README.md +48 -118
  2. package/bin/cli.cjs +37 -57
  3. package/crosschat.md +73 -104
  4. package/dashboard/dist/assets/index-BY-IQhma.js +49 -0
  5. package/dashboard/dist/assets/index-CI8v9PKQ.css +1 -0
  6. package/dashboard/dist/index.html +2 -2
  7. package/dist/hub/_hub-section-1-infra.d.ts +8 -0
  8. package/dist/hub/_hub-section-1-infra.d.ts.map +1 -0
  9. package/dist/hub/_hub-section-1-infra.js +152 -0
  10. package/dist/hub/_hub-section-1-infra.js.map +1 -0
  11. package/dist/hub/_hub-section-2-handlers.d.ts +2 -0
  12. package/dist/hub/_hub-section-2-handlers.d.ts.map +1 -0
  13. package/dist/hub/_hub-section-2-handlers.js +514 -0
  14. package/dist/hub/_hub-section-2-handlers.js.map +1 -0
  15. package/dist/hub/_hub-section-3-rest.d.ts +2 -0
  16. package/dist/hub/_hub-section-3-rest.d.ts.map +1 -0
  17. package/dist/hub/_hub-section-3-rest.js +418 -0
  18. package/dist/hub/_hub-section-3-rest.js.map +1 -0
  19. package/dist/hub/_hub-section-4-ws.d.ts +2 -0
  20. package/dist/hub/_hub-section-4-ws.d.ts.map +1 -0
  21. package/dist/hub/_hub-section-4-ws.js +367 -0
  22. package/dist/hub/_hub-section-4-ws.js.map +1 -0
  23. package/dist/hub/agent-connection.d.ts +38 -62
  24. package/dist/hub/agent-connection.d.ts.map +1 -1
  25. package/dist/hub/agent-connection.js +146 -229
  26. package/dist/hub/agent-connection.js.map +1 -1
  27. package/dist/hub/hub-server.d.ts +1 -1
  28. package/dist/hub/hub-server.d.ts.map +1 -1
  29. package/dist/hub/hub-server.js +389 -685
  30. package/dist/hub/hub-server.js.map +1 -1
  31. package/dist/hub/message-manager.d.ts +158 -0
  32. package/dist/hub/message-manager.d.ts.map +1 -0
  33. package/dist/hub/message-manager.js +443 -0
  34. package/dist/hub/message-manager.js.map +1 -0
  35. package/dist/hub/protocol.d.ts +73 -131
  36. package/dist/hub/protocol.d.ts.map +1 -1
  37. package/dist/hub/protocol.js +3 -0
  38. package/dist/hub/protocol.js.map +1 -1
  39. package/dist/lifecycle.d.ts.map +1 -1
  40. package/dist/lifecycle.js +15 -89
  41. package/dist/lifecycle.js.map +1 -1
  42. package/dist/server.d.ts.map +1 -1
  43. package/dist/server.js +22 -33
  44. package/dist/server.js.map +1 -1
  45. package/dist/tools/add-badge.d.ts +4 -0
  46. package/dist/tools/add-badge.d.ts.map +1 -0
  47. package/dist/tools/add-badge.js +29 -0
  48. package/dist/tools/add-badge.js.map +1 -0
  49. package/dist/tools/claim-task.js +5 -5
  50. package/dist/tools/claim-task.js.map +1 -1
  51. package/dist/tools/clear-session.d.ts +1 -2
  52. package/dist/tools/clear-session.d.ts.map +1 -1
  53. package/dist/tools/clear-session.js +7 -22
  54. package/dist/tools/clear-session.js.map +1 -1
  55. package/dist/tools/flag-as-task.d.ts +4 -0
  56. package/dist/tools/flag-as-task.d.ts.map +1 -0
  57. package/dist/tools/flag-as-task.js +31 -0
  58. package/dist/tools/flag-as-task.js.map +1 -0
  59. package/dist/tools/get-messages.d.ts +2 -1
  60. package/dist/tools/get-messages.d.ts.map +1 -1
  61. package/dist/tools/get-messages.js +19 -6
  62. package/dist/tools/get-messages.js.map +1 -1
  63. package/dist/tools/list-peers.d.ts.map +1 -1
  64. package/dist/tools/list-peers.js +1 -4
  65. package/dist/tools/list-peers.js.map +1 -1
  66. package/dist/tools/resolve-task.d.ts +4 -0
  67. package/dist/tools/resolve-task.d.ts.map +1 -0
  68. package/dist/tools/resolve-task.js +29 -0
  69. package/dist/tools/resolve-task.js.map +1 -0
  70. package/dist/tools/send-message.d.ts.map +1 -1
  71. package/dist/tools/send-message.js +6 -5
  72. package/dist/tools/send-message.js.map +1 -1
  73. package/dist/tools/set-status.js +3 -3
  74. package/dist/tools/set-status.js.map +1 -1
  75. package/dist/tools/wait-for-messages.js +1 -1
  76. package/dist/tools/wait-for-messages.js.map +1 -1
  77. package/dist/types.d.ts +4 -3
  78. package/dist/types.d.ts.map +1 -1
  79. package/hooks/permission-hook.sh +19 -18
  80. package/package.json +1 -1
  81. package/dashboard/dist/assets/index-BR-2rRm6.css +0 -1
  82. package/dashboard/dist/assets/index-Ci2ihChN.js +0 -49
package/dist/server.js CHANGED
@@ -7,43 +7,40 @@ import { registerGetMessages } from './tools/get-messages.js';
7
7
  import { registerWaitForMessages } from './tools/wait-for-messages.js';
8
8
  import { registerListPeers } from './tools/list-peers.js';
9
9
  import { registerSetStatus } from './tools/set-status.js';
10
- import { registerJoinRoom } from './tools/join-room.js';
11
- import { registerCreateRoom } from './tools/create-room.js';
12
- import { registerDelegateTask } from './tools/delegate-task.js';
13
10
  import { registerClaimTask } from './tools/claim-task.js';
14
- import { registerAcceptClaim } from './tools/accept-claim.js';
15
- import { registerUpdateTask } from './tools/update-task.js';
16
- import { registerCompleteTask } from './tools/complete-task.js';
17
- import { registerListTasks } from './tools/list-tasks.js';
18
- import { registerGetTaskStatus } from './tools/get-task-status.js';
11
+ import { registerFlagAsTask } from './tools/flag-as-task.js';
12
+ import { registerResolveTask } from './tools/resolve-task.js';
13
+ import { registerAddBadge } from './tools/add-badge.js';
19
14
  import { registerClearSession } from './tools/clear-session.js';
20
- import { registerGetRoomDigest } from './tools/get-room-digest.js';
21
- import { registerRequestDigest } from './tools/request-digest.js';
22
15
  import { registerPrompts } from './prompts.js';
23
16
  const SERVER_INSTRUCTIONS = `\
24
17
  CrossChat connects you to other Claude Code instances on this machine through a central hub server. \
25
- All communication happens through rooms you are in one room at a time (default: "general").
18
+ All communication happens through a single channel. Messages are persistent and support threads.
26
19
 
27
20
  Your identity: **{peerName}** (peer ID: {peerId}). You are automatically registered and discoverable.
28
21
 
29
22
  ## @mentions
30
23
  \`@agent-name\` delivers only to that agent. \`@here\` broadcasts to everyone. No mention = broadcast to all.
31
24
 
32
- ## Task lifecycle
33
- Tasks follow: **delegate -> claim -> accept -> update -> complete**
25
+ ## Messages & Threads
26
+ Messages are the atomic unit. Reply to any message to start a thread. Threads persist across sessions.
27
+
28
+ ## Badges
29
+ Messages carry badges — extensible metadata rendered as visual badges in the dashboard. Badge types include: task status, importance, question, git-commit, project, permission.
30
+
31
+ ## Tasks
32
+ Any message can be flagged as a task: **send message -> flag_as_task -> claim_task -> resolve_task**
34
33
 
35
34
  ## Dashboard
36
35
  {dashboardInfo}
37
36
 
38
37
  ## Key rules
39
38
  - Use \`list_peers\` to discover peer IDs — never guess UUIDs.
40
- - All messaging is room-basedno direct P2P messaging.
41
- - Check a peer's status before delegating — don't send work to busy peers.
39
+ - Check a peer's status before assigning work don't send work to busy peers.
42
40
  - Set yourself to "busy" when working on a task, "available" when done.
43
- - Tasks are persistent and survive hub restarts. Messages are ephemeral.
44
- - Rooms are capped at 200 messages. Old messages are digested automatically via the task system.
45
- - Use \`get_room_digest\` when joining a room to catch up on prior discussion.
41
+ - Messages persist across hub restarts. Threads persist indefinitely.
46
42
  - Tag messages with \`importance\`: "important", "comment" (default), or "chitchat".
43
+ - Use \`add_badge\` to annotate messages with metadata (importance, question, etc.).
47
44
 
48
45
  For full usage instructions, the user should run the /crosschat command.`;
49
46
  export function createMcpServer(peerId, peerName, messageStore, agentConnection, dashboardInfo) {
@@ -65,27 +62,19 @@ export function createMcpServer(peerId, peerName, messageStore, agentConnection,
65
62
  }, { instructions });
66
63
  // --- Messaging tools ---
67
64
  registerSendMessage(server, agentConnection);
68
- registerGetMessages(server, messageStore);
65
+ registerGetMessages(server, messageStore, agentConnection);
69
66
  registerWaitForMessages(server, messageStore);
70
67
  // --- Peer tools ---
71
68
  registerListPeers(server, agentConnection);
72
69
  registerSetStatus(server, agentConnection);
73
- // --- Room tools ---
74
- registerJoinRoom(server, agentConnection);
75
- registerCreateRoom(server, agentConnection);
76
- // --- Session tools ---
77
- registerClearSession(server, agentConnection, messageStore);
78
- // --- Digest tools ---
79
- registerGetRoomDigest(server, agentConnection);
80
- registerRequestDigest(server, agentConnection);
81
70
  // --- Task tools ---
82
- registerDelegateTask(server, agentConnection);
71
+ registerFlagAsTask(server, agentConnection);
83
72
  registerClaimTask(server, agentConnection);
84
- registerAcceptClaim(server, agentConnection);
85
- registerUpdateTask(server, agentConnection);
86
- registerCompleteTask(server, agentConnection);
87
- registerListTasks(server, agentConnection);
88
- registerGetTaskStatus(server, agentConnection);
73
+ registerResolveTask(server, agentConnection);
74
+ // --- Badge tools ---
75
+ registerAddBadge(server, agentConnection);
76
+ // --- Session tools ---
77
+ registerClearSession(server, agentConnection);
89
78
  // --- Prompts ---
90
79
  registerPrompts(server, peerId, peerName);
91
80
  return server;
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAG9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yEA6B6C,CAAC;AAE1E,MAAM,UAAU,eAAe,CAC7B,MAAc,EACd,QAAgB,EAChB,YAA0B,EAC1B,eAAgC,EAChC,aAAmD;IAEnD,IAAI,gBAAwB,CAAC;IAC7B,IAAI,MAAM,IAAI,aAAa,EAAE,CAAC;QAC5B,gBAAgB,GAAG,+BAA+B,aAAa,CAAC,IAAI,EAAE,CAAC;IACzE,CAAC;SAAM,CAAC;QACN,gBAAgB,GAAG,oBAAoB,aAAa,CAAC,KAAK,EAAE,CAAC;IAC/D,CAAC;IAED,MAAM,YAAY,GAAG,mBAAmB;SACrC,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC;SAC/B,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC;SAC3B,OAAO,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;IAEhD,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;QACE,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,WAAW,EAAE,uFAAuF;KACrG,EACD,EAAE,YAAY,EAAE,CACjB,CAAC;IAEF,0BAA0B;IAC1B,mBAAmB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC7C,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC;IAC3D,uBAAuB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAE9C,qBAAqB;IACrB,iBAAiB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC3C,iBAAiB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAE3C,qBAAqB;IACrB,kBAAkB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC5C,iBAAiB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC3C,mBAAmB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAE7C,sBAAsB;IACtB,gBAAgB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAE1C,wBAAwB;IACxB,oBAAoB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAE9C,kBAAkB;IAClB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAE1C,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { AgentConnection } from '../hub/agent-connection.js';
3
+ export declare function registerAddBadge(server: McpServer, agentConnection: AgentConnection): void;
4
+ //# sourceMappingURL=add-badge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-badge.d.ts","sourceRoot":"","sources":["../../src/tools/add-badge.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAElE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,eAAe,GAAG,IAAI,CA+B1F"}
@@ -0,0 +1,29 @@
1
+ import { z } from 'zod';
2
+ export function registerAddBadge(server, agentConnection) {
3
+ server.tool('add_badge', 'Add a metadata badge to any message. Badges provide at-a-glance context — importance, question, git commit, project, etc. Rendered as visual badges in the dashboard.', {
4
+ messageId: z.string().describe('The messageId to add a badge to'),
5
+ badgeType: z.string().describe('Badge type (e.g., "importance", "question", "git-commit", "project")'),
6
+ badgeValue: z.string().describe('Badge value (e.g., "high", "true", "abc1234", "crosschat")'),
7
+ label: z.string().optional().describe('Optional human-readable display label'),
8
+ }, async ({ messageId, badgeType, badgeValue, label }) => {
9
+ try {
10
+ const result = await agentConnection.addBadge(messageId, badgeType, badgeValue, label);
11
+ return {
12
+ content: [
13
+ {
14
+ type: 'text',
15
+ text: JSON.stringify({ added: true, messageId: result.messageId, badge: result.badge }),
16
+ },
17
+ ],
18
+ };
19
+ }
20
+ catch (err) {
21
+ const message = err instanceof Error ? err.message : 'Unknown error';
22
+ return {
23
+ content: [{ type: 'text', text: JSON.stringify({ error: `Failed to add badge: ${message}` }) }],
24
+ isError: true,
25
+ };
26
+ }
27
+ });
28
+ }
29
+ //# sourceMappingURL=add-badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-badge.js","sourceRoot":"","sources":["../../src/tools/add-badge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,eAAgC;IAClF,MAAM,CAAC,IAAI,CACT,WAAW,EACX,uKAAuK,EACvK;QACE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;QACjE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sEAAsE,CAAC;QACtG,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4DAA4D,CAAC;QAC7F,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;KAC/E,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE;QACpD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;YAEvF,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;qBACxF;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACrE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,wBAAwB,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;gBACxG,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1,15 +1,15 @@
1
1
  import { z } from 'zod';
2
2
  export function registerClaimTask(server, agentConnection) {
3
- server.tool('claim_task', 'Claim an open task. The task creator will be notified of your bid and must accept it before you can start working.', {
4
- taskId: z.string().describe('The ID of the task to claim (from list_tasks or a task announcement in the room)'),
5
- }, async ({ taskId }) => {
3
+ server.tool('claim_task', 'Claim a task that has been flagged on a message. First-come-first-served the hub rejects duplicate claims.', {
4
+ messageId: z.string().describe('The messageId of the flagged task message to claim'),
5
+ }, async ({ messageId }) => {
6
6
  try {
7
- await agentConnection.claimTask(taskId);
7
+ const result = await agentConnection.claimTask(messageId);
8
8
  return {
9
9
  content: [
10
10
  {
11
11
  type: 'text',
12
- text: JSON.stringify({ claimed: true, taskId }),
12
+ text: JSON.stringify({ claimed: true, messageId: result.messageId }),
13
13
  },
14
14
  ],
15
15
  };
@@ -1 +1 @@
1
- {"version":3,"file":"claim-task.js","sourceRoot":"","sources":["../../src/tools/claim-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,iBAAiB,CAAC,MAAiB,EAAE,eAAgC;IACnF,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,oHAAoH,EACpH;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kFAAkF,CAAC;KAChH,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,IAAI,CAAC;YACH,MAAM,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAExC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;qBAChD;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACrE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,yBAAyB,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;gBACzG,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"claim-task.js","sourceRoot":"","sources":["../../src/tools/claim-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,iBAAiB,CAAC,MAAiB,EAAE,eAAgC;IACnF,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,8GAA8G,EAC9G;QACE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;KACrF,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QACtB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAE1D,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;qBACrE;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACrE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,yBAAyB,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;gBACzG,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1,5 +1,4 @@
1
1
  import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
2
  import type { AgentConnection } from '../hub/agent-connection.js';
3
- import type { MessageStore } from '../stores/message-store.js';
4
- export declare function registerClearSession(server: McpServer, agentConnection: AgentConnection, messageStore: MessageStore): void;
3
+ export declare function registerClearSession(server: McpServer, agentConnection: AgentConnection): void;
5
4
  //# sourceMappingURL=clear-session.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"clear-session.d.ts","sourceRoot":"","sources":["../../src/tools/clear-session.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE/D,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,eAAe,EAAE,eAAe,EAChC,YAAY,EAAE,YAAY,GACzB,IAAI,CA4CN"}
1
+ {"version":3,"file":"clear-session.d.ts","sourceRoot":"","sources":["../../src/tools/clear-session.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAElE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,eAAe,GAAG,IAAI,CA4B9F"}
@@ -1,28 +1,15 @@
1
1
  import { z } from 'zod';
2
- export function registerClearSession(server, agentConnection, messageStore) {
3
- server.tool('clear_session', 'Clear messages from your current room and optionally archive completed tasks. Also clears your local message buffer.', {
4
- messages: z
5
- .boolean()
6
- .optional()
7
- .describe('Clear messages from the current room (default: true)'),
8
- tasks: z
9
- .boolean()
10
- .optional()
11
- .describe('Archive completed/failed tasks in the current room (default: false)'),
12
- }, async ({ messages, tasks }) => {
2
+ export function registerClearSession(server, agentConnection) {
3
+ server.tool('clear_session', 'Clear messages from the channel.', {
4
+ messages: z.boolean().optional().describe('Clear messages from channel (default: true)'),
5
+ }, async ({ messages }) => {
13
6
  try {
14
- const result = await agentConnection.clearSession({ messages, tasks });
15
- // Clear local message store as well
16
- messageStore.clear();
7
+ const result = await agentConnection.clearSession({ messages });
17
8
  return {
18
9
  content: [
19
10
  {
20
11
  type: 'text',
21
- text: JSON.stringify({
22
- cleared: true,
23
- messagesCleared: result.messagesCleared,
24
- tasksArchived: result.tasksArchived,
25
- }),
12
+ text: JSON.stringify(result),
26
13
  },
27
14
  ],
28
15
  };
@@ -30,9 +17,7 @@ export function registerClearSession(server, agentConnection, messageStore) {
30
17
  catch (err) {
31
18
  const message = err instanceof Error ? err.message : 'Unknown error';
32
19
  return {
33
- content: [
34
- { type: 'text', text: JSON.stringify({ error: `Failed to clear session: ${message}` }) },
35
- ],
20
+ content: [{ type: 'text', text: JSON.stringify({ error: `Failed to clear session: ${message}` }) }],
36
21
  isError: true,
37
22
  };
38
23
  }
@@ -1 +1 @@
1
- {"version":3,"file":"clear-session.js","sourceRoot":"","sources":["../../src/tools/clear-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,MAAM,UAAU,oBAAoB,CAClC,MAAiB,EACjB,eAAgC,EAChC,YAA0B;IAE1B,MAAM,CAAC,IAAI,CACT,eAAe,EACf,sHAAsH,EACtH;QACE,QAAQ,EAAE,CAAC;aACR,OAAO,EAAE;aACT,QAAQ,EAAE;aACV,QAAQ,CAAC,sDAAsD,CAAC;QACnE,KAAK,EAAE,CAAC;aACL,OAAO,EAAE;aACT,QAAQ,EAAE;aACV,QAAQ,CAAC,qEAAqE,CAAC;KACnF,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE;QAC5B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;YAEvE,oCAAoC;YACpC,YAAY,CAAC,KAAK,EAAE,CAAC;YAErB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,OAAO,EAAE,IAAI;4BACb,eAAe,EAAE,MAAM,CAAC,eAAe;4BACvC,aAAa,EAAE,MAAM,CAAC,aAAa;yBACpC,CAAC;qBACH;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACrE,OAAO;gBACL,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,4BAA4B,OAAO,EAAE,EAAE,CAAC,EAAE;iBAClG;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"clear-session.js","sourceRoot":"","sources":["../../src/tools/clear-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,eAAgC;IACtF,MAAM,CAAC,IAAI,CACT,eAAe,EACf,kCAAkC,EAClC;QACE,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;KACzF,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;YAEhE,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;qBAC7B;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACrE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,4BAA4B,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;gBAC5G,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { AgentConnection } from '../hub/agent-connection.js';
3
+ export declare function registerFlagAsTask(server: McpServer, agentConnection: AgentConnection): void;
4
+ //# sourceMappingURL=flag-as-task.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flag-as-task.d.ts","sourceRoot":"","sources":["../../src/tools/flag-as-task.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAElE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,eAAe,GAAG,IAAI,CAiC5F"}
@@ -0,0 +1,31 @@
1
+ import { z } from 'zod';
2
+ export function registerFlagAsTask(server, agentConnection) {
3
+ server.tool('flag_as_task', 'Promote any message to a tracked task. Adds a task badge to the message and enters the delegation cycle. Other agents can then claim it.', {
4
+ messageId: z.string().describe('The messageId of the message to flag as a task'),
5
+ filter: z.object({
6
+ agentId: z.string().optional().describe('Target a specific agent by peer ID'),
7
+ workingDirReq: z.string().optional().describe('Require agents working in this directory'),
8
+ gitProject: z.string().optional().describe('Require agents working on this git project'),
9
+ }).optional().describe('Optional filter for which agents can claim this task'),
10
+ }, async ({ messageId, filter }) => {
11
+ try {
12
+ const result = await agentConnection.flagTask(messageId, filter);
13
+ return {
14
+ content: [
15
+ {
16
+ type: 'text',
17
+ text: JSON.stringify({ flagged: true, messageId: result.messageId, badges: result.badges }),
18
+ },
19
+ ],
20
+ };
21
+ }
22
+ catch (err) {
23
+ const message = err instanceof Error ? err.message : 'Unknown error';
24
+ return {
25
+ content: [{ type: 'text', text: JSON.stringify({ error: `Failed to flag as task: ${message}` }) }],
26
+ isError: true,
27
+ };
28
+ }
29
+ });
30
+ }
31
+ //# sourceMappingURL=flag-as-task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flag-as-task.js","sourceRoot":"","sources":["../../src/tools/flag-as-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,eAAgC;IACpF,MAAM,CAAC,IAAI,CACT,cAAc,EACd,0IAA0I,EAC1I;QACE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;QAChF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACf,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;YAC7E,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;YACzF,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;SACzF,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sDAAsD,CAAC;KAC/E,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE;QAC9B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAEjE,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;qBAC5F;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACrE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,2BAA2B,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;gBAC3G,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
2
  import type { MessageStore } from '../stores/message-store.js';
3
- export declare function registerGetMessages(server: McpServer, messageStore: MessageStore): void;
3
+ import type { AgentConnection } from '../hub/agent-connection.js';
4
+ export declare function registerGetMessages(server: McpServer, messageStore: MessageStore, agentConnection: AgentConnection): void;
4
5
  //# sourceMappingURL=get-messages.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-messages.d.ts","sourceRoot":"","sources":["../../src/tools/get-messages.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE/D,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,GAAG,IAAI,CAsCvF"}
1
+ {"version":3,"file":"get-messages.d.ts","sourceRoot":"","sources":["../../src/tools/get-messages.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAElE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,GAAG,IAAI,CAoDzH"}
@@ -1,16 +1,29 @@
1
1
  import { z } from 'zod';
2
- export function registerGetMessages(server, messageStore) {
3
- server.tool('get_messages', 'Get messages from your current room. Returns messages received since you joined.', {
2
+ export function registerGetMessages(server, messageStore, agentConnection) {
3
+ server.tool('get_messages', 'Get messages from the channel or a thread. Returns messages with badges for at-a-glance context. Use threadId to read replies in a thread.', {
4
+ threadId: z.string().optional().describe('If set, fetch messages from this thread (the threadId is the messageId of the root message). Omit to get channel messages.'),
4
5
  limit: z.number().optional().describe('Maximum number of messages to return (default: all)'),
5
- unreadOnly: z.boolean().optional().describe('If true, only return unread messages'),
6
- markAsRead: z.boolean().optional().describe('Whether to mark returned messages as read (default: true). Set to false to peek without consuming.'),
7
- }, async ({ limit, unreadOnly, markAsRead }) => {
6
+ unreadOnly: z.boolean().optional().describe('If true, only return unread messages (channel only)'),
7
+ markAsRead: z.boolean().optional().describe('Whether to mark returned messages as read (default: true, channel only)'),
8
+ }, async ({ threadId, limit, unreadOnly, markAsRead }) => {
8
9
  try {
10
+ if (threadId) {
11
+ // Fetch thread messages from hub via AgentConnection
12
+ const messages = await agentConnection.getMessages({ threadId, limit });
13
+ return {
14
+ content: [
15
+ {
16
+ type: 'text',
17
+ text: JSON.stringify({ messages, count: messages.length, threadId }, null, 2),
18
+ },
19
+ ],
20
+ };
21
+ }
22
+ // Channel messages from local MessageStore
9
23
  const messages = messageStore.getAll({
10
24
  limit,
11
25
  unreadOnly,
12
26
  });
13
- // Mark as read by default
14
27
  if (markAsRead !== false && messages.length > 0) {
15
28
  messageStore.markAsRead(messages.map((m) => m.messageId));
16
29
  }
@@ -1 +1 @@
1
- {"version":3,"file":"get-messages.js","sourceRoot":"","sources":["../../src/tools/get-messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,YAA0B;IAC/E,MAAM,CAAC,IAAI,CACT,cAAc,EACd,kFAAkF,EAClF;QACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;QAC5F,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;QACnF,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oGAAoG,CAAC;KAClJ,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE;QAC1C,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC;gBACnC,KAAK;gBACL,UAAU;aACX,CAAC,CAAC;YAEH,0BAA0B;YAC1B,IAAI,UAAU,KAAK,KAAK,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChD,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;YAC5D,CAAC;YAED,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;qBACpE;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACrE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,2BAA2B,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;gBAC3G,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"get-messages.js","sourceRoot":"","sources":["../../src/tools/get-messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,YAA0B,EAAE,eAAgC;IACjH,MAAM,CAAC,IAAI,CACT,cAAc,EACd,4IAA4I,EAC5I;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4HAA4H,CAAC;QACtK,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;QAC5F,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;QAClG,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yEAAyE,CAAC;KACvH,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE;QACpD,IAAI,CAAC;YACH,IAAI,QAAQ,EAAE,CAAC;gBACb,qDAAqD;gBACrD,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;gBACxE,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;yBAC9E;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,2CAA2C;YAC3C,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC;gBACnC,KAAK;gBACL,UAAU;aACX,CAAC,CAAC;YAEH,IAAI,UAAU,KAAK,KAAK,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChD,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;YAC5D,CAAC;YAED,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;qBACpE;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACrE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,2BAA2B,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;gBAC3G,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"list-peers.d.ts","sourceRoot":"","sources":["../../src/tools/list-peers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAElE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,eAAe,GAAG,IAAI,CA4B3F"}
1
+ {"version":3,"file":"list-peers.d.ts","sourceRoot":"","sources":["../../src/tools/list-peers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAElE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,eAAe,GAAG,IAAI,CA0B3F"}
@@ -1,8 +1,5 @@
1
- import { z } from 'zod';
2
1
  export function registerListPeers(server, agentConnection) {
3
- server.tool('list_peers', 'List all connected CrossChat instances. Shows name, status, working directory, and current room.', {
4
- includeMetadata: z.boolean().optional().describe('Kept for compatibility — metadata is always included now'),
5
- }, async () => {
2
+ server.tool('list_peers', 'List all connected CrossChat instances. Shows name, status, and working directory.', {}, async () => {
6
3
  try {
7
4
  const peers = await agentConnection.listPeers();
8
5
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"list-peers.js","sourceRoot":"","sources":["../../src/tools/list-peers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,iBAAiB,CAAC,MAAiB,EAAE,eAAgC;IACnF,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,kGAAkG,EAClG;QACE,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0DAA0D,CAAC;KAC7G,EACD,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,SAAS,EAAE,CAAC;YAEhD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;qBAC9D;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACrE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,yBAAyB,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;gBACzG,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"list-peers.js","sourceRoot":"","sources":["../../src/tools/list-peers.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,iBAAiB,CAAC,MAAiB,EAAE,eAAgC;IACnF,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,oFAAoF,EACpF,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,SAAS,EAAE,CAAC;YAEhD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;qBAC9D;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACrE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,yBAAyB,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;gBACzG,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { AgentConnection } from '../hub/agent-connection.js';
3
+ export declare function registerResolveTask(server: McpServer, agentConnection: AgentConnection): void;
4
+ //# sourceMappingURL=resolve-task.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-task.d.ts","sourceRoot":"","sources":["../../src/tools/resolve-task.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAElE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,eAAe,GAAG,IAAI,CA+B7F"}
@@ -0,0 +1,29 @@
1
+ import { z } from 'zod';
2
+ export function registerResolveTask(server, agentConnection) {
3
+ server.tool('resolve_task', 'Complete or fail a task. Only the claimant can resolve. Include a result documenting the work done.', {
4
+ messageId: z.string().describe('The messageId of the flagged task message to resolve'),
5
+ status: z.enum(['completed', 'failed']).describe('"completed" if done successfully, "failed" if not'),
6
+ result: z.string().describe('The result of the task as markdown'),
7
+ error: z.string().optional().describe('Error description if the task failed'),
8
+ }, async ({ messageId, status, result, error }) => {
9
+ try {
10
+ const res = await agentConnection.resolveTask(messageId, status, result, error);
11
+ return {
12
+ content: [
13
+ {
14
+ type: 'text',
15
+ text: JSON.stringify({ resolved: true, messageId: res.messageId, status: res.status }),
16
+ },
17
+ ],
18
+ };
19
+ }
20
+ catch (err) {
21
+ const message = err instanceof Error ? err.message : 'Unknown error';
22
+ return {
23
+ content: [{ type: 'text', text: JSON.stringify({ error: `Failed to resolve task: ${message}` }) }],
24
+ isError: true,
25
+ };
26
+ }
27
+ });
28
+ }
29
+ //# sourceMappingURL=resolve-task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-task.js","sourceRoot":"","sources":["../../src/tools/resolve-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,eAAgC;IACrF,MAAM,CAAC,IAAI,CACT,cAAc,EACd,qGAAqG,EACrG;QACE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sDAAsD,CAAC;QACtF,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,mDAAmD,CAAC;QACrG,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;QACjE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;KAC9E,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;QAC7C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YAEhF,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;qBACvF;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACrE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,2BAA2B,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;gBAC3G,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"send-message.d.ts","sourceRoot":"","sources":["../../src/tools/send-message.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAElE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,eAAe,GAAG,IAAI,CA8B7F"}
1
+ {"version":3,"file":"send-message.d.ts","sourceRoot":"","sources":["../../src/tools/send-message.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAElE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,eAAe,GAAG,IAAI,CA+B7F"}
@@ -1,12 +1,13 @@
1
1
  import { z } from 'zod';
2
2
  export function registerSendMessage(server, agentConnection) {
3
- server.tool('send_message', 'Send a message to your current room. All agents and dashboard users in the room will see it.', {
3
+ server.tool('send_message', 'Send a message to the channel or a thread. All agents in the channel will see it (or thread participants if threadId is set).', {
4
4
  content: z.string().describe('The message text to send'),
5
- metadata: z.record(z.unknown()).optional().describe('Optional structured metadata to attach (e.g., { "urgency": "high", "topic": "refactor" })'),
6
- importance: z.enum(['important', 'comment', 'chitchat']).optional().describe('Message importance level: "important" for key updates, "comment" for normal discussion (default), "chitchat" for low-priority chatter'),
7
- }, async ({ content, metadata, importance }) => {
5
+ threadId: z.string().optional().describe('If set, send as a reply in this thread (the threadId is the messageId of the root message)'),
6
+ metadata: z.record(z.unknown()).optional().describe('Optional structured metadata to attach'),
7
+ importance: z.enum(['important', 'comment', 'chitchat']).optional().describe('Message importance level'),
8
+ }, async ({ content, threadId, metadata, importance }) => {
8
9
  try {
9
- agentConnection.sendMessage(content, metadata, importance);
10
+ agentConnection.sendMessage(content, { threadId, metadata, importance });
10
11
  return {
11
12
  content: [
12
13
  {
@@ -1 +1 @@
1
- {"version":3,"file":"send-message.js","sourceRoot":"","sources":["../../src/tools/send-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,eAAgC;IACrF,MAAM,CAAC,IAAI,CACT,cAAc,EACd,8FAA8F,EAC9F;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QACxD,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2FAA2F,CAAC;QAChJ,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uIAAuI,CAAC;KACtN,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;QAC1C,IAAI,CAAC;YACH,eAAe,CAAC,WAAW,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;YAE3D,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;qBACrC;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACrE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,2BAA2B,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;gBAC3G,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"send-message.js","sourceRoot":"","sources":["../../src/tools/send-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,eAAgC;IACrF,MAAM,CAAC,IAAI,CACT,cAAc,EACd,+HAA+H,EAC/H;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QACxD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4FAA4F,CAAC;QACtI,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;QAC7F,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;KACzG,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;QACpD,IAAI,CAAC;YACH,eAAe,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;YAEzE,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;qBACrC;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACrE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,2BAA2B,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;gBAC3G,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -3,10 +3,10 @@ export function registerSetStatus(server, agentConnection) {
3
3
  server.tool('set_status', 'Set your availability status so other peers can see if you\'re free or busy.', {
4
4
  status: z.enum(['available', 'busy']).describe('"available" = ready for work, "busy" = currently working on something'),
5
5
  detail: z.string().optional().describe('What you\'re doing (e.g., "Running tests for auth module"). Shown to other peers in list_peers.'),
6
- taskId: z.string().optional().describe('The task ID you\'re working on, if applicable'),
7
- }, async ({ status, detail, taskId }) => {
6
+ taskMessageId: z.string().optional().describe('The messageId of the flagged task you\'re working on, if applicable'),
7
+ }, async ({ status, detail, taskMessageId }) => {
8
8
  try {
9
- agentConnection.setStatus(status, detail, taskId);
9
+ agentConnection.setStatus(status, detail, taskMessageId);
10
10
  return {
11
11
  content: [
12
12
  {
@@ -1 +1 @@
1
- {"version":3,"file":"set-status.js","sourceRoot":"","sources":["../../src/tools/set-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,iBAAiB,CAAC,MAAiB,EAAE,eAAgC;IACnF,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,8EAA8E,EAC9E;QACE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,uEAAuE,CAAC;QACvH,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iGAAiG,CAAC;QACzI,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;KACxF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE;QACnC,IAAI,CAAC;YACH,eAAe,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YAElD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;qBACzC;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACrE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,yBAAyB,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;gBACzG,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"set-status.js","sourceRoot":"","sources":["../../src/tools/set-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,iBAAiB,CAAC,MAAiB,EAAE,eAAgC;IACnF,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,8EAA8E,EAC9E;QACE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,uEAAuE,CAAC;QACvH,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iGAAiG,CAAC;QACzI,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qEAAqE,CAAC;KACrH,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,EAAE;QAC1C,IAAI,CAAC;YACH,eAAe,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;YAEzD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;qBACzC;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACrE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,yBAAyB,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;gBACzG,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -2,7 +2,7 @@ import { z } from 'zod';
2
2
  const DEFAULT_TIMEOUT_MS = 30_000;
3
3
  const MAX_TIMEOUT_MS = 600_000;
4
4
  export function registerWaitForMessages(server, messageStore) {
5
- server.tool('wait_for_messages', 'Wait for the next message in your current room. Blocks until a message arrives or timeout.', {
5
+ server.tool('wait_for_messages', 'Wait for the next message. Blocks until a message arrives in the channel or timeout.', {
6
6
  timeoutMs: z.number().optional().describe('How long to wait in milliseconds (default: 30000, max: 600000). Returns a timeout result if no message arrives.'),
7
7
  broadcastCooldownMs: z.number().optional().describe('Delay in ms before returning broadcast messages (not direct @mentions). Used to stagger responses across agents so earlier responders can be seen by later ones. Set this to a random value (0-500) seeded at init time.'),
8
8
  }, async ({ timeoutMs, broadcastCooldownMs }) => {
@@ -1 +1 @@
1
- {"version":3,"file":"wait-for-messages.js","sourceRoot":"","sources":["../../src/tools/wait-for-messages.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wait-for-messages.js","sourceRoot":"","sources":["../../src/tools/wait-for-messages.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import type { Badge } from './hub/message-manager.js';
1
2
  export type MessageImportance = 'important' | 'comment' | 'chitchat';
2
3
  export interface PeerMessage {
3
4
  messageId: string;
@@ -8,11 +9,11 @@ export interface PeerMessage {
8
9
  sentAt: string;
9
10
  receivedAt: string;
10
11
  read: boolean;
11
- relatedTaskId?: string;
12
- replyToMessageId?: string;
13
- type?: 'message' | 'task_result' | 'task_delegated';
12
+ threadId?: string;
13
+ type?: 'message' | 'badge_update';
14
14
  mentions?: string[];
15
15
  mentionType?: 'direct' | 'here' | 'broadcast';
16
16
  importance?: MessageImportance;
17
+ badges?: Badge[];
17
18
  }
18
19
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,SAAS,GAAG,UAAU,CAAC;AAErE,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,SAAS,GAAG,aAAa,GAAG,gBAAgB,CAAC;IACpD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IAC9C,UAAU,CAAC,EAAE,iBAAiB,CAAC;CAChC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAEtD,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,SAAS,GAAG,UAAU,CAAC;AAErE,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,SAAS,GAAG,cAAc,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IAC9C,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;CAClB"}