orbitx 0.2.4 → 0.2.6

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 (171) hide show
  1. package/dist/core/ai-provider.d.ts +9 -1
  2. package/dist/core/ai-provider.d.ts.map +1 -1
  3. package/dist/core/ai-provider.js.map +1 -1
  4. package/dist/core/anthropic-provider.d.ts +1 -1
  5. package/dist/core/anthropic-provider.d.ts.map +1 -1
  6. package/dist/core/anthropic-provider.js +71 -62
  7. package/dist/core/anthropic-provider.js.map +1 -1
  8. package/dist/core/base-agent.d.ts +2 -0
  9. package/dist/core/base-agent.d.ts.map +1 -1
  10. package/dist/core/base-agent.js +27 -4
  11. package/dist/core/base-agent.js.map +1 -1
  12. package/dist/core/deepseek-provider.d.ts +1 -1
  13. package/dist/core/deepseek-provider.d.ts.map +1 -1
  14. package/dist/core/deepseek-provider.js +49 -50
  15. package/dist/core/deepseek-provider.js.map +1 -1
  16. package/dist/core/mcp-fs-storage.d.ts.map +1 -1
  17. package/dist/core/mcp-fs-storage.js +2 -1
  18. package/dist/core/mcp-fs-storage.js.map +1 -1
  19. package/dist/core/ollama-provider.d.ts +1 -1
  20. package/dist/core/ollama-provider.d.ts.map +1 -1
  21. package/dist/core/ollama-provider.js +47 -34
  22. package/dist/core/ollama-provider.js.map +1 -1
  23. package/dist/core/openai-provider.d.ts +1 -1
  24. package/dist/core/openai-provider.d.ts.map +1 -1
  25. package/dist/core/openai-provider.js +42 -43
  26. package/dist/core/openai-provider.js.map +1 -1
  27. package/dist/core/retry.d.ts +1 -1
  28. package/dist/core/retry.d.ts.map +1 -1
  29. package/dist/core/retry.js +5 -1
  30. package/dist/core/retry.js.map +1 -1
  31. package/dist/tests/core/mcp-computer.test.js +26 -23
  32. package/dist/tests/core/mcp-computer.test.js.map +1 -1
  33. package/dist/tests/core/mcp-connection.test.js +23 -21
  34. package/dist/tests/core/mcp-connection.test.js.map +1 -1
  35. package/dist/tests/core/mcp-ipc-connection.test.js +30 -28
  36. package/dist/tests/core/mcp-ipc-connection.test.js.map +1 -1
  37. package/dist/tests/core/mcp-ws-connection.test.js +31 -30
  38. package/dist/tests/core/mcp-ws-connection.test.js.map +1 -1
  39. package/dist/tests/index.d.ts +27 -0
  40. package/dist/tests/index.d.ts.map +1 -1
  41. package/dist/tests/index.js +27 -0
  42. package/dist/tests/index.js.map +1 -1
  43. package/dist/tests/tools/agent/agent-tools.test.js +149 -147
  44. package/dist/tests/tools/agent/agent-tools.test.js.map +1 -1
  45. package/dist/tests/tools/bash/fixtures.d.ts +16 -0
  46. package/dist/tests/tools/bash/fixtures.d.ts.map +1 -0
  47. package/dist/tests/tools/bash/fixtures.js +22 -0
  48. package/dist/tests/tools/bash/fixtures.js.map +1 -0
  49. package/dist/tests/tools/bash/kill-tree.d.ts +21 -0
  50. package/dist/tests/tools/bash/kill-tree.d.ts.map +1 -0
  51. package/dist/tests/tools/bash/kill-tree.js +47 -0
  52. package/dist/tests/tools/bash/kill-tree.js.map +1 -0
  53. package/dist/tests/tools/bash/list.test.d.ts +2 -0
  54. package/dist/tests/tools/bash/list.test.d.ts.map +1 -0
  55. package/dist/tests/tools/bash/list.test.js +43 -0
  56. package/dist/tests/tools/bash/list.test.js.map +1 -0
  57. package/dist/tests/tools/bash/logs.test.d.ts +2 -0
  58. package/dist/tests/tools/bash/logs.test.d.ts.map +1 -0
  59. package/dist/tests/tools/bash/logs.test.js +48 -0
  60. package/dist/tests/tools/bash/logs.test.js.map +1 -0
  61. package/dist/tests/tools/bash/run.test.d.ts +2 -0
  62. package/dist/tests/tools/bash/run.test.d.ts.map +1 -0
  63. package/dist/tests/tools/bash/run.test.js +53 -0
  64. package/dist/tests/tools/bash/run.test.js.map +1 -0
  65. package/dist/tests/tools/bash/terminate.test.d.ts +2 -0
  66. package/dist/tests/tools/bash/terminate.test.d.ts.map +1 -0
  67. package/dist/tests/tools/bash/terminate.test.js +60 -0
  68. package/dist/tests/tools/bash/terminate.test.js.map +1 -0
  69. package/dist/tests/tools/bash/wait.test.d.ts +2 -0
  70. package/dist/tests/tools/bash/wait.test.d.ts.map +1 -0
  71. package/dist/tests/tools/bash/wait.test.js +45 -0
  72. package/dist/tests/tools/bash/wait.test.js.map +1 -0
  73. package/dist/tests/tools/bash/write-input.test.d.ts +2 -0
  74. package/dist/tests/tools/bash/write-input.test.d.ts.map +1 -0
  75. package/dist/tests/tools/bash/write-input.test.js +65 -0
  76. package/dist/tests/tools/bash/write-input.test.js.map +1 -0
  77. package/dist/tests/tools/browser/browser-tools.test.d.ts +2 -0
  78. package/dist/tests/tools/browser/browser-tools.test.d.ts.map +1 -0
  79. package/dist/tests/tools/browser/browser-tools.test.js +36 -0
  80. package/dist/tests/tools/browser/browser-tools.test.js.map +1 -0
  81. package/dist/tests/tools/fs/create-dir.test.d.ts +2 -0
  82. package/dist/tests/tools/fs/create-dir.test.d.ts.map +1 -0
  83. package/dist/tests/tools/fs/create-dir.test.js +37 -0
  84. package/dist/tests/tools/fs/create-dir.test.js.map +1 -0
  85. package/dist/tests/tools/fs/delete.test.d.ts +2 -0
  86. package/dist/tests/tools/fs/delete.test.d.ts.map +1 -0
  87. package/dist/tests/tools/fs/delete.test.js +69 -0
  88. package/dist/tests/tools/fs/delete.test.js.map +1 -0
  89. package/dist/tests/tools/fs/edit-file.test.d.ts +2 -0
  90. package/dist/tests/tools/fs/edit-file.test.d.ts.map +1 -0
  91. package/dist/tests/tools/fs/edit-file.test.js +103 -0
  92. package/dist/tests/tools/fs/edit-file.test.js.map +1 -0
  93. package/dist/tests/tools/fs/list-dir.test.d.ts +2 -0
  94. package/dist/tests/tools/fs/list-dir.test.d.ts.map +1 -0
  95. package/dist/tests/tools/fs/list-dir.test.js +65 -0
  96. package/dist/tests/tools/fs/list-dir.test.js.map +1 -0
  97. package/dist/tests/tools/fs/move.test.d.ts +2 -0
  98. package/dist/tests/tools/fs/move.test.d.ts.map +1 -0
  99. package/dist/tests/tools/fs/move.test.js +47 -0
  100. package/dist/tests/tools/fs/move.test.js.map +1 -0
  101. package/dist/tests/tools/fs/read-file.test.d.ts +2 -0
  102. package/dist/tests/tools/fs/read-file.test.d.ts.map +1 -0
  103. package/dist/tests/tools/fs/read-file.test.js +52 -0
  104. package/dist/tests/tools/fs/read-file.test.js.map +1 -0
  105. package/dist/tests/tools/fs/stat.test.d.ts +2 -0
  106. package/dist/tests/tools/fs/stat.test.d.ts.map +1 -0
  107. package/dist/tests/tools/fs/stat.test.js +43 -0
  108. package/dist/tests/tools/fs/stat.test.js.map +1 -0
  109. package/dist/tests/tools/fs/write-file.test.d.ts +2 -0
  110. package/dist/tests/tools/fs/write-file.test.d.ts.map +1 -0
  111. package/dist/tests/tools/fs/write-file.test.js +53 -0
  112. package/dist/tests/tools/fs/write-file.test.js.map +1 -0
  113. package/dist/tests/tools/present/add.test.d.ts +2 -0
  114. package/dist/tests/tools/present/add.test.d.ts.map +1 -0
  115. package/dist/tests/tools/present/add.test.js +51 -0
  116. package/dist/tests/tools/present/add.test.js.map +1 -0
  117. package/dist/tests/tools/present/clear.test.d.ts +2 -0
  118. package/dist/tests/tools/present/clear.test.d.ts.map +1 -0
  119. package/dist/tests/tools/present/clear.test.js +44 -0
  120. package/dist/tests/tools/present/clear.test.js.map +1 -0
  121. package/dist/tests/tools/present/get-list.test.d.ts +2 -0
  122. package/dist/tests/tools/present/get-list.test.d.ts.map +1 -0
  123. package/dist/tests/tools/present/get-list.test.js +50 -0
  124. package/dist/tests/tools/present/get-list.test.js.map +1 -0
  125. package/dist/tests/tools/question-answer/question-answer.test.d.ts +2 -0
  126. package/dist/tests/tools/question-answer/question-answer.test.d.ts.map +1 -0
  127. package/dist/tests/tools/question-answer/question-answer.test.js +34 -0
  128. package/dist/tests/tools/question-answer/question-answer.test.js.map +1 -0
  129. package/dist/tests/tools/todo/check-task.test.d.ts +2 -0
  130. package/dist/tests/tools/todo/check-task.test.d.ts.map +1 -0
  131. package/dist/tests/tools/todo/check-task.test.js +42 -0
  132. package/dist/tests/tools/todo/check-task.test.js.map +1 -0
  133. package/dist/tests/tools/todo/create-list.test.d.ts +2 -0
  134. package/dist/tests/tools/todo/create-list.test.d.ts.map +1 -0
  135. package/dist/tests/tools/todo/create-list.test.js +32 -0
  136. package/dist/tests/tools/todo/create-list.test.js.map +1 -0
  137. package/dist/tests/tools/todo/create-task.test.d.ts +2 -0
  138. package/dist/tests/tools/todo/create-task.test.d.ts.map +1 -0
  139. package/dist/tests/tools/todo/create-task.test.js +53 -0
  140. package/dist/tests/tools/todo/create-task.test.js.map +1 -0
  141. package/dist/tests/tools/todo/get-list.test.d.ts +2 -0
  142. package/dist/tests/tools/todo/get-list.test.d.ts.map +1 -0
  143. package/dist/tests/tools/todo/get-list.test.js +38 -0
  144. package/dist/tests/tools/todo/get-list.test.js.map +1 -0
  145. package/dist/tests/tools/todo/get-lists.test.d.ts +2 -0
  146. package/dist/tests/tools/todo/get-lists.test.d.ts.map +1 -0
  147. package/dist/tests/tools/todo/get-lists.test.js +29 -0
  148. package/dist/tests/tools/todo/get-lists.test.js.map +1 -0
  149. package/dist/tests/tools/todo/remove-list.test.d.ts +2 -0
  150. package/dist/tests/tools/todo/remove-list.test.d.ts.map +1 -0
  151. package/dist/tests/tools/todo/remove-list.test.js +41 -0
  152. package/dist/tests/tools/todo/remove-list.test.js.map +1 -0
  153. package/dist/tests/tools/todo/remove-task.test.d.ts +2 -0
  154. package/dist/tests/tools/todo/remove-task.test.d.ts.map +1 -0
  155. package/dist/tests/tools/todo/remove-task.test.js +45 -0
  156. package/dist/tests/tools/todo/remove-task.test.js.map +1 -0
  157. package/dist/tests/tools/utils/delay.test.js +26 -24
  158. package/dist/tests/tools/utils/delay.test.js.map +1 -1
  159. package/dist/tests/tools/utils/get-current-time.test.js +43 -41
  160. package/dist/tests/tools/utils/get-current-time.test.js.map +1 -1
  161. package/dist/tests/tools/utils/read-image.test.d.ts +2 -0
  162. package/dist/tests/tools/utils/read-image.test.d.ts.map +1 -0
  163. package/dist/tests/tools/utils/read-image.test.js +54 -0
  164. package/dist/tests/tools/utils/read-image.test.js.map +1 -0
  165. package/dist/tools/browser/session-manager.d.ts.map +1 -1
  166. package/dist/tools/browser/session-manager.js +16 -3
  167. package/dist/tools/browser/session-manager.js.map +1 -1
  168. package/docs/agents.md +7 -1
  169. package/docs/mcp-architecture.md +1 -1
  170. package/docs/providers.md +5 -1
  171. package/package.json +1 -1
@@ -1,25 +1,27 @@
1
- import { test, before, after } from "node:test";
1
+ import { test, before, after, describe } from "node:test";
2
2
  import assert from "node:assert/strict";
3
3
  import { GetCurrentTimeTool, MCPClient, MCPConnection, MCPServer } from "../../index.js";
4
- let mcpConnection;
5
- let mcpClient;
6
- let mcpServer;
7
- before(async () => {
8
- mcpConnection = new MCPConnection();
9
- mcpClient = new MCPClient("1234", mcpConnection);
10
- mcpServer = new MCPServer(mcpConnection);
11
- mcpServer.registerTool(GetCurrentTimeTool());
12
- });
13
- after(async () => {
14
- mcpConnection?.close();
15
- });
16
- test("MCPConnection: get-current-time tool call returns iso, unix, and timezone fields", async () => {
17
- const result = await mcpClient.callTool("get-current-time", {});
18
- assert.ok(result, "callTool should return a result");
19
- assert.ok(result.output, "result should have an output field");
20
- const { output } = result;
21
- assert.ok("iso" in output, "output should contain 'iso'");
22
- assert.ok("unix" in output, "output should contain 'unix'");
23
- assert.ok("timezone" in output, "output should contain 'timezone'");
4
+ describe("core/mcp-connection", () => {
5
+ let mcpConnection;
6
+ let mcpClient;
7
+ let mcpServer;
8
+ before(async () => {
9
+ mcpConnection = new MCPConnection();
10
+ mcpClient = new MCPClient("1234", mcpConnection);
11
+ mcpServer = new MCPServer(mcpConnection);
12
+ mcpServer.registerTool(GetCurrentTimeTool());
13
+ });
14
+ after(async () => {
15
+ mcpConnection?.close();
16
+ });
17
+ test("MCPConnection: get-current-time tool call returns iso, unix, and timezone fields", async () => {
18
+ const result = await mcpClient.callTool("get-current-time", {});
19
+ assert.ok(result, "callTool should return a result");
20
+ assert.ok(result.output, "result should have an output field");
21
+ const { output } = result;
22
+ assert.ok("iso" in output, "output should contain 'iso'");
23
+ assert.ok("unix" in output, "output should contain 'unix'");
24
+ assert.ok("timezone" in output, "output should contain 'timezone'");
25
+ });
24
26
  });
25
27
  //# sourceMappingURL=mcp-connection.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-connection.test.js","sourceRoot":"","sources":["../../../src/tests/core/mcp-connection.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGzF,IAAI,aAAwC,CAAC;AAC7C,IAAI,SAAoB,CAAC;AACzB,IAAI,SAAoB,CAAC;AAEzB,MAAM,CAAC,KAAK,IAAI,EAAE;IACd,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;IACpC,SAAS,GAAG,IAAI,SAAS,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACjD,SAAS,GAAG,IAAI,SAAS,CAAC,aAAa,CAAC,CAAC;IACzC,SAAS,CAAC,YAAY,CAAC,kBAAkB,EAAE,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AAEH,KAAK,CAAC,KAAK,IAAI,EAAE;IACb,aAAa,EAAE,KAAK,EAAE,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kFAAkF,EAAE,KAAK,IAAI,EAAE;IAChG,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;IAEhE,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,iCAAiC,CAAC,CAAC;IACrD,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,oCAAoC,CAAC,CAAC;IAE/D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAE1B,MAAM,CAAC,EAAE,CAAC,KAAK,IAAI,MAAM,EAAE,6BAA6B,CAAC,CAAC;IAC1D,MAAM,CAAC,EAAE,CAAC,MAAM,IAAI,MAAM,EAAE,8BAA8B,CAAC,CAAC;IAC5D,MAAM,CAAC,EAAE,CAAC,UAAU,IAAI,MAAM,EAAE,kCAAkC,CAAC,CAAC;AACxE,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"mcp-connection.test.js","sourceRoot":"","sources":["../../../src/tests/core/mcp-connection.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEzF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACjC,IAAI,aAAwC,CAAC;IAC7C,IAAI,SAAoB,CAAC;IACzB,IAAI,SAAoB,CAAC;IAEzB,MAAM,CAAC,KAAK,IAAI,EAAE;QACd,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;QACpC,SAAS,GAAG,IAAI,SAAS,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QACjD,SAAS,GAAG,IAAI,SAAS,CAAC,aAAa,CAAC,CAAC;QACzC,SAAS,CAAC,YAAY,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,KAAK,IAAI,EAAE;QACb,aAAa,EAAE,KAAK,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,kFAAkF,EAAE,KAAK,IAAI,EAAE;QAChG,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;QAEhE,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,iCAAiC,CAAC,CAAC;QACrD,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,oCAAoC,CAAC,CAAC;QAE/D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;QAE1B,MAAM,CAAC,EAAE,CAAC,KAAK,IAAI,MAAM,EAAE,6BAA6B,CAAC,CAAC;QAC1D,MAAM,CAAC,EAAE,CAAC,MAAM,IAAI,MAAM,EAAE,8BAA8B,CAAC,CAAC;QAC5D,MAAM,CAAC,EAAE,CAAC,UAAU,IAAI,MAAM,EAAE,kCAAkC,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -1,35 +1,37 @@
1
- import { test, before, after } from "node:test";
1
+ import { test, before, after, describe } from "node:test";
2
2
  import assert from "node:assert/strict";
3
3
  import { GetCurrentTimeTool, MCPClient, MCPConnection, MCPIPCConnection, MCPServer } from "../../index.js";
4
4
  import { platform } from "node:os";
5
- let mcpClientIPCConnection;
6
- let mcpServerIPCConnection;
7
- let mcpClient;
8
- let mcpServer;
9
- before(async () => {
10
- mcpServerIPCConnection = new MCPIPCConnection({
11
- mode: "server",
12
- socketPath: platform() == "win32" ? "\\\\.\\pipe\\mcp_test" : "/tmp/mcp_test.sock"
5
+ describe("core/mcp-ipc-connection", () => {
6
+ let mcpClientIPCConnection;
7
+ let mcpServerIPCConnection;
8
+ let mcpClient;
9
+ let mcpServer;
10
+ before(async () => {
11
+ mcpServerIPCConnection = new MCPIPCConnection({
12
+ mode: "server",
13
+ socketPath: platform() == "win32" ? "\\\\.\\pipe\\mcp_test" : "/tmp/mcp_test.sock"
14
+ });
15
+ mcpClientIPCConnection = new MCPIPCConnection({
16
+ mode: "client",
17
+ socketPath: platform() == "win32" ? "\\\\.\\pipe\\mcp_test" : "/tmp/mcp_test.sock"
18
+ });
19
+ mcpClient = new MCPClient("1234", mcpClientIPCConnection);
20
+ mcpServer = new MCPServer(mcpServerIPCConnection);
21
+ mcpServer.registerTool(GetCurrentTimeTool());
13
22
  });
14
- mcpClientIPCConnection = new MCPIPCConnection({
15
- mode: "client",
16
- socketPath: platform() == "win32" ? "\\\\.\\pipe\\mcp_test" : "/tmp/mcp_test.sock"
23
+ after(async () => {
24
+ mcpClientIPCConnection?.close();
25
+ mcpServerIPCConnection?.close();
26
+ });
27
+ test("MCPIPCConnection: get-current-time tool call returns iso, unix, and timezone fields", async () => {
28
+ const result = await mcpClient.callTool("get-current-time", {});
29
+ assert.ok(result, "callTool should return a result");
30
+ assert.ok(result.output, "result should have an output field");
31
+ const { output } = result;
32
+ assert.ok("iso" in output, "output should contain 'iso'");
33
+ assert.ok("unix" in output, "output should contain 'unix'");
34
+ assert.ok("timezone" in output, "output should contain 'timezone'");
17
35
  });
18
- mcpClient = new MCPClient("1234", mcpClientIPCConnection);
19
- mcpServer = new MCPServer(mcpServerIPCConnection);
20
- mcpServer.registerTool(GetCurrentTimeTool());
21
- });
22
- after(async () => {
23
- mcpClientIPCConnection?.close();
24
- mcpServerIPCConnection?.close();
25
- });
26
- test("MCPIPCConnection: get-current-time tool call returns iso, unix, and timezone fields", async () => {
27
- const result = await mcpClient.callTool("get-current-time", {});
28
- assert.ok(result, "callTool should return a result");
29
- assert.ok(result.output, "result should have an output field");
30
- const { output } = result;
31
- assert.ok("iso" in output, "output should contain 'iso'");
32
- assert.ok("unix" in output, "output should contain 'unix'");
33
- assert.ok("timezone" in output, "output should contain 'timezone'");
34
36
  });
35
37
  //# sourceMappingURL=mcp-ipc-connection.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-ipc-connection.test.js","sourceRoot":"","sources":["../../../src/tests/core/mcp-ipc-connection.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3G,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGnC,IAAI,sBAAiD,CAAC;AACtD,IAAI,sBAAiD,CAAC;AACtD,IAAI,SAAoB,CAAC;AACzB,IAAI,SAAoB,CAAC;AAEzB,MAAM,CAAC,KAAK,IAAI,EAAE;IACd,sBAAsB,GAAG,IAAI,gBAAgB,CAAC;QAC1C,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,QAAQ,EAAE,IAAI,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,oBAAoB;KACrF,CAAC,CAAC;IACH,sBAAsB,GAAG,IAAI,gBAAgB,CAAC;QAC1C,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,QAAQ,EAAE,IAAI,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,oBAAoB;KACrF,CAAC,CAAC;IACH,SAAS,GAAG,IAAI,SAAS,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IAC1D,SAAS,GAAG,IAAI,SAAS,CAAC,sBAAsB,CAAC,CAAC;IAClD,SAAS,CAAC,YAAY,CAAC,kBAAkB,EAAE,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AAEH,KAAK,CAAC,KAAK,IAAI,EAAE;IACb,sBAAsB,EAAE,KAAK,EAAE,CAAC;IAChC,sBAAsB,EAAE,KAAK,EAAE,CAAC;AACpC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qFAAqF,EAAE,KAAK,IAAI,EAAE;IACnG,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;IAEhE,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,iCAAiC,CAAC,CAAC;IACrD,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,oCAAoC,CAAC,CAAC;IAE/D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAE1B,MAAM,CAAC,EAAE,CAAC,KAAK,IAAI,MAAM,EAAE,6BAA6B,CAAC,CAAC;IAC1D,MAAM,CAAC,EAAE,CAAC,MAAM,IAAI,MAAM,EAAE,8BAA8B,CAAC,CAAC;IAC5D,MAAM,CAAC,EAAE,CAAC,UAAU,IAAI,MAAM,EAAE,kCAAkC,CAAC,CAAC;AACxE,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"mcp-ipc-connection.test.js","sourceRoot":"","sources":["../../../src/tests/core/mcp-ipc-connection.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3G,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACrC,IAAI,sBAAiD,CAAC;IACtD,IAAI,sBAAiD,CAAC;IACtD,IAAI,SAAoB,CAAC;IACzB,IAAI,SAAoB,CAAC;IAEzB,MAAM,CAAC,KAAK,IAAI,EAAE;QACd,sBAAsB,GAAG,IAAI,gBAAgB,CAAC;YAC1C,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,QAAQ,EAAE,IAAI,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,oBAAoB;SACrF,CAAC,CAAC;QACH,sBAAsB,GAAG,IAAI,gBAAgB,CAAC;YAC1C,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,QAAQ,EAAE,IAAI,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,oBAAoB;SACrF,CAAC,CAAC;QACH,SAAS,GAAG,IAAI,SAAS,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;QAC1D,SAAS,GAAG,IAAI,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAClD,SAAS,CAAC,YAAY,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,KAAK,IAAI,EAAE;QACb,sBAAsB,EAAE,KAAK,EAAE,CAAC;QAChC,sBAAsB,EAAE,KAAK,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,qFAAqF,EAAE,KAAK,IAAI,EAAE;QACnG,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;QAEhE,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,iCAAiC,CAAC,CAAC;QACrD,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,oCAAoC,CAAC,CAAC;QAE/D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;QAE1B,MAAM,CAAC,EAAE,CAAC,KAAK,IAAI,MAAM,EAAE,6BAA6B,CAAC,CAAC;QAC1D,MAAM,CAAC,EAAE,CAAC,MAAM,IAAI,MAAM,EAAE,8BAA8B,CAAC,CAAC;QAC5D,MAAM,CAAC,EAAE,CAAC,UAAU,IAAI,MAAM,EAAE,kCAAkC,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -1,36 +1,37 @@
1
- import { test, before, after } from "node:test";
1
+ import { test, before, after, describe } from "node:test";
2
2
  import assert from "node:assert/strict";
3
3
  import { GetCurrentTimeTool, MCPClient, MCPConnection, MCPWSConnection, MCPServer } from "../../index.js";
4
- import { platform } from "node:os";
5
- let mcpClientWSConnection;
6
- let mcpServerWSConnection;
7
- let mcpClient;
8
- let mcpServer;
9
- before(async () => {
10
- mcpServerWSConnection = new MCPWSConnection({
11
- mode: "server",
12
- host: "0.0.0.0",
13
- port: 6785
4
+ describe("core/mcp-ws-connection", () => {
5
+ let mcpClientWSConnection;
6
+ let mcpServerWSConnection;
7
+ let mcpClient;
8
+ let mcpServer;
9
+ before(async () => {
10
+ mcpServerWSConnection = new MCPWSConnection({
11
+ mode: "server",
12
+ host: "0.0.0.0",
13
+ port: 6785
14
+ });
15
+ mcpClientWSConnection = new MCPWSConnection({
16
+ mode: "client",
17
+ url: "ws://localhost:6785"
18
+ });
19
+ mcpClient = new MCPClient("1234", mcpClientWSConnection);
20
+ mcpServer = new MCPServer(mcpServerWSConnection);
21
+ mcpServer.registerTool(GetCurrentTimeTool());
14
22
  });
15
- mcpClientWSConnection = new MCPWSConnection({
16
- mode: "client",
17
- url: "ws://localhost:6785"
23
+ after(async () => {
24
+ mcpClientWSConnection?.close();
25
+ mcpServerWSConnection?.close();
26
+ });
27
+ test("MCPWSConnection: get-current-time tool call returns iso, unix, and timezone fields", async () => {
28
+ const result = await mcpClient.callTool("get-current-time", {});
29
+ assert.ok(result, "callTool should return a result");
30
+ assert.ok(result.output, "result should have an output field");
31
+ const { output } = result;
32
+ assert.ok("iso" in output, "output should contain 'iso'");
33
+ assert.ok("unix" in output, "output should contain 'unix'");
34
+ assert.ok("timezone" in output, "output should contain 'timezone'");
18
35
  });
19
- mcpClient = new MCPClient("1234", mcpClientWSConnection);
20
- mcpServer = new MCPServer(mcpServerWSConnection);
21
- mcpServer.registerTool(GetCurrentTimeTool());
22
- });
23
- after(async () => {
24
- mcpClientWSConnection?.close();
25
- mcpServerWSConnection?.close();
26
- });
27
- test("MCPWSConnection: get-current-time tool call returns iso, unix, and timezone fields", async () => {
28
- const result = await mcpClient.callTool("get-current-time", {});
29
- assert.ok(result, "callTool should return a result");
30
- assert.ok(result.output, "result should have an output field");
31
- const { output } = result;
32
- assert.ok("iso" in output, "output should contain 'iso'");
33
- assert.ok("unix" in output, "output should contain 'unix'");
34
- assert.ok("timezone" in output, "output should contain 'timezone'");
35
36
  });
36
37
  //# sourceMappingURL=mcp-ws-connection.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-ws-connection.test.js","sourceRoot":"","sources":["../../../src/tests/core/mcp-ws-connection.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,aAAa,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC1G,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGnC,IAAI,qBAAgD,CAAC;AACrD,IAAI,qBAAgD,CAAC;AACrD,IAAI,SAAoB,CAAC;AACzB,IAAI,SAAoB,CAAC;AAEzB,MAAM,CAAC,KAAK,IAAI,EAAE;IACd,qBAAqB,GAAG,IAAI,eAAe,CAAC;QACxC,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,IAAI;KACb,CAAC,CAAC;IACH,qBAAqB,GAAG,IAAI,eAAe,CAAC;QACxC,IAAI,EAAE,QAAQ;QACd,GAAG,EAAE,qBAAqB;KAC7B,CAAC,CAAC;IACH,SAAS,GAAG,IAAI,SAAS,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IACzD,SAAS,GAAG,IAAI,SAAS,CAAC,qBAAqB,CAAC,CAAC;IACjD,SAAS,CAAC,YAAY,CAAC,kBAAkB,EAAE,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AAEH,KAAK,CAAC,KAAK,IAAI,EAAE;IACb,qBAAqB,EAAE,KAAK,EAAE,CAAC;IAC/B,qBAAqB,EAAE,KAAK,EAAE,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,oFAAoF,EAAE,KAAK,IAAI,EAAE;IAClG,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;IAEhE,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,iCAAiC,CAAC,CAAC;IACrD,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,oCAAoC,CAAC,CAAC;IAE/D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAE1B,MAAM,CAAC,EAAE,CAAC,KAAK,IAAI,MAAM,EAAE,6BAA6B,CAAC,CAAC;IAC1D,MAAM,CAAC,EAAE,CAAC,MAAM,IAAI,MAAM,EAAE,8BAA8B,CAAC,CAAC;IAC5D,MAAM,CAAC,EAAE,CAAC,UAAU,IAAI,MAAM,EAAE,kCAAkC,CAAC,CAAC;AACxE,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"mcp-ws-connection.test.js","sourceRoot":"","sources":["../../../src/tests/core/mcp-ws-connection.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,aAAa,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE1G,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACpC,IAAI,qBAAgD,CAAC;IACrD,IAAI,qBAAgD,CAAC;IACrD,IAAI,SAAoB,CAAC;IACzB,IAAI,SAAoB,CAAC;IAEzB,MAAM,CAAC,KAAK,IAAI,EAAE;QACd,qBAAqB,GAAG,IAAI,eAAe,CAAC;YACxC,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,IAAI;SACb,CAAC,CAAC;QACH,qBAAqB,GAAG,IAAI,eAAe,CAAC;YACxC,IAAI,EAAE,QAAQ;YACd,GAAG,EAAE,qBAAqB;SAC7B,CAAC,CAAC;QACH,SAAS,GAAG,IAAI,SAAS,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;QACzD,SAAS,GAAG,IAAI,SAAS,CAAC,qBAAqB,CAAC,CAAC;QACjD,SAAS,CAAC,YAAY,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,KAAK,IAAI,EAAE;QACb,qBAAqB,EAAE,KAAK,EAAE,CAAC;QAC/B,qBAAqB,EAAE,KAAK,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,oFAAoF,EAAE,KAAK,IAAI,EAAE;QAClG,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;QAEhE,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,iCAAiC,CAAC,CAAC;QACrD,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,oCAAoC,CAAC,CAAC;QAE/D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;QAE1B,MAAM,CAAC,EAAE,CAAC,KAAK,IAAI,MAAM,EAAE,6BAA6B,CAAC,CAAC;QAC1D,MAAM,CAAC,EAAE,CAAC,MAAM,IAAI,MAAM,EAAE,8BAA8B,CAAC,CAAC;QAC5D,MAAM,CAAC,EAAE,CAAC,UAAU,IAAI,MAAM,EAAE,kCAAkC,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -4,5 +4,32 @@ import "./core/mcp-ipc-connection.test.js";
4
4
  import "./core/mcp-ws-connection.test.js";
5
5
  import "./tools/utils/delay.test.js";
6
6
  import "./tools/utils/get-current-time.test.js";
7
+ import "./tools/utils/read-image.test.js";
8
+ import "./tools/fs/read-file.test.js";
9
+ import "./tools/fs/write-file.test.js";
10
+ import "./tools/fs/edit-file.test.js";
11
+ import "./tools/fs/list-dir.test.js";
12
+ import "./tools/fs/create-dir.test.js";
13
+ import "./tools/fs/delete.test.js";
14
+ import "./tools/fs/move.test.js";
15
+ import "./tools/fs/stat.test.js";
16
+ import "./tools/todo/create-list.test.js";
17
+ import "./tools/todo/remove-list.test.js";
18
+ import "./tools/todo/get-lists.test.js";
19
+ import "./tools/todo/get-list.test.js";
20
+ import "./tools/todo/create-task.test.js";
21
+ import "./tools/todo/remove-task.test.js";
22
+ import "./tools/todo/check-task.test.js";
23
+ import "./tools/present/add.test.js";
24
+ import "./tools/present/clear.test.js";
25
+ import "./tools/present/get-list.test.js";
26
+ import "./tools/bash/run.test.js";
27
+ import "./tools/bash/wait.test.js";
28
+ import "./tools/bash/logs.test.js";
29
+ import "./tools/bash/list.test.js";
30
+ import "./tools/bash/write-input.test.js";
31
+ import "./tools/bash/terminate.test.js";
32
+ import "./tools/question-answer/question-answer.test.js";
33
+ import "./tools/browser/browser-tools.test.js";
7
34
  import "./tools/agent/agent-tools.test.js";
8
35
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tests/index.ts"],"names":[],"mappings":"AAAA,OAAO,6BAA6B,CAAC;AACrC,OAAO,+BAA+B,CAAC;AACvC,OAAO,mCAAmC,CAAC;AAC3C,OAAO,kCAAkC,CAAC;AAG1C,OAAO,6BAA6B,CAAC;AACrC,OAAO,wCAAwC,CAAC;AAChD,OAAO,mCAAmC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tests/index.ts"],"names":[],"mappings":"AAAA,OAAO,6BAA6B,CAAC;AACrC,OAAO,+BAA+B,CAAC;AACvC,OAAO,mCAAmC,CAAC;AAC3C,OAAO,kCAAkC,CAAC;AAG1C,OAAO,6BAA6B,CAAC;AACrC,OAAO,wCAAwC,CAAC;AAChD,OAAO,kCAAkC,CAAC;AAE1C,OAAO,8BAA8B,CAAC;AACtC,OAAO,+BAA+B,CAAC;AACvC,OAAO,8BAA8B,CAAC;AACtC,OAAO,6BAA6B,CAAC;AACrC,OAAO,+BAA+B,CAAC;AACvC,OAAO,2BAA2B,CAAC;AACnC,OAAO,yBAAyB,CAAC;AACjC,OAAO,yBAAyB,CAAC;AAEjC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,kCAAkC,CAAC;AAC1C,OAAO,gCAAgC,CAAC;AACxC,OAAO,+BAA+B,CAAC;AACvC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,kCAAkC,CAAC;AAC1C,OAAO,iCAAiC,CAAC;AAEzC,OAAO,6BAA6B,CAAC;AACrC,OAAO,+BAA+B,CAAC;AACvC,OAAO,kCAAkC,CAAC;AAE1C,OAAO,0BAA0B,CAAC;AAClC,OAAO,2BAA2B,CAAC;AACnC,OAAO,2BAA2B,CAAC;AACnC,OAAO,2BAA2B,CAAC;AACnC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,gCAAgC,CAAC;AAExC,OAAO,iDAAiD,CAAC;AAEzD,OAAO,uCAAuC,CAAC;AAE/C,OAAO,mCAAmC,CAAC"}
@@ -4,5 +4,32 @@ import "./core/mcp-ipc-connection.test.js";
4
4
  import "./core/mcp-ws-connection.test.js";
5
5
  import "./tools/utils/delay.test.js";
6
6
  import "./tools/utils/get-current-time.test.js";
7
+ import "./tools/utils/read-image.test.js";
8
+ import "./tools/fs/read-file.test.js";
9
+ import "./tools/fs/write-file.test.js";
10
+ import "./tools/fs/edit-file.test.js";
11
+ import "./tools/fs/list-dir.test.js";
12
+ import "./tools/fs/create-dir.test.js";
13
+ import "./tools/fs/delete.test.js";
14
+ import "./tools/fs/move.test.js";
15
+ import "./tools/fs/stat.test.js";
16
+ import "./tools/todo/create-list.test.js";
17
+ import "./tools/todo/remove-list.test.js";
18
+ import "./tools/todo/get-lists.test.js";
19
+ import "./tools/todo/get-list.test.js";
20
+ import "./tools/todo/create-task.test.js";
21
+ import "./tools/todo/remove-task.test.js";
22
+ import "./tools/todo/check-task.test.js";
23
+ import "./tools/present/add.test.js";
24
+ import "./tools/present/clear.test.js";
25
+ import "./tools/present/get-list.test.js";
26
+ import "./tools/bash/run.test.js";
27
+ import "./tools/bash/wait.test.js";
28
+ import "./tools/bash/logs.test.js";
29
+ import "./tools/bash/list.test.js";
30
+ import "./tools/bash/write-input.test.js";
31
+ import "./tools/bash/terminate.test.js";
32
+ import "./tools/question-answer/question-answer.test.js";
33
+ import "./tools/browser/browser-tools.test.js";
7
34
  import "./tools/agent/agent-tools.test.js";
8
35
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tests/index.ts"],"names":[],"mappings":"AAAA,OAAO,6BAA6B,CAAC;AACrC,OAAO,+BAA+B,CAAC;AACvC,OAAO,mCAAmC,CAAC;AAC3C,OAAO,kCAAkC,CAAC;AAG1C,OAAO,6BAA6B,CAAC;AACrC,OAAO,wCAAwC,CAAC;AAChD,OAAO,mCAAmC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tests/index.ts"],"names":[],"mappings":"AAAA,OAAO,6BAA6B,CAAC;AACrC,OAAO,+BAA+B,CAAC;AACvC,OAAO,mCAAmC,CAAC;AAC3C,OAAO,kCAAkC,CAAC;AAG1C,OAAO,6BAA6B,CAAC;AACrC,OAAO,wCAAwC,CAAC;AAChD,OAAO,kCAAkC,CAAC;AAE1C,OAAO,8BAA8B,CAAC;AACtC,OAAO,+BAA+B,CAAC;AACvC,OAAO,8BAA8B,CAAC;AACtC,OAAO,6BAA6B,CAAC;AACrC,OAAO,+BAA+B,CAAC;AACvC,OAAO,2BAA2B,CAAC;AACnC,OAAO,yBAAyB,CAAC;AACjC,OAAO,yBAAyB,CAAC;AAEjC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,kCAAkC,CAAC;AAC1C,OAAO,gCAAgC,CAAC;AACxC,OAAO,+BAA+B,CAAC;AACvC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,kCAAkC,CAAC;AAC1C,OAAO,iCAAiC,CAAC;AAEzC,OAAO,6BAA6B,CAAC;AACrC,OAAO,+BAA+B,CAAC;AACvC,OAAO,kCAAkC,CAAC;AAE1C,OAAO,0BAA0B,CAAC;AAClC,OAAO,2BAA2B,CAAC;AACnC,OAAO,2BAA2B,CAAC;AACnC,OAAO,2BAA2B,CAAC;AACnC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,gCAAgC,CAAC;AAExC,OAAO,iDAAiD,CAAC;AAEzD,OAAO,uCAAuC,CAAC;AAE/C,OAAO,mCAAmC,CAAC"}
@@ -1,156 +1,158 @@
1
- import { test } from "node:test";
1
+ import { describe, test } from "node:test";
2
2
  import assert from "node:assert/strict";
3
3
  import { AIProvider, AgentReportTool, AgentTools, MCPClient, MCPConnection, MCPServer, WorkerAgent, } from "../../../index.js";
4
- /**
5
- * Returns a fixed, scripted response (or repeats the last one once
6
- * exhausted) instead of calling a real model — lets the agent-management
7
- * tools be tested end to end (hire -> prompt -> worker's own tool loop ->
8
- * report) with no network access.
9
- */
10
- class ScriptedProvider extends AIProvider {
11
- #responses;
12
- #calls = 0;
13
- constructor(responses) {
14
- super();
15
- this.#responses = responses;
16
- }
17
- async chat(_messages, streamCallback, _tools) {
18
- const response = this.#responses[Math.min(this.#calls, this.#responses.length - 1)];
19
- this.#calls++;
20
- if (streamCallback) {
21
- if (response.content) {
22
- await streamCallback({ role: "assistant", content: response.content, done: false });
4
+ describe("agent/agent", () => {
5
+ /**
6
+ * Returns a fixed, scripted response (or repeats the last one once
7
+ * exhausted) instead of calling a real model — lets the agent-management
8
+ * tools be tested end to end (hire -> prompt -> worker's own tool loop ->
9
+ * report) with no network access.
10
+ */
11
+ class ScriptedProvider extends AIProvider {
12
+ #responses;
13
+ #calls = 0;
14
+ constructor(responses) {
15
+ super();
16
+ this.#responses = responses;
17
+ }
18
+ async chat(_messages, streamCallback, _tools) {
19
+ const response = this.#responses[Math.min(this.#calls, this.#responses.length - 1)];
20
+ this.#calls++;
21
+ if (streamCallback) {
22
+ if (response.content) {
23
+ await streamCallback({ role: "assistant", content: response.content, done: false });
24
+ }
25
+ await streamCallback({
26
+ role: "assistant",
27
+ content: "",
28
+ done: true,
29
+ ...(response.toolCalls?.length ? { toolCalls: response.toolCalls } : {}),
30
+ });
23
31
  }
24
- await streamCallback({
25
- role: "assistant",
26
- content: "",
27
- done: true,
28
- ...(response.toolCalls?.length ? { toolCalls: response.toolCalls } : {}),
29
- });
32
+ return response;
33
+ }
34
+ getCapabilities() {
35
+ return { supportsTools: true, supportsImages: false, contextWindow: 200_000, safeUsageRatio: 0.9 };
30
36
  }
31
- return response;
32
37
  }
33
- getCapabilities() {
34
- return { supportsTools: true, supportsImages: false, contextWindow: 200_000, safeUsageRatio: 0.9 };
38
+ function buildWorker(name, description, responses) {
39
+ const connection = new MCPConnection();
40
+ const server = new MCPServer(connection);
41
+ const reportTool = AgentReportTool();
42
+ server.registerTool(reportTool);
43
+ const mcpClient = new MCPClient(`worker-${name}`, connection);
44
+ return new WorkerAgent({
45
+ name,
46
+ description,
47
+ rating: { backend: 8, frontend: 3 },
48
+ instruction: "You are a worker agent.",
49
+ aiProvider: new ScriptedProvider(responses),
50
+ mcpClient,
51
+ allowedTools: [reportTool],
52
+ });
35
53
  }
36
- }
37
- function buildWorker(name, description, responses) {
38
- const connection = new MCPConnection();
39
- const server = new MCPServer(connection);
40
- const reportTool = AgentReportTool();
41
- server.registerTool(reportTool);
42
- const mcpClient = new MCPClient(`worker-${name}`, connection);
43
- return new WorkerAgent({
44
- name,
45
- description,
46
- rating: { backend: 8, frontend: 3 },
47
- instruction: "You are a worker agent.",
48
- aiProvider: new ScriptedProvider(responses),
49
- mcpClient,
50
- allowedTools: [reportTool],
54
+ test("AgentTools: agent-list shows every worker, unhired by default", async () => {
55
+ const worker = buildWorker("backend-worker", "Handles backend tasks.", [{ content: "unused", inputTokens: 0, outputTokens: 0 }]);
56
+ const [listTool] = AgentTools([worker]);
57
+ const result = await listTool.getOptions().execute("env", {});
58
+ assert.strictEqual(result.agents.length, 1);
59
+ assert.strictEqual(result.agents[0].name, "backend-worker");
60
+ assert.strictEqual(result.agents[0].description, "Handles backend tasks.");
61
+ assert.deepStrictEqual(result.agents[0].rating, { backend: 8, frontend: 3 });
62
+ assert.strictEqual(result.agents[0].hired, false);
63
+ });
64
+ test("AgentTools: agent-hire marks a worker hired, reflected in agent-list", async () => {
65
+ const worker = buildWorker("backend-worker", "Handles backend tasks.", [{ content: "unused", inputTokens: 0, outputTokens: 0 }]);
66
+ const [listTool, hireTool] = AgentTools([worker]);
67
+ const hireResult = await hireTool.getOptions().execute("env", { name: "backend-worker" });
68
+ assert.deepStrictEqual(hireResult, { hired: true, name: "backend-worker" });
69
+ const listResult = await listTool.getOptions().execute("env", {});
70
+ assert.strictEqual(listResult.agents[0].hired, true);
71
+ });
72
+ test("AgentTools: agent-hire on an unknown name throws", async () => {
73
+ const worker = buildWorker("backend-worker", "Handles backend tasks.", [{ content: "unused", inputTokens: 0, outputTokens: 0 }]);
74
+ const [, hireTool] = AgentTools([worker]);
75
+ await assert.rejects(() => hireTool.getOptions().execute("env", { name: "nonexistent" }), /no worker agent named "nonexistent"/);
76
+ });
77
+ test("AgentTools: agent-prompt on a worker that isn't hired yet throws", async () => {
78
+ const worker = buildWorker("backend-worker", "Handles backend tasks.", [{ content: "unused", inputTokens: 0, outputTokens: 0 }]);
79
+ const [, , promptTool] = AgentTools([worker]);
80
+ await assert.rejects(() => promptTool.getOptions().execute("env", { name: "backend-worker", prompt: "do it" }), /is not hired yet/);
81
+ });
82
+ test("AgentTools: agent-prompt runs the worker and returns its agent-report text", async () => {
83
+ const reportCall = { id: "call-1", name: "agent-report", inputs: { report: "answer is 42" } };
84
+ const worker = buildWorker("backend-worker", "Handles backend tasks.", [
85
+ { content: "", inputTokens: 10, outputTokens: 5, toolCalls: [reportCall] },
86
+ ]);
87
+ const [, hireTool, promptTool] = AgentTools([worker]);
88
+ await hireTool.getOptions().execute("env", { name: "backend-worker" });
89
+ const result = await promptTool.getOptions().execute("env", { name: "backend-worker", prompt: "what is the answer?" });
90
+ assert.strictEqual(result.reported, true);
91
+ assert.strictEqual(result.report, "answer is 42");
92
+ });
93
+ test("AgentTools: agent-prompt falls back to the worker's last assistant text when it never calls agent-report", async () => {
94
+ const worker = buildWorker("backend-worker", "Handles backend tasks.", [
95
+ { content: "I looked into it, no tool needed.", inputTokens: 10, outputTokens: 5 },
96
+ ]);
97
+ const [, hireTool, promptTool] = AgentTools([worker]);
98
+ await hireTool.getOptions().execute("env", { name: "backend-worker" });
99
+ const result = await promptTool.getOptions().execute("env", { name: "backend-worker", prompt: "check something" });
100
+ assert.strictEqual(result.reported, false);
101
+ assert.strictEqual(result.report, "I looked into it, no tool needed.");
102
+ });
103
+ test("AgentTools: a second agent-prompt call doesn't resurface a stale report from the first call", async () => {
104
+ const reportCall = { id: "call-1", name: "agent-report", inputs: { report: "first answer" } };
105
+ const worker = buildWorker("backend-worker", "Handles backend tasks.", [
106
+ { content: "", inputTokens: 10, outputTokens: 5, toolCalls: [reportCall] },
107
+ { content: "just acknowledging, no report this time", inputTokens: 10, outputTokens: 5 },
108
+ ]);
109
+ const [, hireTool, promptTool] = AgentTools([worker]);
110
+ await hireTool.getOptions().execute("env", { name: "backend-worker" });
111
+ await promptTool.getOptions().execute("env", { name: "backend-worker", prompt: "first task" });
112
+ const second = await promptTool.getOptions().execute("env", { name: "backend-worker", prompt: "second task" });
113
+ assert.strictEqual(second.reported, false);
114
+ assert.strictEqual(second.report, "just acknowledging, no report this time");
115
+ });
116
+ test("AgentTools: duplicate worker names are rejected at construction", async () => {
117
+ const workerA = buildWorker("dup", "A", [{ content: "x", inputTokens: 0, outputTokens: 0 }]);
118
+ const workerB = buildWorker("dup", "B", [{ content: "x", inputTokens: 0, outputTokens: 0 }]);
119
+ assert.throws(() => AgentTools([workerA, workerB]), /duplicate worker agent name "dup"/);
120
+ });
121
+ test("AgentTools: maxHired is mentioned dynamically in agent-hire's description", async () => {
122
+ const worker = buildWorker("backend-worker", "Handles backend tasks.", [{ content: "x", inputTokens: 0, outputTokens: 0 }]);
123
+ const [, hireTool] = AgentTools([worker], { maxHired: 2 });
124
+ assert.match(hireTool.getOptions().description, /At most 2 worker agents may be hired at once/);
125
+ });
126
+ test("AgentTools: agent-hire has no limit note when maxHired is omitted", async () => {
127
+ const worker = buildWorker("backend-worker", "Handles backend tasks.", [{ content: "x", inputTokens: 0, outputTokens: 0 }]);
128
+ const [, hireTool] = AgentTools([worker]);
129
+ assert.doesNotMatch(hireTool.getOptions().description, /At most/);
130
+ });
131
+ test("AgentTools: hiring beyond maxHired throws, but re-hiring an already-hired worker doesn't count against it", async () => {
132
+ const workerA = buildWorker("worker-a", "A", [{ content: "x", inputTokens: 0, outputTokens: 0 }]);
133
+ const workerB = buildWorker("worker-b", "B", [{ content: "x", inputTokens: 0, outputTokens: 0 }]);
134
+ const workerC = buildWorker("worker-c", "C", [{ content: "x", inputTokens: 0, outputTokens: 0 }]);
135
+ const [listTool, hireTool] = AgentTools([workerA, workerB, workerC], { maxHired: 1 });
136
+ await hireTool.getOptions().execute("env", { name: "worker-a" });
137
+ // re-hiring the same worker is a no-op, must not count twice against the limit
138
+ await hireTool.getOptions().execute("env", { name: "worker-a" });
139
+ await assert.rejects(() => hireTool.getOptions().execute("env", { name: "worker-b" }), /maximum of 1 hired agent\(s\) already reached/);
140
+ const listResult = await listTool.getOptions().execute("env", {});
141
+ assert.strictEqual(listResult.hiredCount, 1);
142
+ assert.strictEqual(listResult.maxHired, 1);
143
+ });
144
+ test("AgentTools: agent-list omits maxHired when no limit was configured", async () => {
145
+ const worker = buildWorker("backend-worker", "Handles backend tasks.", [{ content: "x", inputTokens: 0, outputTokens: 0 }]);
146
+ const [listTool] = AgentTools([worker]);
147
+ const result = await listTool.getOptions().execute("env", {});
148
+ assert.strictEqual(result.hiredCount, 0);
149
+ assert.strictEqual("maxHired" in result, false);
150
+ });
151
+ test("AgentTools: maxHired must be a positive integer when given", async () => {
152
+ const worker = buildWorker("backend-worker", "Handles backend tasks.", [{ content: "x", inputTokens: 0, outputTokens: 0 }]);
153
+ assert.throws(() => AgentTools([worker], { maxHired: 0 }), /maxHired must be a positive integer/);
154
+ assert.throws(() => AgentTools([worker], { maxHired: -1 }), /maxHired must be a positive integer/);
155
+ assert.throws(() => AgentTools([worker], { maxHired: 1.5 }), /maxHired must be a positive integer/);
51
156
  });
52
- }
53
- test("AgentTools: agent-list shows every worker, unhired by default", async () => {
54
- const worker = buildWorker("backend-worker", "Handles backend tasks.", [{ content: "unused", inputTokens: 0, outputTokens: 0 }]);
55
- const [listTool] = AgentTools([worker]);
56
- const result = await listTool.getOptions().execute("env", {});
57
- assert.strictEqual(result.agents.length, 1);
58
- assert.strictEqual(result.agents[0].name, "backend-worker");
59
- assert.strictEqual(result.agents[0].description, "Handles backend tasks.");
60
- assert.deepStrictEqual(result.agents[0].rating, { backend: 8, frontend: 3 });
61
- assert.strictEqual(result.agents[0].hired, false);
62
- });
63
- test("AgentTools: agent-hire marks a worker hired, reflected in agent-list", async () => {
64
- const worker = buildWorker("backend-worker", "Handles backend tasks.", [{ content: "unused", inputTokens: 0, outputTokens: 0 }]);
65
- const [listTool, hireTool] = AgentTools([worker]);
66
- const hireResult = await hireTool.getOptions().execute("env", { name: "backend-worker" });
67
- assert.deepStrictEqual(hireResult, { hired: true, name: "backend-worker" });
68
- const listResult = await listTool.getOptions().execute("env", {});
69
- assert.strictEqual(listResult.agents[0].hired, true);
70
- });
71
- test("AgentTools: agent-hire on an unknown name throws", async () => {
72
- const worker = buildWorker("backend-worker", "Handles backend tasks.", [{ content: "unused", inputTokens: 0, outputTokens: 0 }]);
73
- const [, hireTool] = AgentTools([worker]);
74
- await assert.rejects(() => hireTool.getOptions().execute("env", { name: "nonexistent" }), /no worker agent named "nonexistent"/);
75
- });
76
- test("AgentTools: agent-prompt on a worker that isn't hired yet throws", async () => {
77
- const worker = buildWorker("backend-worker", "Handles backend tasks.", [{ content: "unused", inputTokens: 0, outputTokens: 0 }]);
78
- const [, , promptTool] = AgentTools([worker]);
79
- await assert.rejects(() => promptTool.getOptions().execute("env", { name: "backend-worker", prompt: "do it" }), /is not hired yet/);
80
- });
81
- test("AgentTools: agent-prompt runs the worker and returns its agent-report text", async () => {
82
- const reportCall = { id: "call-1", name: "agent-report", inputs: { report: "answer is 42" } };
83
- const worker = buildWorker("backend-worker", "Handles backend tasks.", [
84
- { content: "", inputTokens: 10, outputTokens: 5, toolCalls: [reportCall] },
85
- ]);
86
- const [, hireTool, promptTool] = AgentTools([worker]);
87
- await hireTool.getOptions().execute("env", { name: "backend-worker" });
88
- const result = await promptTool.getOptions().execute("env", { name: "backend-worker", prompt: "what is the answer?" });
89
- assert.strictEqual(result.reported, true);
90
- assert.strictEqual(result.report, "answer is 42");
91
- });
92
- test("AgentTools: agent-prompt falls back to the worker's last assistant text when it never calls agent-report", async () => {
93
- const worker = buildWorker("backend-worker", "Handles backend tasks.", [
94
- { content: "I looked into it, no tool needed.", inputTokens: 10, outputTokens: 5 },
95
- ]);
96
- const [, hireTool, promptTool] = AgentTools([worker]);
97
- await hireTool.getOptions().execute("env", { name: "backend-worker" });
98
- const result = await promptTool.getOptions().execute("env", { name: "backend-worker", prompt: "check something" });
99
- assert.strictEqual(result.reported, false);
100
- assert.strictEqual(result.report, "I looked into it, no tool needed.");
101
- });
102
- test("AgentTools: a second agent-prompt call doesn't resurface a stale report from the first call", async () => {
103
- const reportCall = { id: "call-1", name: "agent-report", inputs: { report: "first answer" } };
104
- const worker = buildWorker("backend-worker", "Handles backend tasks.", [
105
- { content: "", inputTokens: 10, outputTokens: 5, toolCalls: [reportCall] },
106
- { content: "just acknowledging, no report this time", inputTokens: 10, outputTokens: 5 },
107
- ]);
108
- const [, hireTool, promptTool] = AgentTools([worker]);
109
- await hireTool.getOptions().execute("env", { name: "backend-worker" });
110
- await promptTool.getOptions().execute("env", { name: "backend-worker", prompt: "first task" });
111
- const second = await promptTool.getOptions().execute("env", { name: "backend-worker", prompt: "second task" });
112
- assert.strictEqual(second.reported, false);
113
- assert.strictEqual(second.report, "just acknowledging, no report this time");
114
- });
115
- test("AgentTools: duplicate worker names are rejected at construction", async () => {
116
- const workerA = buildWorker("dup", "A", [{ content: "x", inputTokens: 0, outputTokens: 0 }]);
117
- const workerB = buildWorker("dup", "B", [{ content: "x", inputTokens: 0, outputTokens: 0 }]);
118
- assert.throws(() => AgentTools([workerA, workerB]), /duplicate worker agent name "dup"/);
119
- });
120
- test("AgentTools: maxHired is mentioned dynamically in agent-hire's description", async () => {
121
- const worker = buildWorker("backend-worker", "Handles backend tasks.", [{ content: "x", inputTokens: 0, outputTokens: 0 }]);
122
- const [, hireTool] = AgentTools([worker], { maxHired: 2 });
123
- assert.match(hireTool.getOptions().description, /At most 2 worker agents may be hired at once/);
124
- });
125
- test("AgentTools: agent-hire has no limit note when maxHired is omitted", async () => {
126
- const worker = buildWorker("backend-worker", "Handles backend tasks.", [{ content: "x", inputTokens: 0, outputTokens: 0 }]);
127
- const [, hireTool] = AgentTools([worker]);
128
- assert.doesNotMatch(hireTool.getOptions().description, /At most/);
129
- });
130
- test("AgentTools: hiring beyond maxHired throws, but re-hiring an already-hired worker doesn't count against it", async () => {
131
- const workerA = buildWorker("worker-a", "A", [{ content: "x", inputTokens: 0, outputTokens: 0 }]);
132
- const workerB = buildWorker("worker-b", "B", [{ content: "x", inputTokens: 0, outputTokens: 0 }]);
133
- const workerC = buildWorker("worker-c", "C", [{ content: "x", inputTokens: 0, outputTokens: 0 }]);
134
- const [listTool, hireTool] = AgentTools([workerA, workerB, workerC], { maxHired: 1 });
135
- await hireTool.getOptions().execute("env", { name: "worker-a" });
136
- // re-hiring the same worker is a no-op, must not count twice against the limit
137
- await hireTool.getOptions().execute("env", { name: "worker-a" });
138
- await assert.rejects(() => hireTool.getOptions().execute("env", { name: "worker-b" }), /maximum of 1 hired agent\(s\) already reached/);
139
- const listResult = await listTool.getOptions().execute("env", {});
140
- assert.strictEqual(listResult.hiredCount, 1);
141
- assert.strictEqual(listResult.maxHired, 1);
142
- });
143
- test("AgentTools: agent-list omits maxHired when no limit was configured", async () => {
144
- const worker = buildWorker("backend-worker", "Handles backend tasks.", [{ content: "x", inputTokens: 0, outputTokens: 0 }]);
145
- const [listTool] = AgentTools([worker]);
146
- const result = await listTool.getOptions().execute("env", {});
147
- assert.strictEqual(result.hiredCount, 0);
148
- assert.strictEqual("maxHired" in result, false);
149
- });
150
- test("AgentTools: maxHired must be a positive integer when given", async () => {
151
- const worker = buildWorker("backend-worker", "Handles backend tasks.", [{ content: "x", inputTokens: 0, outputTokens: 0 }]);
152
- assert.throws(() => AgentTools([worker], { maxHired: 0 }), /maxHired must be a positive integer/);
153
- assert.throws(() => AgentTools([worker], { maxHired: -1 }), /maxHired must be a positive integer/);
154
- assert.throws(() => AgentTools([worker], { maxHired: 1.5 }), /maxHired must be a positive integer/);
155
157
  });
156
158
  //# sourceMappingURL=agent-tools.test.js.map