@recursiv/mcp 0.1.1

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 (106) hide show
  1. package/README.md +135 -0
  2. package/dist/__tests__/scopes.test.d.ts +2 -0
  3. package/dist/__tests__/scopes.test.d.ts.map +1 -0
  4. package/dist/__tests__/scopes.test.js +85 -0
  5. package/dist/__tests__/scopes.test.js.map +1 -0
  6. package/dist/index.d.ts +3 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +125 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/lib/approval-gate.d.ts +45 -0
  11. package/dist/lib/approval-gate.d.ts.map +1 -0
  12. package/dist/lib/approval-gate.js +143 -0
  13. package/dist/lib/approval-gate.js.map +1 -0
  14. package/dist/scopes.d.ts +99 -0
  15. package/dist/scopes.d.ts.map +1 -0
  16. package/dist/scopes.js +122 -0
  17. package/dist/scopes.js.map +1 -0
  18. package/dist/tools/__tests__/agents.test.d.ts +2 -0
  19. package/dist/tools/__tests__/agents.test.d.ts.map +1 -0
  20. package/dist/tools/__tests__/agents.test.js +248 -0
  21. package/dist/tools/__tests__/agents.test.js.map +1 -0
  22. package/dist/tools/__tests__/devtools.test.d.ts +2 -0
  23. package/dist/tools/__tests__/devtools.test.d.ts.map +1 -0
  24. package/dist/tools/__tests__/devtools.test.js +206 -0
  25. package/dist/tools/__tests__/devtools.test.js.map +1 -0
  26. package/dist/tools/__tests__/dispatcher.test.d.ts +2 -0
  27. package/dist/tools/__tests__/dispatcher.test.d.ts.map +1 -0
  28. package/dist/tools/__tests__/dispatcher.test.js +178 -0
  29. package/dist/tools/__tests__/dispatcher.test.js.map +1 -0
  30. package/dist/tools/__tests__/memory.test.d.ts +2 -0
  31. package/dist/tools/__tests__/memory.test.d.ts.map +1 -0
  32. package/dist/tools/__tests__/memory.test.js +151 -0
  33. package/dist/tools/__tests__/memory.test.js.map +1 -0
  34. package/dist/tools/__tests__/projects.test.d.ts +2 -0
  35. package/dist/tools/__tests__/projects.test.d.ts.map +1 -0
  36. package/dist/tools/__tests__/projects.test.js +168 -0
  37. package/dist/tools/__tests__/projects.test.js.map +1 -0
  38. package/dist/tools/__tests__/sandbox.test.d.ts +2 -0
  39. package/dist/tools/__tests__/sandbox.test.d.ts.map +1 -0
  40. package/dist/tools/__tests__/sandbox.test.js +113 -0
  41. package/dist/tools/__tests__/sandbox.test.js.map +1 -0
  42. package/dist/tools/__tests__/social.test.d.ts +2 -0
  43. package/dist/tools/__tests__/social.test.d.ts.map +1 -0
  44. package/dist/tools/__tests__/social.test.js +127 -0
  45. package/dist/tools/__tests__/social.test.js.map +1 -0
  46. package/dist/tools/__tests__/swarms.test.d.ts +2 -0
  47. package/dist/tools/__tests__/swarms.test.d.ts.map +1 -0
  48. package/dist/tools/__tests__/swarms.test.js +320 -0
  49. package/dist/tools/__tests__/swarms.test.js.map +1 -0
  50. package/dist/tools/__tests__/templates.test.d.ts +2 -0
  51. package/dist/tools/__tests__/templates.test.d.ts.map +1 -0
  52. package/dist/tools/__tests__/templates.test.js +176 -0
  53. package/dist/tools/__tests__/templates.test.js.map +1 -0
  54. package/dist/tools/agents.d.ts +4 -0
  55. package/dist/tools/agents.d.ts.map +1 -0
  56. package/dist/tools/agents.js +170 -0
  57. package/dist/tools/agents.js.map +1 -0
  58. package/dist/tools/devtools.d.ts +4 -0
  59. package/dist/tools/devtools.d.ts.map +1 -0
  60. package/dist/tools/devtools.js +511 -0
  61. package/dist/tools/devtools.js.map +1 -0
  62. package/dist/tools/dispatcher.d.ts +4 -0
  63. package/dist/tools/dispatcher.d.ts.map +1 -0
  64. package/dist/tools/dispatcher.js +647 -0
  65. package/dist/tools/dispatcher.js.map +1 -0
  66. package/dist/tools/memory.d.ts +4 -0
  67. package/dist/tools/memory.d.ts.map +1 -0
  68. package/dist/tools/memory.js +92 -0
  69. package/dist/tools/memory.js.map +1 -0
  70. package/dist/tools/platform.d.ts +4 -0
  71. package/dist/tools/platform.d.ts.map +1 -0
  72. package/dist/tools/platform.js +359 -0
  73. package/dist/tools/platform.js.map +1 -0
  74. package/dist/tools/projects.d.ts +4 -0
  75. package/dist/tools/projects.d.ts.map +1 -0
  76. package/dist/tools/projects.js +79 -0
  77. package/dist/tools/projects.js.map +1 -0
  78. package/dist/tools/rate-limiter.d.ts +53 -0
  79. package/dist/tools/rate-limiter.d.ts.map +1 -0
  80. package/dist/tools/rate-limiter.js +87 -0
  81. package/dist/tools/rate-limiter.js.map +1 -0
  82. package/dist/tools/remaining.d.ts +8 -0
  83. package/dist/tools/remaining.d.ts.map +1 -0
  84. package/dist/tools/remaining.js +283 -0
  85. package/dist/tools/remaining.js.map +1 -0
  86. package/dist/tools/sandbox.d.ts +4 -0
  87. package/dist/tools/sandbox.d.ts.map +1 -0
  88. package/dist/tools/sandbox.js +35 -0
  89. package/dist/tools/sandbox.js.map +1 -0
  90. package/dist/tools/social.d.ts +11 -0
  91. package/dist/tools/social.d.ts.map +1 -0
  92. package/dist/tools/social.js +136 -0
  93. package/dist/tools/social.js.map +1 -0
  94. package/dist/tools/swarms.d.ts +4 -0
  95. package/dist/tools/swarms.d.ts.map +1 -0
  96. package/dist/tools/swarms.js +184 -0
  97. package/dist/tools/swarms.js.map +1 -0
  98. package/dist/tools/templates.d.ts +4 -0
  99. package/dist/tools/templates.d.ts.map +1 -0
  100. package/dist/tools/templates.js +102 -0
  101. package/dist/tools/templates.js.map +1 -0
  102. package/dist/tools/utils.d.ts +9 -0
  103. package/dist/tools/utils.d.ts.map +1 -0
  104. package/dist/tools/utils.js +8 -0
  105. package/dist/tools/utils.js.map +1 -0
  106. package/package.json +50 -0
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Scope-filtered MCP tool registration.
3
+ *
4
+ * Each tool declares the API-key scopes it requires via `requiredScopes`.
5
+ * At startup the MCP server reads the granted scopes (from the
6
+ * `RECURSIV_API_KEY_SCOPES` env var, comma-separated) and only registers
7
+ * tools whose required scopes are all present.
8
+ *
9
+ * If `RECURSIV_API_KEY_SCOPES` is not set, all tools are registered
10
+ * (backwards-compatible default).
11
+ */
12
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
13
+ export declare const Scopes: {
14
+ readonly POSTS_READ: "posts:read";
15
+ readonly POSTS_WRITE: "posts:write";
16
+ readonly USERS_READ: "users:read";
17
+ readonly USERS_WRITE: "users:write";
18
+ readonly COMMUNITIES_READ: "communities:read";
19
+ readonly COMMUNITIES_WRITE: "communities:write";
20
+ readonly CHAT_READ: "chat:read";
21
+ readonly CHAT_WRITE: "chat:write";
22
+ readonly PROJECTS_READ: "projects:read";
23
+ readonly PROJECTS_WRITE: "projects:write";
24
+ readonly AGENTS_READ: "agents:read";
25
+ readonly AGENTS_WRITE: "agents:write";
26
+ readonly ORGANIZATIONS_READ: "organizations:read";
27
+ readonly ORGANIZATIONS_WRITE: "organizations:write";
28
+ readonly NOTIFICATIONS_READ: "notifications:read";
29
+ readonly NOTIFICATIONS_WRITE: "notifications:write";
30
+ readonly SETTINGS_READ: "settings:read";
31
+ readonly SETTINGS_WRITE: "settings:write";
32
+ readonly BILLING_READ: "billing:read";
33
+ readonly BILLING_WRITE: "billing:write";
34
+ readonly TAGS_READ: "tags:read";
35
+ readonly TAGS_WRITE: "tags:write";
36
+ readonly UPLOADS_WRITE: "uploads:write";
37
+ readonly WALLET_READ: "wallet:read";
38
+ readonly WALLET_WRITE: "wallet:write";
39
+ readonly COMMANDS_READ: "commands:read";
40
+ readonly COMMANDS_WRITE: "commands:write";
41
+ readonly MEMORY_READ: "memory:read";
42
+ readonly MEMORY_WRITE: "memory:write";
43
+ readonly ADMIN: "admin";
44
+ };
45
+ export type Scope = (typeof Scopes)[keyof typeof Scopes];
46
+ export interface ScopedToolDefinition {
47
+ /** Tool name (unique within the server). */
48
+ name: string;
49
+ /** Human-readable description shown to the LLM. */
50
+ description: string;
51
+ /** Zod-compatible params object (same shape as McpServer.tool). */
52
+ paramsSchema: Record<string, unknown>;
53
+ /** The handler function. */
54
+ handler: (...args: any[]) => any;
55
+ /**
56
+ * Scopes the API key must have for this tool to be registered.
57
+ * All listed scopes must be present (AND logic).
58
+ * An empty array means no scopes are required (always registered).
59
+ */
60
+ requiredScopes: readonly string[];
61
+ }
62
+ /**
63
+ * Read the granted scopes from the `RECURSIV_API_KEY_SCOPES` environment
64
+ * variable. Returns `null` when the var is unset (= "register everything").
65
+ */
66
+ export declare function resolveGrantedScopes(): Set<string> | null;
67
+ /**
68
+ * Wraps `McpServer` to provide scope-aware tool registration.
69
+ *
70
+ * Usage:
71
+ * ```ts
72
+ * const registry = new ScopedToolRegistry(server, grantedScopes);
73
+ * registry.tool('list_posts', 'List posts', [Scopes.POSTS_READ], schema, handler);
74
+ * ```
75
+ */
76
+ export declare class ScopedToolRegistry {
77
+ private server;
78
+ /**
79
+ * `null` means "all tools are allowed" (no scope env var was set).
80
+ */
81
+ private grantedScopes;
82
+ private registeredCount;
83
+ private skippedCount;
84
+ constructor(server: McpServer, grantedScopes: Set<string> | null);
85
+ /**
86
+ * Register a tool only if the API key's scopes satisfy the requirements.
87
+ *
88
+ * Signature mirrors `McpServer.tool(name, description, schema, handler)`
89
+ * with an additional `requiredScopes` parameter.
90
+ */
91
+ tool(name: string, description: string, requiredScopes: readonly string[], paramsSchema: Record<string, unknown>, handler: (...args: any[]) => any): void;
92
+ /** Check whether the granted scopes satisfy every required scope. */
93
+ private hasScopes;
94
+ /** Number of tools that were registered. */
95
+ get registered(): number;
96
+ /** Number of tools that were skipped due to insufficient scopes. */
97
+ get skipped(): number;
98
+ }
99
+ //# sourceMappingURL=scopes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scopes.d.ts","sourceRoot":"","sources":["../src/scopes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BT,CAAC;AAEX,MAAM,MAAM,KAAK,GAAG,CAAC,OAAO,MAAM,CAAC,CAAC,MAAM,OAAO,MAAM,CAAC,CAAC;AAMzD,MAAM,WAAW,oBAAoB;IACnC,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,4BAA4B;IAC5B,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;IACjC;;;;OAIG;IACH,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAMD;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAQzD;AAMD;;;;;;;;GAQG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAY;IAC1B;;OAEG;IACH,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,YAAY,CAAK;gBAEb,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI;IAKhE;;;;;OAKG;IACH,IAAI,CACF,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,SAAS,MAAM,EAAE,EACjC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,GAC/B,IAAI;IAUP,qEAAqE;IACrE,OAAO,CAAC,SAAS;IAQjB,4CAA4C;IAC5C,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,oEAAoE;IACpE,IAAI,OAAO,IAAI,MAAM,CAEpB;CACF"}
package/dist/scopes.js ADDED
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Scope-filtered MCP tool registration.
3
+ *
4
+ * Each tool declares the API-key scopes it requires via `requiredScopes`.
5
+ * At startup the MCP server reads the granted scopes (from the
6
+ * `RECURSIV_API_KEY_SCOPES` env var, comma-separated) and only registers
7
+ * tools whose required scopes are all present.
8
+ *
9
+ * If `RECURSIV_API_KEY_SCOPES` is not set, all tools are registered
10
+ * (backwards-compatible default).
11
+ */
12
+ // ---------------------------------------------------------------------------
13
+ // Public scope constants — keep in sync with the server's ALLOWED_SCOPES
14
+ // ---------------------------------------------------------------------------
15
+ export const Scopes = {
16
+ POSTS_READ: 'posts:read',
17
+ POSTS_WRITE: 'posts:write',
18
+ USERS_READ: 'users:read',
19
+ USERS_WRITE: 'users:write',
20
+ COMMUNITIES_READ: 'communities:read',
21
+ COMMUNITIES_WRITE: 'communities:write',
22
+ CHAT_READ: 'chat:read',
23
+ CHAT_WRITE: 'chat:write',
24
+ PROJECTS_READ: 'projects:read',
25
+ PROJECTS_WRITE: 'projects:write',
26
+ AGENTS_READ: 'agents:read',
27
+ AGENTS_WRITE: 'agents:write',
28
+ ORGANIZATIONS_READ: 'organizations:read',
29
+ ORGANIZATIONS_WRITE: 'organizations:write',
30
+ NOTIFICATIONS_READ: 'notifications:read',
31
+ NOTIFICATIONS_WRITE: 'notifications:write',
32
+ SETTINGS_READ: 'settings:read',
33
+ SETTINGS_WRITE: 'settings:write',
34
+ BILLING_READ: 'billing:read',
35
+ BILLING_WRITE: 'billing:write',
36
+ TAGS_READ: 'tags:read',
37
+ TAGS_WRITE: 'tags:write',
38
+ UPLOADS_WRITE: 'uploads:write',
39
+ WALLET_READ: 'wallet:read',
40
+ WALLET_WRITE: 'wallet:write',
41
+ COMMANDS_READ: 'commands:read',
42
+ COMMANDS_WRITE: 'commands:write',
43
+ MEMORY_READ: 'memory:read',
44
+ MEMORY_WRITE: 'memory:write',
45
+ ADMIN: 'admin',
46
+ };
47
+ // ---------------------------------------------------------------------------
48
+ // Resolve granted scopes from environment
49
+ // ---------------------------------------------------------------------------
50
+ /**
51
+ * Read the granted scopes from the `RECURSIV_API_KEY_SCOPES` environment
52
+ * variable. Returns `null` when the var is unset (= "register everything").
53
+ */
54
+ export function resolveGrantedScopes() {
55
+ const raw = process.env.RECURSIV_API_KEY_SCOPES;
56
+ if (!raw)
57
+ return null; // no restriction
58
+ const scopes = raw
59
+ .split(',')
60
+ .map((s) => s.trim())
61
+ .filter(Boolean);
62
+ return new Set(scopes);
63
+ }
64
+ // ---------------------------------------------------------------------------
65
+ // Scoped tool registry
66
+ // ---------------------------------------------------------------------------
67
+ /**
68
+ * Wraps `McpServer` to provide scope-aware tool registration.
69
+ *
70
+ * Usage:
71
+ * ```ts
72
+ * const registry = new ScopedToolRegistry(server, grantedScopes);
73
+ * registry.tool('list_posts', 'List posts', [Scopes.POSTS_READ], schema, handler);
74
+ * ```
75
+ */
76
+ export class ScopedToolRegistry {
77
+ server;
78
+ /**
79
+ * `null` means "all tools are allowed" (no scope env var was set).
80
+ */
81
+ grantedScopes;
82
+ registeredCount = 0;
83
+ skippedCount = 0;
84
+ constructor(server, grantedScopes) {
85
+ this.server = server;
86
+ this.grantedScopes = grantedScopes;
87
+ }
88
+ /**
89
+ * Register a tool only if the API key's scopes satisfy the requirements.
90
+ *
91
+ * Signature mirrors `McpServer.tool(name, description, schema, handler)`
92
+ * with an additional `requiredScopes` parameter.
93
+ */
94
+ tool(name, description, requiredScopes, paramsSchema, handler) {
95
+ if (!this.hasScopes(requiredScopes)) {
96
+ this.skippedCount++;
97
+ return;
98
+ }
99
+ // Delegate to the real McpServer
100
+ this.server.tool(name, description, paramsSchema, handler);
101
+ this.registeredCount++;
102
+ }
103
+ /** Check whether the granted scopes satisfy every required scope. */
104
+ hasScopes(required) {
105
+ // No restriction configured — always allow
106
+ if (this.grantedScopes === null)
107
+ return true;
108
+ // No scopes required — always allow
109
+ if (required.length === 0)
110
+ return true;
111
+ return required.every((s) => this.grantedScopes.has(s));
112
+ }
113
+ /** Number of tools that were registered. */
114
+ get registered() {
115
+ return this.registeredCount;
116
+ }
117
+ /** Number of tools that were skipped due to insufficient scopes. */
118
+ get skipped() {
119
+ return this.skippedCount;
120
+ }
121
+ }
122
+ //# sourceMappingURL=scopes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scopes.js","sourceRoot":"","sources":["../src/scopes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agents.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/agents.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,248 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ import { registerAgentTools } from '../agents.js';
4
+ import { ScopedToolRegistry } from '../../scopes.js';
5
+ function createMockClient() {
6
+ return {
7
+ agents: {
8
+ list: vi.fn(),
9
+ get: vi.fn(),
10
+ create: vi.fn(),
11
+ update: vi.fn(),
12
+ delete: vi.fn(),
13
+ chat: vi.fn(),
14
+ conversations: vi.fn(),
15
+ sendMessage: vi.fn(),
16
+ inbox: vi.fn(),
17
+ markMessageRead: vi.fn(),
18
+ },
19
+ };
20
+ }
21
+ function extractTools(server) {
22
+ const tools = {};
23
+ const origTool = server.tool.bind(server);
24
+ server.tool = ((...args) => {
25
+ const name = args[0];
26
+ const handler = args[args.length - 1];
27
+ tools[name] = { handler };
28
+ return origTool(...args);
29
+ });
30
+ return tools;
31
+ }
32
+ describe('agent tools', () => {
33
+ let client;
34
+ let server;
35
+ let tools;
36
+ beforeEach(() => {
37
+ client = createMockClient();
38
+ server = new McpServer({ name: 'test', version: '0.0.1' });
39
+ tools = extractTools(server);
40
+ const registry = new ScopedToolRegistry(server, null);
41
+ registerAgentTools(registry, client);
42
+ });
43
+ it('registers all 10 agent tools', () => {
44
+ const names = Object.keys(tools);
45
+ expect(names).toEqual(expect.arrayContaining([
46
+ 'list_agents', 'get_agent', 'create_agent', 'update_agent',
47
+ 'delete_agent', 'chat_with_agent', 'list_agent_conversations',
48
+ 'send_agent_message', 'check_agent_inbox', 'mark_message_read',
49
+ ]));
50
+ });
51
+ describe('list_agents', () => {
52
+ it('returns JSON stringified agents', async () => {
53
+ const data = { data: [{ id: 'a1', name: 'Claude' }] };
54
+ client.agents.list.mockResolvedValue(data);
55
+ const result = await tools.list_agents.handler({ limit: 10 });
56
+ expect(result.content[0].text).toBe(JSON.stringify(data, null, 2));
57
+ expect(client.agents.list).toHaveBeenCalledWith({ limit: 10 });
58
+ });
59
+ });
60
+ describe('get_agent', () => {
61
+ it('fetches agent by ID and returns JSON', async () => {
62
+ const data = { data: { id: 'a1', name: 'Claude', bio: 'An AI agent' } };
63
+ client.agents.get.mockResolvedValue(data);
64
+ const result = await tools.get_agent.handler({ id: 'a1' });
65
+ expect(client.agents.get).toHaveBeenCalledWith('a1');
66
+ expect(result.content[0].text).toBe(JSON.stringify(data, null, 2));
67
+ });
68
+ });
69
+ describe('create_agent', () => {
70
+ it('creates agent with config', async () => {
71
+ const data = { data: { id: 'a1', name: 'New Agent' } };
72
+ client.agents.create.mockResolvedValue(data);
73
+ const params = {
74
+ name: 'New Agent',
75
+ username: 'newagent',
76
+ model: 'claude-sonnet-4-6',
77
+ system_prompt: 'You are helpful',
78
+ social_mode: 'chat_only',
79
+ tool_mode: 'autonomous',
80
+ };
81
+ const result = await tools.create_agent.handler(params);
82
+ expect(result.content[0].text).toBe(JSON.stringify(data, null, 2));
83
+ expect(client.agents.create).toHaveBeenCalledWith(params);
84
+ });
85
+ });
86
+ describe('update_agent', () => {
87
+ it('destructures id from input and calls update(id, rest)', async () => {
88
+ const data = { data: { id: 'a1', name: 'Updated Agent' } };
89
+ client.agents.update.mockResolvedValue(data);
90
+ const result = await tools.update_agent.handler({ id: 'a1', name: 'Updated Agent' });
91
+ expect(result.content[0].text).toBe(JSON.stringify(data, null, 2));
92
+ expect(client.agents.update).toHaveBeenCalledWith('a1', { name: 'Updated Agent' });
93
+ });
94
+ });
95
+ describe('delete_agent', () => {
96
+ it('deletes agent and returns result', async () => {
97
+ const data = { data: { success: true } };
98
+ client.agents.delete.mockResolvedValue(data);
99
+ const result = await tools.delete_agent.handler({ id: 'a1' });
100
+ expect(client.agents.delete).toHaveBeenCalledWith('a1');
101
+ expect(result.content[0].text).toBe(JSON.stringify(data, null, 2));
102
+ });
103
+ });
104
+ describe('chat_with_agent', () => {
105
+ it('destructures id and passes rest to chat(id, input)', async () => {
106
+ const data = { data: { response: 'Hello!' } };
107
+ client.agents.chat.mockResolvedValue(data);
108
+ const result = await tools.chat_with_agent.handler({
109
+ id: 'a1',
110
+ message: 'Hi there',
111
+ conversation_id: 'conv-1',
112
+ });
113
+ expect(result.content[0].text).toBe(JSON.stringify(data, null, 2));
114
+ expect(client.agents.chat).toHaveBeenCalledWith('a1', {
115
+ message: 'Hi there',
116
+ conversation_id: 'conv-1',
117
+ });
118
+ });
119
+ });
120
+ describe('list_agent_conversations', () => {
121
+ it('destructures id and passes rest to conversations(id, params)', async () => {
122
+ const data = { data: [{ id: 'conv-1', agentId: 'a1' }] };
123
+ client.agents.conversations.mockResolvedValue(data);
124
+ const result = await tools.list_agent_conversations.handler({
125
+ id: 'a1',
126
+ limit: 5,
127
+ });
128
+ expect(result.content[0].text).toBe(JSON.stringify(data, null, 2));
129
+ expect(client.agents.conversations).toHaveBeenCalledWith('a1', { limit: 5 });
130
+ });
131
+ });
132
+ describe('send_agent_message', () => {
133
+ it('sends inter-agent message with correct call shape', async () => {
134
+ const data = { data: { id: 'm1', type: 'delegation' } };
135
+ client.agents.sendMessage.mockResolvedValue(data);
136
+ const result = await tools.send_agent_message.handler({
137
+ to_agent_id: 'a2',
138
+ from_agent_id: 'a1',
139
+ type: 'delegation',
140
+ content: 'Please handle this task',
141
+ });
142
+ expect(result.content[0].text).toBe('Message sent to agent a2\nMessage ID: m1\nType: delegation');
143
+ expect(client.agents.sendMessage).toHaveBeenCalledWith('a2', {
144
+ from_agent_id: 'a1',
145
+ type: 'delegation',
146
+ content: 'Please handle this task',
147
+ project_id: undefined,
148
+ metadata: undefined,
149
+ });
150
+ });
151
+ it('returns error on failure', async () => {
152
+ client.agents.sendMessage.mockRejectedValue(new Error('Agent not found'));
153
+ const result = await tools.send_agent_message.handler({
154
+ to_agent_id: 'a2',
155
+ from_agent_id: 'a1',
156
+ type: 'delegation',
157
+ content: 'Please handle this',
158
+ });
159
+ expect(result.isError).toBe(true);
160
+ expect(result.content[0].text).toBe('Error sending message: Agent not found');
161
+ });
162
+ });
163
+ describe('check_agent_inbox', () => {
164
+ it('returns formatted inbox messages with correct fields', async () => {
165
+ const data = {
166
+ data: [
167
+ {
168
+ id: 'm1',
169
+ fromAgentId: 'a2',
170
+ type: 'question',
171
+ content: 'Need help?',
172
+ readAt: null,
173
+ },
174
+ ],
175
+ };
176
+ client.agents.inbox.mockResolvedValue(data);
177
+ const result = await tools.check_agent_inbox.handler({
178
+ agent_id: 'a1',
179
+ unread_only: true,
180
+ });
181
+ expect(result.content[0].text).toBe('[question] m1 — from a2 (UNREAD)\n Need help?');
182
+ expect(client.agents.inbox).toHaveBeenCalledWith('a1', {
183
+ unread_only: true,
184
+ project_id: undefined,
185
+ type: undefined,
186
+ limit: undefined,
187
+ });
188
+ });
189
+ it('omits UNREAD tag when message has readAt', async () => {
190
+ const data = {
191
+ data: [
192
+ {
193
+ id: 'm1',
194
+ fromAgentId: 'a2',
195
+ type: 'result',
196
+ content: 'Done',
197
+ readAt: '2026-03-06T00:00:00Z',
198
+ },
199
+ ],
200
+ };
201
+ client.agents.inbox.mockResolvedValue(data);
202
+ const result = await tools.check_agent_inbox.handler({ agent_id: 'a1' });
203
+ expect(result.content[0].text).not.toContain('UNREAD');
204
+ expect(result.content[0].text).toBe('[result] m1 — from a2\n Done');
205
+ });
206
+ it('returns empty message when no inbox items', async () => {
207
+ client.agents.inbox.mockResolvedValue({ data: [] });
208
+ const result = await tools.check_agent_inbox.handler({ agent_id: 'a1' });
209
+ expect(result.content[0].text).toBe('No messages in inbox.');
210
+ });
211
+ it('truncates long messages at 200 chars', async () => {
212
+ const longContent = 'x'.repeat(250);
213
+ const data = {
214
+ data: [{
215
+ id: 'm1',
216
+ fromAgentId: 'a2',
217
+ type: 'delegation',
218
+ content: longContent,
219
+ readAt: null,
220
+ }],
221
+ };
222
+ client.agents.inbox.mockResolvedValue(data);
223
+ const result = await tools.check_agent_inbox.handler({ agent_id: 'a1' });
224
+ expect(result.content[0].text).toContain(`${'x'.repeat(200)}...`);
225
+ });
226
+ it('returns error on failure', async () => {
227
+ client.agents.inbox.mockRejectedValue(new Error('Forbidden'));
228
+ const result = await tools.check_agent_inbox.handler({ agent_id: 'a1' });
229
+ expect(result.isError).toBe(true);
230
+ expect(result.content[0].text).toBe('Error checking inbox: Forbidden');
231
+ });
232
+ });
233
+ describe('mark_message_read', () => {
234
+ it('marks message as read and returns confirmation', async () => {
235
+ client.agents.markMessageRead.mockResolvedValue({});
236
+ const result = await tools.mark_message_read.handler({ message_id: 'm1' });
237
+ expect(client.agents.markMessageRead).toHaveBeenCalledWith('m1');
238
+ expect(result.content[0].text).toBe('Message m1 marked as read.');
239
+ });
240
+ it('returns error on failure', async () => {
241
+ client.agents.markMessageRead.mockRejectedValue(new Error('Not found'));
242
+ const result = await tools.mark_message_read.handler({ message_id: 'm1' });
243
+ expect(result.isError).toBe(true);
244
+ expect(result.content[0].text).toBe('Error marking message read: Not found');
245
+ });
246
+ });
247
+ });
248
+ //# sourceMappingURL=agents.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/agents.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=devtools.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/devtools.test.ts"],"names":[],"mappings":""}