aws-runtime-bridge 1.9.124 → 1.9.125
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -2
- package/dist/adapter/AcodeSdkAdapter.js +1 -1
- package/dist/adapter/types.js +1 -1
- package/dist/config.d.ts +22 -2
- package/dist/config.js +1 -1
- package/dist/index.js +1 -1
- package/dist/routes/dashboard.js +58 -3
- package/dist/routes/git.d.ts +28 -0
- package/dist/routes/git.js +32 -31
- package/dist/routes/terminal.js +24 -24
- package/dist/services/auto-register.d.ts +2 -2
- package/dist/services/auto-register.js +1 -1
- package/dist/services/aws-client-agent-mcp.d.ts +2 -1
- package/dist/services/aws-client-agent-mcp.js +2 -2
- package/dist/services/cc-switch-sdk.js +1 -1
- package/dist/services/cli-commands.js +5 -5
- package/dist/services/fileSnapshotStore.js +1 -1
- package/dist/services/instance-ai-config-service.js +1 -1
- package/dist/services/instance-features.d.ts +2 -0
- package/dist/services/instance-features.js +1 -1
- package/dist/services/panel-auth.d.ts +2 -0
- package/dist/services/panel-auth.js +1 -1
- package/dist/services/startup-config-wizard.js +6 -6
- package/dist/services/tunnel-client.js +1 -1
- package/dist/services/update-notifier.js +2 -2
- package/package/acode/dist/ask-user-question-tool.js +2 -2
- package/package/acode/dist/mcpToolNames.d.ts +2 -0
- package/package/acode/dist/mcpToolNames.js +1 -1
- package/package/acode/dist/meeting-debug-log.d.ts +1 -0
- package/package/acode/dist/meeting-debug-log.js +3 -0
- package/package/acode/dist/runtime.d.ts +2 -0
- package/package/acode/dist/runtime.js +12 -12
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts +12 -0
- package/package/aws-client-agent-mcp/dist/agent-client.js +1 -1
- package/package/aws-client-agent-mcp/dist/agent-client.test.js +179 -1
- package/package/aws-client-agent-mcp/dist/config.js +1 -1
- package/package/aws-client-agent-mcp/dist/http-client.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/http-client.js +1 -1
- package/package/aws-client-agent-mcp/dist/launch-config-tools.test.js +6 -2
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +21 -0
- package/package/aws-client-agent-mcp/dist/mcp-server.js +28 -28
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js +604 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +10 -0
- package/package/aws-client-agent-mcp/dist/mcp-tools.js +12 -10
- package/package/aws-client-agent-mcp/dist/mcp-tools.test.js +38 -0
- package/package/aws-client-agent-mcp/dist/meeting-debug-log.d.ts +13 -0
- package/package/aws-client-agent-mcp/dist/meeting-debug-log.js +3 -0
- package/package/aws-client-agent-mcp/dist/message-buffer.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/message-buffer.js +1 -1
- package/package/aws-client-agent-mcp/dist/message-buffer.test.js +60 -0
- package/package/aws-client-agent-mcp/dist/types.d.ts +11 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.js +1 -1
- package/package.json +1 -1
|
@@ -66,4 +66,14 @@ export declare const LAUNCH_CONFIG_STATUS_TOOL: Tool;
|
|
|
66
66
|
|
|
67
67
|
export declare const LAUNCH_CONFIG_TOOL_NAMES: ReadonlySet<string>;
|
|
68
68
|
|
|
69
|
+
export declare const HIRE_TOOL_NAMES: ReadonlySet<string>;
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
export declare const CREATE_MEETING_TOOL: Tool;
|
|
73
|
+
export declare const LEAVE_MEETING_TOOL: Tool;
|
|
74
|
+
export declare const END_MEETING_TOOL: Tool;
|
|
75
|
+
export declare const MEETING_SPEAK_TOOL: Tool;
|
|
76
|
+
export declare const GET_MEETING_INFO_TOOL: Tool;
|
|
77
|
+
export declare const MY_MEETINGS_TOOL: Tool;
|
|
78
|
+
export declare const MEETING_TOOL_NAMES: ReadonlySet<string>;
|
|
69
79
|
export declare const MCP_TOOLS: Tool[];
|
|
@@ -1,27 +1,29 @@
|
|
|
1
|
-
import{CREATE_MEMORY_TOOL as e,DELETE_MEMORY_TOOL as t,GET_MEMORY_STATS_TOOL as i,LIST_MEMORIES_TOOL as n,READ_MEMORY_TOOL as r,SEARCH_MEMORY_TOOL as o,UPDATE_MEMORY_TOOL as p,LIST_MEMORIES_BY_FILE_TOOL as s,ABANDON_MEMORY_UPDATE_TOOL as c,MEMORY_RECURRENCE_TOOL as a,MEMORY_RECURRENCE_COMPLETE_TOOL as d}from"./memory-tools.js";import{CREATE_MEMORY_TOOL as
|
|
1
|
+
import{CREATE_MEMORY_TOOL as e,DELETE_MEMORY_TOOL as t,GET_MEMORY_STATS_TOOL as i,LIST_MEMORIES_TOOL as n,READ_MEMORY_TOOL as r,SEARCH_MEMORY_TOOL as o,UPDATE_MEMORY_TOOL as p,LIST_MEMORIES_BY_FILE_TOOL as s,ABANDON_MEMORY_UPDATE_TOOL as c,MEMORY_RECURRENCE_TOOL as a,MEMORY_RECURRENCE_COMPLETE_TOOL as d}from"./memory-tools.js";import{CREATE_MEMORY_TOOL as te,DELETE_MEMORY_TOOL as ie,GET_MEMORY_STATS_TOOL as ne,LIST_MEMORIES_TOOL as re,READ_MEMORY_TOOL as oe,SEARCH_MEMORY_TOOL as pe,UPDATE_MEMORY_TOOL as se,LIST_MEMORIES_BY_FILE_TOOL as ce,ABANDON_MEMORY_UPDATE_TOOL as ae,MEMORY_RECURRENCE_TOOL as de,MEMORY_RECURRENCE_COMPLETE_TOOL as ge}from"./memory-tools.js";const g={name:"get_colleague",description:"\u83B7\u53D6\u5F53\u524D Agent \u53EF\u89C1\u7684\u540C\u4E8B Agent \u5217\u8868\uFF0C\u5305\u542B\u5728\u7EBF\u548C\u79BB\u7EBF\u72B6\u6001\u3002\u6BCF\u4E2A\u540C\u4E8B\u8FD4\u56DE id\u3001\u89D2\u8272ID\uFF08roleId\uFF09\u3001\u89D2\u8272\u540D\u79F0\uFF08roleName\uFF09\u3001\u9879\u76EEID\uFF1B\u914D\u5408 query_file_changes_history \u53EF\u6309\u540C\u4E8B\u7684 roleId/agentId \u8FC7\u6EE4\u67E5\u8BE2\u5176\u6587\u4EF6\u53D8\u66F4\u5386\u53F2\u3002",inputSchema:{type:"object",properties:{},required:[]}},_={name:"get_group_rooms",description:"\u83B7\u53D6\u5F53\u524D Agent \u5728\u5173\u7CFB\u56FE\u4E2D\u53EF\u53D1\u73B0\u7684\u7FA4\u7EC4\u5217\u8868\uFF0C\u5305\u62EC\u9879\u76EE\u516C\u5171\u7FA4\u804A\u4EE5\u53CA\u81EA\u5DF1\u6240\u5728\u7684\u5C0F\u7EC4\u7FA4\u3002",inputSchema:{type:"object",properties:{},required:[]}},m={name:"get_profile",description:`\u83B7\u53D6\u5F53\u524D Agent \u7684\u4E2A\u4EBA\u4FE1\u606F\uFF0C\u5305\u62EC ID\u3001\u89D2\u8272 ID/\u540D\u79F0\u3001\u663E\u793A\u540D\u79F0\u3001\u63D0\u793A\u8BCD\u7B49\u3002
|
|
2
2
|
|
|
3
3
|
\u3010\u7CFB\u7EDF\u63D0\u793A\u8BCD\u5206\u5C42\u7ED3\u6784\u3011
|
|
4
4
|
\u8FD4\u56DE\u7684 prompt \u5B57\u6BB5\u662F\u89D2\u8272/\u5B9E\u4F8B\u63D0\u793A\u8BCD\uFF08System 2\uFF09\uFF0CglobalAgentPrompt \u662F\u5168\u5C40\u7CFB\u7EDF\u63D0\u793A\u8BCD\uFF08System 1\uFF09\u3002
|
|
5
5
|
\u4E09\u5C42\u63D0\u793A\u8BCD\uFF08\u5168\u5C40\u2192\u89D2\u8272\u2192\u8BB0\u5FC6\uFF09\u7531 runtime adapter \u5728\u4F1A\u8BDD\u521B\u5EFA\u65F6\u6CE8\u5165\uFF0C
|
|
6
6
|
ACode \u76F4\u63A5\u6CE8\u5165\u4E3A\u524D\u4E09\u6761 system role \u6D88\u606F\uFF0COpenCode/Claude \u5408\u5E76\u4E3A\u4E00\u6761 system prompt\u3002
|
|
7
|
-
MCP \u5DE5\u5177\uFF08poll_message/get_message\uFF09\u4E0D\u518D\u8FD4\u56DE systemMessages\u3002`,inputSchema:{type:"object",properties:{},required:[]}},y={name:"hire_colleague",description:"\u5411\u4EBA\u4E8B\u90E8\u53D1\u8D77\u62DB\u8058\u540C\u4E8B\u8BF7\u6C42\uFF0C\u76F4\u63A5\u6309\u521B\u5EFA\u89D2\u8272\u5B9E\u4F8B\u6240\u9700\u53C2\u6570\u521B\u5EFA\u4E00\u4E2A\u65B0\u7684 Agent \u540C\u4E8B\u3002",inputSchema:{type:"object",properties:{projectId:{type:"string",description:"\u9879\u76EE ID\uFF0C\u4E0D\u4F20\u65F6\u7531\u670D\u52A1\u7AEF\u6309\u9ED8\u8BA4\u903B\u8F91\u5904\u7406\u3002"},roleName:{type:"string",description:"\u89D2\u8272\u540D\u3002\u4E0E newRoleName \u4E8C\u9009\u4E00\uFF0C\u4F18\u5148\u6309\u670D\u52A1\u7AEF\u73B0\u6709\u521B\u5EFA\u89C4\u5219\u5904\u7406\u3002"},newRoleName:{type:"string",description:"\u65B0\u89D2\u8272\u540D\u3002\u7528\u4E8E\u9700\u8981\u663E\u5F0F\u521B\u5EFA\u65B0\u89D2\u8272\u5B9E\u4F8B\u65F6\u4F20\u5165\u3002"},displayName:{type:"string",description:"\u65B0\u540C\u4E8B\u663E\u793A\u540D\u3002"},prompt:{type:"string",description:"\u65B0\u540C\u4E8B\u804C\u8D23\u8BF4\u660E\u6216\u7CFB\u7EDF\u63D0\u793A\u8BCD\u3002"},workspacePath:{type:"string",description:"\u65B0\u540C\u4E8B\u5DE5\u4F5C\u76EE\u5F55\u3002"},myYmlPath:{type:"string",description:"my.yml \u8DEF\u5F84\uFF0C\u53EF\u9009\u3002"},myYmlContent:{type:"string",description:"my.yml \u5185\u5BB9\uFF0C\u53EF\u9009\u3002"},runtimeSkillEnabled:{type:"boolean",description:"\u662F\u5426\u542F\u7528 skill\u3002"},runtimeMcpEnabled:{type:"boolean",description:"\u662F\u5426\u542F\u7528 MCP\u3002"},runtimeCcSwitchEnabledTools:{type:"string",description:"\u521D\u59CB\u5316\u542F\u7528\u7684\u5DE5\u5177\u5217\u8868 JSON \u5B57\u7B26\u4E32\u3002"}},required:["workspacePath"]}},u={name:"hire_colleagues_batch",description:"\u5411\u4EBA\u4E8B\u90E8\u53D1\u8D77\u6279\u91CF\u62DB\u8058\u540C\u4E8B\u8BF7\u6C42\uFF0C\u4E00\u6B21\u63D0\u4EA4\u591A\u4E2A\u5F85\u5BA1\u6279\u62DB\u8058\u9879\uFF0C\u7531\u5BA1\u6279\u4EBA\u9010\u9879\u6279\u51C6\u6216\u62D2\u7EDD\u540E\u7EDF\u4E00\u8FD4\u56DE\u7ED3\u679C\u3002",inputSchema:{type:"object",properties:{projectId:{type:"string",description:"\u9879\u76EE ID\uFF0C\u4E0D\u4F20\u65F6\u7531\u670D\u52A1\u7AEF\u6309\u9ED8\u8BA4\u903B\u8F91\u5904\u7406\u3002"},items:{type:"array",description:"\u5F85\u6279\u91CF\u62DB\u8058\u7684\u540C\u4E8B\u5217\u8868\u3002\u6BCF\u4E00\u9879\u5BF9\u5E94\u4E00\u4E2A\u5F85\u5BA1\u6279\u7684\u62DB\u8058\u8BF7\u6C42\u3002",items:{type:"object",properties:{roleName:{type:"string",description:"\u89D2\u8272\u540D\u3002\u4E0E newRoleName \u4E8C\u9009\u4E00\uFF0C\u4F18\u5148\u6309\u670D\u52A1\u7AEF\u73B0\u6709\u521B\u5EFA\u89C4\u5219\u5904\u7406\u3002"},newRoleName:{type:"string",description:"\u65B0\u89D2\u8272\u540D\u3002\u7528\u4E8E\u9700\u8981\u663E\u5F0F\u521B\u5EFA\u65B0\u89D2\u8272\u5B9E\u4F8B\u65F6\u4F20\u5165\u3002"},displayName:{type:"string",description:"\u65B0\u540C\u4E8B\u663E\u793A\u540D\u3002"},prompt:{type:"string",description:"\u65B0\u540C\u4E8B\u804C\u8D23\u8BF4\u660E\u6216\u7CFB\u7EDF\u63D0\u793A\u8BCD\u3002"},workspacePath:{type:"string",description:"\u65B0\u540C\u4E8B\u5DE5\u4F5C\u76EE\u5F55\u3002"},myYmlPath:{type:"string",description:"my.yml \u8DEF\u5F84\uFF0C\u53EF\u9009\u3002"},myYmlContent:{type:"string",description:"my.yml \u5185\u5BB9\uFF0C\u53EF\u9009\u3002"},runtimeSkillEnabled:{type:"boolean",description:"\u662F\u5426\u542F\u7528 skill\u3002"},runtimeMcpEnabled:{type:"boolean",description:"\u662F\u5426\u542F\u7528 MCP\u3002"},runtimeCcSwitchEnabledTools:{type:"string",description:"\u521D\u59CB\u5316\u542F\u7528\u7684\u5DE5\u5177\u5217\u8868 JSON \u5B57\u7B26\u4E32\u3002"}},required:["workspacePath"]},minItems:1}},required:["items"]}},
|
|
7
|
+
MCP \u5DE5\u5177\uFF08poll_message/get_message\uFF09\u4E0D\u518D\u8FD4\u56DE systemMessages\u3002`,inputSchema:{type:"object",properties:{},required:[]}},y={name:"hire_colleague",description:"\u5411\u4EBA\u4E8B\u90E8\u53D1\u8D77\u62DB\u8058\u540C\u4E8B\u8BF7\u6C42\uFF0C\u76F4\u63A5\u6309\u521B\u5EFA\u89D2\u8272\u5B9E\u4F8B\u6240\u9700\u53C2\u6570\u521B\u5EFA\u4E00\u4E2A\u65B0\u7684 Agent \u540C\u4E8B\u3002",inputSchema:{type:"object",properties:{projectId:{type:"string",description:"\u9879\u76EE ID\uFF0C\u4E0D\u4F20\u65F6\u7531\u670D\u52A1\u7AEF\u6309\u9ED8\u8BA4\u903B\u8F91\u5904\u7406\u3002"},roleName:{type:"string",description:"\u89D2\u8272\u540D\u3002\u4E0E newRoleName \u4E8C\u9009\u4E00\uFF0C\u4F18\u5148\u6309\u670D\u52A1\u7AEF\u73B0\u6709\u521B\u5EFA\u89C4\u5219\u5904\u7406\u3002"},newRoleName:{type:"string",description:"\u65B0\u89D2\u8272\u540D\u3002\u7528\u4E8E\u9700\u8981\u663E\u5F0F\u521B\u5EFA\u65B0\u89D2\u8272\u5B9E\u4F8B\u65F6\u4F20\u5165\u3002"},displayName:{type:"string",description:"\u65B0\u540C\u4E8B\u663E\u793A\u540D\u3002"},prompt:{type:"string",description:"\u65B0\u540C\u4E8B\u804C\u8D23\u8BF4\u660E\u6216\u7CFB\u7EDF\u63D0\u793A\u8BCD\u3002"},workspacePath:{type:"string",description:"\u65B0\u540C\u4E8B\u5DE5\u4F5C\u76EE\u5F55\u3002"},myYmlPath:{type:"string",description:"my.yml \u8DEF\u5F84\uFF0C\u53EF\u9009\u3002"},myYmlContent:{type:"string",description:"my.yml \u5185\u5BB9\uFF0C\u53EF\u9009\u3002"},runtimeSkillEnabled:{type:"boolean",description:"\u662F\u5426\u542F\u7528 skill\u3002"},runtimeMcpEnabled:{type:"boolean",description:"\u662F\u5426\u542F\u7528 MCP\u3002"},runtimeCcSwitchEnabledTools:{type:"string",description:"\u521D\u59CB\u5316\u542F\u7528\u7684\u5DE5\u5177\u5217\u8868 JSON \u5B57\u7B26\u4E32\u3002"}},required:["workspacePath"]}},u={name:"hire_colleagues_batch",description:"\u5411\u4EBA\u4E8B\u90E8\u53D1\u8D77\u6279\u91CF\u62DB\u8058\u540C\u4E8B\u8BF7\u6C42\uFF0C\u4E00\u6B21\u63D0\u4EA4\u591A\u4E2A\u5F85\u5BA1\u6279\u62DB\u8058\u9879\uFF0C\u7531\u5BA1\u6279\u4EBA\u9010\u9879\u6279\u51C6\u6216\u62D2\u7EDD\u540E\u7EDF\u4E00\u8FD4\u56DE\u7ED3\u679C\u3002",inputSchema:{type:"object",properties:{projectId:{type:"string",description:"\u9879\u76EE ID\uFF0C\u4E0D\u4F20\u65F6\u7531\u670D\u52A1\u7AEF\u6309\u9ED8\u8BA4\u903B\u8F91\u5904\u7406\u3002"},items:{type:"array",description:"\u5F85\u6279\u91CF\u62DB\u8058\u7684\u540C\u4E8B\u5217\u8868\u3002\u6BCF\u4E00\u9879\u5BF9\u5E94\u4E00\u4E2A\u5F85\u5BA1\u6279\u7684\u62DB\u8058\u8BF7\u6C42\u3002",items:{type:"object",properties:{roleName:{type:"string",description:"\u89D2\u8272\u540D\u3002\u4E0E newRoleName \u4E8C\u9009\u4E00\uFF0C\u4F18\u5148\u6309\u670D\u52A1\u7AEF\u73B0\u6709\u521B\u5EFA\u89C4\u5219\u5904\u7406\u3002"},newRoleName:{type:"string",description:"\u65B0\u89D2\u8272\u540D\u3002\u7528\u4E8E\u9700\u8981\u663E\u5F0F\u521B\u5EFA\u65B0\u89D2\u8272\u5B9E\u4F8B\u65F6\u4F20\u5165\u3002"},displayName:{type:"string",description:"\u65B0\u540C\u4E8B\u663E\u793A\u540D\u3002"},prompt:{type:"string",description:"\u65B0\u540C\u4E8B\u804C\u8D23\u8BF4\u660E\u6216\u7CFB\u7EDF\u63D0\u793A\u8BCD\u3002"},workspacePath:{type:"string",description:"\u65B0\u540C\u4E8B\u5DE5\u4F5C\u76EE\u5F55\u3002"},myYmlPath:{type:"string",description:"my.yml \u8DEF\u5F84\uFF0C\u53EF\u9009\u3002"},myYmlContent:{type:"string",description:"my.yml \u5185\u5BB9\uFF0C\u53EF\u9009\u3002"},runtimeSkillEnabled:{type:"boolean",description:"\u662F\u5426\u542F\u7528 skill\u3002"},runtimeMcpEnabled:{type:"boolean",description:"\u662F\u5426\u542F\u7528 MCP\u3002"},runtimeCcSwitchEnabledTools:{type:"string",description:"\u521D\u59CB\u5316\u542F\u7528\u7684\u5DE5\u5177\u5217\u8868 JSON \u5B57\u7B26\u4E32\u3002"}},required:["workspacePath"]},minItems:1}},required:["items"]}},E={name:"send_group",description:"\u5411\u516C\u5171\u7FA4\u804A\u53D1\u9001\u6D88\u606F\uFF0C\u6240\u6709\u5728\u7EBF\u53C2\u4E0E\u8005\u90FD\u80FD\u6536\u5230\u3002\u56DE\u590D\u7FA4\u6D88\u606F\u65F6\u5EFA\u8BAE\u4F20\u5165\u6D88\u606F\u4E2D\u7684 projectId\uFF0C\u786E\u4FDD\u56DE\u590D\u5230\u6B63\u786E\u7684\u9879\u76EE\u7FA4\u804A\u3002",inputSchema:{type:"object",properties:{content:{type:"string",description:"\u6D88\u606F\u5185\u5BB9"},projectId:{type:"string",description:"\u76EE\u6807\u9879\u76EE ID\uFF08\u53EF\u9009\uFF09\u3002\u4E0D\u4F20\u5219\u4F7F\u7528 Agent \u6240\u5C5E\u9879\u76EE\uFF08\u7531\u670D\u52A1\u7AEF\u51B3\u5B9A\uFF09\u3002\u56DE\u590D\u7FA4\u6D88\u606F\u65F6\u5E94\u4F20\u5165\u6D88\u606F\u4E2D\u7684 projectId\uFF0C\u786E\u4FDD\u56DE\u590D\u5230\u6B63\u786E\u7684\u9879\u76EE\u7FA4\u804A\u3002"},roomId:{type:"string",description:"\u76EE\u6807\u7FA4\u804A\u623F\u95F4 ID\uFF08\u53EF\u9009\uFF09\u3002\u5F53\u56DE\u590D get_group_rooms \u6216\u7FA4\u6D88\u606F\u4E2D\u7684\u5C0F\u7EC4\u7FA4\u65F6\uFF0C\u4F18\u5148\u4F20\u5165 roomId\uFF0C\u907F\u514D\u8BEF\u53D1\u5230\u9879\u76EE\u516C\u5171\u7FA4\u3002"}},required:["content"]}},O={name:"send_private",description:"\u53D1\u9001\u79C1\u4FE1\u7ED9\u6307\u5B9A\u7528\u6237\u3002\u652F\u6301\u4E24\u79CD\u6A21\u5F0F\uFF1A\u901A\u77E5\u5F0F\uFF08waitReply=false\uFF09\u548C\u8C03\u7528\u5F0F\uFF08waitReply=true\uFF0C\u963B\u585E\u7B49\u5F85\u56DE\u590D\uFF09\u3002",inputSchema:{type:"object",properties:{targetId:{type:"string",description:"\u76EE\u6807\u7528\u6237ID"},content:{type:"string",description:"\u6D88\u606F\u5185\u5BB9"},waitReply:{type:"boolean",description:"\u662F\u5426\u7B49\u5F85\u5BF9\u65B9\u56DE\u590D\uFF08\u8C03\u7528\u5F0F\uFF09\u3002\u4E3Atrue\u65F6\u4F1A\u963B\u585E\u7B49\u5F85\u56DE\u590D\uFF0C\u9ED8\u8BA4\u6C38\u4E45\u963B\u585E\u76F4\u5230\u6536\u5230\u56DE\u590D"},replyToCallId:{type:"string",description:"\u56DE\u590D\u7684\u8C03\u7528ID\uFF08\u7528\u4E8E\u56DE\u590D\u8C03\u7528\u5F0F\u6D88\u606F\uFF09"},timeoutMs:{type:"number",description:"\u7B49\u5F85\u56DE\u590D\u7684\u8D85\u65F6\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF0C\u53EF\u9009\uFF09\u3002\u672A\u6307\u5B9A\u6216\u22640\u65F6\u6C38\u4E45\u963B\u585E\u7B49\u5F85\uFF0C>0\u65F6\u6309\u6307\u5B9A\u65F6\u95F4\u8D85\u65F6"}},required:["targetId","content"]}},I={name:"poll_message",description:`\u83B7\u53D6\u672A\u8BFB\u6D88\u606F\uFF08\u5305\u62EC\u7FA4\u6D88\u606F\u548C\u79C1\u4FE1\uFF09\uFF0C\u6301\u7EED\u963B\u585E\u7B49\u5F85\u76F4\u5230\u6709\u65B0\u6D88\u606F\uFF0C\u8FD9\u662F\u83B7\u53D6\u6D88\u606F\u7684\u4E3B\u8981\u63A5\u53E3\u3002
|
|
8
8
|
|
|
9
9
|
\u3010\u8FD4\u56DE\u503C\u8BF4\u660E\u3011
|
|
10
10
|
- directMessages: \u79C1\u4FE1\u6D88\u606F
|
|
11
11
|
- groupMessages: \u7FA4\u804A\u6D88\u606F
|
|
12
12
|
|
|
13
13
|
\u7CFB\u7EDF\u63D0\u793A\u8BCD\uFF08\u5168\u5C40\u63D0\u793A\u8BCD + \u89D2\u8272\u63D0\u793A\u8BCD + \u542F\u52A8\u8BB0\u5FC6\uFF09\u5DF2\u7531 runtime adapter
|
|
14
|
-
\u5728\u4F1A\u8BDD\u521B\u5EFA\u65F6\u6CE8\u5165\uFF0C\u65E0\u9700\u901A\u8FC7 MCP \u83B7\u53D6\u3002`,inputSchema:{type:"object",properties:{},required:[]}},
|
|
14
|
+
\u5728\u4F1A\u8BDD\u521B\u5EFA\u65F6\u6CE8\u5165\uFF0C\u65E0\u9700\u901A\u8FC7 MCP \u83B7\u53D6\u3002`,inputSchema:{type:"object",properties:{},required:[]}},l={name:"get_message",description:`\u83B7\u53D6\u672A\u8BFB\u6D88\u606F\uFF08\u975E\u963B\u585E\uFF09\uFF0C\u4ECE\u6D88\u606F\u7F13\u51B2\u533A\u83B7\u53D6\u6D88\u606F\uFF0C\u7ACB\u5373\u8FD4\u56DE\uFF0C\u82E5\u5F53\u524D\u6CA1\u6709\u4EFB\u52A1\u5E94\u4F7F\u7528 poll_message\u3002
|
|
15
15
|
|
|
16
16
|
\u3010\u8FD4\u56DE\u503C\u8BF4\u660E\u3011
|
|
17
17
|
- directMessages: \u79C1\u4FE1\u6D88\u606F
|
|
18
18
|
- groupMessages: \u7FA4\u804A\u6D88\u606F
|
|
19
19
|
|
|
20
|
-
\u7CFB\u7EDF\u63D0\u793A\u8BCD\u5DF2\u7531 runtime adapter \u5728\u4F1A\u8BDD\u521B\u5EFA\u65F6\u6CE8\u5165\uFF0C\u65E0\u9700\u901A\u8FC7 MCP \u83B7\u53D6\u3002`,inputSchema:{type:"object",properties:{},required:[]}},T={name:"get_dm_history",description:"\u83B7\u53D6\u79C1\u4FE1\u5386\u53F2\u6D88\u606F\u3002\u53EF\u4EE5\u83B7\u53D6\u4E0E\u7279\u5B9A\u7528\u6237\u7684\u5BF9\u8BDD\u5386\u53F2\uFF0C\u6216\u83B7\u53D6\u6240\u6709\u79C1\u4FE1\u5386\u53F2\u3002",inputSchema:{type:"object",properties:{targetUserId:{type:"string",description:"\u76EE\u6807\u7528\u6237ID\uFF08\u53EF\u9009\uFF09\u3002\u5982\u679C\u4E0D\u6307\u5B9A\uFF0C\u5219\u8FD4\u56DE\u6240\u6709\u79C1\u4FE1\u5386\u53F2\u3002"},limit:{type:"number",description:"\u83B7\u53D6\u6700\u8FD1\u5386\u53F2\u6D88\u606F\u7684\u6570\u91CF\uFF08\u9ED8\u8BA450\uFF09"},since:{type:"string",description:"\u8D77\u59CB\u65F6\u95F4\uFF08ISO 8601 \u683C\u5F0F\uFF0C\u53EF\u9009\uFF09\u3002\u65E9\u4E8E\u8BE5\u65F6\u95F4\u7684\u6D88\u606F\u5C06\u4E0D\u4F1A\u88AB\u8FD4\u56DE\u3002"}},required:[]}},A={name:"get_group_history",description:"\u83B7\u53D6\u516C\u5171\u7FA4\u804A\u7684\u5386\u53F2\u6D88\u606F\u3002",inputSchema:{type:"object",properties:{limit:{type:"number",description:"\u83B7\u53D6\u6700\u8FD1\u5386\u53F2\u6D88\u606F\u7684\u6570\u91CF\uFF08\u9ED8\u8BA450\uFF09"},since:{type:"string",description:"\u8D77\u59CB\u65F6\u95F4\uFF08ISO 8601 \u683C\u5F0F\uFF0C\u53EF\u9009\uFF09\u3002\u65E9\u4E8E\u8BE5\u65F6\u95F4\u7684\u6D88\u606F\u5C06\u4E0D\u4F1A\u88AB\u8FD4\u56DE\u3002"}},required:[]}},
|
|
21
|
-
\u63D0\u4EA4\u65F6\u8BF7\u4E00\u5E76\u4F20\u5165 changeLog\uFF08\u672C\u6B21\u4EFB\u52A1\u5904\u7406\u671F\u95F4\u4EA7\u751F\u7684\u6587\u4EF6/\u5185\u5BB9\u53D8\u66F4\u65E5\u5FD7\uFF09\uFF0C\u7528\u4E8E\u300CAI \u56DE\u9000\u300D\u7CBE\u786E\u8FD8\u539F\uFF1A\u6BCF\u9879\u5305\u542B operation(CREATE|UPDATE|DELETE|READ)\u3001path(\u76F8\u5BF9\u5DE5\u4F5C\u533A\u8DEF\u5F84)\u3001\u53EF\u9009 targetType/summary/beforeHash/afterHash/metadata\u3002\u672A\u8BB0\u5F55\u53D8\u66F4\u4F1A\u5BFC\u81F4 AI \u56DE\u9000\u7F3A\u5C11\u4F9D\u636E\u3002`,inputSchema:{type:"object",properties:{nodeId:{type:"string",description:"\u4EFB\u52A1\u8282\u70B9ID\uFF08\u4ECE my_task \u8FD4\u56DE\u7684\u4EFB\u52A1\u4FE1\u606F\u4E2D\u83B7\u53D6\uFF09"},outputPayload:{type:"string",description:'\u4EFB\u52A1\u6267\u884C\u7ED3\u679C\u7684 JSON \u5B57\u7B26\u4E32\u3002\u5FC5\u987B\u6309 my_task.requiredOutput \u9009\u62E9\u76EE\u6807\u5206\u652F\uFF0C\u4F8B\u5982 [{"targetNodeId":"<\u76EE\u6807\u8282\u70B9\u6A21\u677FID>","output":{...}}]\uFF1B\u63D0\u4EA4\u5230 HUMAN \u8282\u70B9\u65F6 output \u5FC5\u987B\u5F62\u5982 {"questions":[{"question":"\u8BF7\u786E\u8BA4...","options":[{"label":"\u901A\u8FC7"}]}]}\u3002'},changeLog:{type:"array",description:"\u53EF\u9009\u3002\u672C\u6B21\u4EFB\u52A1\u5904\u7406\u671F\u95F4\u4EA7\u751F\u7684\u6587\u4EF6/\u5185\u5BB9\u53D8\u66F4\u65E5\u5FD7\uFF0C\u7528\u4E8E AI \u56DE\u9000\u3002\u6BCF\u9879: { operation: 'CREATE'|'UPDATE'|'DELETE'|'READ', targetType?: string, path: string, summary?: string, beforeHash?: string, afterHash?: string, metadata?: string }\u3002\u5EFA\u8BAE\u5728\u5B8C\u6210\u4EFB\u52A1\u3001\u8C03\u7528 submit_task_result \u65F6\u4E00\u5E76\u63D0\u4EA4\u3002",items:{type:"object",properties:{operation:{type:"string",enum:["CREATE","UPDATE","DELETE","READ"],description:"\u53D8\u66F4\u64CD\u4F5C\u7C7B\u578B"},targetType:{type:"string",description:"\u53D8\u66F4\u76EE\u6807\u7C7B\u578B\uFF0C\u7F3A\u7701\u89C6\u4E3A FILE"},path:{type:"string",description:"\u53D8\u66F4\u6587\u4EF6/\u8D44\u6E90\u7684\u76F8\u5BF9\u8DEF\u5F84"},summary:{type:"string",description:"\u53D8\u66F4\u6458\u8981\u8BF4\u660E"},beforeHash:{type:"string",description:"\u53D8\u66F4\u524D\u5185\u5BB9 hash\uFF08\u5DEE\u5F02\u56DE\u9000\u7528\uFF09"},afterHash:{type:"string",description:"\u53D8\u66F4\u540E\u5185\u5BB9 hash\uFF08\u5DEE\u5F02\u56DE\u9000\u7528\uFF09"},metadata:{type:"string",description:"\u9644\u52A0\u5143\u6570\u636E JSON \u5B57\u7B26\u4E32\uFF08\u5982 cacheKey\uFF09"}},required:["operation","path"]}}},required:["nodeId","outputPayload"]}},
|
|
20
|
+
\u7CFB\u7EDF\u63D0\u793A\u8BCD\u5DF2\u7531 runtime adapter \u5728\u4F1A\u8BDD\u521B\u5EFA\u65F6\u6CE8\u5165\uFF0C\u65E0\u9700\u901A\u8FC7 MCP \u83B7\u53D6\u3002`,inputSchema:{type:"object",properties:{},required:[]}},T={name:"get_dm_history",description:"\u83B7\u53D6\u79C1\u4FE1\u5386\u53F2\u6D88\u606F\u3002\u53EF\u4EE5\u83B7\u53D6\u4E0E\u7279\u5B9A\u7528\u6237\u7684\u5BF9\u8BDD\u5386\u53F2\uFF0C\u6216\u83B7\u53D6\u6240\u6709\u79C1\u4FE1\u5386\u53F2\u3002",inputSchema:{type:"object",properties:{targetUserId:{type:"string",description:"\u76EE\u6807\u7528\u6237ID\uFF08\u53EF\u9009\uFF09\u3002\u5982\u679C\u4E0D\u6307\u5B9A\uFF0C\u5219\u8FD4\u56DE\u6240\u6709\u79C1\u4FE1\u5386\u53F2\u3002"},limit:{type:"number",description:"\u83B7\u53D6\u6700\u8FD1\u5386\u53F2\u6D88\u606F\u7684\u6570\u91CF\uFF08\u9ED8\u8BA450\uFF09"},since:{type:"string",description:"\u8D77\u59CB\u65F6\u95F4\uFF08ISO 8601 \u683C\u5F0F\uFF0C\u53EF\u9009\uFF09\u3002\u65E9\u4E8E\u8BE5\u65F6\u95F4\u7684\u6D88\u606F\u5C06\u4E0D\u4F1A\u88AB\u8FD4\u56DE\u3002"}},required:[]}},A={name:"get_group_history",description:"\u83B7\u53D6\u516C\u5171\u7FA4\u804A\u7684\u5386\u53F2\u6D88\u606F\u3002",inputSchema:{type:"object",properties:{limit:{type:"number",description:"\u83B7\u53D6\u6700\u8FD1\u5386\u53F2\u6D88\u606F\u7684\u6570\u91CF\uFF08\u9ED8\u8BA450\uFF09"},since:{type:"string",description:"\u8D77\u59CB\u65F6\u95F4\uFF08ISO 8601 \u683C\u5F0F\uFF0C\u53EF\u9009\uFF09\u3002\u65E9\u4E8E\u8BE5\u65F6\u95F4\u7684\u6D88\u606F\u5C06\u4E0D\u4F1A\u88AB\u8FD4\u56DE\u3002"}},required:[]}},S={name:"my_task",description:"\u83B7\u53D6\u5F53\u524D Agent \u5DF2\u901A\u8FC7 poll_message \u540E\u53F0\u9759\u9ED8\u62A2\u5360\u6216\u6B63\u5728\u5904\u7406\u7684\u6D41\u7A0B\u7EBF\u4EFB\u52A1\u5217\u8868\u3002\u6B64\u5DE5\u5177\u53EA\u8BFB\u53D6\u5DF2\u5206\u914D\u7ED9\u5F53\u524D Agent \u7684\u4EFB\u52A1\u8BE6\u60C5\uFF0C\u4E0D\u4F1A\u4E3B\u52A8\u62A2\u5360\u65B0\u7684\u5F85\u5904\u7406\u8282\u70B9\u3002\u6536\u5230\u6D41\u7A0B\u7EBF\u4EFB\u52A1\u5206\u914D\u901A\u77E5\u540E\uFF0C\u8C03\u7528\u6B64\u5DE5\u5177\u83B7\u53D6\u4EFB\u52A1\u6307\u4EE4\u3001\u524D\u5E8F\u8282\u70B9\u8F93\u51FA\u3001requiredOutput \u8F93\u51FA\u5951\u7EA6\u7B49\uFF1B\u5B8C\u6210\u540E\u5FC5\u987B\u6309 requiredOutput \u4F7F\u7528 submit_task_result \u63D0\u4EA4\u7ED3\u679C\uFF0C\u63D0\u4EA4\u65F6\u8BF7\u4E00\u5E76\u4F20\u5165 changeLog\uFF08\u672C\u6B21\u5904\u7406\u7684\u6587\u4EF6/\u5185\u5BB9\u53D8\u66F4\u65E5\u5FD7\uFF0C\u5305\u542B operation \u4E0E path\uFF09\uFF0C\u7528\u4E8E AI \u56DE\u9000\u3002\u82E5 requiredOutput \u7684\u76EE\u6807\u662F HUMAN \u8282\u70B9\uFF0C\u63D0\u4EA4\u7ED9\u8BE5\u5206\u652F\u7684 output \u5FC5\u987B\u5305\u542B questions \u6570\u7EC4\u4E14\u81F3\u5C11\u4E00\u4E2A\u9898\u76EE\u5E26 question \u5B57\u6BB5\u3002",inputSchema:{type:"object",properties:{},required:[]}},L={name:"create_task_instance_comment",description:"\u4E3A\u5F53\u524D\u6B63\u5728\u5904\u7406\u7684\u6D41\u7A0B\u7EBF\u5B9E\u4F8B\u521B\u5EFA\u4E00\u6761\u5B9E\u4F8B\u7EA7\u7559\u8A00\u3002\u4EC5\u5141\u8BB8\u7531\u540E\u53F0\u9759\u9ED8\u62A2\u5360\u540E\u6B63\u5728\u5904\u7406\u8BE5\u5B9E\u4F8B\u8282\u70B9\u7684 Agent \u8C03\u7528\uFF1B\u5F53\u9700\u8981\u544A\u77E5\u540E\u7EED\u8282\u70B9\u9700\u8981\u6CE8\u610F\u7684\u70B9\u65F6\u4F7F\u7528\u7559\u8A00\u8FDB\u884C\u7559\u8A00\uFF1B\u7559\u8A00\u4F1A\u5728\u5B9E\u4F8B\u5217\u8868\u201C\u67E5\u770B\u7559\u8A00\u201D\u548C\u540E\u7EED my_task \u8FD4\u56DE\u4E2D\u5C55\u793A\u3002",inputSchema:{type:"object",properties:{taskInstanceId:{type:"string",description:"\u6D41\u7A0B\u7EBF\u4EFB\u52A1\u5B9E\u4F8BID\uFF08\u4ECE my_task \u8FD4\u56DE\u4E2D\u83B7\u53D6\uFF09"},content:{type:"string",description:"\u7559\u8A00\u5185\u5BB9"}},required:["taskInstanceId","content"]}},h={name:"submit_task_result",description:`\u63D0\u4EA4\u6D41\u7A0B\u7EBF\u4EFB\u52A1\u7684\u6267\u884C\u7ED3\u679C\u3002\u5B8C\u6210\u4EFB\u52A1\u540E\u8C03\u7528\u6B64\u5DE5\u5177\uFF0C\u8F93\u51FA\u5C06\u4F20\u9012\u7ED9\u4E0B\u4E00\u4E2A\u8282\u70B9\u3002outputPayload \u5FC5\u987B\u9075\u5FAA my_task \u8FD4\u56DE\u7684 requiredOutput\uFF1A\u6709\u540E\u7EE7\u5206\u652F\u65F6\u5FC5\u987B\u662F JSON \u6570\u7EC4\uFF0C\u6BCF\u9879\u5305\u542B targetNodeId \u548C output\u3002\u82E5\u76EE\u6807\u5206\u652F\u662F HUMAN \u8282\u70B9\uFF0Coutput \u5FC5\u987B\u662F JSON \u5BF9\u8C61\u5E76\u5305\u542B\u975E\u7A7A questions \u6570\u7EC4\uFF0Cquestions \u81F3\u5C11\u4E00\u4E2A\u9898\u76EE\u5FC5\u987B\u5305\u542B\u5B57\u7B26\u4E32 question \u5B57\u6BB5\u3002
|
|
21
|
+
\u63D0\u4EA4\u65F6\u8BF7\u4E00\u5E76\u4F20\u5165 changeLog\uFF08\u672C\u6B21\u4EFB\u52A1\u5904\u7406\u671F\u95F4\u4EA7\u751F\u7684\u6587\u4EF6/\u5185\u5BB9\u53D8\u66F4\u65E5\u5FD7\uFF09\uFF0C\u7528\u4E8E\u300CAI \u56DE\u9000\u300D\u7CBE\u786E\u8FD8\u539F\uFF1A\u6BCF\u9879\u5305\u542B operation(CREATE|UPDATE|DELETE|READ)\u3001path(\u76F8\u5BF9\u5DE5\u4F5C\u533A\u8DEF\u5F84)\u3001\u53EF\u9009 targetType/summary/beforeHash/afterHash/metadata\u3002\u672A\u8BB0\u5F55\u53D8\u66F4\u4F1A\u5BFC\u81F4 AI \u56DE\u9000\u7F3A\u5C11\u4F9D\u636E\u3002`,inputSchema:{type:"object",properties:{nodeId:{type:"string",description:"\u4EFB\u52A1\u8282\u70B9ID\uFF08\u4ECE my_task \u8FD4\u56DE\u7684\u4EFB\u52A1\u4FE1\u606F\u4E2D\u83B7\u53D6\uFF09"},outputPayload:{type:"string",description:'\u4EFB\u52A1\u6267\u884C\u7ED3\u679C\u7684 JSON \u5B57\u7B26\u4E32\u3002\u5FC5\u987B\u6309 my_task.requiredOutput \u9009\u62E9\u76EE\u6807\u5206\u652F\uFF0C\u4F8B\u5982 [{"targetNodeId":"<\u76EE\u6807\u8282\u70B9\u6A21\u677FID>","output":{...}}]\uFF1B\u63D0\u4EA4\u5230 HUMAN \u8282\u70B9\u65F6 output \u5FC5\u987B\u5F62\u5982 {"questions":[{"question":"\u8BF7\u786E\u8BA4...","options":[{"label":"\u901A\u8FC7"}]}]}\u3002'},changeLog:{type:"array",description:"\u53EF\u9009\u3002\u672C\u6B21\u4EFB\u52A1\u5904\u7406\u671F\u95F4\u4EA7\u751F\u7684\u6587\u4EF6/\u5185\u5BB9\u53D8\u66F4\u65E5\u5FD7\uFF0C\u7528\u4E8E AI \u56DE\u9000\u3002\u6BCF\u9879: { operation: 'CREATE'|'UPDATE'|'DELETE'|'READ', targetType?: string, path: string, summary?: string, beforeHash?: string, afterHash?: string, metadata?: string }\u3002\u5EFA\u8BAE\u5728\u5B8C\u6210\u4EFB\u52A1\u3001\u8C03\u7528 submit_task_result \u65F6\u4E00\u5E76\u63D0\u4EA4\u3002",items:{type:"object",properties:{operation:{type:"string",enum:["CREATE","UPDATE","DELETE","READ"],description:"\u53D8\u66F4\u64CD\u4F5C\u7C7B\u578B"},targetType:{type:"string",description:"\u53D8\u66F4\u76EE\u6807\u7C7B\u578B\uFF0C\u7F3A\u7701\u89C6\u4E3A FILE"},path:{type:"string",description:"\u53D8\u66F4\u6587\u4EF6/\u8D44\u6E90\u7684\u76F8\u5BF9\u8DEF\u5F84"},summary:{type:"string",description:"\u53D8\u66F4\u6458\u8981\u8BF4\u660E"},beforeHash:{type:"string",description:"\u53D8\u66F4\u524D\u5185\u5BB9 hash\uFF08\u5DEE\u5F02\u56DE\u9000\u7528\uFF09"},afterHash:{type:"string",description:"\u53D8\u66F4\u540E\u5185\u5BB9 hash\uFF08\u5DEE\u5F02\u56DE\u9000\u7528\uFF09"},metadata:{type:"string",description:"\u9644\u52A0\u5143\u6570\u636E JSON \u5B57\u7B26\u4E32\uFF08\u5982 cacheKey\uFF09"}},required:["operation","path"]}}},required:["nodeId","outputPayload"]}},R={name:"start_task_rollback",description:"\u5C06\u5206\u914D\u7ED9\u5F53\u524D Agent \u7684\u6D41\u7A0B\u7EBF AI \u56DE\u9000\u4EFB\u52A1\u6807\u8BB0\u4E3A\u56DE\u9000\u4E2D\u3002\u6536\u5230\u56DE\u9000\u59D4\u6258\u540E\uFF0C\u5F00\u59CB\u5B9E\u9645\u56DE\u9000\u524D\u8C03\u7528\u3002",inputSchema:{type:"object",properties:{rollbackTaskId:{type:"string",description:"AI \u56DE\u9000\u4EFB\u52A1ID\uFF08\u4ECE\u56DE\u9000\u59D4\u6258\u6D88\u606F\u4E2D\u83B7\u53D6\uFF09\u3002"}},required:["rollbackTaskId"]}},b={name:"finish_task_rollback",description:"\u5C06\u5206\u914D\u7ED9\u5F53\u524D Agent \u7684\u6D41\u7A0B\u7EBF AI \u56DE\u9000\u4EFB\u52A1\u6807\u8BB0\u4E3A\u5DF2\u56DE\u9000\uFF0C\u5E76\u8BB0\u5F55\u56DE\u9000\u7ED3\u679C\u3002\u5B8C\u6210\u56DE\u9000\u540E\u8C03\u7528\u3002",inputSchema:{type:"object",properties:{rollbackTaskId:{type:"string",description:"AI \u56DE\u9000\u4EFB\u52A1ID\uFF08\u4ECE\u56DE\u9000\u59D4\u6258\u6D88\u606F\u4E2D\u83B7\u53D6\uFF09\u3002"},resultMessage:{type:"string",description:"\u56DE\u9000\u7ED3\u679C\u8BF4\u660E\uFF08\u53EF\u9009\uFF09\u3002"}},required:["rollbackTaskId"]}},D={name:"reject_task",description:"\u62D2\u7EDD\u5BF9\u524D\u5E8F\u8282\u70B9\u8F93\u51FA\u7684\u4EFB\u52A1\uFF0C\u4EFB\u52A1\u5C06\u56DE\u9000\u5230\u524D\u4E00\u4E2A\u8282\u70B9\u91CD\u65B0\u6267\u884C\u3002\u9002\u7528\u4E8E\u524D\u5E8F\u8F93\u51FA\u4E0D\u6EE1\u8DB3\u8981\u6C42\u6216\u65E0\u6CD5\u7EE7\u7EED\u6267\u884C\u7684\u573A\u666F\u3002",inputSchema:{type:"object",properties:{nodeId:{type:"string",description:"\u4EFB\u52A1\u8282\u70B9ID\uFF08\u4ECE my_task \u8FD4\u56DE\u7684\u4EFB\u52A1\u4FE1\u606F\u4E2D\u83B7\u53D6\uFF09"},reason:{type:"string",description:"\u62D2\u7EDD\u539F\u56E0"}},required:["nodeId","reason"]}},M={name:"terminate_task",description:"\u7EC8\u6B62\u6574\u4E2A\u6D41\u7A0B\u7EBF\u4EFB\u52A1\u3002\u7EC8\u6B62\u540E\u4EFB\u52A1\u72B6\u6001\u53D8\u4E3A TERMINATED\uFF08\u5DF2\u7EC8\u6B62\uFF09\uFF0C\u6240\u6709\u672A\u5B8C\u6210\u7684\u8282\u70B9\u4E5F\u5C06\u88AB\u7EC8\u6B62\uFF0C\u4EFB\u52A1\u4E0D\u518D\u8FDB\u884C\u540E\u7EED\u6D41\u8F6C\u3002\u9002\u7528\u4E8E\u4EFB\u52A1\u65E0\u6CD5\u7EE7\u7EED\u6267\u884C\u6216\u9700\u8981\u5F3A\u5236\u505C\u6B62\u7684\u573A\u666F\u3002\u6CE8\u610F\uFF1A\u7EC8\u6B62\u64CD\u4F5C\u4E0D\u53EF\u9006\uFF0C\u8BF7\u8C28\u614E\u4F7F\u7528\u3002",inputSchema:{type:"object",properties:{taskInstanceId:{type:"string",description:"\u4EFB\u52A1\u5B9E\u4F8BID\uFF08\u4ECE my_task \u8FD4\u56DE\u7684\u4EFB\u52A1\u4FE1\u606F\u4E2D\u83B7\u53D6 taskInstanceId\uFF09"},reason:{type:"string",description:"\u7EC8\u6B62\u539F\u56E0"}},required:["taskInstanceId","reason"]}},N={name:"get_debug_log_config",description:`\u83B7\u53D6 Agent Debug \u65E5\u5FD7\u7CFB\u7EDF\u7684\u4E0A\u62A5\u914D\u7F6E\u3002\u8FD4\u56DE\u5199\u5165\u7AEF\u70B9 URL\u3001\u5F53\u524D Agent \u6240\u5C5E\u9879\u76EE ID\u3001\u4EE5\u53CA\u65E5\u5FD7\u5199\u5165\u5BC6\u94A5\uFF08logWriteKey\uFF09\u3002
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
\u8BE5\u914D\u7F6E\u7528\u4E8E\u5C06 Debug \u65E5\u5FD7\u4E0A\u62A5\u80FD\u529B\u96C6\u6210\u5230\u4E1A\u52A1\u9879\u76EE\u4EE3\u7801\u4E2D\u3002\u65E5\u5FD7\u5199\u5165\u65B9\u662F\u4E1A\u52A1\u7A0B\u5E8F\u7684\u8FD0\u884C\u65F6\u4EE3\u7801\uFF08\u5728\u8FD0\u884C\u65F6\u901A\u8FC7 HTTP \u4E0A\u62A5\uFF09\uFF0C\u800C\u4E0D\u662F Agent \u672C\u4EBA\uFF1B\u4E0D\u5E94\u901A\u8FC7 curl\u3001HTTP \u5DE5\u5177\u6216\u4E34\u65F6\u811A\u672C\u76F4\u63A5\u8C03\u7528 writeUrl \u5199\u5165\u65E5\u5FD7\u3002\u6B63\u786E\u7684\u4F7F\u7528\u65B9\u5F0F\u662F\u4F9D\u636E\u4E0B\u8FF0\u63A5\u53E3\u7EA6\u5B9A\uFF0C\u5728\u4E1A\u52A1\u9879\u76EE\u4E2D\u5B9E\u73B0\u5E76\u63A5\u5165\u65E5\u5FD7\u4E0A\u62A5\u4EE3\u7801\u3002
|
|
24
|
+
|
|
25
|
+
## \u4E1A\u52A1\u9879\u76EE\u5982\u4F55\u4E0A\u62A5\u65E5\u5FD7
|
|
26
|
+
\u5728\u4E1A\u52A1\u9879\u76EE\u5185\u901A\u8FC7 HTTP POST \u8BF7\u6C42\u4E0A\u62A5\uFF1A
|
|
25
27
|
- URL: \u8FD4\u56DE\u7684 writeUrl
|
|
26
28
|
- Header: X-API-Key: <\u8FD4\u56DE\u7684 logWriteKey>
|
|
27
29
|
- Body (JSON):
|
|
@@ -31,12 +33,12 @@ MCP \u5DE5\u5177\uFF08poll_message/get_message\uFF09\u4E0D\u518D\u8FD4\u56DE sys
|
|
|
31
33
|
- level (\u53EF\u9009): DEBUG / INFO / WARN / ERROR\uFF0C\u9ED8\u8BA4 INFO
|
|
32
34
|
- detail (\u53EF\u9009): \u65E5\u5FD7\u8BE6\u60C5\u5185\u5BB9
|
|
33
35
|
|
|
34
|
-
\u5F53 logWriteKey \u975E\u7A7A\u65F6\uFF0C\u4F7F\u7528\u8BE5 key \u5373\u53EF\
|
|
35
|
-
\u5F53 logWriteKey \u4E3A\u7A7A\u65F6\uFF0C\u9700\u4F7F\u7528\u9879\u76EE\u6210\u5458\u7684 API Key\uFF08\u9700\u9879\u76EE\u6210\u5458\u6743\u9650\uFF09\u3002`,inputSchema:{type:"object",properties:{},required:[]}},
|
|
36
|
+
\u5F53 logWriteKey \u975E\u7A7A\u65F6\uFF0C\u4E1A\u52A1\u9879\u76EE\u4F7F\u7528\u8BE5 key \u5373\u53EF\u4E0A\u62A5\u65E5\u5FD7\uFF0C\u65E0\u9700\u9879\u76EE\u6210\u5458\u6743\u9650\u3002
|
|
37
|
+
\u5F53 logWriteKey \u4E3A\u7A7A\u65F6\uFF0C\u9700\u4F7F\u7528\u9879\u76EE\u6210\u5458\u7684 API Key\uFF08\u9700\u9879\u76EE\u6210\u5458\u6743\u9650\uFF09\u3002`,inputSchema:{type:"object",properties:{},required:[]}},C={name:"query_debug_logs",description:`\u5206\u9875\u67E5\u8BE2 Agent Debug \u65E5\u5FD7\uFF08\u6309\u65F6\u95F4\u5012\u5E8F\uFF09\u3002\u7528\u4E8E\u6392\u67E5\u4E1A\u52A1\u9879\u76EE\u8FD0\u884C\u65F6\u95EE\u9898\u3002
|
|
36
38
|
|
|
37
39
|
\u8FD4\u56DE\u5B57\u6BB5\uFF1Aid\u3001projectId\u3001businessLine\u3001module\u3001level\u3001detail\u3001createdAt\u3002`,inputSchema:{type:"object",properties:{projectId:{type:"string",description:"\u9879\u76EE ID\uFF08\u5FC5\u586B\uFF09"},businessLine:{type:"string",description:"\u4E1A\u52A1\u7EBF\u540D\u79F0\uFF08\u5FC5\u586B\uFF09"},module:{type:"string",description:"\u6A21\u5757\u540D\uFF08\u53EF\u9009\uFF09"},level:{type:"string",description:"\u65E5\u5FD7\u7EA7\u522B\uFF1ADEBUG / INFO / WARN / ERROR\uFF08\u53EF\u9009\uFF09",enum:["DEBUG","INFO","WARN","ERROR"]},startTime:{type:"string",description:"\u8D77\u59CB\u65F6\u95F4\uFF0CISO \u683C\u5F0F\u5982 2026-08-01T00:00:00\uFF08\u53EF\u9009\uFF09"},endTime:{type:"string",description:"\u7ED3\u675F\u65F6\u95F4\uFF0CISO \u683C\u5F0F\u5982 2026-08-02T00:00:00\uFF08\u53EF\u9009\uFF09"},offset:{type:"number",description:"\u504F\u79FB\u91CF\uFF0C\u9ED8\u8BA4 0"},limit:{type:"number",description:"\u6BCF\u9875\u6761\u6570\uFF0C\u9ED8\u8BA4 20\uFF0C\u6700\u5927 200"}},required:["projectId","businessLine"]}},f={name:"query_file_changes_history",description:`\u5206\u9875\u67E5\u8BE2\u6587\u4EF6\u53D8\u66F4\u5386\u53F2\uFF08\u6309\u65F6\u95F4\u5012\u5E8F\uFF09\u3002\u7528\u4E8E\u4E86\u89E3\u5176\u5B83 Agent \u5BF9\u6587\u4EF6\u505A\u8FC7\u54EA\u4E9B\u4FEE\u6539\u3001\u4FEE\u6539\u539F\u56E0\u4E0E\u5F53\u524D\u72B6\u6001\uFF0C\u652F\u6301\u6309 \u89D2\u8272/\u5B9E\u4F8B/\u6587\u4EF6\u540D/\u76F8\u5BF9\u8DEF\u5F84/\u64CD\u4F5C/\u72B6\u6001/\u4EFB\u52A1\u5B9E\u4F8B/\u65F6\u95F4\u8303\u56F4 \u8FC7\u6EE4\u3002
|
|
38
40
|
|
|
39
41
|
\u67E5\u8BE2\u8303\u56F4\u81EA\u52A8\u9650\u5B9A\u4E3A\u5F53\u524D Agent \u6240\u5C5E\u9879\u76EE\uFF08\u65E0\u9700\u4F20 projectId\uFF09\u3002agentId \u4E0D\u4F20\u8868\u793A\u67E5\u8BE2\u5F53\u524D\u9879\u76EE\u4E0B\u6240\u6709 Agent \u7684\u53D8\u66F4\u8BB0\u5F55\uFF0C\u4F20\u5176\u5B83 Agent \u5B9E\u4F8B ID \u65F6\u4EC5\u9650\u540C\u9879\u76EE\u5185\uFF08\u670D\u52A1\u7AEF\u6821\u9A8C\uFF0C\u9879\u76EE\u5916 Agent \u4F1A\u88AB\u62D2\u7EDD\uFF09\u3002
|
|
40
42
|
|
|
41
|
-
\u8FD4\u56DE\u5B57\u6BB5\uFF1Aid\u3001projectId\u3001roleName\u3001instanceName\u3001agentId\u3001operation\uFF08CREATE/UPDATE/DELETE\uFF09\u3001targetPath\u3001fullPath\u3001reason\u3001status\uFF08APPLIED/REVERTED/REVERT_FAILED\uFF09\u3001createdAt\u3001revertedAt\u3001revertedBy\u3002`,inputSchema:{type:"object",properties:{roleId:{type:"string",description:"\u89D2\u8272\u5B9A\u4E49 ID\uFF08\u53EF\u9009\uFF09"},agentId:{type:"string",description:"Agent \u5B9E\u4F8B ID\uFF08\u53EF\u9009\uFF1B\u4E0D\u4F20=\u67E5\u8BE2\u5F53\u524D\u9879\u76EE\u4E0B\u6240\u6709 Agent\uFF1B\u4F20\u5176\u5B83 Agent \u65F6\u670D\u52A1\u7AEF\u6821\u9A8C\u5176\u4E0E\u8C03\u7528\u8005\u540C\u9879\u76EE\uFF09"},fileName:{type:"string",description:"\u6587\u4EF6\u540D\uFF08\u53EF\u9009\uFF0C\u6309 basename \u6A21\u7CCA\u5339\u914D\uFF09"},filePath:{type:"string",description:"\u5DE5\u4F5C\u533A\u76F8\u5BF9\u8DEF\u5F84\uFF08\u53EF\u9009\uFF0C\u6309\u8D26\u672C\u8BB0\u5F55\u7684\u76F8\u5BF9\u8DEF\u5F84 targetPath \u5339\u914D\uFF0C\u542B\u76EE\u5F55\u524D\u7F00\u5339\u914D\uFF09\u3002\u652F\u6301 ./xx\u3001xx\u3001@/xx\u3001/xx \u7B49\u4EF7\u5199\u6CD5\uFF08@ \u89C6\u4E3A\u5DE5\u4F5C\u533A\u6839\u8DEF\u5F84\u522B\u540D\uFF09\u3002\u793A\u4F8B\uFF1A@/src/main.ts \u7CBE\u786E\u5339\u914D src/main.ts\uFF1B@/src \u5339\u914D src/ \u76EE\u5F55\u53CA\u5176\u4E0B\u6240\u6709\u6587\u4EF6\u7684\u53D8\u66F4\u3002\u4E0E fileName \u6B63\u4EA4\uFF1AfileName \u6309\u6587\u4EF6\u540D\u6A21\u7CCA\uFF0CfilePath \u6309\u76F8\u5BF9\u8DEF\u5F84\u5339\u914D\u3002"},operation:{type:"string",description:"\u64CD\u4F5C\u7C7B\u578B\uFF1ACREATE / UPDATE / DELETE\uFF08\u53EF\u9009\uFF09",enum:["CREATE","UPDATE","DELETE"]},status:{type:"string",description:"\u8BB0\u5F55\u72B6\u6001\uFF1AAPPLIED\uFF08\u5DF2\u751F\u6548\uFF09/ REVERTED\uFF08\u5DF2\u64A4\u9500\uFF09/ REVERT_FAILED\uFF08\u64A4\u9500\u5931\u8D25\uFF09\uFF08\u53EF\u9009\uFF09",enum:["APPLIED","REVERTED","REVERT_FAILED"]},taskInstanceId:{type:"string",description:"\u4EFB\u52A1\u5B9E\u4F8B ID\uFF08\u53EF\u9009\uFF09"},startTime:{type:"string",description:"\u8D77\u59CB\u65F6\u95F4\uFF0CISO \u683C\u5F0F\u5982 2026-08-01T00:00:00\uFF08\u53EF\u9009\uFF09"},endTime:{type:"string",description:"\u7ED3\u675F\u65F6\u95F4\uFF0CISO \u683C\u5F0F\u5982 2026-08-02T00:00:00\uFF08\u53EF\u9009\uFF09"},page:{type:"number",description:"\u9875\u7801\uFF0C\u9ED8\u8BA4 1"},pageSize:{type:"number",description:"\u6BCF\u9875\u6761\u6570\uFF0C\u9ED8\u8BA4 20"}},required:[]}},v=new Set(["create_memory","read_memory","update_memory","delete_memory","search_memory","list_memories","get_memory_stats","list_memories_by_file","memory_recurrence","memory_recurrence_complete"]),P={name:"launch_config_list",description:"\u67E5\u8BE2\u5F53\u524D Agent \u6240\u5C5E\u9879\u76EE\u4E0B\u7684\u542F\u52A8\u9879\uFF08\u7C7B IDEA Run Configuration\uFF09\u5217\u8868\u3002\u6BCF\u4E2A\u542F\u52A8\u9879\u542B id\u3001name\u3001type\uFF08generic/java/python/node/go/php\uFF09\u3001command\u3001cwd\u3001env\u3001jdkId\u3001groupId\u3001sortOrder\u3002\u67E5\u8BE2\u8303\u56F4\u81EA\u52A8\u9650\u5B9A\u4E3A\u5F53\u524D\u9879\u76EE\uFF0C\u65E0\u9700\u4F20 projectId\u3002",inputSchema:{type:"object",properties:{},required:[]}},j={name:"launch_config_create",description:"\u5728\u5F53\u524D Agent \u6240\u5C5E\u9879\u76EE\u4E0B\u65B0\u5EFA\u542F\u52A8\u9879\uFF08\u7C7B IDEA Run Configuration\uFF09\u3002\u521B\u5EFA\u524D\u5EFA\u8BAE\u5148 launch_config_list \u67E5\u770B\u73B0\u6709\u914D\u7F6E\u4E0E\u547D\u540D\u4E60\u60EF\u3002\u9879\u76EE\u8303\u56F4\u81EA\u52A8\u63A8\u5BFC\uFF0C\u65E0\u9700\u4F20 projectId\u3002cwd\uFF08\u5DE5\u4F5C\u76EE\u5F55\uFF09\u4E3A\u5FC5\u586B\u9879\uFF0C\u7F3A\u5931\u5C06\u521B\u5EFA\u5931\u8D25\u2014\u2014\u8BF7\u4F20\u5165\u9879\u76EE\u5B9E\u9645\u4EE3\u7801/\u6784\u5EFA\u76EE\u5F55\u7684\u7EDD\u5BF9\u8DEF\u5F84\uFF0C\u5982 D:/code/xxx/backend\uFF1B\u4E0D\u786E\u5B9A\u65F6\u53EF\u7528\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84\u3002\u521B\u5EFA\u6210\u529F\u540E\u8FD4\u56DE\u65B0\u542F\u52A8\u9879\u5B8C\u6574\u4FE1\u606F\uFF08\u542B id\uFF09\u3002",inputSchema:{type:"object",properties:{name:{type:"string",description:"\u542F\u52A8\u9879\u540D\u79F0\uFF08\u5FC5\u586B\uFF0C\u9879\u76EE\u5185\u552F\u4E00\uFF0C\u2264128 \u5B57\u7B26\uFF09"},type:{type:"string",description:"\u542F\u52A8\u9879\u7C7B\u578B\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4 generic\uFF09\uFF1Ageneric / java / python / node / go / php",enum:["generic","java","python","node","go","php"]},command:{type:"string",description:"\u542F\u52A8\u547D\u4EE4\uFF08\u5FC5\u586B\uFF0C\u22648192 \u5B57\u7B26\uFF09\u3002\u652F\u6301\u5360\u4F4D\u7B26 ${WORKSPACE}\uFF08\u9879\u76EE\u5DE5\u4F5C\u533A\uFF09\u3001${JAVA_HOME}\uFF08\u6240\u9009 JDK\uFF09\u3001${VAR}\uFF08env \u4E2D\u5B9A\u4E49\u7684\u53D8\u91CF\uFF09\u3002\u793A\u4F8B\uFF1Anpm run dev\u3001python main.py\u3001mvn spring-boot:run"},cwd:{type:"string",description:"\u5DE5\u4F5C\u76EE\u5F55\uFF08\u5FC5\u586B\uFF0C\u2264512 \u5B57\u7B26\uFF09\u2014\u2014\u9879\u76EE\u5B9E\u9645\u4EE3\u7801/\u6784\u5EFA\u76EE\u5F55\u7684\u7EDD\u5BF9\u8DEF\u5F84\uFF0C\u5982 D:/code/xxx/backend"},env:{type:"object",description:"\u989D\u5916\u73AF\u5883\u53D8\u91CF\uFF08\u53EF\u9009\uFF0C\u226464 \u9879\uFF09\uFF0C\u989D\u5916\u5C5E\u6027\uFF1A\u5B57\u7B26\u4E32\u503C",additionalProperties:{type:"string"}},jdkId:{type:"string",description:"\u9009\u4E2D\u7684 JDK ID\uFF08type=java \u65F6\u6709\u6548\uFF0C\u53EF\u9009\uFF09"},groupId:{type:"string",description:"\u6240\u5C5E\u542F\u52A8\u9879\u5206\u7EC4 ID\uFF08\u53EF\u9009\uFF0Cnull/\u7A7A=\u672A\u5206\u7EC4\uFF09"},sortOrder:{type:"number",description:"\u6392\u5E8F\u6743\u91CD\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4\u8FFD\u52A0\u5230\u6240\u5728\u5BB9\u5668\u672B\u5C3E\uFF09"},readinessPattern:{type:"string",description:'\u5C31\u7EEA\u65E5\u5FD7\u6B63\u5219\uFF08\u53EF\u9009\uFF0C\u2264512 \u5B57\u7B26\uFF0CJS RegExp \u8BED\u6CD5\uFF09\u3002\u8BBE\u7F6E\u540E wait_timeout_ms \u7B49\u5F85\u7684 ready \u4FE1\u53F7\u6539\u4E3A"\u8F93\u51FA\u884C\u547D\u4E2D\u8BE5\u6B63\u5219"\uFF08\u9002\u914D\u4E0D\u76D1\u542C\u7AEF\u53E3\u7684\u5E38\u9A7B\u8FDB\u7A0B\uFF0C\u5982 worker/\u6D88\u8D39\u8005\uFF09\u3002\u793A\u4F8B\uFF1A^Server ready|^Build (SUCCESS|successful)\u3002\u7559\u7A7A=\u7AEF\u53E3\u76D1\u542C\u63A2\u6D4B'}},required:["name","command","cwd"]}},x={name:"launch_config_update",description:"\u66F4\u65B0\u542F\u52A8\u9879\uFF08\u540D\u79F0/\u7C7B\u578B/\u547D\u4EE4/\u5DE5\u4F5C\u76EE\u5F55/\u73AF\u5883\u53D8\u91CF/JDK/\u5206\u7EC4/\u6392\u5E8F\uFF09\u3002\u672A\u4F20\u5B57\u6BB5\u4FDD\u6301\u539F\u503C\uFF1B\u4FEE\u6539\u540D\u79F0\u65F6\u9879\u76EE\u5185\u4E0D\u80FD\u91CD\u540D\u3002\u76EE\u6807\u542F\u52A8\u9879\u5FC5\u987B\u5C5E\u4E8E\u5F53\u524D\u9879\u76EE\uFF08\u670D\u52A1\u7AEF\u6821\u9A8C\uFF09\u3002\u8FD0\u884C\u4E2D\u7684\u542F\u52A8\u9879\uFF1A\u4FEE\u6539\u914D\u7F6E\u4E0D\u4F1A\u5F71\u54CD\u5DF2\u8FD0\u884C\u8FDB\u7A0B\uFF0C\u9700\u91CD\u542F\u540E\u751F\u6548\u3002",inputSchema:{type:"object",properties:{configId:{type:"string",description:"\u542F\u52A8\u9879 ID\uFF08\u5FC5\u586B\uFF09"},name:{type:"string",description:"\u542F\u52A8\u9879\u540D\u79F0\uFF08\u53EF\u9009\uFF0C\u2264128 \u5B57\u7B26\uFF09"},type:{type:"string",description:"\u542F\u52A8\u9879\u7C7B\u578B\uFF08\u53EF\u9009\uFF09\uFF1Ageneric / java / python / node / go / php",enum:["generic","java","python","node","go","php"]},command:{type:"string",description:"\u542F\u52A8\u547D\u4EE4\uFF08\u53EF\u9009\uFF0C\u22648192 \u5B57\u7B26\uFF09"},cwd:{type:"string",description:"\u5DE5\u4F5C\u76EE\u5F55\uFF08\u53EF\u9009\uFF09"},env:{type:"object",description:"\u989D\u5916\u73AF\u5883\u53D8\u91CF\uFF08\u53EF\u9009\uFF0C\u6574\u4F53\u8986\u76D6\u539F env\uFF09",additionalProperties:{type:"string"}},jdkId:{type:"string",description:"\u9009\u4E2D\u7684 JDK ID\uFF08type=java \u65F6\u6709\u6548\uFF0C\u53EF\u9009\uFF09"},groupId:{type:"string",description:"\u6240\u5C5E\u542F\u52A8\u9879\u5206\u7EC4 ID\uFF08\u53EF\u9009\uFF09"},clearGroupId:{type:"boolean",description:"\u663E\u5F0F\u6E05\u9664\u5206\u7EC4\uFF08\u79FB\u56DE\u9ED8\u8BA4\u5206\u7EC4\uFF0C\u53EF\u9009\uFF1B\u4E0D\u80FD\u4E0E groupId \u540C\u65F6\u4F20\uFF09"},sortOrder:{type:"number",description:"\u6392\u5E8F\u6743\u91CD\uFF08\u53EF\u9009\uFF09"},readinessPattern:{type:"string",description:"\u5C31\u7EEA\u65E5\u5FD7\u6B63\u5219\uFF08\u53EF\u9009\uFF0CJS RegExp \u8BED\u6CD5\uFF09\uFF1A\u8BBE\u7F6E\u540E\u542F\u52A8\u7B49\u5F85\u7684 ready \u4FE1\u53F7\u4E3A\u8F93\u51FA\u884C\u547D\u4E2D\u6B63\u5219\uFF08\u9002\u914D\u4E0D\u76D1\u542C\u7AEF\u53E3\u7684\u8FDB\u7A0B\uFF09\u3002\u7559\u7A7A=\u7AEF\u53E3\u76D1\u542C\u63A2\u6D4B"},clearReadinessPattern:{type:"boolean",description:"\u663E\u5F0F\u6E05\u9664\u5C31\u7EEA\u6B63\u5219\uFF0C\u6062\u590D\u7AEF\u53E3\u63A2\u6D4B\uFF08\u53EF\u9009\uFF1B\u4E0D\u80FD\u4E0E readinessPattern \u540C\u65F6\u4F20\uFF09"}},required:["configId"]}},k={name:"launch_config_delete",description:"\u5220\u9664\u542F\u52A8\u9879\u914D\u7F6E\u3002\u76EE\u6807\u542F\u52A8\u9879\u5FC5\u987B\u5C5E\u4E8E\u5F53\u524D\u9879\u76EE\uFF08\u670D\u52A1\u7AEF\u6821\u9A8C\uFF09\u3002\u6CE8\u610F\uFF1A\u82E5\u8BE5\u542F\u52A8\u9879\u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u5148 launch_config_stop \u505C\u6B62\u8FDB\u7A0B\u518D\u5220\u9664\uFF08\u5220\u9664\u914D\u7F6E\u4E0D\u4F1A\u81EA\u52A8\u505C\u6B62\u5DF2\u8FD0\u884C\u8FDB\u7A0B\uFF09\u3002",inputSchema:{type:"object",properties:{configId:{type:"string",description:"\u542F\u52A8\u9879 ID\uFF08\u5FC5\u586B\uFF09"}},required:["configId"]}},U={name:"launch_config_start",description:"\u542F\u52A8\u542F\u52A8\u9879\uFF0C\u5728\u8C03\u7528\u8005\u6240\u5728 runtime-bridge \u673A\u5668\u4E0A\u62C9\u8D77\u8FDB\u7A0B\u3002\u652F\u6301\u5355\u9879\uFF08configId\uFF09\u4E0E\u6279\u91CF\uFF08configIds \u6570\u7EC4\uFF0C\u4E00\u6B21\u5E76\u884C\u62C9\u8D77\u591A\u4E2A\uFF09\uFF1A\u6279\u91CF\u65F6\u9010\u9879\u4EE5\u914D\u7F6E\u4E3A\u51C6\u5E76\u884C\u542F\u52A8\uFF0C\u5355\u9879\u5931\u8D25\u4E0D\u5F71\u54CD\u5176\u4F59\u9879\uFF0C\u8FD4\u56DE\u9010\u9879\u7ED3\u679C\u4E0E\u6C47\u603B\uFF08ready/exited/timeout/failed \u8BA1\u6570\uFF09\uFF1B\u5EFA\u8BAE\u542F\u52A8\u524D\u5148 launch_config_status \u786E\u8BA4\u672A\u5728\u8FD0\u884C\u3002\u9ED8\u8BA4\u4E0D\u7B49\u5F85\u7ACB\u5373\u8FD4\u56DE\uFF1B\u4F20 wait_timeout_ms > 0 \u65F6\u963B\u585E\u7B49\u5F85\u542F\u52A8\u7ED3\u679C\uFF08\u5355\u9879\u8FD4\u56DE wait \u5B57\u6BB5\uFF0C\u6279\u91CF\u5BF9\u5168\u90E8\u6210\u529F\u9879\u5E76\u884C\u7B49\u5F85\u3001\u6574\u4F53\u8FD4\u56DE\u65F6\u95F4\u2248\u6700\u6162\u4E00\u9879\uFF09\u3002",inputSchema:{type:"object",properties:{configId:{type:"string",description:"\u542F\u52A8\u9879 ID\uFF08\u5355\u9879\u542F\u52A8\u65F6\u5FC5\u586B\uFF1B\u4E0E configIds \u4E8C\u9009\u4E00\uFF09"},configIds:{type:"array",items:{type:"string"},description:"\u6279\u91CF\u542F\u52A8\uFF1A\u542F\u52A8\u9879 ID \u6570\u7EC4\uFF081-20 \u4E2A\uFF0C\u81EA\u52A8\u53BB\u91CD\uFF1B\u4E0E configId \u4E8C\u9009\u4E00\uFF0C\u4F20\u4E86\u4F18\u5148\u8D70\u6279\u91CF\uFF09\u3002\u6279\u91CF\u6A21\u5F0F\u4EE5\u5404\u9879\u914D\u7F6E\u4E3A\u51C6\u542F\u52A8\uFF0C\u5FFD\u7565 command/cwd/env/readinessPattern \u8986\u76D6\u53C2\u6570\uFF1BworkspacePath/jdkPath \u4E0E wait_timeout_ms \u5BF9\u5168\u90E8\u9879\u751F\u6548"},command:{type:"string",description:"\u542F\u52A8\u547D\u4EE4\u8986\u76D6\uFF08\u53EF\u9009\uFF0C\u4EC5\u5355\u9879\u6A21\u5F0F\uFF09"},cwd:{type:"string",description:"\u5DE5\u4F5C\u76EE\u5F55\u8986\u76D6\uFF08\u53EF\u9009\uFF0C\u4EC5\u5355\u9879\u6A21\u5F0F\uFF09"},env:{type:"object",description:"\u73AF\u5883\u53D8\u91CF\u8986\u76D6\uFF08\u53EF\u9009\uFF0C\u6574\u4F53\u8986\u76D6\u914D\u7F6E env\uFF1B\u4EC5\u5355\u9879\u6A21\u5F0F\uFF09",additionalProperties:{type:"string"}},jdkPath:{type:"string",description:"JDK \u8DEF\u5F84\uFF08type=java \u65F6\u6709\u6548\uFF0C\u53EF\u9009\uFF1B\u5355\u9879=\u8BE5\u9879\u8986\u76D6\uFF0C\u6279\u91CF=\u5168\u90E8\u9879\u751F\u6548\uFF09"},workspacePath:{type:"string",description:"\u9879\u76EE\u5DE5\u4F5C\u533A\u8DEF\u5F84\uFF08\u53EF\u9009\uFF1B\u5355\u9879=\u8BE5\u9879\u8986\u76D6\uFF0C\u6279\u91CF=\u5168\u90E8\u9879\u751F\u6548\uFF09"},readinessPattern:{type:"string",description:"\u5C31\u7EEA\u65E5\u5FD7\u6B63\u5219\u8986\u76D6\uFF08\u53EF\u9009\uFF0C\u4EC5\u5355\u9879\u6A21\u5F0F\uFF0CJS RegExp \u8BED\u6CD5\uFF09\uFF1A\u8BBE\u7F6E\u540E\u542F\u52A8\u7B49\u5F85\u7684 ready \u4FE1\u53F7\u4E3A\u8F93\u51FA\u884C\u547D\u4E2D\u6B63\u5219\uFF08\u9002\u914D\u4E0D\u76D1\u542C\u7AEF\u53E3\u7684\u8FDB\u7A0B\uFF09\u3002\u7559\u7A7A=\u4EE5\u542F\u52A8\u9879\u914D\u7F6E\u4E3A\u51C6\uFF08\u9ED8\u8BA4\u7AEF\u53E3\u76D1\u542C\u63A2\u6D4B\uFF09"},wait_timeout_ms:{type:"number",description:"\u963B\u585E\u7B49\u5F85\u542F\u52A8\u7ED3\u679C\u7684\u8D85\u65F6\u6BEB\u79D2\u6570\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4 0=\u4E0D\u7B49\u5F85\uFF0Cspawn \u540E\u7ACB\u5373\u8FD4\u56DE\uFF09\u3002>0 \u65F6\u672C\u6B21\u8C03\u7528\u963B\u585E\uFF0C\u76F4\u5230\u4EE5\u4E0B\u4FE1\u53F7\u6700\u5148\u5230\u8FBE\u5E76\u5728 wait \u5B57\u6BB5\u8FD4\u56DE\uFF1Aready=\u8FDB\u7A0B\u6811\u63A2\u6D4B\u5230\u76D1\u542C\u7AEF\u53E3\uFF08\u5E38\u9A7B\u670D\u52A1\u542F\u52A8\u6210\u529F\uFF0C\u9644 ports\uFF09\uFF0C\u6216\u8F93\u51FA\u884C\u547D\u4E2D\u5C31\u7EEA\u6B63\u5219\uFF08readinessPattern\uFF0C\u89C1\u4E0A\uFF09\uFF1Bexited=\u8FDB\u7A0B\u9000\u51FA\uFF08\u4E00\u6B21\u6027\u547D\u4EE4\u5B8C\u6210\u6216\u542F\u52A8\u5FEB\u901F\u5931\u8D25\uFF0CexitCode=0 \u4E3A\u6210\u529F\uFF0C\u975E 0 \u68C0\u67E5 logTail \u5B9A\u4F4D\u539F\u56E0\uFF09\uFF1Bstopped=\u7B49\u5F85\u671F\u95F4\u88AB\u505C\u6B62\uFF1Btimeout=\u8D85\u65F6\uFF0C\u8FDB\u7A0B\u4ECD\u5728\u8FD0\u884C\uFF08\u4E0D\u7B97\u9519\u8BEF\uFF0C\u6309 logTail \u81EA\u884C\u5224\u65AD\u6216\u7A0D\u540E launch_config_logs \u8F6E\u8BE2\uFF09\u3002\u4E0A\u9650 300000\uFF085 \u5206\u949F\uFF09\uFF0C\u6162\u542F\u52A8\u670D\u52A1\uFF08\u5982 Spring Boot\uFF09\u5EFA\u8BAE 60000-120000\u3002\u6279\u91CF\u6A21\u5F0F\u5BF9\u5168\u90E8\u6210\u529F\u9879\u5E76\u884C\u7B49\u5F85\uFF08\u6BCF\u9879\u72EC\u7ACB\u8BA1\u65F6\uFF09\u3002"}},required:[]}},q={name:"launch_config_restart",description:"\u91CD\u542F\u542F\u52A8\u9879\uFF08bridge \u5185\u539F\u5B50\u6267\u884C\u300C\u505C\u6B62\u65E7\u8FDB\u7A0B + \u91CD\u65B0\u62C9\u8D77\u300D\uFF0C\u4EE3\u7406\u5230\u8C03\u7528\u8005\u6240\u5728 runtime-bridge\uFF09\u3002\u76F8\u6BD4\u5148 launch_config_stop \u518D launch_config_start\uFF0C\u4E0D\u5B58\u5728 stop \u8BF7\u6C42\u4E22\u5931\u5BFC\u81F4 start \u649E\u4E0A\u4ECD\u5728\u8FD0\u884C\u65E7\u8FDB\u7A0B\u7684\u7ADE\u6001\u3002\u672A\u8FD0\u884C\u65F6\u7B49\u4EF7\u4E8E\u76F4\u63A5 start\u3002\u8986\u76D6\u53C2\u6570\uFF08command/cwd/env \u7B49\uFF09\u4E0E\u542F\u52A8\u7B49\u5F85\u8BED\u4E49\u540C launch_config_start\u3002",inputSchema:{type:"object",properties:{configId:{type:"string",description:"\u542F\u52A8\u9879 ID\uFF08\u5FC5\u586B\uFF09"},command:{type:"string",description:"\u542F\u52A8\u547D\u4EE4\u8986\u76D6\uFF08\u53EF\u9009\uFF09"},cwd:{type:"string",description:"\u5DE5\u4F5C\u76EE\u5F55\u8986\u76D6\uFF08\u53EF\u9009\uFF09"},env:{type:"object",description:"\u73AF\u5883\u53D8\u91CF\u8986\u76D6\uFF08\u53EF\u9009\uFF0C\u6574\u4F53\u8986\u76D6\u914D\u7F6E env\uFF09",additionalProperties:{type:"string"}},jdkPath:{type:"string",description:"JDK \u8DEF\u5F84\uFF08type=java \u65F6\u6709\u6548\uFF0C\u53EF\u9009\uFF09"},workspacePath:{type:"string",description:"\u9879\u76EE\u5DE5\u4F5C\u533A\u8DEF\u5F84\uFF08\u53EF\u9009\uFF09"},readinessPattern:{type:"string",description:"\u5C31\u7EEA\u65E5\u5FD7\u6B63\u5219\u8986\u76D6\uFF08\u53EF\u9009\uFF0CJS RegExp \u8BED\u6CD5\uFF09\uFF1A\u8BBE\u7F6E\u540E\u65B0\u8FDB\u7A0B\u542F\u52A8\u7B49\u5F85\u7684 ready \u4FE1\u53F7\u4E3A\u8F93\u51FA\u884C\u547D\u4E2D\u6B63\u5219\u3002\u7559\u7A7A=\u4EE5\u542F\u52A8\u9879\u914D\u7F6E\u4E3A\u51C6\uFF08\u9ED8\u8BA4\u7AEF\u53E3\u76D1\u542C\u63A2\u6D4B\uFF09"},wait_timeout_ms:{type:"number",description:"\u963B\u585E\u7B49\u5F85\u65B0\u8FDB\u7A0B\u542F\u52A8\u7ED3\u679C\u7684\u8D85\u65F6\u6BEB\u79D2\u6570\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4 0=\u4E0D\u7B49\u5F85\uFF09\u3002\u8BED\u4E49\u540C launch_config_start\uFF1Aready=\u7AEF\u53E3\u5C31\u7EEA\u6216\u65E5\u5FD7\u547D\u4E2D\u5C31\u7EEA\u6B63\u5219 / exited=\u8FDB\u7A0B\u9000\u51FA / timeout=\u8D85\u65F6\uFF08\u8FDB\u7A0B\u4ECD\u5728\u8FD0\u884C\uFF0C\u975E\u9519\u8BEF\uFF09\u3002"}},required:["configId"]}},G={name:"launch_config_stop",description:"\u505C\u6B62\u542F\u52A8\u9879\u8FDB\u7A0B\uFF08\u542B\u8FDB\u7A0B\u6811\uFF0C\u4EE3\u7406\u5230\u8C03\u7528\u8005\u6240\u5728 runtime-bridge\uFF09\u3002\u76EE\u6807\u542F\u52A8\u9879\u5FC5\u987B\u5C5E\u4E8E\u5F53\u524D\u9879\u76EE\uFF08\u670D\u52A1\u7AEF\u6821\u9A8C\uFF09\u3002\u82E5\u8FDB\u7A0B\u5DF2\u9000\u51FA\uFF0C\u8FD4\u56DE\u5DF2\u505C\u6B62/\u65E0\u8FD0\u884C\u8FDB\u7A0B\u7684\u72B6\u6001\uFF0C\u4E0D\u62A5\u9519\u3002",inputSchema:{type:"object",properties:{configId:{type:"string",description:"\u542F\u52A8\u9879 ID\uFF08\u5FC5\u586B\uFF09"}},required:["configId"]}},w={name:"launch_config_logs",description:"\u589E\u91CF\u62C9\u53D6\u542F\u52A8\u9879\u8FD0\u884C\u65E5\u5FD7\uFF08\u6700\u8FD1 200 \u6761\u73AF\u5F62\u7F13\u51B2\uFF0C\u4EE3\u7406\u5230\u8C03\u7528\u8005\u6240\u5728 runtime-bridge\uFF09\u3002\u9996\u6B21\u8C03\u7528\u4E0D\u4F20 since \u83B7\u53D6\u5168\u90E8\u7F13\u51B2\u65E5\u5FD7\uFF1B\u540E\u7EED\u6BCF\u6B21\u628A\u8FD4\u56DE\u7684 nextSince \u4F5C\u4E3A since \u7EED\u62C9\u589E\u91CF\u3002\u8FD4\u56DE\u5B57\u6BB5\uFF1Alines\uFF08\u65E5\u5FD7\u884C\uFF09\u3001nextSince\uFF08\u4E0B\u6B21\u6E38\u6807\uFF09\u3001running\uFF08\u8FDB\u7A0B\u662F\u5426\u8FD0\u884C\u4E2D\uFF09\u3002\u76EE\u6807\u542F\u52A8\u9879\u5FC5\u987B\u5C5E\u4E8E\u5F53\u524D\u9879\u76EE\uFF08\u670D\u52A1\u7AEF\u6821\u9A8C\uFF09\u3002",inputSchema:{type:"object",properties:{configId:{type:"string",description:"\u542F\u52A8\u9879 ID\uFF08\u5FC5\u586B\uFF09"},since:{type:"number",description:"\u65E5\u5FD7\u6E38\u6807\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4 0 = \u4ECE\u5934\u62C9\u53D6\uFF09"}},required:["configId"]}},H={name:"launch_config_status",description:"\u67E5\u8BE2\u8C03\u7528\u8005\u6240\u5728 bridge \u673A\u5668\u4E0A\u5F53\u524D\u9879\u76EE\u7684\u5168\u90E8\u542F\u52A8\u9879\u8FD0\u884C\u72B6\u6001\u3002\u8FD4\u56DE runs \u6570\u7EC4\uFF1A\u6BCF\u9879\u542B configId\u3001status\uFF08running/exited/stopped\uFF09\u3001pid\u3001startTime\u3001command \u7B49\u3002\u4EC5\u8FD4\u56DE\u5F53\u524D\u9879\u76EE\u914D\u7F6E\u7684\u542F\u52A8\u9879\uFF08\u670D\u52A1\u7AEF\u6309\u9879\u76EE\u8FC7\u6EE4\uFF09\u3002",inputSchema:{type:"object",properties:{},required:[]}},F=new Set(["launch_config_list","launch_config_create","launch_config_update","launch_config_delete","launch_config_start","launch_config_restart","launch_config_stop","launch_config_logs","launch_config_status"]),K=[_,g,m,y,u,O,E,l,I,T,A,L,R,h,S,b,D,M,e,r,p,t,o,n,i,s,c,a,d,C,N,f,P,j,x,k,U,q,G,w,H];export{te as ABANDON_MEMORY_UPDATE_TOOL,V as CREATE_MEMORY_TOOL,R as CREATE_TASK_INSTANCE_COMMENT_TOOL,W as DELETE_MEMORY_TOOL,b as FINISH_TASK_ROLLBACK_TOOL,_ as GET_COLLEAGUE_TOOL,C as GET_DEBUG_LOG_CONFIG_TOOL,T as GET_DM_HISTORY_TOOL,A as GET_GROUP_HISTORY_TOOL,g as GET_GROUP_ROOMS_TOOL,$ as GET_MEMORY_STATS_TOOL,I as GET_MESSAGE_TOOL,m as GET_PROFILE_TOOL,u as HIRE_COLLEAGUES_BATCH_TOOL,y as HIRE_COLLEAGUE_TOOL,j as LAUNCH_CONFIG_CREATE_TOOL,k as LAUNCH_CONFIG_DELETE_TOOL,P as LAUNCH_CONFIG_LIST_TOOL,w as LAUNCH_CONFIG_LOGS_TOOL,q as LAUNCH_CONFIG_RESTART_TOOL,U as LAUNCH_CONFIG_START_TOOL,H as LAUNCH_CONFIG_STATUS_TOOL,G as LAUNCH_CONFIG_STOP_TOOL,F as LAUNCH_CONFIG_TOOL_NAMES,x as LAUNCH_CONFIG_UPDATE_TOOL,ee as LIST_MEMORIES_BY_FILE_TOOL,Q as LIST_MEMORIES_TOOL,K as MCP_TOOLS,ne as MEMORY_RECURRENCE_COMPLETE_TOOL,ie as MEMORY_RECURRENCE_TOOL,v as MEMORY_TOOL_NAMES,L as MY_TASK_TOOL,l as POLL_MESSAGE_TOOL,N as QUERY_DEBUG_LOGS_TOOL,f as QUERY_FILE_CHANGES_HISTORY_TOOL,z as READ_MEMORY_TOOL,D as REJECT_TASK_TOOL,X as SEARCH_MEMORY_TOOL,O as SEND_GROUP_TOOL,E as SEND_PRIVATE_TOOL,S as START_TASK_ROLLBACK_TOOL,h as SUBMIT_TASK_RESULT_TOOL,M as TERMINATE_TASK_TOOL,Z as UPDATE_MEMORY_TOOL};
|
|
43
|
+
\u8FD4\u56DE\u5B57\u6BB5\uFF1Aid\u3001projectId\u3001roleName\u3001instanceName\u3001agentId\u3001operation\uFF08CREATE/UPDATE/DELETE\uFF09\u3001targetPath\u3001fullPath\u3001reason\u3001status\uFF08APPLIED/REVERTED/REVERT_FAILED\uFF09\u3001createdAt\u3001revertedAt\u3001revertedBy\u3002`,inputSchema:{type:"object",properties:{roleId:{type:"string",description:"\u89D2\u8272\u5B9A\u4E49 ID\uFF08\u53EF\u9009\uFF09"},agentId:{type:"string",description:"Agent \u5B9E\u4F8B ID\uFF08\u53EF\u9009\uFF1B\u4E0D\u4F20=\u67E5\u8BE2\u5F53\u524D\u9879\u76EE\u4E0B\u6240\u6709 Agent\uFF1B\u4F20\u5176\u5B83 Agent \u65F6\u670D\u52A1\u7AEF\u6821\u9A8C\u5176\u4E0E\u8C03\u7528\u8005\u540C\u9879\u76EE\uFF09"},fileName:{type:"string",description:"\u6587\u4EF6\u540D\uFF08\u53EF\u9009\uFF0C\u6309 basename \u6A21\u7CCA\u5339\u914D\uFF09"},filePath:{type:"string",description:"\u5DE5\u4F5C\u533A\u76F8\u5BF9\u8DEF\u5F84\uFF08\u53EF\u9009\uFF0C\u6309\u8D26\u672C\u8BB0\u5F55\u7684\u76F8\u5BF9\u8DEF\u5F84 targetPath \u5339\u914D\uFF0C\u542B\u76EE\u5F55\u524D\u7F00\u5339\u914D\uFF09\u3002\u652F\u6301 ./xx\u3001xx\u3001@/xx\u3001/xx \u7B49\u4EF7\u5199\u6CD5\uFF08@ \u89C6\u4E3A\u5DE5\u4F5C\u533A\u6839\u8DEF\u5F84\u522B\u540D\uFF09\u3002\u793A\u4F8B\uFF1A@/src/main.ts \u7CBE\u786E\u5339\u914D src/main.ts\uFF1B@/src \u5339\u914D src/ \u76EE\u5F55\u53CA\u5176\u4E0B\u6240\u6709\u6587\u4EF6\u7684\u53D8\u66F4\u3002\u4E0E fileName \u6B63\u4EA4\uFF1AfileName \u6309\u6587\u4EF6\u540D\u6A21\u7CCA\uFF0CfilePath \u6309\u76F8\u5BF9\u8DEF\u5F84\u5339\u914D\u3002"},operation:{type:"string",description:"\u64CD\u4F5C\u7C7B\u578B\uFF1ACREATE / UPDATE / DELETE\uFF08\u53EF\u9009\uFF09",enum:["CREATE","UPDATE","DELETE"]},status:{type:"string",description:"\u8BB0\u5F55\u72B6\u6001\uFF1AAPPLIED\uFF08\u5DF2\u751F\u6548\uFF09/ REVERTED\uFF08\u5DF2\u64A4\u9500\uFF09/ REVERT_FAILED\uFF08\u64A4\u9500\u5931\u8D25\uFF09\uFF08\u53EF\u9009\uFF09",enum:["APPLIED","REVERTED","REVERT_FAILED"]},taskInstanceId:{type:"string",description:"\u4EFB\u52A1\u5B9E\u4F8B ID\uFF08\u53EF\u9009\uFF09"},startTime:{type:"string",description:"\u8D77\u59CB\u65F6\u95F4\uFF0CISO \u683C\u5F0F\u5982 2026-08-01T00:00:00\uFF08\u53EF\u9009\uFF09"},endTime:{type:"string",description:"\u7ED3\u675F\u65F6\u95F4\uFF0CISO \u683C\u5F0F\u5982 2026-08-02T00:00:00\uFF08\u53EF\u9009\uFF09"},page:{type:"number",description:"\u9875\u7801\uFF0C\u9ED8\u8BA4 1"},pageSize:{type:"number",description:"\u6BCF\u9875\u6761\u6570\uFF0C\u9ED8\u8BA4 20"}},required:[]}},W=new Set(["create_memory","read_memory","update_memory","delete_memory","search_memory","list_memories","get_memory_stats","list_memories_by_file","memory_recurrence","memory_recurrence_complete"]),j={name:"launch_config_list",description:"\u67E5\u8BE2\u5F53\u524D Agent \u6240\u5C5E\u9879\u76EE\u4E0B\u7684\u542F\u52A8\u9879\uFF08\u7C7B IDEA Run Configuration\uFF09\u5217\u8868\u3002\u6BCF\u4E2A\u542F\u52A8\u9879\u542B id\u3001name\u3001type\uFF08generic/java/python/node/go/php\uFF09\u3001command\u3001cwd\u3001env\u3001jdkId\u3001groupId\u3001sortOrder\u3002\u67E5\u8BE2\u8303\u56F4\u81EA\u52A8\u9650\u5B9A\u4E3A\u5F53\u524D\u9879\u76EE\uFF0C\u65E0\u9700\u4F20 projectId\u3002",inputSchema:{type:"object",properties:{},required:[]}},P={name:"launch_config_create",description:"\u5728\u5F53\u524D Agent \u6240\u5C5E\u9879\u76EE\u4E0B\u65B0\u5EFA\u542F\u52A8\u9879\uFF08\u7C7B IDEA Run Configuration\uFF09\u3002\u521B\u5EFA\u524D\u5EFA\u8BAE\u5148 launch_config_list \u67E5\u770B\u73B0\u6709\u914D\u7F6E\u4E0E\u547D\u540D\u4E60\u60EF\u3002\u9879\u76EE\u8303\u56F4\u81EA\u52A8\u63A8\u5BFC\uFF0C\u65E0\u9700\u4F20 projectId\u3002cwd\uFF08\u5DE5\u4F5C\u76EE\u5F55\uFF09\u4E3A\u5FC5\u586B\u9879\uFF0C\u7F3A\u5931\u5C06\u521B\u5EFA\u5931\u8D25\u2014\u2014\u8BF7\u4F20\u5165\u9879\u76EE\u5B9E\u9645\u4EE3\u7801/\u6784\u5EFA\u76EE\u5F55\u7684\u7EDD\u5BF9\u8DEF\u5F84\uFF0C\u5982 D:/code/xxx/backend\uFF1B\u4E0D\u786E\u5B9A\u65F6\u53EF\u7528\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84\u3002\u521B\u5EFA\u6210\u529F\u540E\u8FD4\u56DE\u65B0\u542F\u52A8\u9879\u5B8C\u6574\u4FE1\u606F\uFF08\u542B id\uFF09\u3002",inputSchema:{type:"object",properties:{name:{type:"string",description:"\u542F\u52A8\u9879\u540D\u79F0\uFF08\u5FC5\u586B\uFF0C\u9879\u76EE\u5185\u552F\u4E00\uFF0C\u2264128 \u5B57\u7B26\uFF09"},type:{type:"string",description:"\u542F\u52A8\u9879\u7C7B\u578B\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4 generic\uFF09\uFF1Ageneric / java / python / node / go / php",enum:["generic","java","python","node","go","php"]},command:{type:"string",description:"\u542F\u52A8\u547D\u4EE4\uFF08\u5FC5\u586B\uFF0C\u22648192 \u5B57\u7B26\uFF09\u3002\u652F\u6301\u5360\u4F4D\u7B26 ${WORKSPACE}\uFF08\u9879\u76EE\u5DE5\u4F5C\u533A\uFF09\u3001${JAVA_HOME}\uFF08\u6240\u9009 JDK\uFF09\u3001${VAR}\uFF08env \u4E2D\u5B9A\u4E49\u7684\u53D8\u91CF\uFF09\u3002\u793A\u4F8B\uFF1Anpm run dev\u3001python main.py\u3001mvn spring-boot:run"},cwd:{type:"string",description:"\u5DE5\u4F5C\u76EE\u5F55\uFF08\u5FC5\u586B\uFF0C\u2264512 \u5B57\u7B26\uFF09\u2014\u2014\u9879\u76EE\u5B9E\u9645\u4EE3\u7801/\u6784\u5EFA\u76EE\u5F55\u7684\u7EDD\u5BF9\u8DEF\u5F84\uFF0C\u5982 D:/code/xxx/backend"},env:{type:"object",description:"\u989D\u5916\u73AF\u5883\u53D8\u91CF\uFF08\u53EF\u9009\uFF0C\u226464 \u9879\uFF09\uFF0C\u989D\u5916\u5C5E\u6027\uFF1A\u5B57\u7B26\u4E32\u503C",additionalProperties:{type:"string"}},jdkId:{type:"string",description:"\u9009\u4E2D\u7684 JDK ID\uFF08type=java \u65F6\u6709\u6548\uFF0C\u53EF\u9009\uFF09"},groupId:{type:"string",description:"\u6240\u5C5E\u542F\u52A8\u9879\u5206\u7EC4 ID\uFF08\u53EF\u9009\uFF0Cnull/\u7A7A=\u672A\u5206\u7EC4\uFF09"},sortOrder:{type:"number",description:"\u6392\u5E8F\u6743\u91CD\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4\u8FFD\u52A0\u5230\u6240\u5728\u5BB9\u5668\u672B\u5C3E\uFF09"},readinessPattern:{type:"string",description:'\u5C31\u7EEA\u65E5\u5FD7\u6B63\u5219\uFF08\u53EF\u9009\uFF0C\u2264512 \u5B57\u7B26\uFF0CJS RegExp \u8BED\u6CD5\uFF09\u3002\u8BBE\u7F6E\u540E wait_timeout_ms \u7B49\u5F85\u7684 ready \u4FE1\u53F7\u6539\u4E3A"\u8F93\u51FA\u884C\u547D\u4E2D\u8BE5\u6B63\u5219"\uFF08\u9002\u914D\u4E0D\u76D1\u542C\u7AEF\u53E3\u7684\u5E38\u9A7B\u8FDB\u7A0B\uFF0C\u5982 worker/\u6D88\u8D39\u8005\uFF09\u3002\u793A\u4F8B\uFF1A^Server ready|^Build (SUCCESS|successful)\u3002\u7559\u7A7A=\u7AEF\u53E3\u76D1\u542C\u63A2\u6D4B'}},required:["name","command","cwd"]}},x={name:"launch_config_update",description:"\u66F4\u65B0\u542F\u52A8\u9879\uFF08\u540D\u79F0/\u7C7B\u578B/\u547D\u4EE4/\u5DE5\u4F5C\u76EE\u5F55/\u73AF\u5883\u53D8\u91CF/JDK/\u5206\u7EC4/\u6392\u5E8F\uFF09\u3002\u672A\u4F20\u5B57\u6BB5\u4FDD\u6301\u539F\u503C\uFF1B\u4FEE\u6539\u540D\u79F0\u65F6\u9879\u76EE\u5185\u4E0D\u80FD\u91CD\u540D\u3002\u76EE\u6807\u542F\u52A8\u9879\u5FC5\u987B\u5C5E\u4E8E\u5F53\u524D\u9879\u76EE\uFF08\u670D\u52A1\u7AEF\u6821\u9A8C\uFF09\u3002\u8FD0\u884C\u4E2D\u7684\u542F\u52A8\u9879\uFF1A\u4FEE\u6539\u914D\u7F6E\u4E0D\u4F1A\u5F71\u54CD\u5DF2\u8FD0\u884C\u8FDB\u7A0B\uFF0C\u9700\u91CD\u542F\u540E\u751F\u6548\u3002",inputSchema:{type:"object",properties:{configId:{type:"string",description:"\u542F\u52A8\u9879 ID\uFF08\u5FC5\u586B\uFF09"},name:{type:"string",description:"\u542F\u52A8\u9879\u540D\u79F0\uFF08\u53EF\u9009\uFF0C\u2264128 \u5B57\u7B26\uFF09"},type:{type:"string",description:"\u542F\u52A8\u9879\u7C7B\u578B\uFF08\u53EF\u9009\uFF09\uFF1Ageneric / java / python / node / go / php",enum:["generic","java","python","node","go","php"]},command:{type:"string",description:"\u542F\u52A8\u547D\u4EE4\uFF08\u53EF\u9009\uFF0C\u22648192 \u5B57\u7B26\uFF09"},cwd:{type:"string",description:"\u5DE5\u4F5C\u76EE\u5F55\uFF08\u53EF\u9009\uFF09"},env:{type:"object",description:"\u989D\u5916\u73AF\u5883\u53D8\u91CF\uFF08\u53EF\u9009\uFF0C\u6574\u4F53\u8986\u76D6\u539F env\uFF09",additionalProperties:{type:"string"}},jdkId:{type:"string",description:"\u9009\u4E2D\u7684 JDK ID\uFF08type=java \u65F6\u6709\u6548\uFF0C\u53EF\u9009\uFF09"},groupId:{type:"string",description:"\u6240\u5C5E\u542F\u52A8\u9879\u5206\u7EC4 ID\uFF08\u53EF\u9009\uFF09"},clearGroupId:{type:"boolean",description:"\u663E\u5F0F\u6E05\u9664\u5206\u7EC4\uFF08\u79FB\u56DE\u9ED8\u8BA4\u5206\u7EC4\uFF0C\u53EF\u9009\uFF1B\u4E0D\u80FD\u4E0E groupId \u540C\u65F6\u4F20\uFF09"},sortOrder:{type:"number",description:"\u6392\u5E8F\u6743\u91CD\uFF08\u53EF\u9009\uFF09"},readinessPattern:{type:"string",description:"\u5C31\u7EEA\u65E5\u5FD7\u6B63\u5219\uFF08\u53EF\u9009\uFF0CJS RegExp \u8BED\u6CD5\uFF09\uFF1A\u8BBE\u7F6E\u540E\u542F\u52A8\u7B49\u5F85\u7684 ready \u4FE1\u53F7\u4E3A\u8F93\u51FA\u884C\u547D\u4E2D\u6B63\u5219\uFF08\u9002\u914D\u4E0D\u76D1\u542C\u7AEF\u53E3\u7684\u8FDB\u7A0B\uFF09\u3002\u7559\u7A7A=\u7AEF\u53E3\u76D1\u542C\u63A2\u6D4B"},clearReadinessPattern:{type:"boolean",description:"\u663E\u5F0F\u6E05\u9664\u5C31\u7EEA\u6B63\u5219\uFF0C\u6062\u590D\u7AEF\u53E3\u63A2\u6D4B\uFF08\u53EF\u9009\uFF1B\u4E0D\u80FD\u4E0E readinessPattern \u540C\u65F6\u4F20\uFF09"}},required:["configId"]}},k={name:"launch_config_delete",description:"\u5220\u9664\u542F\u52A8\u9879\u914D\u7F6E\u3002\u76EE\u6807\u542F\u52A8\u9879\u5FC5\u987B\u5C5E\u4E8E\u5F53\u524D\u9879\u76EE\uFF08\u670D\u52A1\u7AEF\u6821\u9A8C\uFF09\u3002\u6CE8\u610F\uFF1A\u82E5\u8BE5\u542F\u52A8\u9879\u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u5148 launch_config_stop \u505C\u6B62\u8FDB\u7A0B\u518D\u5220\u9664\uFF08\u5220\u9664\u914D\u7F6E\u4E0D\u4F1A\u81EA\u52A8\u505C\u6B62\u5DF2\u8FD0\u884C\u8FDB\u7A0B\uFF09\u3002",inputSchema:{type:"object",properties:{configId:{type:"string",description:"\u542F\u52A8\u9879 ID\uFF08\u5FC5\u586B\uFF09"}},required:["configId"]}},q={name:"launch_config_start",description:"\u542F\u52A8\u542F\u52A8\u9879\uFF0C\u5728\u8C03\u7528\u8005\u6240\u5728 runtime-bridge \u673A\u5668\u4E0A\u62C9\u8D77\u8FDB\u7A0B\u3002\u652F\u6301\u5355\u9879\uFF08configId\uFF09\u4E0E\u6279\u91CF\uFF08configIds \u6570\u7EC4\uFF0C\u4E00\u6B21\u5E76\u884C\u62C9\u8D77\u591A\u4E2A\uFF09\uFF1A\u6279\u91CF\u65F6\u9010\u9879\u4EE5\u914D\u7F6E\u4E3A\u51C6\u5E76\u884C\u542F\u52A8\uFF0C\u5355\u9879\u5931\u8D25\u4E0D\u5F71\u54CD\u5176\u4F59\u9879\uFF0C\u8FD4\u56DE\u9010\u9879\u7ED3\u679C\u4E0E\u6C47\u603B\uFF08ready/exited/timeout/failed \u8BA1\u6570\uFF09\uFF1B\u5EFA\u8BAE\u542F\u52A8\u524D\u5148 launch_config_status \u786E\u8BA4\u672A\u5728\u8FD0\u884C\u3002\u9ED8\u8BA4\u4E0D\u7B49\u5F85\u7ACB\u5373\u8FD4\u56DE\uFF1B\u4F20 wait_timeout_ms > 0 \u65F6\u963B\u585E\u7B49\u5F85\u542F\u52A8\u7ED3\u679C\uFF08\u5355\u9879\u8FD4\u56DE wait \u5B57\u6BB5\uFF0C\u6279\u91CF\u5BF9\u5168\u90E8\u6210\u529F\u9879\u5E76\u884C\u7B49\u5F85\u3001\u6574\u4F53\u8FD4\u56DE\u65F6\u95F4\u2248\u6700\u6162\u4E00\u9879\uFF09\u3002",inputSchema:{type:"object",properties:{configId:{type:"string",description:"\u542F\u52A8\u9879 ID\uFF08\u5355\u9879\u542F\u52A8\u65F6\u5FC5\u586B\uFF1B\u4E0E configIds \u4E8C\u9009\u4E00\uFF09"},configIds:{type:"array",items:{type:"string"},description:"\u6279\u91CF\u542F\u52A8\uFF1A\u542F\u52A8\u9879 ID \u6570\u7EC4\uFF081-20 \u4E2A\uFF0C\u81EA\u52A8\u53BB\u91CD\uFF1B\u4E0E configId \u4E8C\u9009\u4E00\uFF0C\u4F20\u4E86\u4F18\u5148\u8D70\u6279\u91CF\uFF09\u3002\u6279\u91CF\u6A21\u5F0F\u4EE5\u5404\u9879\u914D\u7F6E\u4E3A\u51C6\u542F\u52A8\uFF0C\u5FFD\u7565 command/cwd/env/readinessPattern \u8986\u76D6\u53C2\u6570\uFF1BworkspacePath/jdkPath \u4E0E wait_timeout_ms \u5BF9\u5168\u90E8\u9879\u751F\u6548"},command:{type:"string",description:"\u542F\u52A8\u547D\u4EE4\u8986\u76D6\uFF08\u53EF\u9009\uFF0C\u4EC5\u5355\u9879\u6A21\u5F0F\uFF09"},cwd:{type:"string",description:"\u5DE5\u4F5C\u76EE\u5F55\u8986\u76D6\uFF08\u53EF\u9009\uFF0C\u4EC5\u5355\u9879\u6A21\u5F0F\uFF09"},env:{type:"object",description:"\u73AF\u5883\u53D8\u91CF\u8986\u76D6\uFF08\u53EF\u9009\uFF0C\u6574\u4F53\u8986\u76D6\u914D\u7F6E env\uFF1B\u4EC5\u5355\u9879\u6A21\u5F0F\uFF09",additionalProperties:{type:"string"}},jdkPath:{type:"string",description:"JDK \u8DEF\u5F84\uFF08type=java \u65F6\u6709\u6548\uFF0C\u53EF\u9009\uFF1B\u5355\u9879=\u8BE5\u9879\u8986\u76D6\uFF0C\u6279\u91CF=\u5168\u90E8\u9879\u751F\u6548\uFF09"},workspacePath:{type:"string",description:"\u9879\u76EE\u5DE5\u4F5C\u533A\u8DEF\u5F84\uFF08\u53EF\u9009\uFF1B\u5355\u9879=\u8BE5\u9879\u8986\u76D6\uFF0C\u6279\u91CF=\u5168\u90E8\u9879\u751F\u6548\uFF09"},readinessPattern:{type:"string",description:"\u5C31\u7EEA\u65E5\u5FD7\u6B63\u5219\u8986\u76D6\uFF08\u53EF\u9009\uFF0C\u4EC5\u5355\u9879\u6A21\u5F0F\uFF0CJS RegExp \u8BED\u6CD5\uFF09\uFF1A\u8BBE\u7F6E\u540E\u542F\u52A8\u7B49\u5F85\u7684 ready \u4FE1\u53F7\u4E3A\u8F93\u51FA\u884C\u547D\u4E2D\u6B63\u5219\uFF08\u9002\u914D\u4E0D\u76D1\u542C\u7AEF\u53E3\u7684\u8FDB\u7A0B\uFF09\u3002\u7559\u7A7A=\u4EE5\u542F\u52A8\u9879\u914D\u7F6E\u4E3A\u51C6\uFF08\u9ED8\u8BA4\u7AEF\u53E3\u76D1\u542C\u63A2\u6D4B\uFF09"},wait_timeout_ms:{type:"number",description:"\u963B\u585E\u7B49\u5F85\u542F\u52A8\u7ED3\u679C\u7684\u8D85\u65F6\u6BEB\u79D2\u6570\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4 0=\u4E0D\u7B49\u5F85\uFF0Cspawn \u540E\u7ACB\u5373\u8FD4\u56DE\uFF09\u3002>0 \u65F6\u672C\u6B21\u8C03\u7528\u963B\u585E\uFF0C\u76F4\u5230\u4EE5\u4E0B\u4FE1\u53F7\u6700\u5148\u5230\u8FBE\u5E76\u5728 wait \u5B57\u6BB5\u8FD4\u56DE\uFF1Aready=\u8FDB\u7A0B\u6811\u63A2\u6D4B\u5230\u76D1\u542C\u7AEF\u53E3\uFF08\u5E38\u9A7B\u670D\u52A1\u542F\u52A8\u6210\u529F\uFF0C\u9644 ports\uFF09\uFF0C\u6216\u8F93\u51FA\u884C\u547D\u4E2D\u5C31\u7EEA\u6B63\u5219\uFF08readinessPattern\uFF0C\u89C1\u4E0A\uFF09\uFF1Bexited=\u8FDB\u7A0B\u9000\u51FA\uFF08\u4E00\u6B21\u6027\u547D\u4EE4\u5B8C\u6210\u6216\u542F\u52A8\u5FEB\u901F\u5931\u8D25\uFF0CexitCode=0 \u4E3A\u6210\u529F\uFF0C\u975E 0 \u68C0\u67E5 logTail \u5B9A\u4F4D\u539F\u56E0\uFF09\uFF1Bstopped=\u7B49\u5F85\u671F\u95F4\u88AB\u505C\u6B62\uFF1Btimeout=\u8D85\u65F6\uFF0C\u8FDB\u7A0B\u4ECD\u5728\u8FD0\u884C\uFF08\u4E0D\u7B97\u9519\u8BEF\uFF0C\u6309 logTail \u81EA\u884C\u5224\u65AD\u6216\u7A0D\u540E launch_config_logs \u8F6E\u8BE2\uFF09\u3002\u4E0A\u9650 300000\uFF085 \u5206\u949F\uFF09\uFF0C\u6162\u542F\u52A8\u670D\u52A1\uFF08\u5982 Spring Boot\uFF09\u5EFA\u8BAE 60000-120000\u3002\u6279\u91CF\u6A21\u5F0F\u5BF9\u5168\u90E8\u6210\u529F\u9879\u5E76\u884C\u7B49\u5F85\uFF08\u6BCF\u9879\u72EC\u7ACB\u8BA1\u65F6\uFF09\u3002"}},required:[]}},U={name:"launch_config_restart",description:"\u91CD\u542F\u542F\u52A8\u9879\uFF08bridge \u5185\u539F\u5B50\u6267\u884C\u300C\u505C\u6B62\u65E7\u8FDB\u7A0B + \u91CD\u65B0\u62C9\u8D77\u300D\uFF0C\u4EE3\u7406\u5230\u8C03\u7528\u8005\u6240\u5728 runtime-bridge\uFF09\u3002\u76F8\u6BD4\u5148 launch_config_stop \u518D launch_config_start\uFF0C\u4E0D\u5B58\u5728 stop \u8BF7\u6C42\u4E22\u5931\u5BFC\u81F4 start \u649E\u4E0A\u4ECD\u5728\u8FD0\u884C\u65E7\u8FDB\u7A0B\u7684\u7ADE\u6001\u3002\u672A\u8FD0\u884C\u65F6\u7B49\u4EF7\u4E8E\u76F4\u63A5 start\u3002\u8986\u76D6\u53C2\u6570\uFF08command/cwd/env \u7B49\uFF09\u4E0E\u542F\u52A8\u7B49\u5F85\u8BED\u4E49\u540C launch_config_start\u3002",inputSchema:{type:"object",properties:{configId:{type:"string",description:"\u542F\u52A8\u9879 ID\uFF08\u5FC5\u586B\uFF09"},command:{type:"string",description:"\u542F\u52A8\u547D\u4EE4\u8986\u76D6\uFF08\u53EF\u9009\uFF09"},cwd:{type:"string",description:"\u5DE5\u4F5C\u76EE\u5F55\u8986\u76D6\uFF08\u53EF\u9009\uFF09"},env:{type:"object",description:"\u73AF\u5883\u53D8\u91CF\u8986\u76D6\uFF08\u53EF\u9009\uFF0C\u6574\u4F53\u8986\u76D6\u914D\u7F6E env\uFF09",additionalProperties:{type:"string"}},jdkPath:{type:"string",description:"JDK \u8DEF\u5F84\uFF08type=java \u65F6\u6709\u6548\uFF0C\u53EF\u9009\uFF09"},workspacePath:{type:"string",description:"\u9879\u76EE\u5DE5\u4F5C\u533A\u8DEF\u5F84\uFF08\u53EF\u9009\uFF09"},readinessPattern:{type:"string",description:"\u5C31\u7EEA\u65E5\u5FD7\u6B63\u5219\u8986\u76D6\uFF08\u53EF\u9009\uFF0CJS RegExp \u8BED\u6CD5\uFF09\uFF1A\u8BBE\u7F6E\u540E\u65B0\u8FDB\u7A0B\u542F\u52A8\u7B49\u5F85\u7684 ready \u4FE1\u53F7\u4E3A\u8F93\u51FA\u884C\u547D\u4E2D\u6B63\u5219\u3002\u7559\u7A7A=\u4EE5\u542F\u52A8\u9879\u914D\u7F6E\u4E3A\u51C6\uFF08\u9ED8\u8BA4\u7AEF\u53E3\u76D1\u542C\u63A2\u6D4B\uFF09"},wait_timeout_ms:{type:"number",description:"\u963B\u585E\u7B49\u5F85\u65B0\u8FDB\u7A0B\u542F\u52A8\u7ED3\u679C\u7684\u8D85\u65F6\u6BEB\u79D2\u6570\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4 0=\u4E0D\u7B49\u5F85\uFF09\u3002\u8BED\u4E49\u540C launch_config_start\uFF1Aready=\u7AEF\u53E3\u5C31\u7EEA\u6216\u65E5\u5FD7\u547D\u4E2D\u5C31\u7EEA\u6B63\u5219 / exited=\u8FDB\u7A0B\u9000\u51FA / timeout=\u8D85\u65F6\uFF08\u8FDB\u7A0B\u4ECD\u5728\u8FD0\u884C\uFF0C\u975E\u9519\u8BEF\uFF09\u3002"}},required:["configId"]}},G={name:"launch_config_stop",description:"\u505C\u6B62\u542F\u52A8\u9879\u8FDB\u7A0B\uFF08\u542B\u8FDB\u7A0B\u6811\uFF0C\u4EE3\u7406\u5230\u8C03\u7528\u8005\u6240\u5728 runtime-bridge\uFF09\u3002\u76EE\u6807\u542F\u52A8\u9879\u5FC5\u987B\u5C5E\u4E8E\u5F53\u524D\u9879\u76EE\uFF08\u670D\u52A1\u7AEF\u6821\u9A8C\uFF09\u3002\u82E5\u8FDB\u7A0B\u5DF2\u9000\u51FA\uFF0C\u8FD4\u56DE\u5DF2\u505C\u6B62/\u65E0\u8FD0\u884C\u8FDB\u7A0B\u7684\u72B6\u6001\uFF0C\u4E0D\u62A5\u9519\u3002",inputSchema:{type:"object",properties:{configId:{type:"string",description:"\u542F\u52A8\u9879 ID\uFF08\u5FC5\u586B\uFF09"}},required:["configId"]}},w={name:"launch_config_logs",description:"\u589E\u91CF\u62C9\u53D6\u542F\u52A8\u9879\u8FD0\u884C\u65E5\u5FD7\uFF08\u6700\u8FD1 200 \u6761\u73AF\u5F62\u7F13\u51B2\uFF0C\u4EE3\u7406\u5230\u8C03\u7528\u8005\u6240\u5728 runtime-bridge\uFF09\u3002\u9996\u6B21\u8C03\u7528\u4E0D\u4F20 since \u83B7\u53D6\u5168\u90E8\u7F13\u51B2\u65E5\u5FD7\uFF1B\u540E\u7EED\u6BCF\u6B21\u628A\u8FD4\u56DE\u7684 nextSince \u4F5C\u4E3A since \u7EED\u62C9\u589E\u91CF\u3002\u8FD4\u56DE\u5B57\u6BB5\uFF1Alines\uFF08\u65E5\u5FD7\u884C\uFF09\u3001nextSince\uFF08\u4E0B\u6B21\u6E38\u6807\uFF09\u3001running\uFF08\u8FDB\u7A0B\u662F\u5426\u8FD0\u884C\u4E2D\uFF09\u3002\u76EE\u6807\u542F\u52A8\u9879\u5FC5\u987B\u5C5E\u4E8E\u5F53\u524D\u9879\u76EE\uFF08\u670D\u52A1\u7AEF\u6821\u9A8C\uFF09\u3002",inputSchema:{type:"object",properties:{configId:{type:"string",description:"\u542F\u52A8\u9879 ID\uFF08\u5FC5\u586B\uFF09"},since:{type:"number",description:"\u65E5\u5FD7\u6E38\u6807\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4 0 = \u4ECE\u5934\u62C9\u53D6\uFF09"}},required:["configId"]}},H={name:"launch_config_status",description:"\u67E5\u8BE2\u8C03\u7528\u8005\u6240\u5728 bridge \u673A\u5668\u4E0A\u5F53\u524D\u9879\u76EE\u7684\u5168\u90E8\u542F\u52A8\u9879\u8FD0\u884C\u72B6\u6001\u3002\u8FD4\u56DE runs \u6570\u7EC4\uFF1A\u6BCF\u9879\u542B configId\u3001status\uFF08running/exited/stopped\uFF09\u3001pid\u3001startTime\u3001command \u7B49\u3002\u4EC5\u8FD4\u56DE\u5F53\u524D\u9879\u76EE\u914D\u7F6E\u7684\u542F\u52A8\u9879\uFF08\u670D\u52A1\u7AEF\u6309\u9879\u76EE\u8FC7\u6EE4\uFF09\u3002",inputSchema:{type:"object",properties:{},required:[]}},$=new Set(["launch_config_list","launch_config_create","launch_config_update","launch_config_delete","launch_config_start","launch_config_restart","launch_config_stop","launch_config_logs","launch_config_status"]),Q=new Set(["hire_colleague","hire_colleagues_batch"]),v={name:"create_meeting",description:"\u521B\u5EFA\u65B0\u4F1A\u8BAE\u5E76\u9080\u8BF7\u6307\u5B9A\u89D2\u8272\uFF08\u542B Agent \u5B9E\u4F8B\uFF09\u3002\u6210\u5458\u5168\u90E8\u5230\u4F4D\u540E\u4F1A\u8BAE\u5F00\u59CB\uFF0C\u968F\u540E\u4F7F\u7528 meeting_speak \u53D1\u8A00 / poll_message \u7B49\u5F85\u5176\u5B83\u7528\u6237\u53D1\u8A00 / end_meeting \u7ED3\u675F\u4F1A\u8BAE\u3002\u963B\u585E\u578B\u5DE5\u5177\uFF1A\u5168\u5458\u5230\u4F4D\u6216\u7B49\u5F85\u8D85\u65F6\u540E\u624D\u8FD4\u56DE\u3002\u6301\u6709\u8FDB\u884C\u4E2D\u6D41\u7A0B\u4EFB\u52A1\u65F6\u540C\u6837\u53EF\u4EE5\u521B\u5EFA\u4F1A\u8BAE\uFF08\u4F8B\u5982\u4EFB\u52A1\u672C\u8EAB\u8981\u6C42\u5F00\u4F1A\u8BA8\u8BBA/\u534F\u8C03\u7684\u573A\u666F\uFF09\uFF0C\u4E0D\u4F1A\u88AB\u4EFB\u52A1\u62E6\u622A\uFF1B\u8FDB\u5165\u4F1A\u8BAE\u540E\u4EFB\u52A1\u63D0\u9192\u6682\u505C\uFF0C\u4F1A\u8BAE\u7ED3\u675F\u540E\u81EA\u52A8\u6062\u590D\u3002",inputSchema:{type:"object",properties:{topic:{type:"string",description:"\u4F1A\u8BAE\u4E3B\u9898\uFF08\u5FC5\u586B\uFF09"},description:{type:"string",description:"\u4F1A\u8BAE\u63CF\u8FF0\uFF08\u53EF\u9009\uFF09"},members:{type:"array",description:"\u53D7\u9080\u6210\u5458\uFF1A[{roleId, agentId?}, ...]\uFF0CagentId \u672A\u6307\u5B9A\u65F6\u670D\u52A1\u7AEF\u6309\u89D2\u8272\u81EA\u52A8\u9009\u53D6\u5B9E\u4F8B",items:{type:"object",properties:{roleId:{type:"string",description:"\u89D2\u8272 id\uFF08\u5FC5\u586B\uFF09"},agentId:{type:"string",description:"Agent \u5B9E\u4F8B id\uFF08\u53EF\u9009\uFF09"}},required:["roleId"]}},waitTimeoutMs:{type:"number",description:"\u7B49\u5F85\u5168\u5458\u5230\u4F4D\u7684\u8D85\u65F6\u65F6\u957F\uFF08\u6BEB\u79D2\uFF0C\u53EF\u9009\uFF0C\u9ED8\u8BA4/\u4E0A\u9650 270000\uFF09\u3002\u8D85\u65F6\u8FD4\u56DE WAITING \u72B6\u6001\u800C\u975E\u9519\u8BEF\uFF0C\u53EF\u7EE7\u7EED poll_message \u7B49\u5F85\u5168\u5458\u5230\u4F4D"}},required:["topic","members"]}},Y={name:"leave_meeting",description:"\u9000\u51FA\u5F53\u524D\u52A0\u5165\u7684\u4F1A\u8BAE\u3002\u5DF2\u52A0\u5165\u6210\u5458\u6B63\u5F0F\u9000\u51FA\uFF1B\u672A\u52A0\u5165\u6210\u5458\u8C03\u7528\u89C6\u4E3A\u5A49\u62D2\u9080\u8BF7\u3002",inputSchema:{type:"object",properties:{meetingId:{type:"string",description:"\u4F1A\u8BAE ID\uFF08\u5FC5\u586B\uFF09"}},required:["meetingId"]}},F={name:"end_meeting",description:"\u7ED3\u675F\u6307\u5B9A\u4F1A\u8BAE\uFF08\u4EC5\u4F1A\u8BAE\u521B\u5EFA\u8005\u53EF\u8C03\u7528\uFF09\u3002\u7ED3\u675F\u540E\u6210\u5458\u53EF\u4F7F\u7528 get_meeting_info \u67E5\u770B\u5386\u53F2\u53D1\u8A00\u3002",inputSchema:{type:"object",properties:{meetingId:{type:"string",description:"\u4F1A\u8BAE ID\uFF08\u5FC5\u586B\uFF09"}},required:["meetingId"]}},K={name:"meeting_speak",description:"\u5411\u6D3B\u8DC3\u4F1A\u8BAE\u53D1\u8A00\uFF08\u4EC5\u5DF2\u52A0\u5165\u4E14\u4F1A\u8BAE\u5DF2 STARTED \u7684\u6210\u5458\u53EF\u7528\uFF09\u3002\u53D1\u8A00\u5B9E\u65F6\u5E7F\u64AD\u7ED9\u6240\u6709\u53C2\u4F1A\u6210\u5458\u3002",inputSchema:{type:"object",properties:{meetingId:{type:"string",description:"\u4F1A\u8BAE ID\uFF08\u5FC5\u586B\uFF09"},content:{type:"string",description:"\u53D1\u8A00\u5185\u5BB9\uFF08\u5FC5\u586B\uFF09"}},required:["meetingId","content"]}},J={name:"get_meeting_info",description:"\u83B7\u53D6\u4F1A\u8BAE\u4FE1\u606F JSON\uFF1A\u4E3B\u9898/\u63CF\u8FF0/\u72B6\u6001/\u6210\u5458\u5217\u8868\uFF08\u521B\u5EFA\u4EBA\u6807\u6CE8 isCreator\uFF09/\u6700\u8FD1\u53D1\u8A00\u8BB0\u5F55\u3002\u53EF\u7528\u4E8E\u67E5\u770B\u81EA\u5DF1\u521B\u5EFA\u7684\u4F1A\u8BAE\u8FDB\u5EA6\u6216\u5DF2\u52A0\u5165\u4F1A\u8BAE\u7684\u8BE6\u60C5\u3002",inputSchema:{type:"object",properties:{meetingId:{type:"string",description:"\u4F1A\u8BAE ID\uFF08\u5FC5\u586B\uFF09"}},required:["meetingId"]}},B={name:"my_meetings",description:"\u67E5\u770B\u4E0E\u6211\u76F8\u5173\u7684\u4F1A\u8BAE\u5217\u8868\uFF08\u65E0\u9700 meetingId\uFF09\uFF1Aactive=\u5DF2\u52A0\u5165\u7684\u8FDB\u884C\u4E2D\u4F1A\u8BAE\uFF1Binvited=\u53D7\u9080\u5C1A\u672A\u52A0\u5165\u7684\u4F1A\u8BAE\u3002\u6BCF\u4E2A\u4F1A\u8BAE\u542B meetingId/\u4E3B\u9898/\u72B6\u6001/\u6210\u5458\u5230\u4F4D\u60C5\u51B5\uFF0C\u53EF\u5148\u7528\u672C\u5DE5\u5177\u83B7\u53D6 meetingId \u518D\u8C03\u7528 get_meeting_info\u3002\u52A0\u5165\u4F1A\u8BAE\u4E0D\u9700\u8981\u624B\u52A8\u5DE5\u5177\uFF1A\u53D7\u9080\u540E\u5C06\u5728 poll_message \u65F6\u81EA\u52A8\u52A0\u5165\u3002",inputSchema:{type:"object",properties:{},required:[]}},z=new Set(["create_meeting","leave_meeting","end_meeting","meeting_speak","get_meeting_info","my_meetings"]),X=[g,_,m,y,u,E,O,I,l,T,A,S,L,h,R,b,D,M,e,r,p,t,o,n,i,s,c,a,d,N,C,f,j,P,x,k,q,U,G,w,H,v,Y,F,K,J,B];export{ae as ABANDON_MEMORY_UPDATE_TOOL,v as CREATE_MEETING_TOOL,te as CREATE_MEMORY_TOOL,L as CREATE_TASK_INSTANCE_COMMENT_TOOL,ie as DELETE_MEMORY_TOOL,F as END_MEETING_TOOL,b as FINISH_TASK_ROLLBACK_TOOL,g as GET_COLLEAGUE_TOOL,N as GET_DEBUG_LOG_CONFIG_TOOL,T as GET_DM_HISTORY_TOOL,A as GET_GROUP_HISTORY_TOOL,_ as GET_GROUP_ROOMS_TOOL,J as GET_MEETING_INFO_TOOL,ne as GET_MEMORY_STATS_TOOL,l as GET_MESSAGE_TOOL,m as GET_PROFILE_TOOL,u as HIRE_COLLEAGUES_BATCH_TOOL,y as HIRE_COLLEAGUE_TOOL,Q as HIRE_TOOL_NAMES,P as LAUNCH_CONFIG_CREATE_TOOL,k as LAUNCH_CONFIG_DELETE_TOOL,j as LAUNCH_CONFIG_LIST_TOOL,w as LAUNCH_CONFIG_LOGS_TOOL,U as LAUNCH_CONFIG_RESTART_TOOL,q as LAUNCH_CONFIG_START_TOOL,H as LAUNCH_CONFIG_STATUS_TOOL,G as LAUNCH_CONFIG_STOP_TOOL,$ as LAUNCH_CONFIG_TOOL_NAMES,x as LAUNCH_CONFIG_UPDATE_TOOL,Y as LEAVE_MEETING_TOOL,ce as LIST_MEMORIES_BY_FILE_TOOL,re as LIST_MEMORIES_TOOL,X as MCP_TOOLS,K as MEETING_SPEAK_TOOL,z as MEETING_TOOL_NAMES,ge as MEMORY_RECURRENCE_COMPLETE_TOOL,de as MEMORY_RECURRENCE_TOOL,W as MEMORY_TOOL_NAMES,B as MY_MEETINGS_TOOL,S as MY_TASK_TOOL,I as POLL_MESSAGE_TOOL,C as QUERY_DEBUG_LOGS_TOOL,f as QUERY_FILE_CHANGES_HISTORY_TOOL,oe as READ_MEMORY_TOOL,D as REJECT_TASK_TOOL,pe as SEARCH_MEMORY_TOOL,E as SEND_GROUP_TOOL,O as SEND_PRIVATE_TOOL,R as START_TASK_ROLLBACK_TOOL,h as SUBMIT_TASK_RESULT_TOOL,M as TERMINATE_TASK_TOOL,se as UPDATE_MEMORY_TOOL};
|
|
42
44
|
|
|
@@ -112,3 +112,41 @@ function assertRecord(value, label) {
|
|
|
112
112
|
assert.equal(typeof value, "object", `${label} should be an object`);
|
|
113
113
|
assert.notEqual(value, null, `${label} should not be null`);
|
|
114
114
|
}
|
|
115
|
+
describe("meeting_* 会议工具", () => {
|
|
116
|
+
const MEETING_TOOL_NAMES = [
|
|
117
|
+
"create_meeting",
|
|
118
|
+
"leave_meeting",
|
|
119
|
+
"end_meeting",
|
|
120
|
+
"meeting_speak",
|
|
121
|
+
"get_meeting_info",
|
|
122
|
+
"my_meetings",
|
|
123
|
+
];
|
|
124
|
+
it("6 个会议工具全部注册在 MCP_TOOLS", () => {
|
|
125
|
+
const names = MCP_TOOLS.map((tool) => tool.name);
|
|
126
|
+
for (const toolName of MEETING_TOOL_NAMES) {
|
|
127
|
+
assert.equal(names.includes(toolName), true, `${toolName} should be in MCP_TOOLS`);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
it("create_meeting 描述成员邀请语义且 members 参数必填", () => {
|
|
131
|
+
const tool = MCP_TOOLS.find((t) => t.name === "create_meeting");
|
|
132
|
+
assert.ok(tool, "create_meeting should exist");
|
|
133
|
+
assert.match(tool.description ?? "", /邀请|邀请角色|[{]roleId/);
|
|
134
|
+
const properties = tool.inputSchema.properties;
|
|
135
|
+
assert.ok(properties.members, "members 参数应存在");
|
|
136
|
+
assert.ok((tool.inputSchema.required ?? []).includes("members"), "members 应必填");
|
|
137
|
+
assert.ok((tool.inputSchema.required ?? []).includes("topic"), "topic 应必填");
|
|
138
|
+
});
|
|
139
|
+
it("meeting_speak 支持 meetingId/content 参数", () => {
|
|
140
|
+
const tool = MCP_TOOLS.find((t) => t.name === "meeting_speak");
|
|
141
|
+
assert.ok(tool, "meeting_speak should exist");
|
|
142
|
+
const properties = tool.inputSchema.properties;
|
|
143
|
+
assert.ok(properties.meetingId, "meetingId 参数应存在");
|
|
144
|
+
assert.ok(properties.content, "content 参数应存在");
|
|
145
|
+
assert.ok((tool.inputSchema.required ?? []).includes("meetingId"), "meetingId 应必填");
|
|
146
|
+
});
|
|
147
|
+
it("阻塞型工具 create_meeting 支持 waitTimeoutMs 参数", () => {
|
|
148
|
+
const tool = MCP_TOOLS.find((t) => t.name === "create_meeting");
|
|
149
|
+
const properties = tool.inputSchema.properties;
|
|
150
|
+
assert.ok(properties.waitTimeoutMs, "create_meeting 应支持 waitTimeoutMs 参数");
|
|
151
|
+
});
|
|
152
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
|
|
2
|
+
export declare function meetingDebugFingerprint(msg: {
|
|
3
|
+
msgId?: unknown;
|
|
4
|
+
channel?: unknown;
|
|
5
|
+
senderId?: unknown;
|
|
6
|
+
} | null | undefined): string;
|
|
7
|
+
|
|
8
|
+
export declare function meetingDebugFingerprints(msgs: Array<{
|
|
9
|
+
msgId?: unknown;
|
|
10
|
+
channel?: unknown;
|
|
11
|
+
senderId?: unknown;
|
|
12
|
+
}> | undefined): string;
|
|
13
|
+
export declare function meetingDebugLog(event: string, detail: string): void;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import u from"node:fs";const c="D:/\u4F1A\u8BAE\u529F\u80FDdebug\u65E5\u5FD7.log",o=4e3;let t,r;function f(){if(t===void 0){const n=String(process.env.AWS_MEETING_DEBUG_LOG??"").trim().toLowerCase();t=n.length>0&&!["0","false","off","no"].includes(n)}return t}function s(){if(r===void 0){const n=String(process.env.AWS_MEETING_DEBUG_LOG??"").trim(),e=["1","true","on","yes"].includes(n.toLowerCase());r=n.length>0&&!e?n:c}return r}function a(n){return n.length>o?`${n.slice(0,o)}...(truncated, ${n.length} total)`:n}function g(n){return!n||typeof n!="object"?"(null)":`msgId=${String(n.msgId??"-")} channel=${String(n.channel??"-")} sender=${String(n.senderId??"-")}`}function p(n){return!n||n.length===0?"[]":`[${n.map(e=>g(e)).join(", ")}]`}function E(n,e){if(!f())return;const i=s();if(i)try{const l=`${new Date().toISOString()} [pid=${process.pid}] [MEETING-DEBUG] ${n} :: ${a(e)}
|
|
2
|
+
`;u.appendFileSync(i,l,"utf8")}catch{r=null,t=!1}}export{g as meetingDebugFingerprint,p as meetingDebugFingerprints,E as meetingDebugLog};
|
|
3
|
+
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{logger as r}from"./logger.js";const
|
|
1
|
+
import{logger as r}from"./logger.js";import{meetingDebugFingerprint as h,meetingDebugFingerprints as c,meetingDebugLog as f}from"./meeting-debug-log.js";const u=500;function a(n){if(n.msgId===void 0||n.msgId===null)return;const e=n.channel;if(e==="meeting")return`meeting:${n.msgId}`;if(e==="meeting_invite")return`meeting_invite:${n.msgId}`;if(e==="notification")return`notification:${n.msgId}`;if(typeof n.msgId=="number"){const s=n.roomId;return`group:${typeof s=="string"?s:""}:${n.msgId}`}return n.msgId}class M{buffer=[];resolvers=[];onMessageArrived=null;isPolling=!1;seenMsgIds=new Map;setOnMessageArrived(e){this.onMessageArrived=e}setIsPolling(e){this.isPolling=e}markSeen(e){const s=a(e);s!==void 0&&(this.seenMsgIds.set(s,Date.now()),this.cleanupSeenMsgIds())}isDuplicate(e){const s=a(e);return s===void 0?!1:this.seenMsgIds.has(s)?!0:(this.seenMsgIds.set(s,Date.now()),this.cleanupSeenMsgIds(),!1)}cleanupSeenMsgIds(){if(this.seenMsgIds.size<=u)return;let e=0;const s=this.seenMsgIds.size-u;for(const t of this.seenMsgIds.keys()){if(e>=s)break;this.seenMsgIds.delete(t),e++}}push(e){if(this.isDuplicate(e)){r.info(`[MessageBuffer] \u5FFD\u7565\u91CD\u590D\u6D88\u606F\uFF0CmsgId: ${e.msgId}`);const s=e.channel;(s==="meeting"||s==="meeting_invite")&&f("buffer.push.duplicate-blocked",`${h(e)} content=${String(e.content??"").slice(0,120)}`);return}this.buffer.push(e),r.info(`[MessageBuffer] \u6D88\u606F\u5165\u7F13\u51B2\u533A\uFF0C\u5F53\u524D\u6570\u91CF: ${this.buffer.length}`);{const s=e.channel;(s==="meeting"||s==="meeting_invite")&&f("buffer.push.enqueued",`${h(e)} content=${String(e.content??"").slice(0,120)}`)}this.isPolling&&this.onMessageArrived&&(r.info("[MessageBuffer] \u68C0\u6D4B\u5230 poll \u7B49\u5F85\u4E2D\uFF0C\u89E6\u53D1\u6D88\u606F\u5230\u8FBE\u56DE\u8C03"),this.onMessageArrived()),this.tryDispatch()}setProfileMessage(e){r.info(`[MessageBuffer] \u6536\u5230 Profile \u63A8\u9001\uFF0CdisplayName: ${e.displayName}\u3002\u8EAB\u4EFD\u4FE1\u606F\u8BF7\u901A\u8FC7 get_profile \u83B7\u53D6\u3002`)}removeProfileMessage(){r.info("[MessageBuffer] removeProfileMessage \u88AB\u8C03\u7528\uFF0C\u5F53\u524D\u65E0\u9700\u79FB\u9664\u672A\u8BFB\u8EAB\u4EFD\u6D88\u606F")}hasProfileMessage(){return!1}wakeUpWaiters(){if(f("buffer.wakeUpWaiters",`bufferSize=${this.buffer.length} waiters=${this.resolvers.length}`),this.tryDispatch(),this.buffer.length===0&&this.resolvers.length>0){const e=this.resolvers.shift();e&&(this.updatePollingState(),r.info("[MessageBuffer] wakeUpWaiters: \u5524\u9192 poll \u8D70 hydrate \u91CD\u67E5"),e({directMessages:[],groupMessages:[]}))}}getProfileMessage(){return null}updatePollingState(){this.isPolling=this.resolvers.length>0}poll(e){if(r.info(`[MessageBuffer] poll() \u88AB\u8C03\u7528\uFF0Cbuffer: ${this.buffer.length}${e?`\uFF0C\u8D85\u65F6: ${e}ms`:""}`),this.buffer.length>0){const s=this.consumeAll();return r.info(`[MessageBuffer] poll \u7ACB\u5373\u8FD4\u56DE\uFF0C\u79C1\u804A: ${s.directMessages.length}\uFF0C\u7FA4\u804A: ${s.groupMessages.length}`),Promise.resolve(s)}return this.resolvers.length===0&&(this.isPolling=!0),new Promise(s=>{let t=null,i=!1;const o=l=>{if(i)return;i=!0;const g=this.resolvers.indexOf(o);g>-1&&this.resolvers.splice(g,1),t&&(clearTimeout(t),t=null),this.updatePollingState(),r.info(`[MessageBuffer] poll \u6536\u5230\u6D88\u606F\uFF0C\u79C1\u804A: ${l.directMessages.length}\uFF0C\u7FA4\u804A: ${l.groupMessages.length}`),s(l)};this.resolvers.push(o),this.tryDispatch(),e&&e>0&&(t=setTimeout(()=>{if(i)return;i=!0;const l=this.resolvers.indexOf(o);l>-1&&this.resolvers.splice(l,1),this.updatePollingState(),r.info(`[MessageBuffer] poll \u8D85\u65F6\uFF08${e}ms\uFF09\uFF0C\u8FD4\u56DE\u7A7A\u6D88\u606F`),s({directMessages:[],groupMessages:[]})},e))})}get(){if(this.buffer.length>0){const e=this.consumeAll();return r.info(`[MessageBuffer] get \u8FD4\u56DE\u6D88\u606F\uFF0C\u79C1\u804A: ${e.directMessages.length}\uFF0C\u7FA4\u804A: ${e.groupMessages.length}`),e}return{directMessages:[],groupMessages:[]}}takeForceDirectMessages(){const e=[],s=[];for(const t of this.buffer)this.isDirectMessage(t)&&t.force===!0?(this.markSeen(t),e.push(t)):s.push(t);return this.buffer=s,e.length>0&&(r.info(`[MessageBuffer] takeForceDirectMessages \u53D6\u8D70\u5F3A\u5236\u79C1\u4FE1 ${e.length} \u6761\uFF0C\u5269\u4F59 ${s.length} \u6761`),this.tryDispatch()),{directMessages:e,groupMessages:[]}}requeue(e){const s=[...e.directMessages,...e.groupMessages];s.length!==0&&(this.buffer.unshift(...s),r.info(`[MessageBuffer] requeue \u56DE\u6EDA\u672A\u4EA4\u4ED8\u6D88\u606F ${s.length} \u6761\uFF08\u79C1\u804A ${e.directMessages.length}\uFF0C\u7FA4\u804A ${e.groupMessages.length}\uFF09\uFF0C\u5F53\u524D\u6570\u91CF: ${this.buffer.length}`),this.tryDispatch())}size(){return this.buffer.length}clear(){this.buffer=[];for(const e of this.resolvers)e({directMessages:[],groupMessages:[]});this.resolvers=[],this.isPolling=!1,this.seenMsgIds.clear()}tryDispatch(){for(;this.resolvers.length>0&&this.buffer.length>0;){const e=this.resolvers.shift();if(e){const s=this.consumeAll();e(s)}}this.updatePollingState()}consumeAll(){const e=[],s=[];for(;this.buffer.length>0;){const i=this.buffer.shift();i&&(this.markSeen(i),this.isDirectMessage(i)?e.push(i):s.push(i))}const t=e.filter(i=>i.channel==="meeting"||i.channel==="meeting_invite");return t.length>0&&f("buffer.consumeAll",`consumed=${c(t)} dm=${e.length} gm=${s.length}`),{directMessages:e,groupMessages:s}}isDirectMessage(e){const s=e.channel;return s==="meeting"||s==="meeting_invite"?!0:typeof e.msgId=="string"}}export{M as MessageBuffer};
|
|
2
2
|
|
|
@@ -79,4 +79,64 @@ describe('MessageBuffer poll', () => {
|
|
|
79
79
|
assert.equal(rest.groupMessages.length, 1);
|
|
80
80
|
assert.deepEqual(rest.groupMessages[0], groupMessage);
|
|
81
81
|
});
|
|
82
|
+
it('classifies meeting-channel messages with numeric msgId as direct messages', () => {
|
|
83
|
+
const buffer = new MessageBuffer();
|
|
84
|
+
const meetingNotice = {
|
|
85
|
+
msgId: 7,
|
|
86
|
+
channel: 'meeting',
|
|
87
|
+
meetingId: 'm-1',
|
|
88
|
+
topic: '评审会',
|
|
89
|
+
senderId: 'system',
|
|
90
|
+
senderName: '系统',
|
|
91
|
+
content: '系统已自动为你加入会议',
|
|
92
|
+
isSystem: true,
|
|
93
|
+
timestamp: new Date().toISOString()
|
|
94
|
+
};
|
|
95
|
+
buffer.push(meetingNotice);
|
|
96
|
+
const messages = buffer.get();
|
|
97
|
+
assert.equal(messages.directMessages.length, 1, 'meeting notice must land in directMessages bucket');
|
|
98
|
+
assert.deepEqual(messages.directMessages[0], meetingNotice);
|
|
99
|
+
assert.deepEqual(messages.groupMessages, []);
|
|
100
|
+
});
|
|
101
|
+
it('does not drop meeting notices whose numeric msgId collides with consumed group msgIds', () => {
|
|
102
|
+
const buffer = new MessageBuffer();
|
|
103
|
+
const groupMessage = {
|
|
104
|
+
msgId: 42,
|
|
105
|
+
roomId: 'room-1',
|
|
106
|
+
senderId: 'human-1',
|
|
107
|
+
senderName: 'Human One',
|
|
108
|
+
content: '群消息',
|
|
109
|
+
timestamp: new Date().toISOString()
|
|
110
|
+
};
|
|
111
|
+
buffer.push(groupMessage);
|
|
112
|
+
const first = buffer.get();
|
|
113
|
+
assert.equal(first.groupMessages.length, 1);
|
|
114
|
+
// 同数字 id 的会议通知:跨表 id 碰撞不得被去重误丢
|
|
115
|
+
const meetingNotice = {
|
|
116
|
+
msgId: 42,
|
|
117
|
+
channel: 'meeting',
|
|
118
|
+
meetingId: 'm-1',
|
|
119
|
+
senderId: 'system',
|
|
120
|
+
content: '自动加入提示',
|
|
121
|
+
timestamp: new Date().toISOString()
|
|
122
|
+
};
|
|
123
|
+
buffer.push(meetingNotice);
|
|
124
|
+
const second = buffer.get();
|
|
125
|
+
assert.equal(second.directMessages.length, 1, 'meeting notice with colliding numeric id must be delivered');
|
|
126
|
+
assert.deepEqual(second.directMessages[0], meetingNotice);
|
|
127
|
+
});
|
|
128
|
+
it('deduplicates repeated meeting notices by namespaced key', () => {
|
|
129
|
+
const buffer = new MessageBuffer();
|
|
130
|
+
const meetingNotice = {
|
|
131
|
+
msgId: 9,
|
|
132
|
+
channel: 'meeting_invite',
|
|
133
|
+
senderId: 'agent-a',
|
|
134
|
+
content: '会议邀请',
|
|
135
|
+
timestamp: new Date().toISOString()
|
|
136
|
+
};
|
|
137
|
+
buffer.push(meetingNotice);
|
|
138
|
+
buffer.push({ ...meetingNotice });
|
|
139
|
+
const messages = buffer.get();
|
|
140
|
+
assert.equal(messages.directMessages.length, 1, 'duplicate meeting_invite must be deduplicated');
|
|
141
|
+
});
|
|
82
142
|
});
|
|
@@ -205,6 +205,8 @@ export interface DirectMessage {
|
|
|
205
205
|
_msgId?: string;
|
|
206
206
|
_requireAck?: boolean;
|
|
207
207
|
|
|
208
|
+
channel?: string;
|
|
209
|
+
|
|
208
210
|
_awsServerMessage?: boolean;
|
|
209
211
|
callId?: string;
|
|
210
212
|
senderId: string;
|
|
@@ -262,6 +264,14 @@ export interface FetchUnreadMessagesOptions {
|
|
|
262
264
|
blockIfEmpty?: boolean;
|
|
263
265
|
blockTimeoutMs?: number;
|
|
264
266
|
includePipelineTasks?: boolean;
|
|
267
|
+
|
|
268
|
+
pollMessageTimeoutMs?: number;
|
|
269
|
+
|
|
270
|
+
skipGroupMessages?: boolean;
|
|
271
|
+
|
|
272
|
+
preemptiveJoinWaitMs?: number;
|
|
273
|
+
|
|
274
|
+
propagatePollTimeout?: boolean;
|
|
265
275
|
}
|
|
266
276
|
|
|
267
277
|
export interface BrowserListenerEvent {
|
|
@@ -298,7 +308,7 @@ export interface SendDmResult {
|
|
|
298
308
|
reply?: DirectMessage;
|
|
299
309
|
}
|
|
300
310
|
export interface WebSocketMessage<T = unknown> {
|
|
301
|
-
type: "GROUP_MSG" | "DM_MSG" | "ONLINE_CHANGE" | "DM_REPLY" | "HEARTBEAT" | "PROFILE_INFO" | "AGENT_CONFIG" | "AGENT_STATUS" | "MCP_NODE_LOG" | "MCP_NODE_LOG_BATCH" | "LOG_ACK" | "MESSAGE_ACK" | "TERMINAL_OUTPUT" | "TERMINAL_STATUS" | "GROUP_READ_RECEIPT" | "DM_READ_RECEIPT" | "AGENT_EVENTS_DELTA";
|
|
311
|
+
type: "GROUP_MSG" | "DM_MSG" | "MEETING_MSG" | "ONLINE_CHANGE" | "DM_REPLY" | "HEARTBEAT" | "PROFILE_INFO" | "AGENT_CONFIG" | "AGENT_STATUS" | "MCP_NODE_LOG" | "MCP_NODE_LOG_BATCH" | "LOG_ACK" | "MESSAGE_ACK" | "TERMINAL_OUTPUT" | "TERMINAL_STATUS" | "GROUP_READ_RECEIPT" | "DM_READ_RECEIPT" | "AGENT_EVENTS_DELTA" | "SYSTEM_NOTIFY";
|
|
302
312
|
data: T;
|
|
303
313
|
timestamp: string;
|
|
304
314
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{EventEmitter as m}from"node:events";import c from"ws";import{logger as r}from"./logger.js";const f=9e3,T=3e4,b=1e3,l=100,u=3,d=3,S=5,k=6e4,p=50,g=1e3;class M extends m{ws=null;config;agentId=null;heartbeatTimer=null;heartbeatTimeoutTimer=null;reconnectAttempts=0;reconnectTimer=null;isManualClose=!1;websocketFactory;openedAt=null;lastRefreshedToken=null;consecutiveRefreshFailures=0;logBatchQueue=[];logBatchTimer=null;logSequenceNumber=0;pendingLogBatches=new Map;isProcessingLogBatch=!1;processedMsgIds=new Map;constructor(e,t){super(),this.config=e,this.websocketFactory=t??(s=>new c(s))}connect(e){return new Promise((t,s)=>{this.prepareConnection(e);const n=this.buildWebSocketUrl(e);r.info(`[WebSocket] \u6B63\u5728\u8FDE\u63A5: ${this.maskRuntimeTokenInUrl(n)}`);const{rejectOnce:o,resolveOnce:i}=this.createSettledHandlers(t,s);try{this.ws=this.websocketFactory(n),this.setupWebSocketEventHandlers(this.ws,o,i)}catch(a){o(a instanceof Error?a:new Error(String(a)))}})}prepareConnection(e){this.agentId=e,this.isManualClose=!1,this.ws&&this.ws.readyState!==c.CLOSED&&(this.ws.removeAllListeners(),this.ws.terminate())}buildWebSocketUrl(e){const t=new URL(this.config.serverUrl);t.searchParams.set("agentId",e);const s=this.config.runtimeAccessToken?.trim();return s&&t.searchParams.set("runtimeAccessToken",s),t.toString()}maskRuntimeTokenInUrl(e){try{const t=new URL(e);return t.searchParams.has("runtimeAccessToken")&&t.searchParams.set("runtimeAccessToken","***"),t.toString()}catch{return e.replace(/([?&]runtimeAccessToken=)[^&]*/u,"$1***")}}createSettledHandlers(e,t){let s=!1;return{rejectOnce:i=>{s||(s=!0,t(i))},resolveOnce:()=>{s||(s=!0,e())}}}setupWebSocketEventHandlers(e,t,s){let n=!1;e.on("open",()=>{n=!0,this.handleWebSocketOpen(s)}),e.on("message",o=>this.handleWebSocketMessage(o)),e.on("pong",()=>this.markHeartbeatReceived()),e.on("close",(o,i)=>this.handleWebSocketClose(o,i,n,t)),e.on("error",o=>this.handleWebSocketError(o,n,t))}handleWebSocketOpen(e){r.info("[WebSocket] \u8FDE\u63A5\u5DF2\u5EFA\u7ACB"),this.openedAt=Date.now(),this.lastRefreshedToken=null,this.clearReconnectTimer(),this.startHeartbeat(),this.emit("connected"),e()}handleWebSocketMessage(e){try{const t=JSON.parse(e.toString()),s=this.extractReliableMessageId(t),n=s!==null&&this.markMsgIdProcessed(s);if(this.acknowledgeReliableMessage(t),n){r.info("[WebSocket] \u5FFD\u7565\u91CD\u590D\u6295\u9012\u7684\u53EF\u9760\u6D88\u606F: msgId=%s, type=%s",s,t.type);return}this.handleMessage(t)}catch(t){const s=e.toString(),n=s.length>200?`${s.slice(0,200)}...(truncated, ${s.length} total)`:s;r.warn("[WebSocket] \u6D88\u606F\u89E3\u6790\u5931\u8D25, dataLength=%s, preview=%s:",s.length,n,t)}}extractReliableMessageId(e){const t=e.data;if(!t||typeof t!="object")return null;const s=t,n=String(s._msgId||"").trim(),o=s._requireAck===!0||s._requireAck==="true";return!n||!o?null:n}markMsgIdProcessed(e){if(this.processedMsgIds.has(e))return!0;if(this.processedMsgIds.set(e,Date.now()),this.processedMsgIds.size>g){let t=0;const s=this.processedMsgIds.size-g;for(const n of this.processedMsgIds.keys()){if(t>=s)break;this.processedMsgIds.delete(n),t++}}return!1}acknowledgeReliableMessage(e){const t=this.extractReliableMessageId(e);t&&this.send({type:"MESSAGE_ACK",data:{msgId:t},timestamp:new Date().toISOString()})}async handleWebSocketClose(e,t,s,n){const o=t.toString(),i=this.ws?.readyState;r.warn(`[WebSocket] \u8FDE\u63A5\u5173\u95ED: code=${e}, reason=${o}, readyState=${i}, opened=${s}, reconnectAttempts=${this.reconnectAttempts}`),this.stopHeartbeat(),this.clearHeartbeatTimeout(),this.emit("disconnected",e,t),this.openedAt!==null&&Date.now()-this.openedAt>=k&&(this.reconnectAttempts=0,this.consecutiveRefreshFailures=0),this.openedAt=null,s||n(new Error(`WebSocket \u8FDE\u63A5\u5728\u5EFA\u7ACB\u524D\u5173\u95ED: code=${e}, reason=${o}`)),this.isManualClose||(e===1008?await this.handleTokenExpiredAndReconnect():this.scheduleReconnect())}async handleTokenExpiredAndReconnect(){const e=await this.refreshRuntimeTokenOnPolicyRejection();if(e==="refreshed"){r.info("[WebSocket] runtime token \u5DF2\u5237\u65B0\uFF0C\u4F7F\u7528\u65B0 token \u91CD\u8FDE"),this.consecutiveRefreshFailures=0,this.scheduleReconnect();return}if(e==="unchanged"){r.warn("[WebSocket] bridge \u8FD4\u56DE token \u672A\u53D8\u5316\u4E14\u670D\u52A1\u7AEF 1008 \u62D2\u7EDD\uFF0C\u8FDB\u5165\u6162\u901F\u91CD\u8BD5\u7B49\u5F85\u65B0 token \u7B7E\u53D1"),this.emit("tokenRejected",this.config.runtimeAccessToken),this.enterSlowReconnect();return}if(this.consecutiveRefreshFailures+=1,this.consecutiveRefreshFailures>=d){r.error(`[WebSocket] runtime token \u5237\u65B0\u8FDE\u7EED\u5931\u8D25 ${this.consecutiveRefreshFailures} \u6B21\uFF0C\u964D\u7EA7\u4E3A\u6162\u901F\u91CD\u8BD5\u7B49\u5F85 bridge \u6062\u590D`),this.emit("tokenRefreshFailed",this.consecutiveRefreshFailures),this.enterSlowReconnect();return}r.warn(`[WebSocket] runtime token \u5237\u65B0\u5931\u8D25\uFF0C\u7B2C ${this.consecutiveRefreshFailures}/${d} \u6B21\u5C1D\u8BD5\u91CD\u8FDE`),this.scheduleReconnect()}enterSlowReconnect(){this.reconnectAttempts=Math.max(this.reconnectAttempts,S),this.scheduleReconnect()}async refreshRuntimeTokenOnPolicyRejection(){const e=this.config.runtimeBridgeBaseUrl;if(!e||!this.agentId)return"failed";const t=this.config.runtimeAccessToken||"",s=Math.min(this.config.mcpHttpRequestTimeoutMs??12e4,1e4),n=new AbortController,o=setTimeout(()=>n.abort(),s);try{const i=await fetch(`${e}/runtime/binding/refresh-token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({agentId:this.agentId,currentToken:t,forceRefresh:!0}),signal:n.signal});if(!i.ok)return r.warn(`[WebSocket] bridge refresh-token \u8FD4\u56DE ${i.status}\uFF0C\u65E0\u6CD5\u5237\u65B0`),"failed";const h=(await i.json()).runtimeAccessToken;return!h||h===t?"unchanged":(this.config.runtimeAccessToken=h,this.lastRefreshedToken=t,r.info("[WebSocket] runtimeAccessToken \u5DF2\u901A\u8FC7 bridge refresh \u66F4\u65B0"),"refreshed")}catch(i){return i instanceof Error&&i.name==="AbortError"?r.warn(`[WebSocket] bridge refresh-token \u8D85\u65F6\uFF08${s}ms\uFF09`):(r.warn("[WebSocket] bridge refresh-token \u5F02\u5E38: %s",i instanceof Error?i.message:String(i)),i instanceof Error&&i.stack&&r.warn("[WebSocket] refresh-token \u5F02\u5E38\u5806\u6808:",i.stack.slice(0,2e3))),"failed"}finally{clearTimeout(o)}}handleWebSocketError(e,t,s){const n=this.ws?.readyState;r.error("[WebSocket] \u8FDE\u63A5\u9519\u8BEF: readyState=%s, opened=%s, reconnectAttempts=%s, message=%s",n,t,this.reconnectAttempts,e.message),r.error("[WebSocket] \u9519\u8BEF\u5806\u6808:",e.stack?.slice(0,2e3)),this.emit("error",e),t||s(e)}disconnect(){this.isManualClose=!0,this.stopHeartbeat(),this.clearHeartbeatTimeout(),this.clearReconnectTimer(),this.ws&&(this.ws.readyState===c.OPEN&&this.ws.close(1e3,"Agent logout"),this.ws=null),this.agentId=null,r.info("[WebSocket] \u5DF2\u65AD\u5F00\u8FDE\u63A5")}send(e){const t=this.ws?.readyState;if(!this.ws||t!==c.OPEN)return r.warn("[WebSocket] \u8FDE\u63A5\u672A\u5EFA\u7ACB\uFF0C\u65E0\u6CD5\u53D1\u9001\u6D88\u606F: readyState=%s, isManualClose=%s, agentId=%s",t,this.isManualClose,this.agentId),!1;try{return this.ws.send(JSON.stringify(e)),!0}catch(s){return r.error("[WebSocket] send() \u53D1\u9001\u6D88\u606F\u5F02\u5E38: readyState=%s, error=%s",t,s),!1}}sendMcpNodeLog(e){return this.isConnected()?(this.logBatchQueue.push(e),this.logBatchTimer||(this.logBatchTimer=setTimeout(()=>{this.logBatchTimer=null,this.flushLogBatch()},l)),!0):!1}flushLogBatch(){if(this.logBatchQueue.length===0||this.isProcessingLogBatch)return;const e=this.logBatchQueue.splice(0,p);if(e.length===0)return;this.isProcessingLogBatch=!0,this.logSequenceNumber+=1;const t=this.logSequenceNumber;new Promise((n,o)=>{this.pendingLogBatches.set(t,{logs:e,sequenceNumber:t,retryCount:0,resolve:n,reject:o})}).then(()=>{this.isProcessingLogBatch=!1,this.logBatchQueue.length>0&&(this.logBatchTimer=setTimeout(()=>{this.logBatchTimer=null,this.flushLogBatch()},l))}).catch(()=>{this.isProcessingLogBatch=!1}),this.sendLogBatch(t)}sendLogBatch(e){const t=this.pendingLogBatches.get(e);if(!t)return;this.send({type:"MCP_NODE_LOG_BATCH",data:{sequenceNumber:e,logs:t.logs},timestamp:new Date().toISOString()})||this.handleLogBatchSendFailure(e)}handleLogBatchSendFailure(e){const t=this.pendingLogBatches.get(e);t&&(t.retryCount+=1,t.retryCount<=u?(r.warn(`[WebSocket] \u65E5\u5FD7\u6279\u6B21 #${e} \u53D1\u9001\u5931\u8D25\uFF0C\u7B2C ${t.retryCount} \u6B21\u91CD\u8BD5`),setTimeout(()=>{this.sendLogBatch(e)},l*t.retryCount)):(r.error(`[WebSocket] \u65E5\u5FD7\u6279\u6B21 #${e} \u53D1\u9001\u5931\u8D25\uFF0C\u5DF2\u91CD\u8BD5 ${u} \u6B21\uFF0C\u4E22\u5F03`),this.pendingLogBatches.delete(e),t.reject(new Error(`\u65E5\u5FD7\u6279\u6B21 #${e} \u53D1\u9001\u5931\u8D25`))))}handleLogAck(e){const s=Number(e?.ackSequenceNumber);if(!s||!this.pendingLogBatches.has(s))return;const n=this.pendingLogBatches.get(s);n&&(this.pendingLogBatches.delete(s),n.resolve())}isConnected(){return this.ws!==null&&this.ws.readyState===c.OPEN}handleMessage(e){switch(e.type){case"GROUP_MSG":this.emit("groupMessage",e.data);break;case"DM_MSG":this.emit("directMessage",e.data);break;case"ONLINE_CHANGE":this.emit("onlineChange",e.data);break;case"HEARTBEAT":this.markHeartbeatReceived();break;case"PROFILE_INFO":r.info("[WebSocket] \u6536\u5230 PROFILE_INFO \u6D88\u606F"),this.emit("profileInfo",e.data);break;case"AGENT_CONFIG":r.info("[WebSocket] \u6536\u5230 AGENT_CONFIG \u6D88\u606F"),this.emit("agentConfig",e.data);break;case"AGENT_STATUS":r.info("[WebSocket] \u6536\u5230 AGENT_STATUS \u6D88\u606F"),this.emit("agentStatus",e.data);break;case"LOG_ACK":this.handleLogAck(e.data);break;case"GROUP_READ_RECEIPT":case"DM_READ_RECEIPT":case"TERMINAL_OUTPUT":case"TERMINAL_STATUS":case"MCP_NODE_LOG":case"AGENT_EVENTS_DELTA":break;default:r.warn("[WebSocket] \u672A\u77E5\u6D88\u606F\u7C7B\u578B:",e.type)}}startHeartbeat(){this.stopHeartbeat(),this.heartbeatTimer=setInterval(()=>{this.isConnected()&&(this.ensureHeartbeatTimeout(),this.sendProtocolPing(),this.send({type:"HEARTBEAT",data:"ping",timestamp:new Date().toISOString()}))},this.config.heartbeatInterval)}stopHeartbeat(){this.heartbeatTimer&&(clearInterval(this.heartbeatTimer),this.heartbeatTimer=null),this.clearHeartbeatTimeout()}sendProtocolPing(){if(!(!this.ws||this.ws.readyState!==c.OPEN))try{this.ws.ping()}catch(e){r.warn("[WebSocket] \u534F\u8BAE\u5C42 ping \u53D1\u9001\u5931\u8D25\uFF0C\u7EC8\u6B62\u8FDE\u63A5\u5E76\u91CD\u8FDE:",e instanceof Error?e.message:String(e)),this.ws.terminate()}}markHeartbeatReceived(){this.clearHeartbeatTimeout()}ensureHeartbeatTimeout(){this.heartbeatTimeoutTimer||(this.heartbeatTimeoutTimer=setTimeout(()=>{this.heartbeatTimeoutTimer=null,!(!this.ws||this.ws.readyState!==c.OPEN)&&(r.warn(`[WebSocket] ${this.resolveHeartbeatTimeout()}ms \u672A\u6536\u5230\u5FC3\u8DF3\u54CD\u5E94\uFF0C\u7EC8\u6B62\u8FDE\u63A5\u5E76\u89E6\u53D1\u91CD\u8FDE`),this.ws.terminate())},this.resolveHeartbeatTimeout()))}clearHeartbeatTimeout(){this.heartbeatTimeoutTimer&&(clearTimeout(this.heartbeatTimeoutTimer),this.heartbeatTimeoutTimer=null)}resolveHeartbeatTimeout(){return this.config.heartbeatTimeout??f}scheduleReconnect(){const e=this.config.maxReconnectAttempts!==-1;if(e&&this.reconnectAttempts>=this.config.maxReconnectAttempts){r.error("[WebSocket] \u91CD\u8FDE\u6B21\u6570\u5DF2\u8FBE\u4E0A\u9650\uFF0C\u653E\u5F03\u91CD\u8FDE"),this.emit("reconnectFailed");return}if(this.reconnectTimer)return;this.reconnectAttempts++;const t=Math.min(this.config.reconnectInterval*Math.pow(2,this.reconnectAttempts-1),this.config.reconnectMaxInterval??T),s=Math.random()*(this.config.reconnectJitterMs??b),n=Math.round(t+s),o=e?`\u7B2C ${this.reconnectAttempts}/${this.config.maxReconnectAttempts} \u6B21`:`\u7B2C ${this.reconnectAttempts} \u6B21\uFF08\u65E0\u9650\u91CD\u8BD5\u6A21\u5F0F\uFF09`;r.warn(`[WebSocket] ${n}ms \u540E\u5C1D\u8BD5${o}\u91CD\u8FDE (base=${Math.round(t)}ms, jitter=+${Math.round(s)}ms)...`),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.agentId&&this.connect(this.agentId).catch(i=>{const a=i instanceof Error?i.message:String(i),h=i instanceof Error?i.stack:void 0;r.warn("[WebSocket] \u91CD\u8FDE\u5931\u8D25 (attempt #%s), \u7EE7\u7EED\u91CD\u8BD5: %s",this.reconnectAttempts,a),h&&r.warn("[WebSocket] \u91CD\u8FDE\u5931\u8D25\u5806\u6808:",h.slice(0,2e3)),this.scheduleReconnect()})},n)}clearReconnectTimer(){this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null)}}export{M as WebSocketClient};
|
|
1
|
+
import{EventEmitter as f}from"node:events";import c from"ws";import{logger as r}from"./logger.js";import{meetingDebugLog as u}from"./meeting-debug-log.js";const T=9e3,S=3e4,b=1e3,l=100,d=3,g=3,k=5,p=6e4,E=50,m=1e3;class _ extends f{ws=null;config;agentId=null;heartbeatTimer=null;heartbeatTimeoutTimer=null;reconnectAttempts=0;reconnectTimer=null;isManualClose=!1;websocketFactory;openedAt=null;lastRefreshedToken=null;consecutiveRefreshFailures=0;logBatchQueue=[];logBatchTimer=null;logSequenceNumber=0;pendingLogBatches=new Map;isProcessingLogBatch=!1;processedMsgIds=new Map;constructor(e,t){super(),this.config=e,this.websocketFactory=t??(s=>new c(s))}connect(e){return new Promise((t,s)=>{this.prepareConnection(e);const n=this.buildWebSocketUrl(e);r.info(`[WebSocket] \u6B63\u5728\u8FDE\u63A5: ${this.maskRuntimeTokenInUrl(n)}`);const{rejectOnce:o,resolveOnce:i}=this.createSettledHandlers(t,s);try{this.ws=this.websocketFactory(n),this.setupWebSocketEventHandlers(this.ws,o,i)}catch(a){o(a instanceof Error?a:new Error(String(a)))}})}prepareConnection(e){this.agentId=e,this.isManualClose=!1,this.ws&&this.ws.readyState!==c.CLOSED&&(this.ws.removeAllListeners(),this.ws.terminate())}buildWebSocketUrl(e){const t=new URL(this.config.serverUrl);t.searchParams.set("agentId",e);const s=this.config.runtimeAccessToken?.trim();return s&&t.searchParams.set("runtimeAccessToken",s),t.toString()}maskRuntimeTokenInUrl(e){try{const t=new URL(e);return t.searchParams.has("runtimeAccessToken")&&t.searchParams.set("runtimeAccessToken","***"),t.toString()}catch{return e.replace(/([?&]runtimeAccessToken=)[^&]*/u,"$1***")}}createSettledHandlers(e,t){let s=!1;return{rejectOnce:i=>{s||(s=!0,t(i))},resolveOnce:()=>{s||(s=!0,e())}}}setupWebSocketEventHandlers(e,t,s){let n=!1;e.on("open",()=>{n=!0,this.handleWebSocketOpen(s)}),e.on("message",o=>this.handleWebSocketMessage(o)),e.on("pong",()=>this.markHeartbeatReceived()),e.on("close",(o,i)=>this.handleWebSocketClose(o,i,n,t)),e.on("error",o=>this.handleWebSocketError(o,n,t))}handleWebSocketOpen(e){r.info("[WebSocket] \u8FDE\u63A5\u5DF2\u5EFA\u7ACB"),this.openedAt=Date.now(),this.lastRefreshedToken=null,this.clearReconnectTimer(),this.startHeartbeat(),this.emit("connected"),e()}handleWebSocketMessage(e){try{const t=JSON.parse(e.toString()),s=this.extractReliableMessageId(t),n=s!==null&&this.markMsgIdProcessed(s);if(this.acknowledgeReliableMessage(t),n){r.info("[WebSocket] \u5FFD\u7565\u91CD\u590D\u6295\u9012\u7684\u53EF\u9760\u6D88\u606F: msgId=%s, type=%s",s,t.type);return}this.handleMessage(t)}catch(t){const s=e.toString(),n=s.length>200?`${s.slice(0,200)}...(truncated, ${s.length} total)`:s;r.warn("[WebSocket] \u6D88\u606F\u89E3\u6790\u5931\u8D25, dataLength=%s, preview=%s:",s.length,n,t)}}extractReliableMessageId(e){const t=e.data;if(!t||typeof t!="object")return null;const s=t,n=String(s._msgId||"").trim(),o=s._requireAck===!0||s._requireAck==="true";return!n||!o?null:n}markMsgIdProcessed(e){if(this.processedMsgIds.has(e))return!0;if(this.processedMsgIds.set(e,Date.now()),this.processedMsgIds.size>m){let t=0;const s=this.processedMsgIds.size-m;for(const n of this.processedMsgIds.keys()){if(t>=s)break;this.processedMsgIds.delete(n),t++}}return!1}acknowledgeReliableMessage(e){const t=this.extractReliableMessageId(e);t&&this.send({type:"MESSAGE_ACK",data:{msgId:t},timestamp:new Date().toISOString()})}async handleWebSocketClose(e,t,s,n){const o=t.toString(),i=this.ws?.readyState;r.warn(`[WebSocket] \u8FDE\u63A5\u5173\u95ED: code=${e}, reason=${o}, readyState=${i}, opened=${s}, reconnectAttempts=${this.reconnectAttempts}`),this.stopHeartbeat(),this.clearHeartbeatTimeout(),this.emit("disconnected",e,t),this.openedAt!==null&&Date.now()-this.openedAt>=p&&(this.reconnectAttempts=0,this.consecutiveRefreshFailures=0),this.openedAt=null,s||n(new Error(`WebSocket \u8FDE\u63A5\u5728\u5EFA\u7ACB\u524D\u5173\u95ED: code=${e}, reason=${o}`)),this.isManualClose||(e===1008?await this.handleTokenExpiredAndReconnect():this.scheduleReconnect())}async handleTokenExpiredAndReconnect(){const e=await this.refreshRuntimeTokenOnPolicyRejection();if(e==="refreshed"){r.info("[WebSocket] runtime token \u5DF2\u5237\u65B0\uFF0C\u4F7F\u7528\u65B0 token \u91CD\u8FDE"),this.consecutiveRefreshFailures=0,this.scheduleReconnect();return}if(e==="unchanged"){r.warn("[WebSocket] bridge \u8FD4\u56DE token \u672A\u53D8\u5316\u4E14\u670D\u52A1\u7AEF 1008 \u62D2\u7EDD\uFF0C\u8FDB\u5165\u6162\u901F\u91CD\u8BD5\u7B49\u5F85\u65B0 token \u7B7E\u53D1"),this.emit("tokenRejected",this.config.runtimeAccessToken),this.enterSlowReconnect();return}if(this.consecutiveRefreshFailures+=1,this.consecutiveRefreshFailures>=g){r.error(`[WebSocket] runtime token \u5237\u65B0\u8FDE\u7EED\u5931\u8D25 ${this.consecutiveRefreshFailures} \u6B21\uFF0C\u964D\u7EA7\u4E3A\u6162\u901F\u91CD\u8BD5\u7B49\u5F85 bridge \u6062\u590D`),this.emit("tokenRefreshFailed",this.consecutiveRefreshFailures),this.enterSlowReconnect();return}r.warn(`[WebSocket] runtime token \u5237\u65B0\u5931\u8D25\uFF0C\u7B2C ${this.consecutiveRefreshFailures}/${g} \u6B21\u5C1D\u8BD5\u91CD\u8FDE`),this.scheduleReconnect()}enterSlowReconnect(){this.reconnectAttempts=Math.max(this.reconnectAttempts,k),this.scheduleReconnect()}async refreshRuntimeTokenOnPolicyRejection(){const e=this.config.runtimeBridgeBaseUrl;if(!e||!this.agentId)return"failed";const t=this.config.runtimeAccessToken||"",s=Math.min(this.config.mcpHttpRequestTimeoutMs??12e4,1e4),n=new AbortController,o=setTimeout(()=>n.abort(),s);try{const i=await fetch(`${e}/runtime/binding/refresh-token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({agentId:this.agentId,currentToken:t,forceRefresh:!0}),signal:n.signal});if(!i.ok)return r.warn(`[WebSocket] bridge refresh-token \u8FD4\u56DE ${i.status}\uFF0C\u65E0\u6CD5\u5237\u65B0`),"failed";const h=(await i.json()).runtimeAccessToken;return!h||h===t?"unchanged":(this.config.runtimeAccessToken=h,this.lastRefreshedToken=t,r.info("[WebSocket] runtimeAccessToken \u5DF2\u901A\u8FC7 bridge refresh \u66F4\u65B0"),"refreshed")}catch(i){return i instanceof Error&&i.name==="AbortError"?r.warn(`[WebSocket] bridge refresh-token \u8D85\u65F6\uFF08${s}ms\uFF09`):(r.warn("[WebSocket] bridge refresh-token \u5F02\u5E38: %s",i instanceof Error?i.message:String(i)),i instanceof Error&&i.stack&&r.warn("[WebSocket] refresh-token \u5F02\u5E38\u5806\u6808:",i.stack.slice(0,2e3))),"failed"}finally{clearTimeout(o)}}handleWebSocketError(e,t,s){const n=this.ws?.readyState;r.error("[WebSocket] \u8FDE\u63A5\u9519\u8BEF: readyState=%s, opened=%s, reconnectAttempts=%s, message=%s",n,t,this.reconnectAttempts,e.message),r.error("[WebSocket] \u9519\u8BEF\u5806\u6808:",e.stack?.slice(0,2e3)),this.emit("error",e),t||s(e)}disconnect(){this.isManualClose=!0,this.stopHeartbeat(),this.clearHeartbeatTimeout(),this.clearReconnectTimer(),this.ws&&(this.ws.readyState===c.OPEN&&this.ws.close(1e3,"Agent logout"),this.ws=null),this.agentId=null,r.info("[WebSocket] \u5DF2\u65AD\u5F00\u8FDE\u63A5")}send(e){const t=this.ws?.readyState;if(!this.ws||t!==c.OPEN)return r.warn("[WebSocket] \u8FDE\u63A5\u672A\u5EFA\u7ACB\uFF0C\u65E0\u6CD5\u53D1\u9001\u6D88\u606F: readyState=%s, isManualClose=%s, agentId=%s",t,this.isManualClose,this.agentId),!1;try{return this.ws.send(JSON.stringify(e)),!0}catch(s){return r.error("[WebSocket] send() \u53D1\u9001\u6D88\u606F\u5F02\u5E38: readyState=%s, error=%s",t,s),!1}}sendMcpNodeLog(e){return this.isConnected()?(this.logBatchQueue.push(e),this.logBatchTimer||(this.logBatchTimer=setTimeout(()=>{this.logBatchTimer=null,this.flushLogBatch()},l)),!0):!1}flushLogBatch(){if(this.logBatchQueue.length===0||this.isProcessingLogBatch)return;const e=this.logBatchQueue.splice(0,E);if(e.length===0)return;this.isProcessingLogBatch=!0,this.logSequenceNumber+=1;const t=this.logSequenceNumber;new Promise((n,o)=>{this.pendingLogBatches.set(t,{logs:e,sequenceNumber:t,retryCount:0,resolve:n,reject:o})}).then(()=>{this.isProcessingLogBatch=!1,this.logBatchQueue.length>0&&(this.logBatchTimer=setTimeout(()=>{this.logBatchTimer=null,this.flushLogBatch()},l))}).catch(()=>{this.isProcessingLogBatch=!1}),this.sendLogBatch(t)}sendLogBatch(e){const t=this.pendingLogBatches.get(e);if(!t)return;this.send({type:"MCP_NODE_LOG_BATCH",data:{sequenceNumber:e,logs:t.logs},timestamp:new Date().toISOString()})||this.handleLogBatchSendFailure(e)}handleLogBatchSendFailure(e){const t=this.pendingLogBatches.get(e);t&&(t.retryCount+=1,t.retryCount<=d?(r.warn(`[WebSocket] \u65E5\u5FD7\u6279\u6B21 #${e} \u53D1\u9001\u5931\u8D25\uFF0C\u7B2C ${t.retryCount} \u6B21\u91CD\u8BD5`),setTimeout(()=>{this.sendLogBatch(e)},l*t.retryCount)):(r.error(`[WebSocket] \u65E5\u5FD7\u6279\u6B21 #${e} \u53D1\u9001\u5931\u8D25\uFF0C\u5DF2\u91CD\u8BD5 ${d} \u6B21\uFF0C\u4E22\u5F03`),this.pendingLogBatches.delete(e),t.reject(new Error(`\u65E5\u5FD7\u6279\u6B21 #${e} \u53D1\u9001\u5931\u8D25`))))}handleLogAck(e){const s=Number(e?.ackSequenceNumber);if(!s||!this.pendingLogBatches.has(s))return;const n=this.pendingLogBatches.get(s);n&&(this.pendingLogBatches.delete(s),n.resolve())}isConnected(){return this.ws!==null&&this.ws.readyState===c.OPEN}handleMessage(e){switch(e.type){case"GROUP_MSG":this.emit("groupMessage",e.data);break;case"DM_MSG":this.emit("directMessage",e.data);break;case"MEETING_MSG":u("ws.MEETING_MSG",`\u6536\u5230\u4F1A\u8BAE\u6D88\u606F WS \u63A8\u9001: msgId=${String(e.data?.msgId??"-")} content=${String(e.data?.content??"").slice(0,120)}`),this.emit("meetingMessage",e.data);break;case"SYSTEM_NOTIFY":u("ws.SYSTEM_NOTIFY",`type=${String(e.data?.type??"-")}`),this.emit("systemNotify",e.data);break;case"ONLINE_CHANGE":this.emit("onlineChange",e.data);break;case"HEARTBEAT":this.markHeartbeatReceived();break;case"PROFILE_INFO":r.info("[WebSocket] \u6536\u5230 PROFILE_INFO \u6D88\u606F"),this.emit("profileInfo",e.data);break;case"AGENT_CONFIG":r.info("[WebSocket] \u6536\u5230 AGENT_CONFIG \u6D88\u606F"),this.emit("agentConfig",e.data);break;case"AGENT_STATUS":r.info("[WebSocket] \u6536\u5230 AGENT_STATUS \u6D88\u606F"),this.emit("agentStatus",e.data);break;case"LOG_ACK":this.handleLogAck(e.data);break;case"GROUP_READ_RECEIPT":case"DM_READ_RECEIPT":case"TERMINAL_OUTPUT":case"TERMINAL_STATUS":case"MCP_NODE_LOG":case"AGENT_EVENTS_DELTA":break;default:r.warn("[WebSocket] \u672A\u77E5\u6D88\u606F\u7C7B\u578B:",e.type)}}startHeartbeat(){this.stopHeartbeat(),this.heartbeatTimer=setInterval(()=>{this.isConnected()&&(this.ensureHeartbeatTimeout(),this.sendProtocolPing(),this.send({type:"HEARTBEAT",data:"ping",timestamp:new Date().toISOString()}))},this.config.heartbeatInterval)}stopHeartbeat(){this.heartbeatTimer&&(clearInterval(this.heartbeatTimer),this.heartbeatTimer=null),this.clearHeartbeatTimeout()}sendProtocolPing(){if(!(!this.ws||this.ws.readyState!==c.OPEN))try{this.ws.ping()}catch(e){r.warn("[WebSocket] \u534F\u8BAE\u5C42 ping \u53D1\u9001\u5931\u8D25\uFF0C\u7EC8\u6B62\u8FDE\u63A5\u5E76\u91CD\u8FDE:",e instanceof Error?e.message:String(e)),this.ws.terminate()}}markHeartbeatReceived(){this.clearHeartbeatTimeout()}ensureHeartbeatTimeout(){this.heartbeatTimeoutTimer||(this.heartbeatTimeoutTimer=setTimeout(()=>{this.heartbeatTimeoutTimer=null,!(!this.ws||this.ws.readyState!==c.OPEN)&&(r.warn(`[WebSocket] ${this.resolveHeartbeatTimeout()}ms \u672A\u6536\u5230\u5FC3\u8DF3\u54CD\u5E94\uFF0C\u7EC8\u6B62\u8FDE\u63A5\u5E76\u89E6\u53D1\u91CD\u8FDE`),this.ws.terminate())},this.resolveHeartbeatTimeout()))}clearHeartbeatTimeout(){this.heartbeatTimeoutTimer&&(clearTimeout(this.heartbeatTimeoutTimer),this.heartbeatTimeoutTimer=null)}resolveHeartbeatTimeout(){return this.config.heartbeatTimeout??T}scheduleReconnect(){const e=this.config.maxReconnectAttempts!==-1;if(e&&this.reconnectAttempts>=this.config.maxReconnectAttempts){r.error("[WebSocket] \u91CD\u8FDE\u6B21\u6570\u5DF2\u8FBE\u4E0A\u9650\uFF0C\u653E\u5F03\u91CD\u8FDE"),this.emit("reconnectFailed");return}if(this.reconnectTimer)return;this.reconnectAttempts++;const t=Math.min(this.config.reconnectInterval*Math.pow(2,this.reconnectAttempts-1),this.config.reconnectMaxInterval??S),s=Math.random()*(this.config.reconnectJitterMs??b),n=Math.round(t+s),o=e?`\u7B2C ${this.reconnectAttempts}/${this.config.maxReconnectAttempts} \u6B21`:`\u7B2C ${this.reconnectAttempts} \u6B21\uFF08\u65E0\u9650\u91CD\u8BD5\u6A21\u5F0F\uFF09`;r.warn(`[WebSocket] ${n}ms \u540E\u5C1D\u8BD5${o}\u91CD\u8FDE (base=${Math.round(t)}ms, jitter=+${Math.round(s)}ms)...`),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.agentId&&this.connect(this.agentId).catch(i=>{const a=i instanceof Error?i.message:String(i),h=i instanceof Error?i.stack:void 0;r.warn("[WebSocket] \u91CD\u8FDE\u5931\u8D25 (attempt #%s), \u7EE7\u7EED\u91CD\u8BD5: %s",this.reconnectAttempts,a),h&&r.warn("[WebSocket] \u91CD\u8FDE\u5931\u8D25\u5806\u6808:",h.slice(0,2e3)),this.scheduleReconnect()})},n)}clearReconnectTimer(){this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null)}}export{_ as WebSocketClient};
|
|
2
2
|
|