@hashgraphonline/conversational-agent 0.2.216 → 0.2.218
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/cli/readme.md +181 -0
- package/dist/cjs/index.cjs +1 -1
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/plugins/community/swarm/SwarmPlugin.d.ts +17 -0
- package/dist/cjs/plugins/community/swarm/__tests__/SwarmPlugin.mocks.d.ts +1 -0
- package/dist/cjs/plugins/community/swarm/__tests__/SwarmPlugin.test.d.ts +1 -0
- package/dist/cjs/plugins/community/swarm/__tests__/tools/CreatePostageStampTool.test.d.ts +1 -0
- package/dist/cjs/plugins/community/swarm/__tests__/tools/DownloadDataTool.test.d.ts +1 -0
- package/dist/cjs/plugins/community/swarm/__tests__/tools/DownloadFilesTool.test.d.ts +1 -0
- package/dist/cjs/plugins/community/swarm/__tests__/tools/ExtendPostageStampTool.test.d.ts +1 -0
- package/dist/cjs/plugins/community/swarm/__tests__/tools/GetPostageStampTool.test.d.ts +1 -0
- package/dist/cjs/plugins/community/swarm/__tests__/tools/ListPostageStampsTool.test.d.ts +1 -0
- package/dist/cjs/plugins/community/swarm/__tests__/tools/QueryUploadProgressTool.test.d.ts +1 -0
- package/dist/cjs/plugins/community/swarm/__tests__/tools/ReadFeedTool.test.d.ts +1 -0
- package/dist/cjs/plugins/community/swarm/__tests__/tools/SwarmTool.mocks.d.ts +14 -0
- package/dist/cjs/plugins/community/swarm/__tests__/tools/UpdateFeedTool.test.d.ts +1 -0
- package/dist/cjs/plugins/community/swarm/__tests__/tools/UploadDataTool.test.d.ts +1 -0
- package/dist/cjs/plugins/community/swarm/__tests__/tools/UploadFileTool.test.d.ts +1 -0
- package/dist/cjs/plugins/community/swarm/__tests__/tools/UploadFolderTool.test.d.ts +1 -0
- package/dist/cjs/plugins/community/swarm/config.d.ts +6 -0
- package/dist/cjs/plugins/community/swarm/constants.d.ts +8 -0
- package/dist/cjs/plugins/community/swarm/index.d.ts +2 -0
- package/dist/cjs/plugins/community/swarm/model.d.ts +23 -0
- package/dist/cjs/plugins/community/swarm/tools/CreatePostageStampTool.d.ts +47 -0
- package/dist/cjs/plugins/community/swarm/tools/DownloadDataTool.d.ts +35 -0
- package/dist/cjs/plugins/community/swarm/tools/DownloadFilesTool.d.ts +41 -0
- package/dist/cjs/plugins/community/swarm/tools/ExtendPostageStampTool.d.ts +47 -0
- package/dist/cjs/plugins/community/swarm/tools/GetPostageStampTool.d.ts +35 -0
- package/dist/cjs/plugins/community/swarm/tools/ListPostageStampsTool.d.ts +53 -0
- package/dist/cjs/plugins/community/swarm/tools/QueryUploadProgressTool.d.ts +35 -0
- package/dist/cjs/plugins/community/swarm/tools/ReadFeedTool.d.ts +41 -0
- package/dist/cjs/plugins/community/swarm/tools/UpdateFeedTool.d.ts +47 -0
- package/dist/cjs/plugins/community/swarm/tools/UploadDataTool.d.ts +47 -0
- package/dist/cjs/plugins/community/swarm/tools/UploadFileTool.d.ts +53 -0
- package/dist/cjs/plugins/community/swarm/tools/UploadFolderTool.d.ts +47 -0
- package/dist/cjs/plugins/community/swarm/utils.d.ts +22 -0
- package/dist/cjs/plugins/index.d.ts +1 -0
- package/dist/esm/index.js +33 -31
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index10.js +13 -677
- package/dist/esm/index10.js.map +1 -1
- package/dist/esm/index11.js +601 -234
- package/dist/esm/index11.js.map +1 -1
- package/dist/esm/index12.js +296 -136
- package/dist/esm/index12.js.map +1 -1
- package/dist/esm/index13.js +127 -235
- package/dist/esm/index13.js.map +1 -1
- package/dist/esm/index14.js +247 -84
- package/dist/esm/index14.js.map +1 -1
- package/dist/esm/index15.js +81 -159
- package/dist/esm/index15.js.map +1 -1
- package/dist/esm/index16.js +155 -229
- package/dist/esm/index16.js.map +1 -1
- package/dist/esm/index17.js +238 -140
- package/dist/esm/index17.js.map +1 -1
- package/dist/esm/index18.js +139 -493
- package/dist/esm/index18.js.map +1 -1
- package/dist/esm/index19.js +479 -91
- package/dist/esm/index19.js.map +1 -1
- package/dist/esm/index20.js +88 -147
- package/dist/esm/index20.js.map +1 -1
- package/dist/esm/index21.js +127 -666
- package/dist/esm/index21.js.map +1 -1
- package/dist/esm/index22.js +698 -44
- package/dist/esm/index22.js.map +1 -1
- package/dist/esm/index23.js +45 -304
- package/dist/esm/index23.js.map +1 -1
- package/dist/esm/index24.js +303 -153
- package/dist/esm/index24.js.map +1 -1
- package/dist/esm/index25.js +150 -117
- package/dist/esm/index25.js.map +1 -1
- package/dist/esm/index26.js +154 -18
- package/dist/esm/index26.js.map +1 -1
- package/dist/esm/index27.js +18 -22
- package/dist/esm/index27.js.map +1 -1
- package/dist/esm/index28.js +15 -74
- package/dist/esm/index28.js.map +1 -1
- package/dist/esm/index29.js +70 -295
- package/dist/esm/index29.js.map +1 -1
- package/dist/esm/index30.js +279 -100
- package/dist/esm/index30.js.map +1 -1
- package/dist/esm/index31.js +86 -922
- package/dist/esm/index31.js.map +1 -1
- package/dist/esm/index32.js +904 -189
- package/dist/esm/index32.js.map +1 -1
- package/dist/esm/index33.js +185 -1169
- package/dist/esm/index33.js.map +1 -1
- package/dist/esm/index34.js +1218 -112
- package/dist/esm/index34.js.map +1 -1
- package/dist/esm/index35.js +111 -99
- package/dist/esm/index35.js.map +1 -1
- package/dist/esm/index36.js +113 -8
- package/dist/esm/index36.js.map +1 -1
- package/dist/esm/index37.js +8 -45
- package/dist/esm/index37.js.map +1 -1
- package/dist/esm/index38.js +41 -102
- package/dist/esm/index38.js.map +1 -1
- package/dist/esm/index39.js +96 -55
- package/dist/esm/index39.js.map +1 -1
- package/dist/esm/index4.js +1 -1
- package/dist/esm/index40.js +58 -71
- package/dist/esm/index40.js.map +1 -1
- package/dist/esm/index41.js +79 -21
- package/dist/esm/index41.js.map +1 -1
- package/dist/esm/index42.js +21 -5
- package/dist/esm/index42.js.map +1 -1
- package/dist/esm/index43.js +26 -11
- package/dist/esm/index43.js.map +1 -1
- package/dist/esm/index44.js +12 -322
- package/dist/esm/index44.js.map +1 -1
- package/dist/esm/index45.js +66 -173
- package/dist/esm/index45.js.map +1 -1
- package/dist/esm/index46.js +69 -24
- package/dist/esm/index46.js.map +1 -1
- package/dist/esm/index47.js +47 -88
- package/dist/esm/index47.js.map +1 -1
- package/dist/esm/index48.js +100 -7
- package/dist/esm/index48.js.map +1 -1
- package/dist/esm/index49.js +79 -0
- package/dist/esm/index49.js.map +1 -0
- package/dist/esm/index5.js +2 -2
- package/dist/esm/index50.js +75 -0
- package/dist/esm/index50.js.map +1 -0
- package/dist/esm/index51.js +124 -0
- package/dist/esm/index51.js.map +1 -0
- package/dist/esm/index52.js +58 -0
- package/dist/esm/index52.js.map +1 -0
- package/dist/esm/index53.js +83 -0
- package/dist/esm/index53.js.map +1 -0
- package/dist/esm/index54.js +100 -0
- package/dist/esm/index54.js.map +1 -0
- package/dist/esm/index55.js +118 -0
- package/dist/esm/index55.js.map +1 -0
- package/dist/esm/index56.js +108 -0
- package/dist/esm/index56.js.map +1 -0
- package/dist/esm/index57.js +8 -0
- package/dist/esm/index57.js.map +1 -0
- package/dist/esm/index58.js +325 -0
- package/dist/esm/index58.js.map +1 -0
- package/dist/esm/index59.js +187 -0
- package/dist/esm/index59.js.map +1 -0
- package/dist/esm/index6.js +132 -833
- package/dist/esm/index6.js.map +1 -1
- package/dist/esm/index60.js +10 -0
- package/dist/esm/index60.js.map +1 -0
- package/dist/esm/index61.js +98 -0
- package/dist/esm/index61.js.map +1 -0
- package/dist/esm/index62.js +131 -0
- package/dist/esm/index62.js.map +1 -0
- package/dist/esm/index63.js +19 -0
- package/dist/esm/index63.js.map +1 -0
- package/dist/esm/index7.js +826 -75
- package/dist/esm/index7.js.map +1 -1
- package/dist/esm/index8.js +91 -13
- package/dist/esm/index8.js.map +1 -1
- package/dist/esm/index9.js +13 -17
- package/dist/esm/index9.js.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/plugins/community/swarm/SwarmPlugin.d.ts +17 -0
- package/dist/types/plugins/community/swarm/__tests__/SwarmPlugin.mocks.d.ts +1 -0
- package/dist/types/plugins/community/swarm/__tests__/SwarmPlugin.test.d.ts +1 -0
- package/dist/types/plugins/community/swarm/__tests__/tools/CreatePostageStampTool.test.d.ts +1 -0
- package/dist/types/plugins/community/swarm/__tests__/tools/DownloadDataTool.test.d.ts +1 -0
- package/dist/types/plugins/community/swarm/__tests__/tools/DownloadFilesTool.test.d.ts +1 -0
- package/dist/types/plugins/community/swarm/__tests__/tools/ExtendPostageStampTool.test.d.ts +1 -0
- package/dist/types/plugins/community/swarm/__tests__/tools/GetPostageStampTool.test.d.ts +1 -0
- package/dist/types/plugins/community/swarm/__tests__/tools/ListPostageStampsTool.test.d.ts +1 -0
- package/dist/types/plugins/community/swarm/__tests__/tools/QueryUploadProgressTool.test.d.ts +1 -0
- package/dist/types/plugins/community/swarm/__tests__/tools/ReadFeedTool.test.d.ts +1 -0
- package/dist/types/plugins/community/swarm/__tests__/tools/SwarmTool.mocks.d.ts +14 -0
- package/dist/types/plugins/community/swarm/__tests__/tools/UpdateFeedTool.test.d.ts +1 -0
- package/dist/types/plugins/community/swarm/__tests__/tools/UploadDataTool.test.d.ts +1 -0
- package/dist/types/plugins/community/swarm/__tests__/tools/UploadFileTool.test.d.ts +1 -0
- package/dist/types/plugins/community/swarm/__tests__/tools/UploadFolderTool.test.d.ts +1 -0
- package/dist/types/plugins/community/swarm/config.d.ts +6 -0
- package/dist/types/plugins/community/swarm/constants.d.ts +8 -0
- package/dist/types/plugins/community/swarm/index.d.ts +2 -0
- package/dist/types/plugins/community/swarm/model.d.ts +23 -0
- package/dist/types/plugins/community/swarm/tools/CreatePostageStampTool.d.ts +47 -0
- package/dist/types/plugins/community/swarm/tools/DownloadDataTool.d.ts +35 -0
- package/dist/types/plugins/community/swarm/tools/DownloadFilesTool.d.ts +41 -0
- package/dist/types/plugins/community/swarm/tools/ExtendPostageStampTool.d.ts +47 -0
- package/dist/types/plugins/community/swarm/tools/GetPostageStampTool.d.ts +35 -0
- package/dist/types/plugins/community/swarm/tools/ListPostageStampsTool.d.ts +53 -0
- package/dist/types/plugins/community/swarm/tools/QueryUploadProgressTool.d.ts +35 -0
- package/dist/types/plugins/community/swarm/tools/ReadFeedTool.d.ts +41 -0
- package/dist/types/plugins/community/swarm/tools/UpdateFeedTool.d.ts +47 -0
- package/dist/types/plugins/community/swarm/tools/UploadDataTool.d.ts +47 -0
- package/dist/types/plugins/community/swarm/tools/UploadFileTool.d.ts +53 -0
- package/dist/types/plugins/community/swarm/tools/UploadFolderTool.d.ts +47 -0
- package/dist/types/plugins/community/swarm/utils.d.ts +22 -0
- package/dist/types/plugins/index.d.ts +1 -0
- package/package.json +37 -27
- package/src/index.ts +1 -0
- package/src/plugins/community/swarm/README.md +279 -0
- package/src/plugins/community/swarm/SwarmPlugin.ts +178 -0
- package/src/plugins/community/swarm/__tests__/SwarmPlugin.mocks.ts +105 -0
- package/src/plugins/community/swarm/__tests__/SwarmPlugin.test.ts +93 -0
- package/src/plugins/community/swarm/__tests__/tools/CreatePostageStampTool.test.ts +152 -0
- package/src/plugins/community/swarm/__tests__/tools/DownloadDataTool.test.ts +93 -0
- package/src/plugins/community/swarm/__tests__/tools/DownloadFilesTool.test.ts +163 -0
- package/src/plugins/community/swarm/__tests__/tools/ExtendPostageStampTool.test.ts +132 -0
- package/src/plugins/community/swarm/__tests__/tools/GetPostageStampTool.test.ts +83 -0
- package/src/plugins/community/swarm/__tests__/tools/ListPostageStampsTool.test.ts +219 -0
- package/src/plugins/community/swarm/__tests__/tools/QueryUploadProgressTool.test.ts +169 -0
- package/src/plugins/community/swarm/__tests__/tools/ReadFeedTool.test.ts +133 -0
- package/src/plugins/community/swarm/__tests__/tools/SwarmTool.mocks.ts +67 -0
- package/src/plugins/community/swarm/__tests__/tools/UpdateFeedTool.test.ts +148 -0
- package/src/plugins/community/swarm/__tests__/tools/UploadDataTool.test.ts +125 -0
- package/src/plugins/community/swarm/__tests__/tools/UploadFileTool.test.ts +194 -0
- package/src/plugins/community/swarm/__tests__/tools/UploadFolderTool.test.ts +118 -0
- package/src/plugins/community/swarm/config.ts +6 -0
- package/src/plugins/community/swarm/constants.ts +12 -0
- package/src/plugins/community/swarm/index.ts +2 -0
- package/src/plugins/community/swarm/model.ts +23 -0
- package/src/plugins/community/swarm/tools/CreatePostageStampTool.ts +137 -0
- package/src/plugins/community/swarm/tools/DownloadDataTool.ts +79 -0
- package/src/plugins/community/swarm/tools/DownloadFilesTool.ts +155 -0
- package/src/plugins/community/swarm/tools/ExtendPostageStampTool.ts +112 -0
- package/src/plugins/community/swarm/tools/GetPostageStampTool.ts +92 -0
- package/src/plugins/community/swarm/tools/ListPostageStampsTool.ts +124 -0
- package/src/plugins/community/swarm/tools/QueryUploadProgressTool.ts +109 -0
- package/src/plugins/community/swarm/tools/ReadFeedTool.ts +110 -0
- package/src/plugins/community/swarm/tools/UpdateFeedTool.ts +149 -0
- package/src/plugins/community/swarm/tools/UploadDataTool.ts +109 -0
- package/src/plugins/community/swarm/tools/UploadFileTool.ts +163 -0
- package/src/plugins/community/swarm/tools/UploadFolderTool.ts +150 -0
- package/src/plugins/community/swarm/utils.ts +172 -0
- package/src/plugins/index.ts +1 -0
- package/cli/dist/CLIApp.d.ts +0 -11
- package/cli/dist/CLIApp.d.ts.map +0 -1
- package/cli/dist/CLIApp.js +0 -128
- package/cli/dist/CLIApp.js.map +0 -1
- package/cli/dist/LocalConversationalAgent.d.ts +0 -37
- package/cli/dist/LocalConversationalAgent.js +0 -58
- package/cli/dist/app.d.ts +0 -18
- package/cli/dist/app.d.ts.map +0 -1
- package/cli/dist/app.js +0 -14
- package/cli/dist/app.js.map +0 -1
- package/cli/dist/cli.d.ts +0 -3
- package/cli/dist/cli.d.ts.map +0 -1
- package/cli/dist/cli.js +0 -87
- package/cli/dist/cli.js.map +0 -1
- package/cli/dist/components/AppContainer.d.ts +0 -16
- package/cli/dist/components/AppContainer.js +0 -24
- package/cli/dist/components/AppScreens.d.ts +0 -2
- package/cli/dist/components/AppScreens.js +0 -259
- package/cli/dist/components/ChatScreen.d.ts +0 -21
- package/cli/dist/components/ChatScreen.d.ts.map +0 -1
- package/cli/dist/components/ChatScreen.js +0 -40
- package/cli/dist/components/ChatScreen.js.map +0 -1
- package/cli/dist/components/DebugLoadingScreen.d.ts +0 -5
- package/cli/dist/components/DebugLoadingScreen.js +0 -31
- package/cli/dist/components/LoadingScreen.d.ts +0 -3
- package/cli/dist/components/LoadingScreen.d.ts.map +0 -1
- package/cli/dist/components/LoadingScreen.js +0 -17
- package/cli/dist/components/LoadingScreen.js.map +0 -1
- package/cli/dist/components/LoadingScreenDebug.d.ts +0 -5
- package/cli/dist/components/LoadingScreenDebug.js +0 -27
- package/cli/dist/components/MCPConfigScreen.d.ts +0 -28
- package/cli/dist/components/MCPConfigScreen.d.ts.map +0 -1
- package/cli/dist/components/MCPConfigScreen.js +0 -186
- package/cli/dist/components/MCPConfigScreen.js.map +0 -1
- package/cli/dist/components/ScreenRouter.d.ts +0 -13
- package/cli/dist/components/ScreenRouter.d.ts.map +0 -1
- package/cli/dist/components/ScreenRouter.js +0 -23
- package/cli/dist/components/ScreenRouter.js.map +0 -1
- package/cli/dist/components/SetupScreen.d.ts +0 -16
- package/cli/dist/components/SetupScreen.d.ts.map +0 -1
- package/cli/dist/components/SetupScreen.js +0 -67
- package/cli/dist/components/SetupScreen.js.map +0 -1
- package/cli/dist/components/SingleLoadingScreen.d.ts +0 -5
- package/cli/dist/components/SingleLoadingScreen.js +0 -27
- package/cli/dist/components/StatusBadge.d.ts +0 -10
- package/cli/dist/components/StatusBadge.d.ts.map +0 -1
- package/cli/dist/components/StatusBadge.js +0 -24
- package/cli/dist/components/StatusBadge.js.map +0 -1
- package/cli/dist/components/TerminalWindow.d.ts +0 -9
- package/cli/dist/components/TerminalWindow.d.ts.map +0 -1
- package/cli/dist/components/TerminalWindow.js +0 -19
- package/cli/dist/components/TerminalWindow.js.map +0 -1
- package/cli/dist/components/WelcomeScreen.d.ts +0 -12
- package/cli/dist/components/WelcomeScreen.d.ts.map +0 -1
- package/cli/dist/components/WelcomeScreen.js +0 -47
- package/cli/dist/components/WelcomeScreen.js.map +0 -1
- package/cli/dist/context/AppContext.d.ts +0 -68
- package/cli/dist/context/AppContext.js +0 -363
- package/cli/dist/headless-runner.d.ts +0 -17
- package/cli/dist/headless-runner.d.ts.map +0 -1
- package/cli/dist/headless-runner.js +0 -128
- package/cli/dist/headless-runner.js.map +0 -1
- package/cli/dist/hooks/useInitializeAgent.d.ts +0 -19
- package/cli/dist/hooks/useInitializeAgent.d.ts.map +0 -1
- package/cli/dist/hooks/useInitializeAgent.js +0 -29
- package/cli/dist/hooks/useInitializeAgent.js.map +0 -1
- package/cli/dist/hooks/useStableState.d.ts +0 -38
- package/cli/dist/hooks/useStableState.d.ts.map +0 -1
- package/cli/dist/hooks/useStableState.js +0 -69
- package/cli/dist/hooks/useStableState.js.map +0 -1
- package/cli/dist/managers/AgentManager.d.ts +0 -58
- package/cli/dist/managers/AgentManager.d.ts.map +0 -1
- package/cli/dist/managers/AgentManager.js +0 -121
- package/cli/dist/managers/AgentManager.js.map +0 -1
- package/cli/dist/managers/ConfigManager.d.ts +0 -54
- package/cli/dist/managers/ConfigManager.d.ts.map +0 -1
- package/cli/dist/managers/ConfigManager.js +0 -188
- package/cli/dist/managers/ConfigManager.js.map +0 -1
- package/cli/dist/types.d.ts +0 -52
- package/cli/dist/types.d.ts.map +0 -1
- package/cli/dist/types.js +0 -34
- package/cli/dist/types.js.map +0 -1
package/dist/esm/index14.js
CHANGED
|
@@ -1,104 +1,267 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
transport: "stdio",
|
|
10
|
-
autoConnect: true,
|
|
11
|
-
additionalContext: "This server provides access to files and directories in the current working directory.",
|
|
12
|
-
toolDescriptions: {
|
|
13
|
-
list_directory: 'Use this tool when users ask about files in the "current directory" or "working directory".',
|
|
14
|
-
read_file: "Use this tool when users ask to see or check files in the current directory."
|
|
15
|
-
}
|
|
16
|
-
}),
|
|
1
|
+
import { Logger } from "@hashgraphonline/standards-sdk";
|
|
2
|
+
class FieldGuidanceRegistry {
|
|
3
|
+
constructor() {
|
|
4
|
+
this.configurations = [];
|
|
5
|
+
this.providers = [];
|
|
6
|
+
this.registerOrderCounter = 0;
|
|
7
|
+
this.logger = new Logger({ module: "FieldGuidanceRegistry" });
|
|
8
|
+
}
|
|
17
9
|
/**
|
|
18
|
-
*
|
|
10
|
+
* Register field guidance for a specific tool
|
|
19
11
|
*/
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
args: ["-y", "@modelcontextprotocol/server-github"],
|
|
24
|
-
...token && { env: { GITHUB_TOKEN: token } },
|
|
25
|
-
transport: "stdio",
|
|
26
|
-
autoConnect: true
|
|
27
|
-
}),
|
|
12
|
+
registerToolConfiguration(config) {
|
|
13
|
+
this.configurations.push(config);
|
|
14
|
+
}
|
|
28
15
|
/**
|
|
29
|
-
*
|
|
16
|
+
* Register a provider for dynamic field/global guidance
|
|
30
17
|
*/
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
18
|
+
registerToolProvider(toolPattern, provider, options) {
|
|
19
|
+
const id = options?.id ?? `provider-${this.providers.length + 1}`;
|
|
20
|
+
const priority = options?.priority ?? 0;
|
|
21
|
+
if (this.providers.some((p) => p.id === id)) {
|
|
22
|
+
this.logger.error("Duplicate provider id", { id });
|
|
23
|
+
throw new Error("DUPLICATE_PROVIDER_ID");
|
|
24
|
+
}
|
|
25
|
+
this.providers.push({
|
|
26
|
+
id,
|
|
27
|
+
priority,
|
|
28
|
+
pattern: toolPattern,
|
|
29
|
+
provider,
|
|
30
|
+
order: this.registerOrderCounter++
|
|
31
|
+
});
|
|
32
|
+
return id;
|
|
33
|
+
}
|
|
34
|
+
/** Unregister a provider by id */
|
|
35
|
+
unregisterProvider(id) {
|
|
36
|
+
this.providers = this.providers.filter((p) => p.id !== id);
|
|
37
|
+
}
|
|
38
|
+
/** List registered providers */
|
|
39
|
+
listProviders() {
|
|
40
|
+
return this.providers.map(({ id, priority, pattern }) => ({
|
|
41
|
+
id,
|
|
42
|
+
priority,
|
|
43
|
+
pattern
|
|
44
|
+
}));
|
|
45
|
+
}
|
|
39
46
|
/**
|
|
40
|
-
*
|
|
47
|
+
* Get field guidance for a specific tool and field
|
|
41
48
|
*/
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
49
|
+
getFieldGuidance(toolName, fieldName) {
|
|
50
|
+
if (process.env.CA_FORM_GUIDANCE_ENABLED === "false") {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
for (const config of this.configurations) {
|
|
54
|
+
const matches = typeof config.toolPattern === "string" ? toolName.toLowerCase().includes(config.toolPattern.toLowerCase()) : config.toolPattern.test(toolName);
|
|
55
|
+
if (matches && config.fields[fieldName]) {
|
|
56
|
+
const staticGuidance = config.fields[fieldName];
|
|
57
|
+
const providers2 = this.pickMatchingProviders(toolName);
|
|
58
|
+
if (providers2.length === 0) return staticGuidance;
|
|
59
|
+
let merged = { ...staticGuidance };
|
|
60
|
+
for (const p of [...providers2].reverse()) {
|
|
61
|
+
const fromProvider = this.safeGetFieldGuidance(
|
|
62
|
+
p,
|
|
63
|
+
fieldName,
|
|
64
|
+
toolName
|
|
65
|
+
);
|
|
66
|
+
if (fromProvider) {
|
|
67
|
+
merged = this.mergeGuidance(merged, fromProvider);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return merged;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const providers = this.pickMatchingProviders(toolName);
|
|
74
|
+
if (providers.length > 0) {
|
|
75
|
+
let merged = {};
|
|
76
|
+
for (const p of [...providers].reverse()) {
|
|
77
|
+
const g = this.safeGetFieldGuidance(p, fieldName, toolName);
|
|
78
|
+
if (g) merged = this.mergeGuidance(merged, g);
|
|
79
|
+
}
|
|
80
|
+
return Object.keys(merged).length > 0 ? merged : null;
|
|
81
|
+
}
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
50
84
|
/**
|
|
51
|
-
*
|
|
85
|
+
* Get global guidance for a tool
|
|
52
86
|
*/
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
87
|
+
getGlobalGuidance(toolName) {
|
|
88
|
+
if (process.env.CA_FORM_GUIDANCE_ENABLED === "false") {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
for (const config of this.configurations) {
|
|
92
|
+
const matches = typeof config.toolPattern === "string" ? toolName.toLowerCase().includes(config.toolPattern.toLowerCase()) : config.toolPattern.test(toolName);
|
|
93
|
+
if (matches && config.globalGuidance) {
|
|
94
|
+
const base = config.globalGuidance;
|
|
95
|
+
const providers2 = this.pickMatchingProviders(toolName);
|
|
96
|
+
if (providers2.length === 0) return base;
|
|
97
|
+
let mergedWarnings = base.warnings;
|
|
98
|
+
let mergedQuality = base.qualityStandards;
|
|
99
|
+
for (const p of [...providers2].reverse()) {
|
|
100
|
+
const fromProvider = this.safeGetGlobalGuidance(p, toolName);
|
|
101
|
+
if (fromProvider) {
|
|
102
|
+
mergedWarnings = fromProvider.warnings ?? mergedWarnings;
|
|
103
|
+
mergedQuality = fromProvider.qualityStandards ?? mergedQuality;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const result = {};
|
|
107
|
+
if (mergedWarnings !== void 0) result.warnings = mergedWarnings;
|
|
108
|
+
if (mergedQuality !== void 0)
|
|
109
|
+
result.qualityStandards = mergedQuality;
|
|
110
|
+
return result;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
const providers = this.pickMatchingProviders(toolName);
|
|
114
|
+
if (providers.length > 0) {
|
|
115
|
+
let mergedWarnings;
|
|
116
|
+
let mergedQuality;
|
|
117
|
+
for (const p of [...providers].reverse()) {
|
|
118
|
+
const g = this.safeGetGlobalGuidance(p, toolName);
|
|
119
|
+
if (g) {
|
|
120
|
+
mergedWarnings = g.warnings ?? mergedWarnings;
|
|
121
|
+
mergedQuality = g.qualityStandards ?? mergedQuality;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
const result = {};
|
|
125
|
+
if (mergedWarnings !== void 0) result.warnings = mergedWarnings;
|
|
126
|
+
if (mergedQuality !== void 0) result.qualityStandards = mergedQuality;
|
|
127
|
+
return Object.keys(result).length > 0 ? result : null;
|
|
128
|
+
}
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
60
131
|
/**
|
|
61
|
-
*
|
|
132
|
+
* Validate field value against guidance rules
|
|
62
133
|
*/
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
134
|
+
validateFieldValue(toolName, fieldName, value) {
|
|
135
|
+
const guidance = this.getFieldGuidance(toolName, fieldName);
|
|
136
|
+
const warnings = [];
|
|
137
|
+
const errors = [];
|
|
138
|
+
if (!guidance || typeof value !== "string") {
|
|
139
|
+
return { isValid: true, warnings, errors };
|
|
140
|
+
}
|
|
141
|
+
if (guidance.warnings) {
|
|
142
|
+
for (const warning of guidance.warnings) {
|
|
143
|
+
if (warning.pattern.test(value)) {
|
|
144
|
+
warnings.push(warning.message);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (guidance.validationRules) {
|
|
149
|
+
const { rejectPatterns, qualityChecks } = guidance.validationRules;
|
|
150
|
+
if (rejectPatterns) {
|
|
151
|
+
for (const reject of rejectPatterns) {
|
|
152
|
+
if (reject.pattern.test(value)) {
|
|
153
|
+
errors.push(`Rejected: ${reject.reason}`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
if (qualityChecks) {
|
|
158
|
+
if (qualityChecks.forbidTechnicalTerms) {
|
|
159
|
+
const lowerValue = value.toLowerCase();
|
|
160
|
+
for (const term of qualityChecks.forbidTechnicalTerms) {
|
|
161
|
+
if (lowerValue.includes(term.toLowerCase())) {
|
|
162
|
+
errors.push(
|
|
163
|
+
`Avoid technical terms like "${term}" in NFT metadata`
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
if (qualityChecks.requireSpecificTerms) {
|
|
169
|
+
const lowerValue = value.toLowerCase();
|
|
170
|
+
const hasRequired = qualityChecks.requireSpecificTerms.some(
|
|
171
|
+
(term) => lowerValue.includes(term.toLowerCase())
|
|
172
|
+
);
|
|
173
|
+
if (!hasRequired) {
|
|
174
|
+
warnings.push(
|
|
175
|
+
`Consider including terms like: ${qualityChecks.requireSpecificTerms.join(
|
|
176
|
+
", "
|
|
177
|
+
)}`
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
if (qualityChecks.minNonTechnicalWords) {
|
|
182
|
+
const words = value.split(/\s+/).filter((word) => word.length > 2);
|
|
183
|
+
if (words.length < qualityChecks.minNonTechnicalWords) {
|
|
184
|
+
warnings.push(
|
|
185
|
+
`Consider providing more descriptive content (at least ${qualityChecks.minNonTechnicalWords} meaningful words)`
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return {
|
|
192
|
+
isValid: errors.length === 0,
|
|
193
|
+
warnings,
|
|
194
|
+
errors
|
|
195
|
+
};
|
|
196
|
+
}
|
|
70
197
|
/**
|
|
71
|
-
*
|
|
198
|
+
* Clear all configurations (useful for testing)
|
|
72
199
|
*/
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
200
|
+
clear() {
|
|
201
|
+
this.configurations = [];
|
|
202
|
+
this.providers = [];
|
|
203
|
+
this.registerOrderCounter = 0;
|
|
204
|
+
}
|
|
205
|
+
/** Choose matching provider by priority then last-in wins */
|
|
206
|
+
pickMatchingProviders(toolName) {
|
|
207
|
+
const matches = this.providers.filter(
|
|
208
|
+
(p) => typeof p.pattern === "string" ? toolName.toLowerCase().includes(p.pattern.toLowerCase()) : p.pattern.test(toolName)
|
|
209
|
+
);
|
|
210
|
+
const sorted = matches.sort((a, b) => {
|
|
211
|
+
if (b.priority !== a.priority) return b.priority - a.priority;
|
|
212
|
+
return b.order - a.order;
|
|
213
|
+
});
|
|
214
|
+
return sorted.map((m) => ({
|
|
215
|
+
id: m.id,
|
|
216
|
+
provider: m.provider,
|
|
217
|
+
priority: m.priority,
|
|
218
|
+
order: m.order
|
|
219
|
+
}));
|
|
79
220
|
}
|
|
80
|
-
|
|
81
|
-
|
|
221
|
+
safeGetFieldGuidance(winner, fieldName, toolName) {
|
|
222
|
+
try {
|
|
223
|
+
return winner.provider.getFieldGuidance(fieldName, { toolName }) ?? null;
|
|
224
|
+
} catch (err) {
|
|
225
|
+
this.logger.warn("Provider getFieldGuidance failed", {
|
|
226
|
+
id: winner.id,
|
|
227
|
+
err
|
|
228
|
+
});
|
|
229
|
+
return null;
|
|
230
|
+
}
|
|
82
231
|
}
|
|
83
|
-
|
|
84
|
-
|
|
232
|
+
safeGetGlobalGuidance(winner, toolName) {
|
|
233
|
+
try {
|
|
234
|
+
return winner.provider.getGlobalGuidance?.(toolName) ?? null;
|
|
235
|
+
} catch (err) {
|
|
236
|
+
this.logger.warn("Provider getGlobalGuidance failed", {
|
|
237
|
+
id: winner.id,
|
|
238
|
+
err
|
|
239
|
+
});
|
|
240
|
+
return null;
|
|
241
|
+
}
|
|
85
242
|
}
|
|
86
|
-
|
|
87
|
-
|
|
243
|
+
mergeGuidance(base, over) {
|
|
244
|
+
const out = {};
|
|
245
|
+
const suggestions = over.suggestions ?? base.suggestions;
|
|
246
|
+
if (suggestions !== void 0) out.suggestions = suggestions;
|
|
247
|
+
const predefinedOptions = over.predefinedOptions ?? base.predefinedOptions;
|
|
248
|
+
if (predefinedOptions !== void 0)
|
|
249
|
+
out.predefinedOptions = predefinedOptions;
|
|
250
|
+
const warnings = over.warnings ?? base.warnings;
|
|
251
|
+
if (warnings !== void 0) out.warnings = warnings;
|
|
252
|
+
const validationRules = over.validationRules ?? base.validationRules;
|
|
253
|
+
if (validationRules !== void 0) out.validationRules = validationRules;
|
|
254
|
+
const fieldTypeOverride = over.fieldTypeOverride ?? base.fieldTypeOverride;
|
|
255
|
+
if (fieldTypeOverride !== void 0)
|
|
256
|
+
out.fieldTypeOverride = fieldTypeOverride;
|
|
257
|
+
const contextualHelpText = over.contextualHelpText ?? base.contextualHelpText;
|
|
258
|
+
if (contextualHelpText !== void 0)
|
|
259
|
+
out.contextualHelpText = contextualHelpText;
|
|
260
|
+
return out;
|
|
88
261
|
}
|
|
89
|
-
return errors;
|
|
90
|
-
}
|
|
91
|
-
function createMCPConfig(servers, autoConnect = true) {
|
|
92
|
-
return {
|
|
93
|
-
mcpServers: servers.map((server) => ({
|
|
94
|
-
...server,
|
|
95
|
-
autoConnect: server.autoConnect ?? autoConnect
|
|
96
|
-
}))
|
|
97
|
-
};
|
|
98
262
|
}
|
|
263
|
+
const fieldGuidanceRegistry = new FieldGuidanceRegistry();
|
|
99
264
|
export {
|
|
100
|
-
|
|
101
|
-
createMCPConfig,
|
|
102
|
-
validateServerConfig
|
|
265
|
+
fieldGuidanceRegistry
|
|
103
266
|
};
|
|
104
267
|
//# sourceMappingURL=index14.js.map
|
package/dist/esm/index14.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index14.js","sources":["../../src/mcp/helpers.ts"],"sourcesContent":["import type { MCPServerConfig } from './types';\n\n/**\n * Common MCP server configurations for easy setup\n */\nexport const MCPServers = {\n /**\n * Filesystem server for file operations\n */\n filesystem: (path: string): MCPServerConfig => ({\n name: 'filesystem',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-filesystem', path],\n transport: 'stdio',\n autoConnect: true,\n additionalContext: 'This server provides access to files and directories in the current working directory.',\n toolDescriptions: {\n list_directory: 'Use this tool when users ask about files in the \"current directory\" or \"working directory\".',\n read_file: 'Use this tool when users ask to see or check files in the current directory.',\n },\n }),\n\n /**\n * GitHub server for repository operations\n */\n github: (token?: string): MCPServerConfig => ({\n name: 'github',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-github'],\n ...(token && { env: { GITHUB_TOKEN: token } }),\n transport: 'stdio',\n autoConnect: true,\n }),\n\n /**\n * Slack server for messaging operations\n */\n slack: (token: string): MCPServerConfig => ({\n name: 'slack',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-slack'],\n env: { SLACK_TOKEN: token },\n transport: 'stdio',\n autoConnect: true,\n }),\n\n /**\n * Google Drive server for document operations\n */\n googleDrive: (credentials: string): MCPServerConfig => ({\n name: 'google-drive',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-google-drive'],\n env: { GOOGLE_CREDENTIALS: credentials },\n transport: 'stdio',\n autoConnect: true,\n }),\n\n /**\n * PostgreSQL server for database operations\n */\n postgres: (connectionString: string): MCPServerConfig => ({\n name: 'postgres',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-postgres', connectionString],\n transport: 'stdio',\n autoConnect: true,\n }),\n\n /**\n * SQLite server for database operations\n */\n sqlite: (dbPath: string): MCPServerConfig => ({\n name: 'sqlite',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-sqlite', dbPath],\n transport: 'stdio',\n autoConnect: true,\n }),\n\n /**\n * Custom server configuration\n */\n custom: (config: MCPServerConfig): MCPServerConfig => config,\n};\n\n/**\n * Validate MCP server configuration\n */\nexport function validateServerConfig(config: MCPServerConfig): string[] {\n const errors: string[] = [];\n\n if (!config.name) {\n errors.push('Server name is required');\n }\n\n if (!config.command) {\n errors.push('Server command is required');\n }\n\n if (!config.args || !Array.isArray(config.args)) {\n errors.push('Server args must be an array');\n }\n\n if (config.transport && !['stdio', 'http', 'websocket'].includes(config.transport)) {\n errors.push('Invalid transport type. Must be stdio, http, or websocket');\n }\n\n return errors;\n}\n\n/**\n * Create a typed MCP configuration for ConversationalAgent\n */\nexport function createMCPConfig(servers: MCPServerConfig[], autoConnect = true): { mcpServers: MCPServerConfig[] } {\n return {\n mcpServers: servers.map(server => ({\n ...server,\n autoConnect: server.autoConnect ?? autoConnect,\n })),\n };\n}"],"names":[],"mappings":"AAKO,MAAM,aAAa;AAAA;AAAA;AAAA;AAAA,EAIxB,YAAY,CAAC,UAAmC;AAAA,IAC9C,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,MAAM,2CAA2C,IAAI;AAAA,IAC5D,WAAW;AAAA,IACX,aAAa;AAAA,IACb,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,MAChB,gBAAgB;AAAA,MAChB,WAAW;AAAA,IAAA;AAAA,EACb;AAAA;AAAA;AAAA;AAAA,EAMF,QAAQ,CAAC,WAAqC;AAAA,IAC5C,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,MAAM,qCAAqC;AAAA,IAClD,GAAI,SAAS,EAAE,KAAK,EAAE,cAAc,QAAM;AAAA,IAC1C,WAAW;AAAA,IACX,aAAa;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMf,OAAO,CAAC,WAAoC;AAAA,IAC1C,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,MAAM,oCAAoC;AAAA,IACjD,KAAK,EAAE,aAAa,MAAA;AAAA,IACpB,WAAW;AAAA,IACX,aAAa;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMf,aAAa,CAAC,iBAA0C;AAAA,IACtD,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,MAAM,2CAA2C;AAAA,IACxD,KAAK,EAAE,oBAAoB,YAAA;AAAA,IAC3B,WAAW;AAAA,IACX,aAAa;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMf,UAAU,CAAC,sBAA+C;AAAA,IACxD,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,MAAM,yCAAyC,gBAAgB;AAAA,IACtE,WAAW;AAAA,IACX,aAAa;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMf,QAAQ,CAAC,YAAqC;AAAA,IAC5C,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,MAAM,uCAAuC,MAAM;AAAA,IAC1D,WAAW;AAAA,IACX,aAAa;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMf,QAAQ,CAAC,WAA6C;AACxD;AAKO,SAAS,qBAAqB,QAAmC;AACtE,QAAM,SAAmB,CAAA;AAEzB,MAAI,CAAC,OAAO,MAAM;AAChB,WAAO,KAAK,yBAAyB;AAAA,EACvC;AAEA,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,KAAK,4BAA4B;AAAA,EAC1C;AAEA,MAAI,CAAC,OAAO,QAAQ,CAAC,MAAM,QAAQ,OAAO,IAAI,GAAG;AAC/C,WAAO,KAAK,8BAA8B;AAAA,EAC5C;AAEA,MAAI,OAAO,aAAa,CAAC,CAAC,SAAS,QAAQ,WAAW,EAAE,SAAS,OAAO,SAAS,GAAG;AAClF,WAAO,KAAK,2DAA2D;AAAA,EACzE;AAEA,SAAO;AACT;AAKO,SAAS,gBAAgB,SAA4B,cAAc,MAAyC;AACjH,SAAO;AAAA,IACL,YAAY,QAAQ,IAAI,CAAA,YAAW;AAAA,MACjC,GAAG;AAAA,MACH,aAAa,OAAO,eAAe;AAAA,IAAA,EACnC;AAAA,EAAA;AAEN;"}
|
|
1
|
+
{"version":3,"file":"index14.js","sources":["../../src/forms/field-guidance-registry.ts"],"sourcesContent":["import type { FormFieldType, FieldOption } from './types';\nimport { Logger } from '@hashgraphonline/standards-sdk';\n\n/**\n * Field guidance configuration for providing contextual help and suggestions\n */\nexport interface FieldGuidance {\n /**\n * Suggestions to show as placeholder or examples\n */\n suggestions?: string[];\n\n /**\n * Predefined options for select fields\n */\n predefinedOptions?: FieldOption[];\n\n /**\n * Warning messages for specific patterns to avoid\n */\n warnings?: {\n pattern: RegExp;\n message: string;\n }[];\n\n /**\n * Validation rules specific to the field context\n */\n validationRules?: {\n /**\n * Patterns that should be rejected\n */\n rejectPatterns?: {\n pattern: RegExp;\n reason: string;\n }[];\n\n /**\n * Minimum quality requirements\n */\n qualityChecks?: {\n minNonTechnicalWords?: number;\n requireSpecificTerms?: string[];\n forbidTechnicalTerms?: string[];\n };\n };\n\n /**\n * Field type override for specific contexts\n */\n fieldTypeOverride?: FormFieldType;\n\n /**\n * Help text specific to the tool context\n */\n contextualHelpText?: string;\n}\n\n/**\n * Tool-specific field configurations\n */\nexport interface ToolFieldConfiguration {\n /**\n * Tool name or pattern to match\n */\n toolPattern: string | RegExp;\n\n /**\n * Field-specific guidance\n */\n fields: Record<string, FieldGuidance>;\n\n /**\n * Global guidance for all fields in this tool\n */\n globalGuidance?: {\n /**\n * General warnings to show\n */\n warnings?: string[];\n\n /**\n * Quality standards for this tool\n */\n qualityStandards?: string[];\n };\n}\n\n/**\n * Registry for field guidance configurations\n */\nclass FieldGuidanceRegistry {\n private configurations: ToolFieldConfiguration[] = [];\n private providers: Array<{\n id: string;\n priority: number;\n pattern: string | RegExp;\n provider: FieldGuidanceProvider;\n order: number;\n }> = [];\n private registerOrderCounter = 0;\n private logger: Logger;\n\n constructor() {\n this.logger = new Logger({ module: 'FieldGuidanceRegistry' });\n }\n\n /**\n * Register field guidance for a specific tool\n */\n registerToolConfiguration(config: ToolFieldConfiguration): void {\n this.configurations.push(config);\n }\n\n /**\n * Register a provider for dynamic field/global guidance\n */\n registerToolProvider(\n toolPattern: string | RegExp,\n provider: FieldGuidanceProvider,\n options?: { id?: string; priority?: number }\n ): string {\n const id = options?.id ?? `provider-${this.providers.length + 1}`;\n const priority = options?.priority ?? 0;\n if (this.providers.some((p) => p.id === id)) {\n this.logger.error('Duplicate provider id', { id });\n throw new Error('DUPLICATE_PROVIDER_ID');\n }\n this.providers.push({\n id,\n priority,\n pattern: toolPattern,\n provider,\n order: this.registerOrderCounter++,\n });\n return id;\n }\n\n /** Unregister a provider by id */\n unregisterProvider(id: string): void {\n this.providers = this.providers.filter((p) => p.id !== id);\n }\n\n /** List registered providers */\n listProviders(): Array<{\n id: string;\n priority: number;\n pattern: string | RegExp;\n }> {\n return this.providers.map(({ id, priority, pattern }) => ({\n id,\n priority,\n pattern,\n }));\n }\n\n /**\n * Get field guidance for a specific tool and field\n */\n getFieldGuidance(toolName: string, fieldName: string): FieldGuidance | null {\n if (process.env.CA_FORM_GUIDANCE_ENABLED === 'false') {\n return null;\n }\n for (const config of this.configurations) {\n const matches =\n typeof config.toolPattern === 'string'\n ? toolName.toLowerCase().includes(config.toolPattern.toLowerCase())\n : config.toolPattern.test(toolName);\n\n if (matches && config.fields[fieldName]) {\n const staticGuidance = config.fields[fieldName];\n const providers = this.pickMatchingProviders(toolName);\n if (providers.length === 0) return staticGuidance;\n let merged: FieldGuidance = { ...staticGuidance };\n for (const p of [...providers].reverse()) {\n const fromProvider = this.safeGetFieldGuidance(\n p,\n fieldName,\n toolName\n );\n if (fromProvider) {\n merged = this.mergeGuidance(merged, fromProvider);\n }\n }\n return merged;\n }\n }\n const providers = this.pickMatchingProviders(toolName);\n if (providers.length > 0) {\n let merged: FieldGuidance = {};\n for (const p of [...providers].reverse()) {\n const g = this.safeGetFieldGuidance(p, fieldName, toolName);\n if (g) merged = this.mergeGuidance(merged, g);\n }\n return Object.keys(merged).length > 0 ? merged : null;\n }\n return null;\n }\n\n /**\n * Get global guidance for a tool\n */\n getGlobalGuidance(\n toolName: string\n ): ToolFieldConfiguration['globalGuidance'] | null {\n if (process.env.CA_FORM_GUIDANCE_ENABLED === 'false') {\n return null;\n }\n for (const config of this.configurations) {\n const matches =\n typeof config.toolPattern === 'string'\n ? toolName.toLowerCase().includes(config.toolPattern.toLowerCase())\n : config.toolPattern.test(toolName);\n\n if (matches && config.globalGuidance) {\n const base = config.globalGuidance;\n const providers = this.pickMatchingProviders(toolName);\n if (providers.length === 0) return base;\n let mergedWarnings: string[] | undefined = base.warnings;\n let mergedQuality: string[] | undefined = base.qualityStandards;\n for (const p of [...providers].reverse()) {\n const fromProvider = this.safeGetGlobalGuidance(p, toolName);\n if (fromProvider) {\n mergedWarnings = fromProvider.warnings ?? mergedWarnings;\n mergedQuality = fromProvider.qualityStandards ?? mergedQuality;\n }\n }\n const result: NonNullable<ToolFieldConfiguration['globalGuidance']> =\n {};\n if (mergedWarnings !== undefined) result.warnings = mergedWarnings;\n if (mergedQuality !== undefined)\n result.qualityStandards = mergedQuality;\n return result;\n }\n }\n const providers = this.pickMatchingProviders(toolName);\n if (providers.length > 0) {\n let mergedWarnings: string[] | undefined;\n let mergedQuality: string[] | undefined;\n for (const p of [...providers].reverse()) {\n const g = this.safeGetGlobalGuidance(p, toolName);\n if (g) {\n mergedWarnings = g.warnings ?? mergedWarnings;\n mergedQuality = g.qualityStandards ?? mergedQuality;\n }\n }\n const result: NonNullable<ToolFieldConfiguration['globalGuidance']> = {};\n if (mergedWarnings !== undefined) result.warnings = mergedWarnings;\n if (mergedQuality !== undefined) result.qualityStandards = mergedQuality;\n return Object.keys(result).length > 0 ? result : null;\n }\n return null;\n }\n\n /**\n * Validate field value against guidance rules\n */\n validateFieldValue(\n toolName: string,\n fieldName: string,\n value: unknown\n ): {\n isValid: boolean;\n warnings: string[];\n errors: string[];\n } {\n const guidance = this.getFieldGuidance(toolName, fieldName);\n const warnings: string[] = [];\n const errors: string[] = [];\n\n if (!guidance || typeof value !== 'string') {\n return { isValid: true, warnings, errors };\n }\n\n if (guidance.warnings) {\n for (const warning of guidance.warnings) {\n if (warning.pattern.test(value)) {\n warnings.push(warning.message);\n }\n }\n }\n\n if (guidance.validationRules) {\n const { rejectPatterns, qualityChecks } = guidance.validationRules;\n\n if (rejectPatterns) {\n for (const reject of rejectPatterns) {\n if (reject.pattern.test(value)) {\n errors.push(`Rejected: ${reject.reason}`);\n }\n }\n }\n\n if (qualityChecks) {\n if (qualityChecks.forbidTechnicalTerms) {\n const lowerValue = value.toLowerCase();\n for (const term of qualityChecks.forbidTechnicalTerms) {\n if (lowerValue.includes(term.toLowerCase())) {\n errors.push(\n `Avoid technical terms like \"${term}\" in NFT metadata`\n );\n }\n }\n }\n\n if (qualityChecks.requireSpecificTerms) {\n const lowerValue = value.toLowerCase();\n const hasRequired = qualityChecks.requireSpecificTerms.some((term) =>\n lowerValue.includes(term.toLowerCase())\n );\n if (!hasRequired) {\n warnings.push(\n `Consider including terms like: ${qualityChecks.requireSpecificTerms.join(\n ', '\n )}`\n );\n }\n }\n\n if (qualityChecks.minNonTechnicalWords) {\n const words = value.split(/\\s+/).filter((word) => word.length > 2);\n if (words.length < qualityChecks.minNonTechnicalWords) {\n warnings.push(\n `Consider providing more descriptive content (at least ${qualityChecks.minNonTechnicalWords} meaningful words)`\n );\n }\n }\n }\n }\n\n return {\n isValid: errors.length === 0,\n warnings,\n errors,\n };\n }\n\n /**\n * Clear all configurations (useful for testing)\n */\n clear(): void {\n this.configurations = [];\n this.providers = [];\n this.registerOrderCounter = 0;\n }\n\n /** Choose matching provider by priority then last-in wins */\n private pickMatchingProviders(toolName: string): Array<{\n id: string;\n provider: FieldGuidanceProvider;\n priority: number;\n order: number;\n }> {\n const matches = this.providers.filter((p) =>\n typeof p.pattern === 'string'\n ? toolName.toLowerCase().includes((p.pattern as string).toLowerCase())\n : (p.pattern as RegExp).test(toolName)\n );\n const sorted = matches.sort((a, b) => {\n if (b.priority !== a.priority) return b.priority - a.priority;\n return b.order - a.order; // last-in wins when equal priority\n });\n return sorted.map((m) => ({\n id: m.id,\n provider: m.provider,\n priority: m.priority,\n order: m.order,\n }));\n }\n\n private safeGetFieldGuidance(\n winner: { id: string; provider: FieldGuidanceProvider },\n fieldName: string,\n toolName: string\n ): FieldGuidance | null {\n try {\n return winner.provider.getFieldGuidance(fieldName, { toolName }) ?? null;\n } catch (err) {\n this.logger.warn('Provider getFieldGuidance failed', {\n id: winner.id,\n err,\n });\n return null;\n }\n }\n\n private safeGetGlobalGuidance(\n winner: { id: string; provider: FieldGuidanceProvider },\n toolName: string\n ): ToolFieldConfiguration['globalGuidance'] | null {\n try {\n return winner.provider.getGlobalGuidance?.(toolName) ?? null;\n } catch (err) {\n this.logger.warn('Provider getGlobalGuidance failed', {\n id: winner.id,\n err,\n });\n return null;\n }\n }\n\n private mergeGuidance(\n base: FieldGuidance,\n over: FieldGuidance\n ): FieldGuidance {\n const out: FieldGuidance = {};\n const suggestions = over.suggestions ?? base.suggestions;\n if (suggestions !== undefined) out.suggestions = suggestions;\n const predefinedOptions = over.predefinedOptions ?? base.predefinedOptions;\n if (predefinedOptions !== undefined)\n out.predefinedOptions = predefinedOptions;\n const warnings = over.warnings ?? base.warnings;\n if (warnings !== undefined) out.warnings = warnings;\n const validationRules = over.validationRules ?? base.validationRules;\n if (validationRules !== undefined) out.validationRules = validationRules;\n const fieldTypeOverride = over.fieldTypeOverride ?? base.fieldTypeOverride;\n if (fieldTypeOverride !== undefined)\n out.fieldTypeOverride = fieldTypeOverride;\n const contextualHelpText =\n over.contextualHelpText ?? base.contextualHelpText;\n if (contextualHelpText !== undefined)\n out.contextualHelpText = contextualHelpText;\n return out;\n }\n}\n\nexport const fieldGuidanceRegistry = new FieldGuidanceRegistry();\n\n/**\n * Provider interface (optional, for dynamic guidance)\n */\nexport interface FieldGuidanceProvider {\n getFieldGuidance(\n fieldName: string,\n ctx: { toolName: string }\n ): FieldGuidance | null;\n getGlobalGuidance?(\n toolName: string\n ): ToolFieldConfiguration['globalGuidance'] | null;\n}\n"],"names":["providers"],"mappings":"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"}
|