@microsoft/teamsfx-core 3.0.14-alpha.36cd4ecbcb.0 → 3.0.14-alpha.3f4824bc25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/client/teamsDevPortalClient.d.ts +7 -2
- package/build/client/teamsDevPortalClient.d.ts.map +1 -1
- package/build/client/teamsDevPortalClient.js +63 -59
- package/build/client/teamsDevPortalClient.js.map +1 -1
- package/build/client/teamsGraphClient.d.ts +3 -3
- package/build/client/teamsGraphClient.d.ts.map +1 -1
- package/build/client/teamsGraphClient.js +3 -3
- package/build/client/teamsGraphClient.js.map +1 -1
- package/build/common/daSpecParser.d.ts +16 -1
- package/build/common/daSpecParser.d.ts.map +1 -1
- package/build/common/daSpecParser.js +34 -21
- package/build/common/daSpecParser.js.map +1 -1
- package/build/common/featureFlags.d.ts +10 -0
- package/build/common/featureFlags.d.ts.map +1 -1
- package/build/common/featureFlags.js +17 -1
- package/build/common/featureFlags.js.map +1 -1
- package/build/common/fetchHelper.d.ts.map +1 -1
- package/build/common/fetchHelper.js +41 -3
- package/build/common/fetchHelper.js.map +1 -1
- package/build/common/kiotaClient.d.ts +3 -3
- package/build/common/kiotaClient.d.ts.map +1 -1
- package/build/common/kiotaClient.js +10 -10
- package/build/common/kiotaClient.js.map +1 -1
- package/build/common/telemetry.js +2 -2
- package/build/common/telemetry.js.map +1 -1
- package/build/common/templates-config.json +2 -2
- package/build/common/tools.d.ts +6 -1
- package/build/common/tools.d.ts.map +1 -1
- package/build/common/tools.js +13 -8
- package/build/common/tools.js.map +1 -1
- package/build/common/wrappedAxiosClient.d.ts +1 -1
- package/build/common/wrappedAxiosClient.d.ts.map +1 -1
- package/build/common/wrappedAxiosClient.js +12 -13
- package/build/common/wrappedAxiosClient.js.map +1 -1
- package/build/component/configManager/actionInjector.d.ts +16 -1
- package/build/component/configManager/actionInjector.d.ts.map +1 -1
- package/build/component/configManager/actionInjector.js +106 -1
- package/build/component/configManager/actionInjector.js.map +1 -1
- package/build/component/coordinator/index.d.ts +4 -0
- package/build/component/coordinator/index.d.ts.map +1 -1
- package/build/component/coordinator/index.js +5 -2
- package/build/component/coordinator/index.js.map +1 -1
- package/build/component/deps-checker/internal/funcToolChecker.d.ts +6 -0
- package/build/component/deps-checker/internal/funcToolChecker.d.ts.map +1 -1
- package/build/component/deps-checker/internal/funcToolChecker.js +15 -12
- package/build/component/deps-checker/internal/funcToolChecker.js.map +1 -1
- package/build/component/deps-checker/internal/nodeChecker.js +1 -1
- package/build/component/deps-checker/internal/nodeChecker.js.map +1 -1
- package/build/component/deps-checker/internal/testToolChecker.d.ts +12 -0
- package/build/component/deps-checker/internal/testToolChecker.d.ts.map +1 -1
- package/build/component/deps-checker/internal/testToolChecker.js +23 -14
- package/build/component/deps-checker/internal/testToolChecker.js.map +1 -1
- package/build/component/developerPortalScaffoldUtils.d.ts +11 -1
- package/build/component/developerPortalScaffoldUtils.d.ts.map +1 -1
- package/build/component/developerPortalScaffoldUtils.js +21 -12
- package/build/component/developerPortalScaffoldUtils.js.map +1 -1
- package/build/component/driver/aad/utility/aadManifestHelper.d.ts +1 -1
- package/build/component/driver/aad/utility/aadManifestHelper.d.ts.map +1 -1
- package/build/component/driver/aad/utility/aadManifestHelper.js +7 -4
- package/build/component/driver/aad/utility/aadManifestHelper.js.map +1 -1
- package/build/component/driver/add/addWebPart.d.ts +9 -0
- package/build/component/driver/add/addWebPart.d.ts.map +1 -1
- package/build/component/driver/add/addWebPart.js +13 -7
- package/build/component/driver/add/addWebPart.js.map +1 -1
- package/build/component/driver/arm/util/handleError.d.ts +5 -0
- package/build/component/driver/arm/util/handleError.d.ts.map +1 -1
- package/build/component/driver/arm/util/handleError.js +10 -5
- package/build/component/driver/arm/util/handleError.js.map +1 -1
- package/build/component/driver/deploy/azure/azureStaticWebAppGetDeploymentTokenDriver.d.ts +8 -1
- package/build/component/driver/deploy/azure/azureStaticWebAppGetDeploymentTokenDriver.d.ts.map +1 -1
- package/build/component/driver/deploy/azure/azureStaticWebAppGetDeploymentTokenDriver.js +15 -10
- package/build/component/driver/deploy/azure/azureStaticWebAppGetDeploymentTokenDriver.js.map +1 -1
- package/build/component/driver/devTool/httpClient.d.ts +4 -0
- package/build/component/driver/devTool/httpClient.d.ts.map +1 -1
- package/build/component/driver/devTool/httpClient.js +6 -3
- package/build/component/driver/devTool/httpClient.js.map +1 -1
- package/build/component/driver/m365/acquire.d.ts +13 -1
- package/build/component/driver/m365/acquire.d.ts.map +1 -1
- package/build/component/driver/m365/acquire.js +16 -8
- package/build/component/driver/m365/acquire.js.map +1 -1
- package/build/component/driver/oauth/update.d.ts +6 -0
- package/build/component/driver/oauth/update.d.ts.map +1 -1
- package/build/component/driver/oauth/update.js +8 -4
- package/build/component/driver/oauth/update.js.map +1 -1
- package/build/component/driver/script/scriptDriver.d.ts +6 -0
- package/build/component/driver/script/scriptDriver.d.ts.map +1 -1
- package/build/component/driver/script/scriptDriver.js +9 -4
- package/build/component/driver/script/scriptDriver.js.map +1 -1
- package/build/component/driver/share/utils.d.ts.map +1 -1
- package/build/component/driver/share/utils.js +9 -7
- package/build/component/driver/share/utils.js.map +1 -1
- package/build/component/driver/teamsApp/constants.d.ts +3 -3
- package/build/component/driver/teamsApp/constants.d.ts.map +1 -1
- package/build/component/driver/teamsApp/constants.js +3 -3
- package/build/component/driver/teamsApp/constants.js.map +1 -1
- package/build/component/driver/teamsApp/createAppPackage.d.ts +6 -0
- package/build/component/driver/teamsApp/createAppPackage.d.ts.map +1 -1
- package/build/component/driver/teamsApp/createAppPackage.js +47 -11
- package/build/component/driver/teamsApp/createAppPackage.js.map +1 -1
- package/build/component/driver/teamsApp/interfaces/ValidationResult.d.ts +6 -0
- package/build/component/driver/teamsApp/interfaces/ValidationResult.d.ts.map +1 -1
- package/build/component/driver/teamsApp/publishAppPackage.d.ts +4 -0
- package/build/component/driver/teamsApp/publishAppPackage.d.ts.map +1 -1
- package/build/component/driver/teamsApp/publishAppPackage.js +8 -5
- package/build/component/driver/teamsApp/publishAppPackage.js.map +1 -1
- package/build/component/driver/teamsApp/syncManifest.d.ts +16 -3
- package/build/component/driver/teamsApp/syncManifest.d.ts.map +1 -1
- package/build/component/driver/teamsApp/syncManifest.js +28 -18
- package/build/component/driver/teamsApp/syncManifest.js.map +1 -1
- package/build/component/driver/teamsApp/teamsappMgr.d.ts +4 -0
- package/build/component/driver/teamsApp/teamsappMgr.d.ts.map +1 -1
- package/build/component/driver/teamsApp/teamsappMgr.js +6 -3
- package/build/component/driver/teamsApp/teamsappMgr.js.map +1 -1
- package/build/component/driver/teamsApp/utils/CopilotGptManifestUtils.d.ts +2 -0
- package/build/component/driver/teamsApp/utils/CopilotGptManifestUtils.d.ts.map +1 -1
- package/build/component/driver/teamsApp/utils/CopilotGptManifestUtils.js +113 -1
- package/build/component/driver/teamsApp/utils/CopilotGptManifestUtils.js.map +1 -1
- package/build/component/driver/teamsApp/utils/ManifestUtils.d.ts +4 -0
- package/build/component/driver/teamsApp/utils/ManifestUtils.d.ts.map +1 -1
- package/build/component/driver/teamsApp/utils/ManifestUtils.js +5 -2
- package/build/component/driver/teamsApp/utils/ManifestUtils.js.map +1 -1
- package/build/component/driver/teamsApp/utils/McpCertVerification.d.ts +4 -0
- package/build/component/driver/teamsApp/utils/McpCertVerification.d.ts.map +1 -1
- package/build/component/driver/teamsApp/utils/McpCertVerification.js +12 -5
- package/build/component/driver/teamsApp/utils/McpCertVerification.js.map +1 -1
- package/build/component/driver/teamsApp/utils/telemetry.d.ts +1 -0
- package/build/component/driver/teamsApp/utils/telemetry.d.ts.map +1 -1
- package/build/component/driver/teamsApp/utils/telemetry.js +1 -0
- package/build/component/driver/teamsApp/utils/telemetry.js.map +1 -1
- package/build/component/driver/teamsApp/validate.d.ts.map +1 -1
- package/build/component/driver/teamsApp/validate.js +11 -1
- package/build/component/driver/teamsApp/validate.js.map +1 -1
- package/build/component/driver/teamsApp/validateTestCases.d.ts +12 -0
- package/build/component/driver/teamsApp/validateTestCases.d.ts.map +1 -1
- package/build/component/driver/teamsApp/validateTestCases.js +17 -8
- package/build/component/driver/teamsApp/validateTestCases.js.map +1 -1
- package/build/component/driver/typeSpec/compile.d.ts +9 -0
- package/build/component/driver/typeSpec/compile.d.ts.map +1 -1
- package/build/component/driver/typeSpec/compile.js +16 -10
- package/build/component/driver/typeSpec/compile.js.map +1 -1
- package/build/component/generator/declarativeAgent/generator.d.ts +8 -0
- package/build/component/generator/declarativeAgent/generator.d.ts.map +1 -1
- package/build/component/generator/declarativeAgent/generator.js +15 -8
- package/build/component/generator/declarativeAgent/generator.js.map +1 -1
- package/build/component/generator/declarativeAgent/helper.d.ts +31 -0
- package/build/component/generator/declarativeAgent/helper.d.ts.map +1 -1
- package/build/component/generator/declarativeAgent/helper.js +237 -34
- package/build/component/generator/declarativeAgent/helper.js.map +1 -1
- package/build/component/generator/defaultGenerator.js +2 -2
- package/build/component/generator/defaultGenerator.js.map +1 -1
- package/build/component/generator/generatorAction.d.ts +9 -0
- package/build/component/generator/generatorAction.d.ts.map +1 -1
- package/build/component/generator/generatorAction.js +16 -8
- package/build/component/generator/generatorAction.js.map +1 -1
- package/build/component/generator/officeAddin/generator.d.ts +4 -0
- package/build/component/generator/officeAddin/generator.d.ts.map +1 -1
- package/build/component/generator/officeAddin/generator.js +6 -3
- package/build/component/generator/officeAddin/generator.js.map +1 -1
- package/build/component/generator/officeAddin/helperMethods.d.ts +4 -0
- package/build/component/generator/officeAddin/helperMethods.d.ts.map +1 -1
- package/build/component/generator/officeAddin/helperMethods.js +6 -3
- package/build/component/generator/officeAddin/helperMethods.js.map +1 -1
- package/build/component/generator/openApiSpec/customEngineAgentGenerator.d.ts +9 -0
- package/build/component/generator/openApiSpec/customEngineAgentGenerator.d.ts.map +1 -1
- package/build/component/generator/openApiSpec/customEngineAgentGenerator.js +11 -5
- package/build/component/generator/openApiSpec/customEngineAgentGenerator.js.map +1 -1
- package/build/component/generator/spfx/utils/constants.d.ts +1 -1
- package/build/component/generator/spfx/utils/constants.js +1 -1
- package/build/component/generator/templates/metadata/index.js +5 -5
- package/build/component/generator/templates/metadata/index.js.map +1 -1
- package/build/component/generator/templates/templateNames.d.ts +2 -0
- package/build/component/generator/templates/templateNames.d.ts.map +1 -1
- package/build/component/generator/templates/templateNames.js +3 -0
- package/build/component/generator/templates/templateNames.js.map +1 -1
- package/build/component/generator/utils.js +8 -8
- package/build/component/generator/utils.js.map +1 -1
- package/build/component/generator/v4MetadataSource.d.ts +2 -2
- package/build/component/generator/v4MetadataSource.d.ts.map +1 -1
- package/build/component/generator/v4MetadataSource.js +6 -6
- package/build/component/generator/v4MetadataSource.js.map +1 -1
- package/build/component/generator/v4TemplateBridge.d.ts +11 -0
- package/build/component/generator/v4TemplateBridge.d.ts.map +1 -1
- package/build/component/generator/v4TemplateBridge.js +17 -6
- package/build/component/generator/v4TemplateBridge.js.map +1 -1
- package/build/component/local/localCertificateManager.d.ts +17 -1
- package/build/component/local/localCertificateManager.d.ts.map +1 -1
- package/build/component/local/localCertificateManager.js +48 -31
- package/build/component/local/localCertificateManager.js.map +1 -1
- package/build/component/m365/packageService.d.ts +5 -0
- package/build/component/m365/packageService.d.ts.map +1 -1
- package/build/component/m365/packageService.js +32 -12
- package/build/component/m365/packageService.js.map +1 -1
- package/build/component/middleware/envMW.d.ts.map +1 -1
- package/build/component/middleware/envMW.js +5 -0
- package/build/component/middleware/envMW.js.map +1 -1
- package/build/component/utils/ResourceGroupHelper.d.ts +4 -0
- package/build/component/utils/ResourceGroupHelper.d.ts.map +1 -1
- package/build/component/utils/ResourceGroupHelper.js +7 -4
- package/build/component/utils/ResourceGroupHelper.js.map +1 -1
- package/build/component/utils/charsetUtils.js +3 -3
- package/build/component/utils/charsetUtils.js.map +1 -1
- package/build/component/utils/fileOperation.d.ts +10 -0
- package/build/component/utils/fileOperation.d.ts.map +1 -1
- package/build/component/utils/fileOperation.js +27 -17
- package/build/component/utils/fileOperation.js.map +1 -1
- package/build/component/utils/mcpAuthScaffolder.d.ts +106 -0
- package/build/component/utils/mcpAuthScaffolder.d.ts.map +1 -0
- package/build/component/utils/mcpAuthScaffolder.js +153 -0
- package/build/component/utils/mcpAuthScaffolder.js.map +1 -0
- package/build/component/utils/mcpToolFetcher.d.ts +12 -1
- package/build/component/utils/mcpToolFetcher.d.ts.map +1 -1
- package/build/component/utils/mcpToolFetcher.js +23 -3
- package/build/component/utils/mcpToolFetcher.js.map +1 -1
- package/build/component/utils/metadataGraphPermssion.d.ts +4 -0
- package/build/component/utils/metadataGraphPermssion.d.ts.map +1 -1
- package/build/component/utils/metadataGraphPermssion.js +7 -4
- package/build/component/utils/metadataGraphPermssion.js.map +1 -1
- package/build/component/utils/odrProvider.d.ts +6 -0
- package/build/component/utils/odrProvider.d.ts.map +1 -1
- package/build/component/utils/odrProvider.js +9 -4
- package/build/component/utils/odrProvider.js.map +1 -1
- package/build/core/FxCore.d.ts +44 -0
- package/build/core/FxCore.d.ts.map +1 -1
- package/build/core/FxCore.declarativeAgent.d.ts +9 -0
- package/build/core/FxCore.declarativeAgent.d.ts.map +1 -1
- package/build/core/FxCore.declarativeAgent.js +299 -181
- package/build/core/FxCore.declarativeAgent.js.map +1 -1
- package/build/core/FxCore.js +394 -66
- package/build/core/FxCore.js.map +1 -1
- package/build/core/FxCore.openPlugin.d.ts +6 -0
- package/build/core/FxCore.openPlugin.d.ts.map +1 -1
- package/build/core/FxCore.openPlugin.js +8 -4
- package/build/core/FxCore.openPlugin.js.map +1 -1
- package/build/core/collaborator.d.ts +4 -0
- package/build/core/collaborator.d.ts.map +1 -1
- package/build/core/collaborator.js +6 -3
- package/build/core/collaborator.js.map +1 -1
- package/build/core/middleware/concurrentLocker.d.ts +9 -0
- package/build/core/middleware/concurrentLocker.d.ts.map +1 -1
- package/build/core/middleware/concurrentLocker.js +14 -8
- package/build/core/middleware/concurrentLocker.js.map +1 -1
- package/build/core/middleware/fileLocker.d.ts +6 -0
- package/build/core/middleware/fileLocker.d.ts.map +1 -1
- package/build/core/middleware/fileLocker.js +11 -6
- package/build/core/middleware/fileLocker.js.map +1 -1
- package/build/error/teamsApp.d.ts +3 -0
- package/build/error/teamsApp.d.ts.map +1 -1
- package/build/error/teamsApp.js +15 -1
- package/build/error/teamsApp.js.map +1 -1
- package/build/question/create.d.ts +8 -1
- package/build/question/create.d.ts.map +1 -1
- package/build/question/create.js +24 -15
- package/build/question/create.js.map +1 -1
- package/build/question/index.d.ts +1 -0
- package/build/question/index.d.ts.map +1 -1
- package/build/question/index.js +3 -0
- package/build/question/index.js.map +1 -1
- package/build/question/inputs/AddPluginInputs.d.ts +1 -1
- package/build/question/inputs/AddPluginInputs.d.ts.map +1 -1
- package/build/question/inputs/AddSkillInputs.d.ts +10 -0
- package/build/question/inputs/AddSkillInputs.d.ts.map +1 -0
- package/build/question/inputs/AddSkillInputs.js +5 -0
- package/build/question/inputs/AddSkillInputs.js.map +1 -0
- package/build/question/inputs/CreateProjectInputs.d.ts +7 -1
- package/build/question/inputs/CreateProjectInputs.d.ts.map +1 -1
- package/build/question/inputs/index.d.ts +1 -0
- package/build/question/inputs/index.d.ts.map +1 -1
- package/build/question/inputs/index.js +1 -0
- package/build/question/inputs/index.js.map +1 -1
- package/build/question/options/AddPluginOptions.js +1 -1
- package/build/question/options/AddPluginOptions.js.map +1 -1
- package/build/question/options/AddSkillOptions.d.ts +4 -0
- package/build/question/options/AddSkillOptions.d.ts.map +1 -0
- package/build/question/options/AddSkillOptions.js +47 -0
- package/build/question/options/AddSkillOptions.js.map +1 -0
- package/build/question/options/CreateProjectOptions.d.ts.map +1 -1
- package/build/question/options/CreateProjectOptions.js +17 -2
- package/build/question/options/CreateProjectOptions.js.map +1 -1
- package/build/question/options/index.d.ts +1 -0
- package/build/question/options/index.d.ts.map +1 -1
- package/build/question/options/index.js +1 -0
- package/build/question/options/index.js.map +1 -1
- package/build/question/other.d.ts +1 -0
- package/build/question/other.d.ts.map +1 -1
- package/build/question/other.js +152 -35
- package/build/question/other.js.map +1 -1
- package/build/question/questionNames.d.ts +10 -1
- package/build/question/questionNames.d.ts.map +1 -1
- package/build/question/questionNames.js +9 -0
- package/build/question/questionNames.js.map +1 -1
- package/build/question/scaffold/vsc/CapabilityOptions.d.ts +1 -0
- package/build/question/scaffold/vsc/CapabilityOptions.d.ts.map +1 -1
- package/build/question/scaffold/vsc/CapabilityOptions.js +11 -0
- package/build/question/scaffold/vsc/CapabilityOptions.js.map +1 -1
- package/build/question/scaffold/vsc/ProjectTypeOptions.d.ts +2 -0
- package/build/question/scaffold/vsc/ProjectTypeOptions.d.ts.map +1 -1
- package/build/question/scaffold/vsc/ProjectTypeOptions.js +9 -0
- package/build/question/scaffold/vsc/ProjectTypeOptions.js.map +1 -1
- package/build/question/scaffold/vsc/rootNode.d.ts.map +1 -1
- package/build/question/scaffold/vsc/rootNode.js +6 -4
- package/build/question/scaffold/vsc/rootNode.js.map +1 -1
- package/build/question/scaffold/vsc/teamsProjectTypeNode.d.ts +33 -0
- package/build/question/scaffold/vsc/teamsProjectTypeNode.d.ts.map +1 -1
- package/build/question/scaffold/vsc/teamsProjectTypeNode.js +160 -37
- package/build/question/scaffold/vsc/teamsProjectTypeNode.js.map +1 -1
- package/build/question/share.d.ts +7 -0
- package/build/question/share.d.ts.map +1 -1
- package/build/question/share.js +7 -3
- package/build/question/share.js.map +1 -1
- package/build/v4/distribution/templateConfig.d.ts +36 -10
- package/build/v4/distribution/templateConfig.d.ts.map +1 -1
- package/build/v4/distribution/templateConfig.js +47 -9
- package/build/v4/distribution/templateConfig.js.map +1 -1
- package/package.json +18 -79
- package/resource/package.nls.cs.json +57 -4
- package/resource/package.nls.de.json +57 -4
- package/resource/package.nls.es.json +57 -4
- package/resource/package.nls.fr.json +57 -4
- package/resource/package.nls.it.json +57 -4
- package/resource/package.nls.ja.json +57 -4
- package/resource/package.nls.json +54 -1
- package/resource/package.nls.ko.json +57 -4
- package/resource/package.nls.pl.json +57 -4
- package/resource/package.nls.pt-BR.json +57 -4
- package/resource/package.nls.ru.json +57 -4
- package/resource/package.nls.tr.json +57 -4
- package/resource/package.nls.zh-Hans.json +57 -4
- package/resource/package.nls.zh-Hant.json +57 -4
- package/resource/templates/package.nls.cs.json +5 -0
- package/resource/templates/package.nls.de.json +5 -0
- package/resource/templates/package.nls.es.json +5 -0
- package/resource/templates/package.nls.fr.json +5 -0
- package/resource/templates/package.nls.it.json +5 -0
- package/resource/templates/package.nls.ja.json +5 -0
- package/resource/templates/package.nls.json +5 -0
- package/resource/templates/package.nls.ko.json +5 -0
- package/resource/templates/package.nls.pl.json +5 -0
- package/resource/templates/package.nls.pt-BR.json +5 -0
- package/resource/templates/package.nls.ru.json +5 -0
- package/resource/templates/package.nls.tr.json +5 -0
- package/resource/templates/package.nls.zh-Hans.json +5 -0
- package/resource/templates/package.nls.zh-Hant.json +5 -0
- package/templates/fallback/common.zip +0 -0
- package/templates/fallback/csharp.zip +0 -0
- package/templates/fallback/js.zip +0 -0
- package/templates/fallback/python.zip +0 -0
- package/templates/fallback/ts.zip +0 -0
- package/templates/metadata/allTemplates.json +16 -0
- package/templates/metadata/defaultGeneratorTemplates.json +8 -0
- package/templates/metadata.zip +0 -0
- package/templates/ui/tdpNode.json +7 -0
- package/templates/ui/wizardNode.json +33 -0
- package/templates/v4/floor.json +1 -1
- package/templates/v4/templates.zip +0 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Copyright (c) Microsoft Corporation.
|
|
3
3
|
// Licensed under the MIT license.
|
|
4
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
-
exports.FxCoreDeclarativeAgentPart = void 0;
|
|
5
|
+
exports.FxCoreDeclarativeAgentPart = exports.fxCoreDeclarativeAgentDeps = void 0;
|
|
6
6
|
const tslib_1 = require("tslib");
|
|
7
7
|
const hooks_1 = require("@feathersjs/hooks");
|
|
8
8
|
const m365_spec_parser_1 = require("@microsoft/m365-spec-parser");
|
|
@@ -14,7 +14,7 @@ const globalVars_1 = require("../common/globalVars");
|
|
|
14
14
|
const localizeUtils_1 = require("../common/localizeUtils");
|
|
15
15
|
const telemetry_1 = require("../common/telemetry");
|
|
16
16
|
const versionMetadata_1 = require("../common/versionMetadata");
|
|
17
|
-
const
|
|
17
|
+
const featureFlags_1 = require("../common/featureFlags");
|
|
18
18
|
const constants_1 = require("../component/constants");
|
|
19
19
|
const errors_1 = require("../component/driver/teamsApp/errors");
|
|
20
20
|
const results_1 = require("../component/driver/teamsApp/results");
|
|
@@ -26,7 +26,7 @@ const helper_1 = require("../component/generator/declarativeAgent/helper");
|
|
|
26
26
|
const helper_2 = require("../component/generator/openApiSpec/helper");
|
|
27
27
|
const questionMW_1 = require("../component/middleware/questionMW");
|
|
28
28
|
const common_1 = require("../component/utils/common");
|
|
29
|
-
const
|
|
29
|
+
const mcpAuthScaffolder_1 = require("../component/utils/mcpAuthScaffolder");
|
|
30
30
|
const pathUtils_1 = require("../component/utils/pathUtils");
|
|
31
31
|
const common_2 = require("../error/common");
|
|
32
32
|
const constants_2 = require("../question/constants");
|
|
@@ -35,6 +35,13 @@ const concurrentLocker_1 = require("./middleware/concurrentLocker");
|
|
|
35
35
|
const errorHandler_1 = require("./middleware/errorHandler");
|
|
36
36
|
// Non-translatable CLI command template used in warning messages
|
|
37
37
|
const mcpAddActionHint = "atk add action --api-plugin-type mcp --mcp-da-server-url <server-url> --mcp-tools-file-path <path-to-tools-json> --interactive false";
|
|
38
|
+
exports.fxCoreDeclarativeAgentDeps = {
|
|
39
|
+
addExistingPlugin: helper_1.addExistingPlugin,
|
|
40
|
+
createNewActionPluginManifest: helper_1.createNewActionPluginManifest,
|
|
41
|
+
deriveMCPServerNameFromUrl: helper_1.deriveMCPServerNameFromUrl,
|
|
42
|
+
generateFromApiSpec: helper_2.generateFromApiSpec,
|
|
43
|
+
generateScaffoldingSummary: helper_2.generateScaffoldingSummary,
|
|
44
|
+
};
|
|
38
45
|
class FxCoreDeclarativeAgentPart {
|
|
39
46
|
async updateActionWithMCP(inputs) {
|
|
40
47
|
const context = (0, globalVars_1.createContext)();
|
|
@@ -60,7 +67,7 @@ class FxCoreDeclarativeAgentPart {
|
|
|
60
67
|
return (0, teamsfx_api_1.err)(results_1.AppStudioResultFactory.UserError(errors_1.AppStudioError.TeamsAppRequiredPropertyMissingError.name, errors_1.AppStudioError.TeamsAppRequiredPropertyMissingError.message("declarativeAgents", teamsManifestPath)));
|
|
61
68
|
}
|
|
62
69
|
const declarativeAgentManifestPath = path.join(projectPath, teamsfx_api_1.AppPackageFolderName, declarativeAgentRelativePath);
|
|
63
|
-
const createRes = await
|
|
70
|
+
const createRes = await exports.fxCoreDeclarativeAgentDeps.createNewActionPluginManifest(projectPath, desiredFileName, declarativeAgentManifestPath);
|
|
64
71
|
if (createRes.isErr()) {
|
|
65
72
|
return (0, teamsfx_api_1.err)(createRes.error);
|
|
66
73
|
}
|
|
@@ -76,19 +83,12 @@ class FxCoreDeclarativeAgentPart {
|
|
|
76
83
|
const serverName = inputs[constants_2.QuestionNames.MCPForDAServerName];
|
|
77
84
|
const mcpAuth = inputs[constants_2.QuestionNames.MCPForDAAuth];
|
|
78
85
|
const authType = inputs[constants_2.QuestionNames.MCPForDAAuthType];
|
|
79
|
-
let
|
|
80
|
-
let oauthTokenUrl = undefined;
|
|
81
|
-
let oauthRefreshUrl = undefined;
|
|
86
|
+
let mcpAuthEndpoints = {};
|
|
82
87
|
let registrationId = undefined;
|
|
83
88
|
if (mcpAuth === "OAuthPluginVault") {
|
|
84
89
|
try {
|
|
85
90
|
registrationId = `MCP_DA_AUTH_ID_${serverName.toUpperCase()}`;
|
|
86
|
-
|
|
87
|
-
const metadata = await (0, mcpToolFetcher_1.resolveMCPOAuthMetadata)(inputs[constants_2.QuestionNames.MCPForDAAuthMetadataUrl], inputs[constants_2.QuestionNames.MCPForDAAuthWellKnownUrl]);
|
|
88
|
-
oauthAuthorizationUrl = metadata.authorizationUrl;
|
|
89
|
-
oauthTokenUrl = metadata.tokenUrl;
|
|
90
|
-
oauthRefreshUrl = metadata.refreshUrl;
|
|
91
|
-
}
|
|
91
|
+
mcpAuthEndpoints = await (0, mcpAuthScaffolder_1.resolveMCPAuthEndpoints)(authType, inputs);
|
|
92
92
|
}
|
|
93
93
|
catch (error) {
|
|
94
94
|
void context.userInteraction.showMessage("error", (0, localizeUtils_1.getLocalizedString)("core.MCPForDA.mcpAuthMetadataMissingError", error.message), false);
|
|
@@ -104,14 +104,20 @@ class FxCoreDeclarativeAgentPart {
|
|
|
104
104
|
const error = new teamsfx_api_1.UserError("MCPForDAPreFetchToolsNotFound", "PreFetchToolsNotFound", (0, localizeUtils_1.getDefaultString)("core.MCPForDA.preFetchToolsNotFound"), (0, localizeUtils_1.getLocalizedString)("core.MCPForDA.preFetchToolsNotFound"));
|
|
105
105
|
return (0, teamsfx_api_1.err)(error);
|
|
106
106
|
}
|
|
107
|
+
const pluginFunctions = Array.isArray(aiPluginContent.functions)
|
|
108
|
+
? aiPluginContent.functions
|
|
109
|
+
: [];
|
|
110
|
+
const pluginRuntimes = Array.isArray(aiPluginContent.runtimes) ? aiPluginContent.runtimes : [];
|
|
107
111
|
const toolsSelectedPrevious = [];
|
|
108
|
-
|
|
109
|
-
.filter((runtime) => (runtime.type === "RemoteMCPServer" && runtime.spec
|
|
112
|
+
pluginRuntimes
|
|
113
|
+
.filter((runtime) => (runtime.type === "RemoteMCPServer" && runtime.spec?.url === mcpServerUrl) ||
|
|
110
114
|
runtime.type === "LocalPlugin")
|
|
111
115
|
.forEach((runtime) => {
|
|
112
|
-
|
|
116
|
+
if (Array.isArray(runtime.run_for_functions)) {
|
|
117
|
+
toolsSelectedPrevious.push(...runtime.run_for_functions);
|
|
118
|
+
}
|
|
113
119
|
});
|
|
114
|
-
aiPluginContent.functions =
|
|
120
|
+
aiPluginContent.functions = pluginFunctions.filter((func) => !toolsSelectedPrevious.includes(func.name));
|
|
115
121
|
aiPluginContent.functions = [
|
|
116
122
|
...aiPluginContent.functions,
|
|
117
123
|
...mcpToolsDetail
|
|
@@ -136,9 +142,9 @@ class FxCoreDeclarativeAgentPart {
|
|
|
136
142
|
}
|
|
137
143
|
}),
|
|
138
144
|
];
|
|
139
|
-
const matchedRuntime =
|
|
140
|
-
aiPluginContent.runtimes =
|
|
141
|
-
runtime.spec
|
|
145
|
+
const matchedRuntime = pluginRuntimes.find((runtime) => runtime.type === "RemoteMCPServer" && runtime.spec?.url === mcpServerUrl);
|
|
146
|
+
aiPluginContent.runtimes = pluginRuntimes.filter((runtime) => (runtime.type !== "RemoteMCPServer" && runtime.type !== "LocalPlugin") ||
|
|
147
|
+
runtime.spec?.url !== mcpServerUrl);
|
|
142
148
|
if (inputs[constants_2.QuestionNames.MCPLocalServerIdentifier] != null) {
|
|
143
149
|
aiPluginContent.runtimes.push({
|
|
144
150
|
type: "LocalPlugin",
|
|
@@ -181,19 +187,21 @@ class FxCoreDeclarativeAgentPart {
|
|
|
181
187
|
},
|
|
182
188
|
},
|
|
183
189
|
run_for_functions: mcpToolsSelected,
|
|
184
|
-
auth:
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
reference_id: `$\{\{${registrationId}\}\}`,
|
|
188
|
-
}
|
|
189
|
-
: {
|
|
190
|
-
type: "None",
|
|
191
|
-
},
|
|
190
|
+
auth: (0, mcpAuthScaffolder_1.deriveMCPManifestOAuth)(authType, registrationId) ?? {
|
|
191
|
+
type: "None",
|
|
192
|
+
},
|
|
192
193
|
});
|
|
193
194
|
}
|
|
194
195
|
if (mcpAuth === "OAuthPluginVault" && !!registrationId) {
|
|
195
196
|
// insert oauth info in teamsapp.yaml
|
|
196
|
-
await
|
|
197
|
+
await (0, mcpAuthScaffolder_1.injectMCPAuthActionToYml)({
|
|
198
|
+
ymlPath: pathUtils_1.pathUtils.getYmlFilePath(projectPath),
|
|
199
|
+
authType,
|
|
200
|
+
authName: serverName,
|
|
201
|
+
registrationId,
|
|
202
|
+
mcpServerUrl,
|
|
203
|
+
endpoints: mcpAuthEndpoints,
|
|
204
|
+
});
|
|
197
205
|
}
|
|
198
206
|
void context.userInteraction
|
|
199
207
|
.showMessage("info", (0, localizeUtils_1.getLocalizedString)("core.MCPForDA.updatePluginManifest", aiPluginFilePathRelative), false, "Provision")
|
|
@@ -238,10 +246,21 @@ class FxCoreDeclarativeAgentPart {
|
|
|
238
246
|
// The CLI flow (below) keeps the original non-interactive behavior of
|
|
239
247
|
// probing the MCP server, fetching tools and writing ai-plugin.json + yaml
|
|
240
248
|
// OAuth registration, since the CLI has no equivalent notification UX.
|
|
241
|
-
|
|
249
|
+
//
|
|
250
|
+
// Under the Dynamic Tool Discovery (DT) flag this early redirect is skipped
|
|
251
|
+
// so that VS Code runs the same inline scaffolder as the CLI — the
|
|
252
|
+
// CodeLens "fetch action" hop is absorbed into add-action itself.
|
|
253
|
+
if (isGenerateFromMCP &&
|
|
254
|
+
inputs.platform === teamsfx_api_1.Platform.VSCode &&
|
|
255
|
+
!featureFlags_1.featureFlagManager.getBooleanValue(featureFlags_1.FeatureFlags.MCPForDADT)) {
|
|
242
256
|
return await this.addPluginFromMCP(inputs, context);
|
|
243
257
|
}
|
|
244
|
-
|
|
258
|
+
// VS Code MCP inline flow (DT on) skips the Teams-manifest picker; infer
|
|
259
|
+
// the path from `projectPath/appPackage/manifest.json` to match the leaner
|
|
260
|
+
// `updateActionWithMCP` UX. CLI and non-MCP flows still supply ManifestPath
|
|
261
|
+
// via the question tree / `--manifest-file`.
|
|
262
|
+
const teamsManifestPath = inputs[constants_2.QuestionNames.ManifestPath] ??
|
|
263
|
+
path.join(inputs.projectPath, teamsfx_api_1.AppPackageFolderName, teamsfx_api_1.ManifestTemplateFileName);
|
|
245
264
|
const appPackageFolder = path.dirname(teamsManifestPath);
|
|
246
265
|
// validate the project is valid for adding plugin
|
|
247
266
|
const manifestRes = await ManifestUtils_1.manifestUtils._readAppManifest(teamsManifestPath);
|
|
@@ -265,7 +284,13 @@ class FxCoreDeclarativeAgentPart {
|
|
|
265
284
|
return (0, teamsfx_api_1.err)(declarativeCopilotManifesRes.error);
|
|
266
285
|
}
|
|
267
286
|
const declarativeCopilotManifest = declarativeCopilotManifesRes.value;
|
|
268
|
-
|
|
287
|
+
const mcpAuthTypeChoice = inputs[constants_2.QuestionNames.MCPForDAAuthType];
|
|
288
|
+
const mcpTouchesYml = isGenerateFromMCP && mcpAuthTypeChoice && mcpAuthTypeChoice !== "none";
|
|
289
|
+
let confirmMessage = (0, localizeUtils_1.getLocalizedString)(isGenerateFromMCP
|
|
290
|
+
? mcpTouchesYml
|
|
291
|
+
? "core.addApi.confirm.mcp.teamsYaml"
|
|
292
|
+
: "core.addApi.confirm.mcp"
|
|
293
|
+
: "core.addApi.confirm", path.relative(inputs.projectPath, appPackageFolder), ...(mcpTouchesYml ? [versionMetadata_1.MetadataV4.configFile] : []));
|
|
269
294
|
// Will be used if generating from API spec
|
|
270
295
|
let specParser = undefined;
|
|
271
296
|
let authNameAndSchemes = [];
|
|
@@ -281,12 +306,20 @@ class FxCoreDeclarativeAgentPart {
|
|
|
281
306
|
}
|
|
282
307
|
}
|
|
283
308
|
// confirm
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
309
|
+
// VS Code MCP inline flow (DT on) skips the confirmation modal to match
|
|
310
|
+
// the leaner `updateActionWithMCP` UX; writes happen as soon as the last
|
|
311
|
+
// required answer is provided. CLI interactive and other flows still show it.
|
|
312
|
+
const skipConfirmModal = isGenerateFromMCP &&
|
|
313
|
+
inputs.platform === teamsfx_api_1.Platform.VSCode &&
|
|
314
|
+
featureFlags_1.featureFlagManager.getBooleanValue(featureFlags_1.FeatureFlags.MCPForDADT);
|
|
315
|
+
if (!skipConfirmModal) {
|
|
316
|
+
const confirmRes = await context.userInteraction.showMessage("warn", confirmMessage, true, (0, localizeUtils_1.getLocalizedString)("core.addApi.continue"));
|
|
317
|
+
if (confirmRes.isErr()) {
|
|
318
|
+
return (0, teamsfx_api_1.err)(confirmRes.error);
|
|
319
|
+
}
|
|
320
|
+
else if (confirmRes.value !== (0, localizeUtils_1.getLocalizedString)("core.addApi.continue")) {
|
|
321
|
+
return (0, teamsfx_api_1.err)(new common_2.UserCancelError());
|
|
322
|
+
}
|
|
290
323
|
}
|
|
291
324
|
// find the next available action id
|
|
292
325
|
let actionId = "";
|
|
@@ -303,7 +336,7 @@ class FxCoreDeclarativeAgentPart {
|
|
|
303
336
|
destinationPluginManifestPath =
|
|
304
337
|
await CopilotGptManifestUtils_1.copilotGptManifestUtils.getDefaultNextAvailablePluginManifestPath(appPackageFolder, undefined);
|
|
305
338
|
const destinationApiSpecPath = await PluginManifestUtils_1.pluginManifestUtils.getDefaultNextAvailableApiSpecPath(inputs[constants_2.QuestionNames.ApiSpecLocation].trim(), path.join(appPackageFolder, teamsfx_api_1.DefaultApiSpecFolderName));
|
|
306
|
-
const generateRes = await
|
|
339
|
+
const generateRes = await exports.fxCoreDeclarativeAgentDeps.generateFromApiSpec(specParser, teamsManifestPath, inputs, context, teamsfx_api_1.Stage.addPlugin, m365_spec_parser_1.ProjectType.Copilot, {
|
|
307
340
|
destinationApiSpecFilePath: destinationApiSpecPath,
|
|
308
341
|
pluginManifestFilePath: destinationPluginManifestPath,
|
|
309
342
|
}, inputs[constants_2.QuestionNames.ApiSpecLocation].trim());
|
|
@@ -312,7 +345,7 @@ class FxCoreDeclarativeAgentPart {
|
|
|
312
345
|
}
|
|
313
346
|
const warnings = generateRes.value.warnings;
|
|
314
347
|
if (warnings && warnings.length > 0) {
|
|
315
|
-
const warnSummary = await
|
|
348
|
+
const warnSummary = await exports.fxCoreDeclarativeAgentDeps.generateScaffoldingSummary(warnings, manifestRes.value, path.relative(inputs.projectPath, destinationApiSpecPath), path.relative(inputs.projectPath, destinationPluginManifestPath), inputs.projectPath);
|
|
316
349
|
context.logProvider.info(warnSummary + "\n");
|
|
317
350
|
}
|
|
318
351
|
const addActionRes = await CopilotGptManifestUtils_1.copilotGptManifestUtils.addAction(declarativeCopilotManifestPath, actionId, (0, utils_1.normalizePath)(path.relative(appPackageFolder, destinationPluginManifestPath), true));
|
|
@@ -333,175 +366,260 @@ class FxCoreDeclarativeAgentPart {
|
|
|
333
366
|
if (!mcpServerUrl) {
|
|
334
367
|
return (0, teamsfx_api_1.err)(new teamsfx_api_1.UserError(teamsfx_api_1.Stage.addPlugin, "MissingMCPServerUrl", (0, localizeUtils_1.getLocalizedString)("core.MCPForDA.missingServerUrl"), (0, localizeUtils_1.getLocalizedString)("core.MCPForDA.missingServerUrl")));
|
|
335
368
|
}
|
|
336
|
-
//
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
catch {
|
|
369
|
-
// Auth probe failed - continue without auth
|
|
369
|
+
// Dynamic Tool Discovery flow: skip static tool fetching entirely;
|
|
370
|
+
// write ai-plugin.json with a `ModelContextProtocol` runtime that the
|
|
371
|
+
// agent host probes for tools at runtime, then inject the OAuth/DCR step.
|
|
372
|
+
if (featureFlags_1.featureFlagManager.getBooleanValue(featureFlags_1.FeatureFlags.MCPForDADT)) {
|
|
373
|
+
destinationPluginManifestPath =
|
|
374
|
+
await CopilotGptManifestUtils_1.copilotGptManifestUtils.getDefaultNextAvailablePluginManifestPath(appPackageFolder, undefined);
|
|
375
|
+
// Namespace the action by the MCP server host (shared rule with the
|
|
376
|
+
// create flow) so actions targeting different MCP servers get distinct
|
|
377
|
+
// namespaces. The derived value is alphanumeric + lowercase, satisfying
|
|
378
|
+
// the plugin manifest schema (which rejects `_` and other punctuation).
|
|
379
|
+
const namespace = (0, helper_1.deriveMCPNamespaceFromUrl)(mcpServerUrl);
|
|
380
|
+
const pluginManifest = {
|
|
381
|
+
$schema: "https://developer.microsoft.com/json-schemas/copilot/plugin/v2.4/schema.json",
|
|
382
|
+
schema_version: "v2.4",
|
|
383
|
+
name_for_human: "MCP Action",
|
|
384
|
+
description_for_human: "Action powered by MCP server",
|
|
385
|
+
contact_email: "publisher-email@example.com",
|
|
386
|
+
namespace,
|
|
387
|
+
functions: [],
|
|
388
|
+
runtimes: [
|
|
389
|
+
{
|
|
390
|
+
type: "RemoteMCPServer",
|
|
391
|
+
spec: { url: mcpServerUrl },
|
|
392
|
+
run_for_functions: ["*"],
|
|
393
|
+
},
|
|
394
|
+
],
|
|
395
|
+
};
|
|
396
|
+
const authType = inputs[constants_2.QuestionNames.MCPForDAAuthType];
|
|
397
|
+
if (authType === "none") {
|
|
398
|
+
pluginManifest.runtimes[0].auth = { type: "None" };
|
|
370
399
|
}
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
const result = await fetchMCPTools(mcpServerUrl);
|
|
378
|
-
if (!result.requiresAuth && result.tools.length > 0) {
|
|
379
|
-
inputs[constants_2.QuestionNames.MCPForDAAvailableTools] = result.tools;
|
|
380
|
-
if (!inputs[constants_2.QuestionNames.MCPForDAPreFetchTools]) {
|
|
381
|
-
inputs[constants_2.QuestionNames.MCPForDAPreFetchTools] = result.tools.map((t) => t.name);
|
|
382
|
-
}
|
|
400
|
+
else if (authType) {
|
|
401
|
+
const serverName = (0, helper_1.deriveMCPServerNameFromUrl)(mcpServerUrl).toUpperCase();
|
|
402
|
+
const registrationId = (0, helper_1.deriveMCPRegistrationIdFromUrl)(mcpServerUrl);
|
|
403
|
+
const manifestOAuth = (0, mcpAuthScaffolder_1.deriveMCPManifestOAuth)(authType, registrationId);
|
|
404
|
+
if (manifestOAuth) {
|
|
405
|
+
pluginManifest.runtimes[0].auth = manifestOAuth;
|
|
383
406
|
}
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
if (
|
|
388
|
-
|
|
407
|
+
try {
|
|
408
|
+
const endpoints = await (0, mcpAuthScaffolder_1.resolveMCPAuthEndpoints)(authType, inputs);
|
|
409
|
+
const ymlPath = pathUtils_1.pathUtils.getYmlFilePath(inputs.projectPath);
|
|
410
|
+
if (ymlPath) {
|
|
411
|
+
await (0, mcpAuthScaffolder_1.injectMCPAuthActionToYml)({
|
|
412
|
+
ymlPath,
|
|
413
|
+
authType,
|
|
414
|
+
// Per SCN-DA-CREATE-WITH-MCP-SERVER the `name:` of the injected
|
|
415
|
+
// oauth/dcr step matches the ai-plugin.json `namespace`, not the
|
|
416
|
+
// declarativeAgent action id (which stays the template default).
|
|
417
|
+
authName: namespace,
|
|
418
|
+
registrationId,
|
|
419
|
+
mcpServerUrl,
|
|
420
|
+
endpoints,
|
|
421
|
+
persistCredentialEnvRefs: true,
|
|
422
|
+
serverName,
|
|
423
|
+
});
|
|
389
424
|
}
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
425
|
+
await (0, mcpAuthScaffolder_1.persistMCPAuthCredentialEnvVars)({
|
|
426
|
+
projectPath: inputs.projectPath,
|
|
427
|
+
authType,
|
|
428
|
+
serverName,
|
|
429
|
+
clientId: inputs[constants_2.QuestionNames.MCPForDAClientId],
|
|
430
|
+
clientSecret: inputs[constants_2.QuestionNames.MCPForDAClientSecret],
|
|
431
|
+
scopes: inputs[constants_2.QuestionNames.MCPForDAScopes],
|
|
393
432
|
});
|
|
394
433
|
}
|
|
395
|
-
|
|
434
|
+
catch (error) {
|
|
396
435
|
mcpWarnings.push({
|
|
397
|
-
type: "
|
|
398
|
-
content: (0, localizeUtils_1.getLocalizedString)("core.MCPForDA.
|
|
436
|
+
type: "mcpAuthMetadataError",
|
|
437
|
+
content: (0, localizeUtils_1.getLocalizedString)("core.MCPForDA.mcpAuthMetadataMissingError", error.message),
|
|
399
438
|
});
|
|
400
439
|
}
|
|
401
440
|
}
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
441
|
+
await fs_extra_1.default.ensureFile(destinationPluginManifestPath);
|
|
442
|
+
await fs_extra_1.default.writeJSON(destinationPluginManifestPath, pluginManifest, { spaces: 4 });
|
|
443
|
+
const addActionRes = await CopilotGptManifestUtils_1.copilotGptManifestUtils.addAction(declarativeCopilotManifestPath, actionId, (0, utils_1.normalizePath)(path.relative(appPackageFolder, destinationPluginManifestPath), true));
|
|
444
|
+
if (addActionRes.isErr()) {
|
|
445
|
+
return (0, teamsfx_api_1.err)(addActionRes.error);
|
|
407
446
|
}
|
|
408
|
-
}
|
|
409
|
-
// If no tools available (auth required or fetch failed), skip creating plugin - just warn
|
|
410
|
-
const mcpTools = inputs[constants_2.QuestionNames.MCPForDAAvailableTools];
|
|
411
|
-
const mcpToolsSelected = inputs[constants_2.QuestionNames.MCPForDAPreFetchTools] || [];
|
|
412
|
-
if (!mcpTools || mcpTools.length === 0 || mcpToolsSelected.length === 0) {
|
|
413
447
|
if (mcpWarnings.length > 0) {
|
|
414
448
|
for (const warning of mcpWarnings) {
|
|
415
449
|
context.logProvider.warning(warning.content);
|
|
416
450
|
}
|
|
417
451
|
}
|
|
418
|
-
return (0, teamsfx_api_1.ok)(undefined);
|
|
419
452
|
}
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
};
|
|
432
|
-
if (mcpTools && mcpTools.length > 0 && mcpToolsSelected.length > 0) {
|
|
433
|
-
const selectedTools = mcpTools.filter((tool) => mcpToolsSelected.includes(tool.name));
|
|
434
|
-
pluginManifest.functions = selectedTools.map((tool) => ({
|
|
435
|
-
name: tool.name,
|
|
436
|
-
description: tool.description || "",
|
|
437
|
-
}));
|
|
438
|
-
// Write mcp-tools file with full tool definitions (no field filtering)
|
|
439
|
-
const mcpToolsFile = `mcp-tools-${suffix}.json`;
|
|
440
|
-
const mcpToolsOutputPath = path.join(appPackageFolder, mcpToolsFile);
|
|
441
|
-
await fs_extra_1.default.writeJSON(mcpToolsOutputPath, { tools: selectedTools }, { spaces: 4 });
|
|
442
|
-
pluginManifest.runtimes = [
|
|
443
|
-
{
|
|
444
|
-
type: "RemoteMCPServer",
|
|
445
|
-
spec: {
|
|
446
|
-
url: mcpServerUrl,
|
|
447
|
-
mcp_tool_description: {
|
|
448
|
-
file: mcpToolsFile,
|
|
449
|
-
},
|
|
450
|
-
},
|
|
451
|
-
run_for_functions: pluginManifest.functions.map((f) => f.name),
|
|
452
|
-
},
|
|
453
|
-
];
|
|
454
|
-
// Auth handling
|
|
455
|
-
const mcpAuth = inputs[constants_2.QuestionNames.MCPForDAAuth];
|
|
456
|
-
if (mcpAuth === "OAuthPluginVault") {
|
|
457
|
-
const authType = inputs[constants_2.QuestionNames.MCPForDAAuthType];
|
|
458
|
-
if (!authType) {
|
|
459
|
-
return (0, teamsfx_api_1.err)(new teamsfx_api_1.UserError(teamsfx_api_1.Stage.addPlugin, "MissingMCPAuthType", (0, localizeUtils_1.getLocalizedString)("core.MCPForDA.missingAuthType"), (0, localizeUtils_1.getLocalizedString)("core.MCPForDA.missingAuthType")));
|
|
453
|
+
else {
|
|
454
|
+
// Load tools from file if provided and not yet loaded
|
|
455
|
+
const existingTools = inputs[constants_2.QuestionNames.MCPForDAAvailableTools];
|
|
456
|
+
if (toolsFilePath && (!existingTools || existingTools.length === 0)) {
|
|
457
|
+
try {
|
|
458
|
+
const { readMCPToolsFromFile } = await Promise.resolve().then(() => tslib_1.__importStar(require("../component/utils/mcpToolFetcher")));
|
|
459
|
+
const fileTools = await readMCPToolsFromFile(toolsFilePath);
|
|
460
|
+
inputs[constants_2.QuestionNames.MCPForDAAvailableTools] = fileTools;
|
|
461
|
+
if (!inputs[constants_2.QuestionNames.MCPForDAPreFetchTools]) {
|
|
462
|
+
inputs[constants_2.QuestionNames.MCPForDAPreFetchTools] = fileTools.map((t) => t.name);
|
|
463
|
+
}
|
|
460
464
|
}
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
465
|
+
catch {
|
|
466
|
+
mcpWarnings.push({
|
|
467
|
+
type: "mcpToolsFileReadError",
|
|
468
|
+
content: (0, localizeUtils_1.getLocalizedString)("core.MCPForDA.toolsFileReadError", toolsFilePath, mcpAddActionHint),
|
|
469
|
+
});
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
// Probe auth if tools were loaded from file but auth not yet detected
|
|
473
|
+
if (inputs[constants_2.QuestionNames.MCPForDAAvailableTools]?.length > 0 &&
|
|
474
|
+
!inputs[constants_2.QuestionNames.MCPForDAAuth] &&
|
|
475
|
+
mcpServerUrl) {
|
|
467
476
|
try {
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
refreshUrl = metadata.refreshUrl;
|
|
477
|
+
const { probeMCPServerAuth } = await Promise.resolve().then(() => tslib_1.__importStar(require("../component/utils/mcpToolFetcher")));
|
|
478
|
+
const authProbe = await probeMCPServerAuth(mcpServerUrl);
|
|
479
|
+
if (authProbe.requiresAuth) {
|
|
480
|
+
inputs[constants_2.QuestionNames.MCPForDAAuth] = "OAuthPluginVault";
|
|
481
|
+
if (authProbe.authMetadataUrl) {
|
|
482
|
+
inputs[constants_2.QuestionNames.MCPForDAAuthMetadataUrl] = authProbe.authMetadataUrl;
|
|
483
|
+
}
|
|
476
484
|
}
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
485
|
+
}
|
|
486
|
+
catch {
|
|
487
|
+
// Auth probe failed - continue without auth
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
// Auto-fetch tools if not yet loaded (CLI flow for no-auth servers)
|
|
491
|
+
const currentTools = inputs[constants_2.QuestionNames.MCPForDAAvailableTools];
|
|
492
|
+
if ((!currentTools || currentTools.length === 0) && mcpServerUrl) {
|
|
493
|
+
try {
|
|
494
|
+
const { fetchMCPTools } = await Promise.resolve().then(() => tslib_1.__importStar(require("../component/utils/mcpToolFetcher")));
|
|
495
|
+
const result = await fetchMCPTools(mcpServerUrl);
|
|
496
|
+
if (!result.requiresAuth && result.tools.length > 0) {
|
|
497
|
+
inputs[constants_2.QuestionNames.MCPForDAAvailableTools] = result.tools;
|
|
498
|
+
if (!inputs[constants_2.QuestionNames.MCPForDAPreFetchTools]) {
|
|
499
|
+
inputs[constants_2.QuestionNames.MCPForDAPreFetchTools] = result.tools.map((t) => t.name);
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
else if (result.requiresAuth) {
|
|
503
|
+
// Store auth metadata for later use
|
|
504
|
+
inputs[constants_2.QuestionNames.MCPForDAAuth] = "OAuthPluginVault";
|
|
505
|
+
if (result.authMetadataUrl) {
|
|
506
|
+
inputs[constants_2.QuestionNames.MCPForDAAuthMetadataUrl] = result.authMetadataUrl;
|
|
507
|
+
}
|
|
508
|
+
mcpWarnings.push({
|
|
509
|
+
type: "mcpAuthRequired",
|
|
510
|
+
content: (0, localizeUtils_1.getLocalizedString)("core.MCPForDA.authRequired", mcpServerUrl, mcpAddActionHint),
|
|
511
|
+
});
|
|
512
|
+
}
|
|
513
|
+
else {
|
|
514
|
+
mcpWarnings.push({
|
|
515
|
+
type: "mcpNoToolsFetched",
|
|
516
|
+
content: (0, localizeUtils_1.getLocalizedString)("core.MCPForDA.noToolsFetched", mcpServerUrl, mcpAddActionHint),
|
|
517
|
+
});
|
|
480
518
|
}
|
|
481
519
|
}
|
|
482
|
-
catch
|
|
520
|
+
catch {
|
|
483
521
|
mcpWarnings.push({
|
|
484
|
-
type: "
|
|
485
|
-
content: (0, localizeUtils_1.getLocalizedString)("core.MCPForDA.
|
|
522
|
+
type: "mcpFetchError",
|
|
523
|
+
content: (0, localizeUtils_1.getLocalizedString)("core.MCPForDA.fetchError", mcpServerUrl, mcpAddActionHint),
|
|
486
524
|
});
|
|
487
525
|
}
|
|
488
526
|
}
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
527
|
+
// If no tools available (auth required or fetch failed), skip creating plugin - just warn
|
|
528
|
+
const mcpTools = inputs[constants_2.QuestionNames.MCPForDAAvailableTools];
|
|
529
|
+
const mcpToolsSelected = inputs[constants_2.QuestionNames.MCPForDAPreFetchTools] || [];
|
|
530
|
+
if (!mcpTools || mcpTools.length === 0 || mcpToolsSelected.length === 0) {
|
|
531
|
+
if (mcpWarnings.length > 0) {
|
|
532
|
+
for (const warning of mcpWarnings) {
|
|
533
|
+
context.logProvider.warning(warning.content);
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
return (0, teamsfx_api_1.ok)(undefined);
|
|
537
|
+
}
|
|
538
|
+
destinationPluginManifestPath =
|
|
539
|
+
await CopilotGptManifestUtils_1.copilotGptManifestUtils.getDefaultNextAvailablePluginManifestPath(appPackageFolder, undefined);
|
|
540
|
+
const pluginManifest = {
|
|
541
|
+
$schema: "https://developer.microsoft.com/json-schemas/copilot/plugin/v2.4/schema.json",
|
|
542
|
+
schema_version: "v2.4",
|
|
543
|
+
name_for_human: "MCP Action",
|
|
544
|
+
description_for_human: "Action powered by MCP server",
|
|
545
|
+
contact_email: "publisher-email@example.com",
|
|
546
|
+
namespace: "mcpAction",
|
|
547
|
+
functions: [],
|
|
548
|
+
runtimes: [],
|
|
549
|
+
};
|
|
550
|
+
if (mcpTools && mcpTools.length > 0 && mcpToolsSelected.length > 0) {
|
|
551
|
+
const selectedTools = mcpTools.filter((tool) => mcpToolsSelected.includes(tool.name));
|
|
552
|
+
pluginManifest.functions = selectedTools.map((tool) => ({
|
|
553
|
+
name: tool.name,
|
|
554
|
+
description: tool.description || "",
|
|
555
|
+
}));
|
|
556
|
+
// Write mcp-tools file with full tool definitions (no field filtering)
|
|
557
|
+
const mcpToolsFile = `mcp-tools-${suffix}.json`;
|
|
558
|
+
const mcpToolsOutputPath = path.join(appPackageFolder, mcpToolsFile);
|
|
559
|
+
await fs_extra_1.default.writeJSON(mcpToolsOutputPath, { tools: selectedTools }, { spaces: 4 });
|
|
560
|
+
pluginManifest.runtimes = [
|
|
561
|
+
{
|
|
562
|
+
type: "RemoteMCPServer",
|
|
563
|
+
spec: {
|
|
564
|
+
url: mcpServerUrl,
|
|
565
|
+
mcp_tool_description: {
|
|
566
|
+
file: mcpToolsFile,
|
|
567
|
+
},
|
|
568
|
+
},
|
|
569
|
+
run_for_functions: pluginManifest.functions.map((f) => f.name),
|
|
570
|
+
},
|
|
571
|
+
];
|
|
572
|
+
// Auth handling
|
|
573
|
+
const mcpAuth = inputs[constants_2.QuestionNames.MCPForDAAuth];
|
|
574
|
+
if (mcpAuth === "OAuthPluginVault") {
|
|
575
|
+
const authType = inputs[constants_2.QuestionNames.MCPForDAAuthType];
|
|
576
|
+
if (!authType) {
|
|
577
|
+
return (0, teamsfx_api_1.err)(new teamsfx_api_1.UserError(teamsfx_api_1.Stage.addPlugin, "MissingMCPAuthType", (0, localizeUtils_1.getLocalizedString)("core.MCPForDA.missingAuthType"), (0, localizeUtils_1.getLocalizedString)("core.MCPForDA.missingAuthType")));
|
|
578
|
+
}
|
|
579
|
+
const registrationId = `MCP_DA_AUTH_ID_${actionId.toUpperCase()}`;
|
|
580
|
+
const manifestOAuth = (0, mcpAuthScaffolder_1.deriveMCPManifestOAuth)(authType, registrationId);
|
|
581
|
+
if (manifestOAuth) {
|
|
582
|
+
pluginManifest.runtimes[0].auth = manifestOAuth;
|
|
583
|
+
}
|
|
584
|
+
// Resolve OAuth metadata and inject oauth/register into m365agents.yml
|
|
585
|
+
try {
|
|
586
|
+
const endpoints = await (0, mcpAuthScaffolder_1.resolveMCPAuthEndpoints)(authType, inputs);
|
|
587
|
+
const ymlPath = pathUtils_1.pathUtils.getYmlFilePath(inputs.projectPath);
|
|
588
|
+
if (ymlPath) {
|
|
589
|
+
await (0, mcpAuthScaffolder_1.injectMCPAuthActionToYml)({
|
|
590
|
+
ymlPath,
|
|
591
|
+
authType,
|
|
592
|
+
authName: actionId,
|
|
593
|
+
registrationId,
|
|
594
|
+
mcpServerUrl,
|
|
595
|
+
endpoints,
|
|
596
|
+
});
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
catch (error) {
|
|
600
|
+
mcpWarnings.push({
|
|
601
|
+
type: "mcpAuthMetadataError",
|
|
602
|
+
content: (0, localizeUtils_1.getLocalizedString)("core.MCPForDA.mcpAuthMetadataMissingError", error.message),
|
|
603
|
+
});
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
await fs_extra_1.default.ensureFile(destinationPluginManifestPath);
|
|
608
|
+
await fs_extra_1.default.writeJSON(destinationPluginManifestPath, pluginManifest, { spaces: 4 });
|
|
609
|
+
const addActionRes = await CopilotGptManifestUtils_1.copilotGptManifestUtils.addAction(declarativeCopilotManifestPath, actionId, (0, utils_1.normalizePath)(path.relative(appPackageFolder, destinationPluginManifestPath), true));
|
|
610
|
+
if (addActionRes.isErr()) {
|
|
611
|
+
return (0, teamsfx_api_1.err)(addActionRes.error);
|
|
612
|
+
}
|
|
613
|
+
// Surface warnings for CLI
|
|
614
|
+
if (mcpWarnings.length > 0) {
|
|
615
|
+
for (const warning of mcpWarnings) {
|
|
616
|
+
context.logProvider.warning(warning.content);
|
|
617
|
+
}
|
|
500
618
|
}
|
|
501
619
|
}
|
|
502
620
|
}
|
|
503
621
|
else {
|
|
504
|
-
const addPluginRes = await
|
|
622
|
+
const addPluginRes = await exports.fxCoreDeclarativeAgentDeps.addExistingPlugin(declarativeCopilotManifestPath, inputs[constants_2.QuestionNames.PluginManifestFilePath].trim(), inputs[constants_2.QuestionNames.PluginOpenApiSpecFilePath].trim(), actionId, context, teamsfx_api_1.Stage.addPlugin);
|
|
505
623
|
if (addPluginRes.isErr()) {
|
|
506
624
|
return (0, teamsfx_api_1.err)(addPluginRes.error);
|
|
507
625
|
}
|
|
@@ -541,7 +659,7 @@ class FxCoreDeclarativeAgentPart {
|
|
|
541
659
|
}
|
|
542
660
|
// Derive a server entry name from the URL host using the same logic as the
|
|
543
661
|
// "DA with MCP" scaffolding template variable `ServerName`.
|
|
544
|
-
const serverName =
|
|
662
|
+
const serverName = exports.fxCoreDeclarativeAgentDeps.deriveMCPServerNameFromUrl(mcpServerUrl);
|
|
545
663
|
const mcpConfigDir = path.join(projectPath, ".vscode");
|
|
546
664
|
const mcpConfigPath = path.join(mcpConfigDir, "mcp.json");
|
|
547
665
|
let mcpConfig = { servers: {} };
|