d365fo-mcp 1.0.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/LICENSE +21 -0
- package/README.md +205 -0
- package/dist/bridge/bridgeAdapter.d.ts +319 -0
- package/dist/bridge/bridgeAdapter.d.ts.map +1 -0
- package/dist/bridge/bridgeAdapter.js +2003 -0
- package/dist/bridge/bridgeAdapter.js.map +1 -0
- package/dist/bridge/bridgeClient.d.ts +255 -0
- package/dist/bridge/bridgeClient.d.ts.map +1 -0
- package/dist/bridge/bridgeClient.js +741 -0
- package/dist/bridge/bridgeClient.js.map +1 -0
- package/dist/bridge/bridgeTypes.d.ts +561 -0
- package/dist/bridge/bridgeTypes.d.ts.map +1 -0
- package/dist/bridge/bridgeTypes.js +6 -0
- package/dist/bridge/bridgeTypes.js.map +1 -0
- package/dist/bridge/debouncedRefresh.d.ts +16 -0
- package/dist/bridge/debouncedRefresh.d.ts.map +1 -0
- package/dist/bridge/debouncedRefresh.js +77 -0
- package/dist/bridge/debouncedRefresh.js.map +1 -0
- package/dist/bridge/index.d.ts +21 -0
- package/dist/bridge/index.d.ts.map +1 -0
- package/dist/bridge/index.js +20 -0
- package/dist/bridge/index.js.map +1 -0
- package/dist/cli/commands/config.d.ts +8 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +77 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +2 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +177 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/indexCmd.d.ts +8 -0
- package/dist/cli/commands/indexCmd.d.ts.map +1 -0
- package/dist/cli/commands/indexCmd.js +78 -0
- package/dist/cli/commands/indexCmd.js.map +1 -0
- package/dist/cli/commands/instance.d.ts +4 -0
- package/dist/cli/commands/instance.d.ts.map +1 -0
- package/dist/cli/commands/instance.js +183 -0
- package/dist/cli/commands/instance.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +4 -0
- package/dist/cli/commands/setup.d.ts.map +1 -0
- package/dist/cli/commands/setup.js +246 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/commands/start.d.ts +2 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +49 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/update.d.ts +4 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +55 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/context.d.ts +26 -0
- package/dist/cli/context.d.ts.map +1 -0
- package/dist/cli/context.js +38 -0
- package/dist/cli/context.js.map +1 -0
- package/dist/cli/envFile.d.ts +23 -0
- package/dist/cli/envFile.d.ts.map +1 -0
- package/dist/cli/envFile.js +79 -0
- package/dist/cli/envFile.js.map +1 -0
- package/dist/cli/exec.d.ts +13 -0
- package/dist/cli/exec.d.ts.map +1 -0
- package/dist/cli/exec.js +47 -0
- package/dist/cli/exec.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +122 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/instances.d.ts +19 -0
- package/dist/cli/instances.d.ts.map +1 -0
- package/dist/cli/instances.js +60 -0
- package/dist/cli/instances.js.map +1 -0
- package/dist/cli/mcpJson.d.ts +15 -0
- package/dist/cli/mcpJson.d.ts.map +1 -0
- package/dist/cli/mcpJson.js +44 -0
- package/dist/cli/mcpJson.js.map +1 -0
- package/dist/cli/settingsPrompt.d.ts +20 -0
- package/dist/cli/settingsPrompt.d.ts.map +1 -0
- package/dist/cli/settingsPrompt.js +150 -0
- package/dist/cli/settingsPrompt.js.map +1 -0
- package/dist/cli/settingsStore.d.ts +47 -0
- package/dist/cli/settingsStore.d.ts.map +1 -0
- package/dist/cli/settingsStore.js +144 -0
- package/dist/cli/settingsStore.js.map +1 -0
- package/dist/cli/target.d.ts +23 -0
- package/dist/cli/target.d.ts.map +1 -0
- package/dist/cli/target.js +62 -0
- package/dist/cli/target.js.map +1 -0
- package/dist/cli/ui.d.ts +26 -0
- package/dist/cli/ui.d.ts.map +1 -0
- package/dist/cli/ui.js +48 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/cli/xppConfig.d.ts +35 -0
- package/dist/cli/xppConfig.d.ts.map +1 -0
- package/dist/cli/xppConfig.js +97 -0
- package/dist/cli/xppConfig.js.map +1 -0
- package/dist/config/configFile.d.ts +50 -0
- package/dist/config/configFile.d.ts.map +1 -0
- package/dist/config/configFile.js +152 -0
- package/dist/config/configFile.js.map +1 -0
- package/dist/config/settings.d.ts +58 -0
- package/dist/config/settings.d.ts.map +1 -0
- package/dist/config/settings.js +641 -0
- package/dist/config/settings.js.map +1 -0
- package/dist/database/download.d.ts +27 -0
- package/dist/database/download.d.ts.map +1 -0
- package/dist/database/download.js +241 -0
- package/dist/database/download.js.map +1 -0
- package/dist/eval/audit/knowledgeAudit.d.ts +66 -0
- package/dist/eval/audit/knowledgeAudit.d.ts.map +1 -0
- package/dist/eval/audit/knowledgeAudit.js +117 -0
- package/dist/eval/audit/knowledgeAudit.js.map +1 -0
- package/dist/eval/audit/knowledgeAuditCli.d.ts +17 -0
- package/dist/eval/audit/knowledgeAuditCli.d.ts.map +1 -0
- package/dist/eval/audit/knowledgeAuditCli.js +83 -0
- package/dist/eval/audit/knowledgeAuditCli.js.map +1 -0
- package/dist/eval/audit/knowledgeRefs.d.ts +37 -0
- package/dist/eval/audit/knowledgeRefs.d.ts.map +1 -0
- package/dist/eval/audit/knowledgeRefs.js +150 -0
- package/dist/eval/audit/knowledgeRefs.js.map +1 -0
- package/dist/eval/audit/symbolLookup.d.ts +23 -0
- package/dist/eval/audit/symbolLookup.d.ts.map +1 -0
- package/dist/eval/audit/symbolLookup.js +80 -0
- package/dist/eval/audit/symbolLookup.js.map +1 -0
- package/dist/eval/coverage/coverage.d.ts +65 -0
- package/dist/eval/coverage/coverage.d.ts.map +1 -0
- package/dist/eval/coverage/coverage.js +136 -0
- package/dist/eval/coverage/coverage.js.map +1 -0
- package/dist/eval/coverage/coverageCli.d.ts +13 -0
- package/dist/eval/coverage/coverageCli.d.ts.map +1 -0
- package/dist/eval/coverage/coverageCli.js +106 -0
- package/dist/eval/coverage/coverageCli.js.map +1 -0
- package/dist/eval/coverage/sources.d.ts +17 -0
- package/dist/eval/coverage/sources.d.ts.map +1 -0
- package/dist/eval/coverage/sources.js +40 -0
- package/dist/eval/coverage/sources.js.map +1 -0
- package/dist/eval/coverage/taxonomy.d.ts +59 -0
- package/dist/eval/coverage/taxonomy.d.ts.map +1 -0
- package/dist/eval/coverage/taxonomy.js +400 -0
- package/dist/eval/coverage/taxonomy.js.map +1 -0
- package/dist/eval/improver/caseMining.d.ts +55 -0
- package/dist/eval/improver/caseMining.d.ts.map +1 -0
- package/dist/eval/improver/caseMining.js +64 -0
- package/dist/eval/improver/caseMining.js.map +1 -0
- package/dist/eval/improver/caseMiningCli.d.ts +10 -0
- package/dist/eval/improver/caseMiningCli.d.ts.map +1 -0
- package/dist/eval/improver/caseMiningCli.js +50 -0
- package/dist/eval/improver/caseMiningCli.js.map +1 -0
- package/dist/eval/improver/cli.d.ts +11 -0
- package/dist/eval/improver/cli.d.ts.map +1 -0
- package/dist/eval/improver/cli.js +73 -0
- package/dist/eval/improver/cli.js.map +1 -0
- package/dist/eval/improver/cluster.d.ts +47 -0
- package/dist/eval/improver/cluster.d.ts.map +1 -0
- package/dist/eval/improver/cluster.js +0 -0
- package/dist/eval/improver/cluster.js.map +1 -0
- package/dist/eval/improver/corpusIO.d.ts +26 -0
- package/dist/eval/improver/corpusIO.d.ts.map +1 -0
- package/dist/eval/improver/corpusIO.js +50 -0
- package/dist/eval/improver/corpusIO.js.map +1 -0
- package/dist/eval/improver/fixBrief.d.ts +34 -0
- package/dist/eval/improver/fixBrief.d.ts.map +1 -0
- package/dist/eval/improver/fixBrief.js +69 -0
- package/dist/eval/improver/fixBrief.js.map +1 -0
- package/dist/eval/improver/fixBriefCli.d.ts +11 -0
- package/dist/eval/improver/fixBriefCli.d.ts.map +1 -0
- package/dist/eval/improver/fixBriefCli.js +46 -0
- package/dist/eval/improver/fixBriefCli.js.map +1 -0
- package/dist/eval/improver/flakeDetection.d.ts +50 -0
- package/dist/eval/improver/flakeDetection.d.ts.map +1 -0
- package/dist/eval/improver/flakeDetection.js +0 -0
- package/dist/eval/improver/flakeDetection.js.map +1 -0
- package/dist/eval/improver/flakeDetectionCli.d.ts +8 -0
- package/dist/eval/improver/flakeDetectionCli.d.ts.map +1 -0
- package/dist/eval/improver/flakeDetectionCli.js +27 -0
- package/dist/eval/improver/flakeDetectionCli.js.map +1 -0
- package/dist/eval/improver/heldout.d.ts +44 -0
- package/dist/eval/improver/heldout.d.ts.map +1 -0
- package/dist/eval/improver/heldout.js +52 -0
- package/dist/eval/improver/heldout.js.map +1 -0
- package/dist/eval/improver/knowledgeFeedback.d.ts +56 -0
- package/dist/eval/improver/knowledgeFeedback.d.ts.map +1 -0
- package/dist/eval/improver/knowledgeFeedback.js +88 -0
- package/dist/eval/improver/knowledgeFeedback.js.map +1 -0
- package/dist/eval/improver/knowledgeFeedbackCli.d.ts +8 -0
- package/dist/eval/improver/knowledgeFeedbackCli.d.ts.map +1 -0
- package/dist/eval/improver/knowledgeFeedbackCli.js +28 -0
- package/dist/eval/improver/knowledgeFeedbackCli.js.map +1 -0
- package/dist/eval/improver/report.d.ts +36 -0
- package/dist/eval/improver/report.d.ts.map +1 -0
- package/dist/eval/improver/report.js +61 -0
- package/dist/eval/improver/report.js.map +1 -0
- package/dist/eval/improver/reportCli.d.ts +7 -0
- package/dist/eval/improver/reportCli.d.ts.map +1 -0
- package/dist/eval/improver/reportCli.js +27 -0
- package/dist/eval/improver/reportCli.js.map +1 -0
- package/dist/eval/oracle/actualArtifactResolution.d.ts +49 -0
- package/dist/eval/oracle/actualArtifactResolution.d.ts.map +1 -0
- package/dist/eval/oracle/actualArtifactResolution.js +73 -0
- package/dist/eval/oracle/actualArtifactResolution.js.map +1 -0
- package/dist/eval/oracle/cli.d.ts +30 -0
- package/dist/eval/oracle/cli.d.ts.map +1 -0
- package/dist/eval/oracle/cli.js +179 -0
- package/dist/eval/oracle/cli.js.map +1 -0
- package/dist/eval/oracle/diff.d.ts +26 -0
- package/dist/eval/oracle/diff.d.ts.map +1 -0
- package/dist/eval/oracle/diff.js +51 -0
- package/dist/eval/oracle/diff.js.map +1 -0
- package/dist/eval/oracle/index.d.ts +81 -0
- package/dist/eval/oracle/index.d.ts.map +1 -0
- package/dist/eval/oracle/index.js +55 -0
- package/dist/eval/oracle/index.js.map +1 -0
- package/dist/eval/oracle/normalize.d.ts +85 -0
- package/dist/eval/oracle/normalize.d.ts.map +1 -0
- package/dist/eval/oracle/normalize.js +321 -0
- package/dist/eval/oracle/normalize.js.map +1 -0
- package/dist/eval/oracle/score.d.ts +26 -0
- package/dist/eval/oracle/score.d.ts.map +1 -0
- package/dist/eval/oracle/score.js +15 -0
- package/dist/eval/oracle/score.js.map +1 -0
- package/dist/eval/oracle/systest.d.ts +30 -0
- package/dist/eval/oracle/systest.d.ts.map +1 -0
- package/dist/eval/oracle/systest.js +98 -0
- package/dist/eval/oracle/systest.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +753 -0
- package/dist/index.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/customFilters.d.ts +10 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/customFilters.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/customFilters.js +38 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/customFilters.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/fields.d.ts +21 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/fields.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/fields.js +168 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/fields.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/panels.d.ts +9 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/panels.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/panels.js +47 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/panels.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/toolbar.d.ts +16 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/toolbar.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/toolbar.js +124 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/toolbar.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/workspaceSections.d.ts +12 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/workspaceSections.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/workspaceSections.js +36 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/workspaceSections.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/common.d.ts +11 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/common.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/common.js +37 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/common.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/detailsMaster.d.ts +8 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/detailsMaster.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/detailsMaster.js +86 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/detailsMaster.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/detailsTransaction.d.ts +7 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/detailsTransaction.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/detailsTransaction.js +69 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/detailsTransaction.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/dialog.d.ts +14 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/dialog.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/dialog.js +187 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/dialog.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/factBox.d.ts +10 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/factBox.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/factBox.js +54 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/factBox.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/listPage.d.ts +7 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/listPage.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/listPage.js +33 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/listPage.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/lookup.d.ts +10 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/lookup.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/lookup.js +95 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/lookup.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/simpleDetails.d.ts +16 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/simpleDetails.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/simpleDetails.js +158 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/simpleDetails.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/simpleList.d.ts +7 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/simpleList.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/simpleList.js +34 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/simpleList.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/simpleListDetails.d.ts +9 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/simpleListDetails.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/simpleListDetails.js +99 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/simpleListDetails.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/tableOfContents.d.ts +8 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/tableOfContents.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/tableOfContents.js +95 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/tableOfContents.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/task.d.ts +9 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/task.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/task.js +42 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/task.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/wizard.d.ts +7 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/wizard.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/wizard.js +42 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/wizard.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/workspace.d.ts +17 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/workspace.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/workspace.js +157 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/workspace.js.map +1 -0
- package/dist/knowledge/formPatterns/crossCheck.d.ts +44 -0
- package/dist/knowledge/formPatterns/crossCheck.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/crossCheck.js +109 -0
- package/dist/knowledge/formPatterns/crossCheck.js.map +1 -0
- package/dist/knowledge/formPatterns/index.d.ts +30 -0
- package/dist/knowledge/formPatterns/index.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/index.js +158 -0
- package/dist/knowledge/formPatterns/index.js.map +1 -0
- package/dist/knowledge/formPatterns/methodStubs.d.ts +45 -0
- package/dist/knowledge/formPatterns/methodStubs.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/methodStubs.js +257 -0
- package/dist/knowledge/formPatterns/methodStubs.js.map +1 -0
- package/dist/knowledge/formPatterns/types.d.ts +115 -0
- package/dist/knowledge/formPatterns/types.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/types.js +44 -0
- package/dist/knowledge/formPatterns/types.js.map +1 -0
- package/dist/metadata/enhancedParser.d.ts +91 -0
- package/dist/metadata/enhancedParser.d.ts.map +1 -0
- package/dist/metadata/enhancedParser.js +379 -0
- package/dist/metadata/enhancedParser.js.map +1 -0
- package/dist/metadata/formPatternMiner.d.ts +78 -0
- package/dist/metadata/formPatternMiner.d.ts.map +1 -0
- package/dist/metadata/formPatternMiner.js +220 -0
- package/dist/metadata/formPatternMiner.js.map +1 -0
- package/dist/metadata/labelParser.d.ts +71 -0
- package/dist/metadata/labelParser.d.ts.map +1 -0
- package/dist/metadata/labelParser.js +258 -0
- package/dist/metadata/labelParser.js.map +1 -0
- package/dist/metadata/symbolCountsWorker.d.ts +16 -0
- package/dist/metadata/symbolCountsWorker.d.ts.map +1 -0
- package/dist/metadata/symbolCountsWorker.js +42 -0
- package/dist/metadata/symbolCountsWorker.js.map +1 -0
- package/dist/metadata/symbolIndex.d.ts +474 -0
- package/dist/metadata/symbolIndex.d.ts.map +1 -0
- package/dist/metadata/symbolIndex.js +3152 -0
- package/dist/metadata/symbolIndex.js.map +1 -0
- package/dist/metadata/types.d.ts +267 -0
- package/dist/metadata/types.d.ts.map +1 -0
- package/dist/metadata/types.js +5 -0
- package/dist/metadata/types.js.map +1 -0
- package/dist/metadata/xmlParser.d.ts +232 -0
- package/dist/metadata/xmlParser.d.ts.map +1 -0
- package/dist/metadata/xmlParser.js +1021 -0
- package/dist/metadata/xmlParser.js.map +1 -0
- package/dist/metadata/xppDeclaration.d.ts +116 -0
- package/dist/metadata/xppDeclaration.d.ts.map +1 -0
- package/dist/metadata/xppDeclaration.js +350 -0
- package/dist/metadata/xppDeclaration.js.map +1 -0
- package/dist/middleware/apiKeyAuth.d.ts +7 -0
- package/dist/middleware/apiKeyAuth.d.ts.map +1 -0
- package/dist/middleware/apiKeyAuth.js +70 -0
- package/dist/middleware/apiKeyAuth.js.map +1 -0
- package/dist/middleware/rateLimiter.d.ts +7 -0
- package/dist/middleware/rateLimiter.d.ts.map +1 -0
- package/dist/middleware/rateLimiter.js +78 -0
- package/dist/middleware/rateLimiter.js.map +1 -0
- package/dist/prompts/codeReview.d.ts +8 -0
- package/dist/prompts/codeReview.d.ts.map +1 -0
- package/dist/prompts/codeReview.js +619 -0
- package/dist/prompts/codeReview.js.map +1 -0
- package/dist/prompts/index.d.ts +6 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +6 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/systemInstructions.d.ts +33 -0
- package/dist/prompts/systemInstructions.d.ts.map +1 -0
- package/dist/prompts/systemInstructions.js +154 -0
- package/dist/prompts/systemInstructions.js.map +1 -0
- package/dist/resources/classResource.d.ts +17 -0
- package/dist/resources/classResource.d.ts.map +1 -0
- package/dist/resources/classResource.js +33 -0
- package/dist/resources/classResource.js.map +1 -0
- package/dist/resources/index.d.ts +20 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +154 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/server/mcpServer.d.ts +11 -0
- package/dist/server/mcpServer.d.ts.map +1 -0
- package/dist/server/mcpServer.js +185 -0
- package/dist/server/mcpServer.js.map +1 -0
- package/dist/server/serverMode.d.ts +53 -0
- package/dist/server/serverMode.d.ts.map +1 -0
- package/dist/server/serverMode.js +72 -0
- package/dist/server/serverMode.js.map +1 -0
- package/dist/server/toolAnnotations.d.ts +28 -0
- package/dist/server/toolAnnotations.d.ts.map +1 -0
- package/dist/server/toolAnnotations.js +70 -0
- package/dist/server/toolAnnotations.js.map +1 -0
- package/dist/server/toolSchemas/analyzeCode.d.ts +71 -0
- package/dist/server/toolSchemas/analyzeCode.d.ts.map +1 -0
- package/dist/server/toolSchemas/analyzeCode.js +50 -0
- package/dist/server/toolSchemas/analyzeCode.js.map +1 -0
- package/dist/server/toolSchemas/batchGetInfo.d.ts +32 -0
- package/dist/server/toolSchemas/batchGetInfo.d.ts.map +1 -0
- package/dist/server/toolSchemas/batchGetInfo.js +35 -0
- package/dist/server/toolSchemas/batchGetInfo.js.map +1 -0
- package/dist/server/toolSchemas/buildD365foProject.d.ts +44 -0
- package/dist/server/toolSchemas/buildD365foProject.d.ts.map +1 -0
- package/dist/server/toolSchemas/buildD365foProject.js +47 -0
- package/dist/server/toolSchemas/buildD365foProject.js.map +1 -0
- package/dist/server/toolSchemas/d365foFile.d.ts +99 -0
- package/dist/server/toolSchemas/d365foFile.d.ts.map +1 -0
- package/dist/server/toolSchemas/d365foFile.js +163 -0
- package/dist/server/toolSchemas/d365foFile.js.map +1 -0
- package/dist/server/toolSchemas/extensionInfo.d.ts +65 -0
- package/dist/server/toolSchemas/extensionInfo.d.ts.map +1 -0
- package/dist/server/toolSchemas/extensionInfo.js +73 -0
- package/dist/server/toolSchemas/extensionInfo.js.map +1 -0
- package/dist/server/toolSchemas/findReferences.d.ts +35 -0
- package/dist/server/toolSchemas/findReferences.d.ts.map +1 -0
- package/dist/server/toolSchemas/findReferences.js +35 -0
- package/dist/server/toolSchemas/findReferences.js.map +1 -0
- package/dist/server/toolSchemas/generateObject.d.ts +246 -0
- package/dist/server/toolSchemas/generateObject.d.ts.map +1 -0
- package/dist/server/toolSchemas/generateObject.js +158 -0
- package/dist/server/toolSchemas/generateObject.js.map +1 -0
- package/dist/server/toolSchemas/getKnowledge.d.ts +39 -0
- package/dist/server/toolSchemas/getKnowledge.d.ts.map +1 -0
- package/dist/server/toolSchemas/getKnowledge.js +46 -0
- package/dist/server/toolSchemas/getKnowledge.js.map +1 -0
- package/dist/server/toolSchemas/getMethod.d.ts +30 -0
- package/dist/server/toolSchemas/getMethod.d.ts.map +1 -0
- package/dist/server/toolSchemas/getMethod.js +34 -0
- package/dist/server/toolSchemas/getMethod.js.map +1 -0
- package/dist/server/toolSchemas/getObjectInfo.d.ts +24 -0
- package/dist/server/toolSchemas/getObjectInfo.d.ts.map +1 -0
- package/dist/server/toolSchemas/getObjectInfo.js +30 -0
- package/dist/server/toolSchemas/getObjectInfo.js.map +1 -0
- package/dist/server/toolSchemas/getWorkspaceInfo.d.ts +29 -0
- package/dist/server/toolSchemas/getWorkspaceInfo.d.ts.map +1 -0
- package/dist/server/toolSchemas/getWorkspaceInfo.js +29 -0
- package/dist/server/toolSchemas/getWorkspaceInfo.js.map +1 -0
- package/dist/server/toolSchemas/index.d.ts +1142 -0
- package/dist/server/toolSchemas/index.d.ts.map +1 -0
- package/dist/server/toolSchemas/index.js +60 -0
- package/dist/server/toolSchemas/index.js.map +1 -0
- package/dist/server/toolSchemas/labels.d.ts +172 -0
- package/dist/server/toolSchemas/labels.d.ts.map +1 -0
- package/dist/server/toolSchemas/labels.js +159 -0
- package/dist/server/toolSchemas/labels.js.map +1 -0
- package/dist/server/toolSchemas/objectPatterns.d.ts +93 -0
- package/dist/server/toolSchemas/objectPatterns.d.ts.map +1 -0
- package/dist/server/toolSchemas/objectPatterns.js +104 -0
- package/dist/server/toolSchemas/objectPatterns.js.map +1 -0
- package/dist/server/toolSchemas/prepare.d.ts +49 -0
- package/dist/server/toolSchemas/prepare.d.ts.map +1 -0
- package/dist/server/toolSchemas/prepare.js +57 -0
- package/dist/server/toolSchemas/prepare.js.map +1 -0
- package/dist/server/toolSchemas/reviewWorkspaceChanges.d.ts +20 -0
- package/dist/server/toolSchemas/reviewWorkspaceChanges.d.ts.map +1 -0
- package/dist/server/toolSchemas/reviewWorkspaceChanges.js +19 -0
- package/dist/server/toolSchemas/reviewWorkspaceChanges.js.map +1 -0
- package/dist/server/toolSchemas/runBpCheck.d.ts +36 -0
- package/dist/server/toolSchemas/runBpCheck.d.ts.map +1 -0
- package/dist/server/toolSchemas/runBpCheck.js +21 -0
- package/dist/server/toolSchemas/runBpCheck.js.map +1 -0
- package/dist/server/toolSchemas/runSystestClass.d.ts +32 -0
- package/dist/server/toolSchemas/runSystestClass.d.ts.map +1 -0
- package/dist/server/toolSchemas/runSystestClass.js +20 -0
- package/dist/server/toolSchemas/runSystestClass.js.map +1 -0
- package/dist/server/toolSchemas/search.d.ts +109 -0
- package/dist/server/toolSchemas/search.d.ts.map +1 -0
- package/dist/server/toolSchemas/search.js +123 -0
- package/dist/server/toolSchemas/search.js.map +1 -0
- package/dist/server/toolSchemas/securityInfo.d.ts +45 -0
- package/dist/server/toolSchemas/securityInfo.d.ts.map +1 -0
- package/dist/server/toolSchemas/securityInfo.js +39 -0
- package/dist/server/toolSchemas/securityInfo.js.map +1 -0
- package/dist/server/toolSchemas/suggestEdt.d.ts +29 -0
- package/dist/server/toolSchemas/suggestEdt.d.ts.map +1 -0
- package/dist/server/toolSchemas/suggestEdt.js +29 -0
- package/dist/server/toolSchemas/suggestEdt.js.map +1 -0
- package/dist/server/toolSchemas/triggerDbSync.d.ts +47 -0
- package/dist/server/toolSchemas/triggerDbSync.d.ts.map +1 -0
- package/dist/server/toolSchemas/triggerDbSync.js +31 -0
- package/dist/server/toolSchemas/triggerDbSync.js.map +1 -0
- package/dist/server/toolSchemas/undoLastModification.d.ts +20 -0
- package/dist/server/toolSchemas/undoLastModification.d.ts.map +1 -0
- package/dist/server/toolSchemas/undoLastModification.js +17 -0
- package/dist/server/toolSchemas/undoLastModification.js.map +1 -0
- package/dist/server/toolSchemas/updateSymbolIndex.d.ts +19 -0
- package/dist/server/toolSchemas/updateSymbolIndex.d.ts.map +1 -0
- package/dist/server/toolSchemas/updateSymbolIndex.js +18 -0
- package/dist/server/toolSchemas/updateSymbolIndex.js.map +1 -0
- package/dist/server/toolSchemas/validateCode.d.ts +35 -0
- package/dist/server/toolSchemas/validateCode.d.ts.map +1 -0
- package/dist/server/toolSchemas/validateCode.js +38 -0
- package/dist/server/toolSchemas/validateCode.js.map +1 -0
- package/dist/server/toolSchemas/validateObjectNaming.d.ts +33 -0
- package/dist/server/toolSchemas/validateObjectNaming.d.ts.map +1 -0
- package/dist/server/toolSchemas/validateObjectNaming.js +32 -0
- package/dist/server/toolSchemas/validateObjectNaming.js.map +1 -0
- package/dist/server/toolSchemas/verifyD365foProject.d.ts +50 -0
- package/dist/server/toolSchemas/verifyD365foProject.d.ts.map +1 -0
- package/dist/server/toolSchemas/verifyD365foProject.js +46 -0
- package/dist/server/toolSchemas/verifyD365foProject.js.map +1 -0
- package/dist/server/transport.d.ts +30 -0
- package/dist/server/transport.d.ts.map +1 -0
- package/dist/server/transport.js +391 -0
- package/dist/server/transport.js.map +1 -0
- package/dist/tools/analyzeCode.d.ts +17 -0
- package/dist/tools/analyzeCode.d.ts.map +1 -0
- package/dist/tools/analyzeCode.js +63 -0
- package/dist/tools/analyzeCode.js.map +1 -0
- package/dist/tools/analyzeCompleteness.d.ts +20 -0
- package/dist/tools/analyzeCompleteness.d.ts.map +1 -0
- package/dist/tools/analyzeCompleteness.js +103 -0
- package/dist/tools/analyzeCompleteness.js.map +1 -0
- package/dist/tools/analyzeExtensionPoints.d.ts +21 -0
- package/dist/tools/analyzeExtensionPoints.d.ts.map +1 -0
- package/dist/tools/analyzeExtensionPoints.js +343 -0
- package/dist/tools/analyzeExtensionPoints.js.map +1 -0
- package/dist/tools/analyzePatterns.d.ts +20 -0
- package/dist/tools/analyzePatterns.d.ts.map +1 -0
- package/dist/tools/analyzePatterns.js +71 -0
- package/dist/tools/analyzePatterns.js.map +1 -0
- package/dist/tools/apiUsagePatterns.d.ts +20 -0
- package/dist/tools/apiUsagePatterns.d.ts.map +1 -0
- package/dist/tools/apiUsagePatterns.js +136 -0
- package/dist/tools/apiUsagePatterns.js.map +1 -0
- package/dist/tools/batchGetInfo.d.ts +50 -0
- package/dist/tools/batchGetInfo.d.ts.map +1 -0
- package/dist/tools/batchGetInfo.js +52 -0
- package/dist/tools/batchGetInfo.js.map +1 -0
- package/dist/tools/batchSearch.d.ts +64 -0
- package/dist/tools/batchSearch.d.ts.map +1 -0
- package/dist/tools/batchSearch.js +265 -0
- package/dist/tools/batchSearch.js.map +1 -0
- package/dist/tools/buildProject.d.ts +28 -0
- package/dist/tools/buildProject.d.ts.map +1 -0
- package/dist/tools/buildProject.js +929 -0
- package/dist/tools/buildProject.js.map +1 -0
- package/dist/tools/classInfo.d.ts +8 -0
- package/dist/tools/classInfo.d.ts.map +1 -0
- package/dist/tools/classInfo.js +235 -0
- package/dist/tools/classInfo.js.map +1 -0
- package/dist/tools/codeGen.d.ts +19 -0
- package/dist/tools/codeGen.d.ts.map +1 -0
- package/dist/tools/codeGen.js +1956 -0
- package/dist/tools/codeGen.js.map +1 -0
- package/dist/tools/completion.d.ts +8 -0
- package/dist/tools/completion.d.ts.map +1 -0
- package/dist/tools/completion.js +272 -0
- package/dist/tools/completion.js.map +1 -0
- package/dist/tools/configKeyInfo.d.ts +22 -0
- package/dist/tools/configKeyInfo.d.ts.map +1 -0
- package/dist/tools/configKeyInfo.js +74 -0
- package/dist/tools/configKeyInfo.js.map +1 -0
- package/dist/tools/createD365File.d.ts +479 -0
- package/dist/tools/createD365File.d.ts.map +1 -0
- package/dist/tools/createD365File.js +4185 -0
- package/dist/tools/createD365File.js.map +1 -0
- package/dist/tools/createLabel.d.ts +51 -0
- package/dist/tools/createLabel.d.ts.map +1 -0
- package/dist/tools/createLabel.js +761 -0
- package/dist/tools/createLabel.js.map +1 -0
- package/dist/tools/d365foErrorHelp.d.ts +29 -0
- package/dist/tools/d365foErrorHelp.d.ts.map +1 -0
- package/dist/tools/d365foErrorHelp.js +389 -0
- package/dist/tools/d365foErrorHelp.js.map +1 -0
- package/dist/tools/d365foFile.d.ts +20 -0
- package/dist/tools/d365foFile.d.ts.map +1 -0
- package/dist/tools/d365foFile.js +58 -0
- package/dist/tools/d365foFile.js.map +1 -0
- package/dist/tools/d365foFileOpSpecs.d.ts +41 -0
- package/dist/tools/d365foFileOpSpecs.d.ts.map +1 -0
- package/dist/tools/d365foFileOpSpecs.js +336 -0
- package/dist/tools/d365foFileOpSpecs.js.map +1 -0
- package/dist/tools/dataEntityInfo.d.ts +23 -0
- package/dist/tools/dataEntityInfo.d.ts.map +1 -0
- package/dist/tools/dataEntityInfo.js +45 -0
- package/dist/tools/dataEntityInfo.js.map +1 -0
- package/dist/tools/dataEntityXml.d.ts +31 -0
- package/dist/tools/dataEntityXml.d.ts.map +1 -0
- package/dist/tools/dataEntityXml.js +131 -0
- package/dist/tools/dataEntityXml.js.map +1 -0
- package/dist/tools/dbSync.d.ts +8 -0
- package/dist/tools/dbSync.d.ts.map +1 -0
- package/dist/tools/dbSync.js +285 -0
- package/dist/tools/dbSync.js.map +1 -0
- package/dist/tools/edtInfo.d.ts +23 -0
- package/dist/tools/edtInfo.d.ts.map +1 -0
- package/dist/tools/edtInfo.js +122 -0
- package/dist/tools/edtInfo.js.map +1 -0
- package/dist/tools/enumInfo.d.ts +17 -0
- package/dist/tools/enumInfo.d.ts.map +1 -0
- package/dist/tools/enumInfo.js +44 -0
- package/dist/tools/enumInfo.js.map +1 -0
- package/dist/tools/extensionInfo.d.ts +26 -0
- package/dist/tools/extensionInfo.d.ts.map +1 -0
- package/dist/tools/extensionInfo.js +73 -0
- package/dist/tools/extensionInfo.js.map +1 -0
- package/dist/tools/extensionSearch.d.ts +20 -0
- package/dist/tools/extensionSearch.d.ts.map +1 -0
- package/dist/tools/extensionSearch.js +72 -0
- package/dist/tools/extensionSearch.js.map +1 -0
- package/dist/tools/extensionStrategyAdvisor.d.ts +15 -0
- package/dist/tools/extensionStrategyAdvisor.d.ts.map +1 -0
- package/dist/tools/extensionStrategyAdvisor.js +519 -0
- package/dist/tools/extensionStrategyAdvisor.js.map +1 -0
- package/dist/tools/findCocExtensions.d.ts +20 -0
- package/dist/tools/findCocExtensions.d.ts.map +1 -0
- package/dist/tools/findCocExtensions.js +285 -0
- package/dist/tools/findCocExtensions.js.map +1 -0
- package/dist/tools/findEventHandlers.d.ts +21 -0
- package/dist/tools/findEventHandlers.d.ts.map +1 -0
- package/dist/tools/findEventHandlers.js +196 -0
- package/dist/tools/findEventHandlers.js.map +1 -0
- package/dist/tools/findReferences.d.ts +30 -0
- package/dist/tools/findReferences.d.ts.map +1 -0
- package/dist/tools/findReferences.js +551 -0
- package/dist/tools/findReferences.js.map +1 -0
- package/dist/tools/formInfo.d.ts +13 -0
- package/dist/tools/formInfo.d.ts.map +1 -0
- package/dist/tools/formInfo.js +407 -0
- package/dist/tools/formInfo.js.map +1 -0
- package/dist/tools/formPattern.d.ts +19 -0
- package/dist/tools/formPattern.d.ts.map +1 -0
- package/dist/tools/formPattern.js +52 -0
- package/dist/tools/formPattern.js.map +1 -0
- package/dist/tools/generateD365Xml.d.ts +12 -0
- package/dist/tools/generateD365Xml.d.ts.map +1 -0
- package/dist/tools/generateD365Xml.js +1454 -0
- package/dist/tools/generateD365Xml.js.map +1 -0
- package/dist/tools/generateFindMethods.d.ts +69 -0
- package/dist/tools/generateFindMethods.d.ts.map +1 -0
- package/dist/tools/generateFindMethods.js +207 -0
- package/dist/tools/generateFindMethods.js.map +1 -0
- package/dist/tools/generateMetadata.d.ts +37 -0
- package/dist/tools/generateMetadata.d.ts.map +1 -0
- package/dist/tools/generateMetadata.js +213 -0
- package/dist/tools/generateMetadata.js.map +1 -0
- package/dist/tools/generateObject.d.ts +34 -0
- package/dist/tools/generateObject.d.ts.map +1 -0
- package/dist/tools/generateObject.js +47 -0
- package/dist/tools/generateObject.js.map +1 -0
- package/dist/tools/generateRelationXpp.d.ts +45 -0
- package/dist/tools/generateRelationXpp.d.ts.map +1 -0
- package/dist/tools/generateRelationXpp.js +129 -0
- package/dist/tools/generateRelationXpp.js.map +1 -0
- package/dist/tools/generateSmart.d.ts +32 -0
- package/dist/tools/generateSmart.d.ts.map +1 -0
- package/dist/tools/generateSmart.js +52 -0
- package/dist/tools/generateSmart.js.map +1 -0
- package/dist/tools/generateSmartForm.d.ts +82 -0
- package/dist/tools/generateSmartForm.d.ts.map +1 -0
- package/dist/tools/generateSmartForm.js +996 -0
- package/dist/tools/generateSmartForm.js.map +1 -0
- package/dist/tools/generateSmartReport.d.ts +90 -0
- package/dist/tools/generateSmartReport.d.ts.map +1 -0
- package/dist/tools/generateSmartReport.js +1254 -0
- package/dist/tools/generateSmartReport.js.map +1 -0
- package/dist/tools/generateSmartTable.d.ts +138 -0
- package/dist/tools/generateSmartTable.d.ts.map +1 -0
- package/dist/tools/generateSmartTable.js +1305 -0
- package/dist/tools/generateSmartTable.js.map +1 -0
- package/dist/tools/generateTableFields.d.ts +48 -0
- package/dist/tools/generateTableFields.d.ts.map +1 -0
- package/dist/tools/generateTableFields.js +186 -0
- package/dist/tools/generateTableFields.js.map +1 -0
- package/dist/tools/generateTableRelation.d.ts +35 -0
- package/dist/tools/generateTableRelation.d.ts.map +1 -0
- package/dist/tools/generateTableRelation.js +161 -0
- package/dist/tools/generateTableRelation.js.map +1 -0
- package/dist/tools/getFormPatternSpec.d.ts +13 -0
- package/dist/tools/getFormPatternSpec.d.ts.map +1 -0
- package/dist/tools/getFormPatternSpec.js +290 -0
- package/dist/tools/getFormPatternSpec.js.map +1 -0
- package/dist/tools/getFormPatterns.d.ts +68 -0
- package/dist/tools/getFormPatterns.d.ts.map +1 -0
- package/dist/tools/getFormPatterns.js +471 -0
- package/dist/tools/getFormPatterns.js.map +1 -0
- package/dist/tools/getKnowledge.d.ts +27 -0
- package/dist/tools/getKnowledge.d.ts.map +1 -0
- package/dist/tools/getKnowledge.js +50 -0
- package/dist/tools/getKnowledge.js.map +1 -0
- package/dist/tools/getLabelInfo.d.ts +21 -0
- package/dist/tools/getLabelInfo.d.ts.map +1 -0
- package/dist/tools/getLabelInfo.js +138 -0
- package/dist/tools/getLabelInfo.js.map +1 -0
- package/dist/tools/getMethod.d.ts +19 -0
- package/dist/tools/getMethod.d.ts.map +1 -0
- package/dist/tools/getMethod.js +77 -0
- package/dist/tools/getMethod.js.map +1 -0
- package/dist/tools/getMethodSource.d.ts +17 -0
- package/dist/tools/getMethodSource.d.ts.map +1 -0
- package/dist/tools/getMethodSource.js +161 -0
- package/dist/tools/getMethodSource.js.map +1 -0
- package/dist/tools/getObjectInfo.d.ts +17 -0
- package/dist/tools/getObjectInfo.d.ts.map +1 -0
- package/dist/tools/getObjectInfo.js +88 -0
- package/dist/tools/getObjectInfo.js.map +1 -0
- package/dist/tools/getTablePatterns.d.ts +45 -0
- package/dist/tools/getTablePatterns.d.ts.map +1 -0
- package/dist/tools/getTablePatterns.js +235 -0
- package/dist/tools/getTablePatterns.js.map +1 -0
- package/dist/tools/index.d.ts +11 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +11 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/labels.d.ts +25 -0
- package/dist/tools/labels.d.ts.map +1 -0
- package/dist/tools/labels.js +111 -0
- package/dist/tools/labels.js.map +1 -0
- package/dist/tools/macroInfo.d.ts +23 -0
- package/dist/tools/macroInfo.d.ts.map +1 -0
- package/dist/tools/macroInfo.js +62 -0
- package/dist/tools/macroInfo.js.map +1 -0
- package/dist/tools/mapInfo.d.ts +21 -0
- package/dist/tools/mapInfo.d.ts.map +1 -0
- package/dist/tools/mapInfo.js +54 -0
- package/dist/tools/mapInfo.js.map +1 -0
- package/dist/tools/mapXml.d.ts +26 -0
- package/dist/tools/mapXml.d.ts.map +1 -0
- package/dist/tools/mapXml.js +88 -0
- package/dist/tools/mapXml.js.map +1 -0
- package/dist/tools/menuItemInfo.d.ts +20 -0
- package/dist/tools/menuItemInfo.d.ts.map +1 -0
- package/dist/tools/menuItemInfo.js +185 -0
- package/dist/tools/menuItemInfo.js.map +1 -0
- package/dist/tools/methodSignature.d.ts +33 -0
- package/dist/tools/methodSignature.d.ts.map +1 -0
- package/dist/tools/methodSignature.js +348 -0
- package/dist/tools/methodSignature.js.map +1 -0
- package/dist/tools/modifyD365File.d.ts +130 -0
- package/dist/tools/modifyD365File.d.ts.map +1 -0
- package/dist/tools/modifyD365File.js +2179 -0
- package/dist/tools/modifyD365File.js.map +1 -0
- package/dist/tools/objectInfoRegistry.d.ts +36 -0
- package/dist/tools/objectInfoRegistry.d.ts.map +1 -0
- package/dist/tools/objectInfoRegistry.js +98 -0
- package/dist/tools/objectInfoRegistry.js.map +1 -0
- package/dist/tools/objectPatterns.d.ts +16 -0
- package/dist/tools/objectPatterns.d.ts.map +1 -0
- package/dist/tools/objectPatterns.js +84 -0
- package/dist/tools/objectPatterns.js.map +1 -0
- package/dist/tools/prepare.d.ts +18 -0
- package/dist/tools/prepare.d.ts.map +1 -0
- package/dist/tools/prepare.js +47 -0
- package/dist/tools/prepare.js.map +1 -0
- package/dist/tools/prepareChange.d.ts +43 -0
- package/dist/tools/prepareChange.d.ts.map +1 -0
- package/dist/tools/prepareChange.js +327 -0
- package/dist/tools/prepareChange.js.map +1 -0
- package/dist/tools/prepareCreate.d.ts +45 -0
- package/dist/tools/prepareCreate.d.ts.map +1 -0
- package/dist/tools/prepareCreate.js +263 -0
- package/dist/tools/prepareCreate.js.map +1 -0
- package/dist/tools/queryInfo.d.ts +17 -0
- package/dist/tools/queryInfo.d.ts.map +1 -0
- package/dist/tools/queryInfo.js +46 -0
- package/dist/tools/queryInfo.js.map +1 -0
- package/dist/tools/queryViewXml.d.ts +36 -0
- package/dist/tools/queryViewXml.d.ts.map +1 -0
- package/dist/tools/queryViewXml.js +129 -0
- package/dist/tools/queryViewXml.js.map +1 -0
- package/dist/tools/renameLabel.d.ts +29 -0
- package/dist/tools/renameLabel.d.ts.map +1 -0
- package/dist/tools/renameLabel.js +377 -0
- package/dist/tools/renameLabel.js.map +1 -0
- package/dist/tools/repairFormControls.d.ts +21 -0
- package/dist/tools/repairFormControls.d.ts.map +1 -0
- package/dist/tools/repairFormControls.js +151 -0
- package/dist/tools/repairFormControls.js.map +1 -0
- package/dist/tools/reportInfo.d.ts +14 -0
- package/dist/tools/reportInfo.d.ts.map +1 -0
- package/dist/tools/reportInfo.js +302 -0
- package/dist/tools/reportInfo.js.map +1 -0
- package/dist/tools/resolveReferences.d.ts +89 -0
- package/dist/tools/resolveReferences.d.ts.map +1 -0
- package/dist/tools/resolveReferences.js +791 -0
- package/dist/tools/resolveReferences.js.map +1 -0
- package/dist/tools/reviewWorkspaceChanges.d.ts +14 -0
- package/dist/tools/reviewWorkspaceChanges.d.ts.map +1 -0
- package/dist/tools/reviewWorkspaceChanges.js +73 -0
- package/dist/tools/reviewWorkspaceChanges.js.map +1 -0
- package/dist/tools/runBpCheck.d.ts +14 -0
- package/dist/tools/runBpCheck.d.ts.map +1 -0
- package/dist/tools/runBpCheck.js +241 -0
- package/dist/tools/runBpCheck.js.map +1 -0
- package/dist/tools/search.d.ts +20 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +246 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/searchLabels.d.ts +26 -0
- package/dist/tools/searchLabels.d.ts.map +1 -0
- package/dist/tools/searchLabels.js +91 -0
- package/dist/tools/searchLabels.js.map +1 -0
- package/dist/tools/searchUnified.d.ts +28 -0
- package/dist/tools/searchUnified.d.ts.map +1 -0
- package/dist/tools/searchUnified.js +48 -0
- package/dist/tools/searchUnified.js.map +1 -0
- package/dist/tools/securityArtifactInfo.d.ts +14 -0
- package/dist/tools/securityArtifactInfo.d.ts.map +1 -0
- package/dist/tools/securityArtifactInfo.js +192 -0
- package/dist/tools/securityArtifactInfo.js.map +1 -0
- package/dist/tools/securityCoverageInfo.d.ts +21 -0
- package/dist/tools/securityCoverageInfo.d.ts.map +1 -0
- package/dist/tools/securityCoverageInfo.js +248 -0
- package/dist/tools/securityCoverageInfo.js.map +1 -0
- package/dist/tools/securityInfo.d.ts +22 -0
- package/dist/tools/securityInfo.d.ts.map +1 -0
- package/dist/tools/securityInfo.js +43 -0
- package/dist/tools/securityInfo.js.map +1 -0
- package/dist/tools/securityPolicyInfo.d.ts +22 -0
- package/dist/tools/securityPolicyInfo.d.ts.map +1 -0
- package/dist/tools/securityPolicyInfo.js +49 -0
- package/dist/tools/securityPolicyInfo.js.map +1 -0
- package/dist/tools/securityPrivilegeXml.d.ts +21 -0
- package/dist/tools/securityPrivilegeXml.d.ts.map +1 -0
- package/dist/tools/securityPrivilegeXml.js +61 -0
- package/dist/tools/securityPrivilegeXml.js.map +1 -0
- package/dist/tools/serviceInfo.d.ts +25 -0
- package/dist/tools/serviceInfo.d.ts.map +1 -0
- package/dist/tools/serviceInfo.js +93 -0
- package/dist/tools/serviceInfo.js.map +1 -0
- package/dist/tools/suggestEdt.d.ts +15 -0
- package/dist/tools/suggestEdt.d.ts.map +1 -0
- package/dist/tools/suggestEdt.js +348 -0
- package/dist/tools/suggestEdt.js.map +1 -0
- package/dist/tools/suggestImplementation.d.ts +20 -0
- package/dist/tools/suggestImplementation.d.ts.map +1 -0
- package/dist/tools/suggestImplementation.js +144 -0
- package/dist/tools/suggestImplementation.js.map +1 -0
- package/dist/tools/sysTestRunner.d.ts +14 -0
- package/dist/tools/sysTestRunner.d.ts.map +1 -0
- package/dist/tools/sysTestRunner.js +145 -0
- package/dist/tools/sysTestRunner.js.map +1 -0
- package/dist/tools/tableExtensionInfo.d.ts +91 -0
- package/dist/tools/tableExtensionInfo.d.ts.map +1 -0
- package/dist/tools/tableExtensionInfo.js +305 -0
- package/dist/tools/tableExtensionInfo.js.map +1 -0
- package/dist/tools/tableInfo.d.ts +23 -0
- package/dist/tools/tableInfo.d.ts.map +1 -0
- package/dist/tools/tableInfo.js +125 -0
- package/dist/tools/tableInfo.js.map +1 -0
- package/dist/tools/toolHandler.d.ts +4 -0
- package/dist/tools/toolHandler.d.ts.map +1 -0
- package/dist/tools/toolHandler.js +508 -0
- package/dist/tools/toolHandler.js.map +1 -0
- package/dist/tools/undoLastModification.d.ts +15 -0
- package/dist/tools/undoLastModification.d.ts.map +1 -0
- package/dist/tools/undoLastModification.js +147 -0
- package/dist/tools/undoLastModification.js.map +1 -0
- package/dist/tools/updateSymbolIndex.d.ts +15 -0
- package/dist/tools/updateSymbolIndex.d.ts.map +1 -0
- package/dist/tools/updateSymbolIndex.js +520 -0
- package/dist/tools/updateSymbolIndex.js.map +1 -0
- package/dist/tools/validateCode.d.ts +24 -0
- package/dist/tools/validateCode.d.ts.map +1 -0
- package/dist/tools/validateCode.js +201 -0
- package/dist/tools/validateCode.js.map +1 -0
- package/dist/tools/validateFormPattern.d.ts +51 -0
- package/dist/tools/validateFormPattern.d.ts.map +1 -0
- package/dist/tools/validateFormPattern.js +201 -0
- package/dist/tools/validateFormPattern.js.map +1 -0
- package/dist/tools/validateObjectNaming.d.ts +21 -0
- package/dist/tools/validateObjectNaming.d.ts.map +1 -0
- package/dist/tools/validateObjectNaming.js +319 -0
- package/dist/tools/validateObjectNaming.js.map +1 -0
- package/dist/tools/validateXpp.d.ts +79 -0
- package/dist/tools/validateXpp.d.ts.map +1 -0
- package/dist/tools/validateXpp.js +705 -0
- package/dist/tools/validateXpp.js.map +1 -0
- package/dist/tools/verifyD365Project.d.ts +21 -0
- package/dist/tools/verifyD365Project.d.ts.map +1 -0
- package/dist/tools/verifyD365Project.js +299 -0
- package/dist/tools/verifyD365Project.js.map +1 -0
- package/dist/tools/viewInfo.d.ts +17 -0
- package/dist/tools/viewInfo.d.ts.map +1 -0
- package/dist/tools/viewInfo.js +46 -0
- package/dist/tools/viewInfo.js.map +1 -0
- package/dist/tools/xppKnowledge.d.ts +45 -0
- package/dist/tools/xppKnowledge.d.ts.map +1 -0
- package/dist/tools/xppKnowledge.js +2815 -0
- package/dist/tools/xppKnowledge.js.map +1 -0
- package/dist/types/context.d.ts +56 -0
- package/dist/types/context.d.ts.map +1 -0
- package/dist/types/context.js +5 -0
- package/dist/types/context.js.map +1 -0
- package/dist/utils/callDedup.d.ts +29 -0
- package/dist/utils/callDedup.d.ts.map +1 -0
- package/dist/utils/callDedup.js +87 -0
- package/dist/utils/callDedup.js.map +1 -0
- package/dist/utils/configManager.d.ts +307 -0
- package/dist/utils/configManager.d.ts.map +1 -0
- package/dist/utils/configManager.js +1169 -0
- package/dist/utils/configManager.js.map +1 -0
- package/dist/utils/d365XmlNormalizer.d.ts +9 -0
- package/dist/utils/d365XmlNormalizer.d.ts.map +1 -0
- package/dist/utils/d365XmlNormalizer.js +24 -0
- package/dist/utils/d365XmlNormalizer.js.map +1 -0
- package/dist/utils/edtExtensionValidator.d.ts +110 -0
- package/dist/utils/edtExtensionValidator.d.ts.map +1 -0
- package/dist/utils/edtExtensionValidator.js +367 -0
- package/dist/utils/edtExtensionValidator.js.map +1 -0
- package/dist/utils/eolUtils.d.ts +15 -0
- package/dist/utils/eolUtils.d.ts.map +1 -0
- package/dist/utils/eolUtils.js +21 -0
- package/dist/utils/eolUtils.js.map +1 -0
- package/dist/utils/extractManifest.d.ts +34 -0
- package/dist/utils/extractManifest.d.ts.map +1 -0
- package/dist/utils/extractManifest.js +43 -0
- package/dist/utils/extractManifest.js.map +1 -0
- package/dist/utils/fieldControlTypes.d.ts +44 -0
- package/dist/utils/fieldControlTypes.d.ts.map +1 -0
- package/dist/utils/fieldControlTypes.js +97 -0
- package/dist/utils/fieldControlTypes.js.map +1 -0
- package/dist/utils/formCloner.d.ts +77 -0
- package/dist/utils/formCloner.d.ts.map +1 -0
- package/dist/utils/formCloner.js +364 -0
- package/dist/utils/formCloner.js.map +1 -0
- package/dist/utils/formControlExpander.d.ts +68 -0
- package/dist/utils/formControlExpander.d.ts.map +1 -0
- package/dist/utils/formControlExpander.js +207 -0
- package/dist/utils/formControlExpander.js.map +1 -0
- package/dist/utils/formControlRepair.d.ts +81 -0
- package/dist/utils/formControlRepair.d.ts.map +1 -0
- package/dist/utils/formControlRepair.js +203 -0
- package/dist/utils/formControlRepair.js.map +1 -0
- package/dist/utils/formExtensionShapeValidator.d.ts +44 -0
- package/dist/utils/formExtensionShapeValidator.d.ts.map +1 -0
- package/dist/utils/formExtensionShapeValidator.js +99 -0
- package/dist/utils/formExtensionShapeValidator.js.map +1 -0
- package/dist/utils/formPatternTemplates.d.ts +77 -0
- package/dist/utils/formPatternTemplates.d.ts.map +1 -0
- package/dist/utils/formPatternTemplates.js +1917 -0
- package/dist/utils/formPatternTemplates.js.map +1 -0
- package/dist/utils/fsExtensionScanner.d.ts +76 -0
- package/dist/utils/fsExtensionScanner.d.ts.map +1 -0
- package/dist/utils/fsExtensionScanner.js +271 -0
- package/dist/utils/fsExtensionScanner.js.map +1 -0
- package/dist/utils/fuzzyMatching.d.ts +41 -0
- package/dist/utils/fuzzyMatching.d.ts.map +1 -0
- package/dist/utils/fuzzyMatching.js +186 -0
- package/dist/utils/fuzzyMatching.js.map +1 -0
- package/dist/utils/indexStaleness.d.ts +30 -0
- package/dist/utils/indexStaleness.d.ts.map +1 -0
- package/dist/utils/indexStaleness.js +104 -0
- package/dist/utils/indexStaleness.js.map +1 -0
- package/dist/utils/loadEnv.d.ts +32 -0
- package/dist/utils/loadEnv.d.ts.map +1 -0
- package/dist/utils/loadEnv.js +83 -0
- package/dist/utils/loadEnv.js.map +1 -0
- package/dist/utils/logger.d.ts +4 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +11 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/metadataResolver.d.ts +155 -0
- package/dist/utils/metadataResolver.d.ts.map +1 -0
- package/dist/utils/metadataResolver.js +277 -0
- package/dist/utils/metadataResolver.js.map +1 -0
- package/dist/utils/modelClassifier.d.ts +180 -0
- package/dist/utils/modelClassifier.d.ts.map +1 -0
- package/dist/utils/modelClassifier.js +373 -0
- package/dist/utils/modelClassifier.js.map +1 -0
- package/dist/utils/operationLocks.d.ts +26 -0
- package/dist/utils/operationLocks.d.ts.map +1 -0
- package/dist/utils/operationLocks.js +182 -0
- package/dist/utils/operationLocks.js.map +1 -0
- package/dist/utils/packageResolver.d.ts +52 -0
- package/dist/utils/packageResolver.d.ts.map +1 -0
- package/dist/utils/packageResolver.js +174 -0
- package/dist/utils/packageResolver.js.map +1 -0
- package/dist/utils/pathContainment.d.ts +60 -0
- package/dist/utils/pathContainment.d.ts.map +1 -0
- package/dist/utils/pathContainment.js +270 -0
- package/dist/utils/pathContainment.js.map +1 -0
- package/dist/utils/projectUtils.d.ts +14 -0
- package/dist/utils/projectUtils.d.ts.map +1 -0
- package/dist/utils/projectUtils.js +48 -0
- package/dist/utils/projectUtils.js.map +1 -0
- package/dist/utils/provenanceStore.d.ts +54 -0
- package/dist/utils/provenanceStore.d.ts.map +1 -0
- package/dist/utils/provenanceStore.js +203 -0
- package/dist/utils/provenanceStore.js.map +1 -0
- package/dist/utils/richContext.d.ts +45 -0
- package/dist/utils/richContext.d.ts.map +1 -0
- package/dist/utils/richContext.js +316 -0
- package/dist/utils/richContext.js.map +1 -0
- package/dist/utils/smartXmlBuilder.d.ts +187 -0
- package/dist/utils/smartXmlBuilder.d.ts.map +1 -0
- package/dist/utils/smartXmlBuilder.js +504 -0
- package/dist/utils/smartXmlBuilder.js.map +1 -0
- package/dist/utils/stdioSessionInfo.d.ts +53 -0
- package/dist/utils/stdioSessionInfo.d.ts.map +1 -0
- package/dist/utils/stdioSessionInfo.js +47 -0
- package/dist/utils/stdioSessionInfo.js.map +1 -0
- package/dist/utils/suggestionEngine.d.ts +20 -0
- package/dist/utils/suggestionEngine.d.ts.map +1 -0
- package/dist/utils/suggestionEngine.js +145 -0
- package/dist/utils/suggestionEngine.js.map +1 -0
- package/dist/utils/symbolLookup.d.ts +60 -0
- package/dist/utils/symbolLookup.d.ts.map +1 -0
- package/dist/utils/symbolLookup.js +0 -0
- package/dist/utils/symbolLookup.js.map +1 -0
- package/dist/utils/terminalUi.d.ts +85 -0
- package/dist/utils/terminalUi.d.ts.map +1 -0
- package/dist/utils/terminalUi.js +182 -0
- package/dist/utils/terminalUi.js.map +1 -0
- package/dist/utils/toolMetrics.d.ts +32 -0
- package/dist/utils/toolMetrics.d.ts.map +1 -0
- package/dist/utils/toolMetrics.js +89 -0
- package/dist/utils/toolMetrics.js.map +1 -0
- package/dist/utils/toolProgressMessage.d.ts +8 -0
- package/dist/utils/toolProgressMessage.d.ts.map +1 -0
- package/dist/utils/toolProgressMessage.js +182 -0
- package/dist/utils/toolProgressMessage.js.map +1 -0
- package/dist/utils/workspaceDetector.d.ts +51 -0
- package/dist/utils/workspaceDetector.d.ts.map +1 -0
- package/dist/utils/workspaceDetector.js +328 -0
- package/dist/utils/workspaceDetector.js.map +1 -0
- package/dist/utils/xppConfigProvider.d.ts +48 -0
- package/dist/utils/xppConfigProvider.d.ts.map +1 -0
- package/dist/utils/xppConfigProvider.js +121 -0
- package/dist/utils/xppConfigProvider.js.map +1 -0
- package/dist/utils/xppDocGen.d.ts +39 -0
- package/dist/utils/xppDocGen.d.ts.map +1 -0
- package/dist/utils/xppDocGen.js +518 -0
- package/dist/utils/xppDocGen.js.map +1 -0
- package/dist/utils/xppFormat.d.ts +21 -0
- package/dist/utils/xppFormat.d.ts.map +1 -0
- package/dist/utils/xppFormat.js +102 -0
- package/dist/utils/xppFormat.js.map +1 -0
- package/dist/utils/xppSelectLint.d.ts +18 -0
- package/dist/utils/xppSelectLint.d.ts.map +1 -0
- package/dist/utils/xppSelectLint.js +80 -0
- package/dist/utils/xppSelectLint.js.map +1 -0
- package/dist/validation/formPatternValidator.d.ts +53 -0
- package/dist/validation/formPatternValidator.d.ts.map +1 -0
- package/dist/validation/formPatternValidator.js +454 -0
- package/dist/validation/formPatternValidator.js.map +1 -0
- package/dist/workspace/contextRanker.d.ts +58 -0
- package/dist/workspace/contextRanker.d.ts.map +1 -0
- package/dist/workspace/contextRanker.js +216 -0
- package/dist/workspace/contextRanker.js.map +1 -0
- package/dist/workspace/contextSnapshot.d.ts +68 -0
- package/dist/workspace/contextSnapshot.d.ts.map +1 -0
- package/dist/workspace/contextSnapshot.js +193 -0
- package/dist/workspace/contextSnapshot.js.map +1 -0
- package/dist/workspace/hybridSearch.d.ts +39 -0
- package/dist/workspace/hybridSearch.d.ts.map +1 -0
- package/dist/workspace/hybridSearch.js +96 -0
- package/dist/workspace/hybridSearch.js.map +1 -0
- package/dist/workspace/workspaceScanner.d.ts +95 -0
- package/dist/workspace/workspaceScanner.d.ts.map +1 -0
- package/dist/workspace/workspaceScanner.js +247 -0
- package/dist/workspace/workspaceScanner.js.map +1 -0
- package/dist/workspace/workspaceUtils.d.ts +23 -0
- package/dist/workspace/workspaceUtils.d.ts.map +1 -0
- package/dist/workspace/workspaceUtils.js +77 -0
- package/dist/workspace/workspaceUtils.js.map +1 -0
- package/package.json +94 -0
|
@@ -0,0 +1,1169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Configuration Manager
|
|
3
|
+
* Loads and provides access to .mcp.json configuration
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'fs/promises';
|
|
6
|
+
import { existsSync, realpathSync } from 'fs';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
import * as os from 'os';
|
|
9
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
10
|
+
import { autoDetectD365Project, detectD365Project, scanAllD365Projects, extractModelNameFromProject, detectGitBranch, isMicrosoftDemoModel } from './workspaceDetector.js';
|
|
11
|
+
import { registerCustomModel, getCustomModels } from './modelClassifier.js';
|
|
12
|
+
import { XppConfigProvider } from './xppConfigProvider.js';
|
|
13
|
+
import { debugLog } from './logger.js';
|
|
14
|
+
/**
|
|
15
|
+
* Resolve the actual on-disk casing of a path.
|
|
16
|
+
* On Windows the filesystem is case-insensitive but VS Code and Copilot compare
|
|
17
|
+
* paths case-sensitively, causing "Couldn't find file" errors when casing in
|
|
18
|
+
* .mcp.json / .rnrproj differs from the real directory name (e.g. AOSService vs AosService).
|
|
19
|
+
* Falls back to the original string when the path does not exist yet.
|
|
20
|
+
*/
|
|
21
|
+
function normalizePath(p) {
|
|
22
|
+
try {
|
|
23
|
+
return realpathSync(p);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return p;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
class ConfigManager {
|
|
30
|
+
config = null;
|
|
31
|
+
configPath;
|
|
32
|
+
runtimeContext = {};
|
|
33
|
+
// Guards one-time registration of configured custom models in ensureLoaded().
|
|
34
|
+
configuredModelsRegistered = false;
|
|
35
|
+
/**
|
|
36
|
+
* Per-request context storage — isolates each HTTP request's workspace path
|
|
37
|
+
* from concurrent requests. Populated via runWithRequestContext() in transport.ts.
|
|
38
|
+
* Takes priority over runtimeContext in getContext().
|
|
39
|
+
*/
|
|
40
|
+
requestContextStorage = new AsyncLocalStorage();
|
|
41
|
+
autoDetectedProject = null;
|
|
42
|
+
autoDetectionAttempted = false;
|
|
43
|
+
// Auto-detection results cached per workspace path.
|
|
44
|
+
autoDetectionCache = new Map();
|
|
45
|
+
// All projects found when D365FO_SOLUTIONS_PATH is configured.
|
|
46
|
+
allDetectedProjects = [];
|
|
47
|
+
// Monotonically-increasing counter identifying each background detection call;
|
|
48
|
+
// a scan whose generation is stale by the time it finishes is discarded so it
|
|
49
|
+
// can't overwrite a more recent, more specific scan's result.
|
|
50
|
+
detectionGeneration = 0;
|
|
51
|
+
// Resolves once the D365FO_SOLUTIONS_PATH eager scan completes; awaited by
|
|
52
|
+
// setRuntimeContextFromRoots() before matchProjectForWorkspace() runs.
|
|
53
|
+
allDetectedProjectsReady = null;
|
|
54
|
+
// Promise for the in-progress background autoDetectProject() call, awaited by
|
|
55
|
+
// getWorkspaceInfoDiagnostics() when autoDetectedProject is still null.
|
|
56
|
+
detectionInProgress = null;
|
|
57
|
+
xppConfigProvider = null;
|
|
58
|
+
xppConfig = null;
|
|
59
|
+
xppConfigLoaded = false;
|
|
60
|
+
constructor(configPath) {
|
|
61
|
+
// Default to .mcp.json in current directory or parent directories
|
|
62
|
+
this.configPath = configPath || this.findConfigFile();
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Start scanning D365FO_SOLUTIONS_PATH immediately at startup (fire-and-forget).
|
|
66
|
+
* Stores a Promise so setRuntimeContextFromRoots() can await it, guaranteeing
|
|
67
|
+
* allDetectedProjects is populated before the first roots/list notification.
|
|
68
|
+
* Safe to call multiple times; subsequent calls are no-ops.
|
|
69
|
+
*/
|
|
70
|
+
initEagerScan() {
|
|
71
|
+
const solutionsRoot = process.env.D365FO_SOLUTIONS_PATH;
|
|
72
|
+
if (!solutionsRoot || this.allDetectedProjectsReady)
|
|
73
|
+
return;
|
|
74
|
+
debugLog(`[ConfigManager] 🔍 Eager project scan starting: ${solutionsRoot}`);
|
|
75
|
+
this.allDetectedProjectsReady = (async () => {
|
|
76
|
+
try {
|
|
77
|
+
const all = await scanAllD365Projects(solutionsRoot);
|
|
78
|
+
if (all.length > 0) {
|
|
79
|
+
this.allDetectedProjects = all;
|
|
80
|
+
// Group by model for a compact summary; gated behind DEBUG_LOGGING.
|
|
81
|
+
const byModel = new Map();
|
|
82
|
+
for (const p of all) {
|
|
83
|
+
const list = byModel.get(p.modelName) ?? [];
|
|
84
|
+
if (p.projectPath)
|
|
85
|
+
list.push(p.projectPath);
|
|
86
|
+
byModel.set(p.modelName, list);
|
|
87
|
+
}
|
|
88
|
+
debugLog(`[ConfigManager] 🔍 Eager scan complete: ${all.length} project(s) across ${byModel.size} model(s)`);
|
|
89
|
+
for (const [model, paths] of byModel) {
|
|
90
|
+
debugLog(` ${model}: ${paths.length} project(s) (first: ${paths[0]})`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
debugLog(`[ConfigManager] 🔍 Eager scan: no projects found under ${solutionsRoot}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
console.error(`[ConfigManager] 🔍 Eager scan failed:`, err);
|
|
99
|
+
}
|
|
100
|
+
})();
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Auto-detect D365FO project from workspace.
|
|
104
|
+
* Called automatically when projectPath/solutionPath is requested but not configured.
|
|
105
|
+
* Results are cached per workspace path.
|
|
106
|
+
*/
|
|
107
|
+
async autoDetectProject(workspacePath, generation) {
|
|
108
|
+
if (this.autoDetectionAttempted) {
|
|
109
|
+
return; // Only attempt once per workspace
|
|
110
|
+
}
|
|
111
|
+
this.autoDetectionAttempted = true;
|
|
112
|
+
// .rnrproj files only exist on Windows D365FO VMs — skip scan on Azure/Linux
|
|
113
|
+
if (process.platform !== 'win32') {
|
|
114
|
+
console.error('[ConfigManager] Non-Windows platform — skipping .rnrproj auto-detection');
|
|
115
|
+
this.autoDetectionCache.set(workspacePath || 'default', null);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const cacheKey = workspacePath || 'default';
|
|
119
|
+
if (this.autoDetectionCache.has(cacheKey)) {
|
|
120
|
+
this.autoDetectedProject = this.autoDetectionCache.get(cacheKey) || null;
|
|
121
|
+
if (this.autoDetectedProject) {
|
|
122
|
+
console.error(`[ConfigManager] ⚡ Using cached auto-detection for: ${cacheKey}`);
|
|
123
|
+
}
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
console.error('[ConfigManager] Auto-detecting D365FO project from workspace...');
|
|
127
|
+
// Try to detect from provided workspace path or current directory
|
|
128
|
+
let detectedProject = await autoDetectD365Project(workspacePath);
|
|
129
|
+
// Fallback: if no .rnrproj was found (workspace is the MCP server dir, not the D365FO solution),
|
|
130
|
+
// scan the configured packagePath directly.
|
|
131
|
+
// In standard D365FO layout the .rnrproj lives inside:
|
|
132
|
+
// PackagesLocalDirectory\<package>\<model>\<model>.rnrproj
|
|
133
|
+
if (!detectedProject?.projectPath) {
|
|
134
|
+
const packagePathHint = this.runtimeContext.packagePath ||
|
|
135
|
+
this.config?.servers?.context?.packagePath;
|
|
136
|
+
if (packagePathHint) {
|
|
137
|
+
console.error(`[ConfigManager] No .rnrproj in workspace — scanning packagePath: ${packagePathHint}`);
|
|
138
|
+
const pkgScan = await detectD365Project(packagePathHint, 4);
|
|
139
|
+
if (pkgScan?.projectPath) {
|
|
140
|
+
detectedProject = {
|
|
141
|
+
...pkgScan,
|
|
142
|
+
// Prefer model name already resolved via Priority 4 (from PackagesLocalDirectory regex)
|
|
143
|
+
modelName: detectedProject?.modelName || pkgScan.modelName,
|
|
144
|
+
packagePath: packagePathHint,
|
|
145
|
+
};
|
|
146
|
+
console.error(`[ConfigManager] ✅ Found .rnrproj via packagePath scan: ${pkgScan.projectPath}`);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
console.error(`[ConfigManager] No .rnrproj found in packagePath either`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// Store in cache (PERFORMANCE FIX)
|
|
154
|
+
this.autoDetectionCache.set(cacheKey, detectedProject);
|
|
155
|
+
// Guard: if a newer setRuntimeContext call has already started a fresher detection,
|
|
156
|
+
// discard this (now stale) result so we never overwrite a more recent correct answer.
|
|
157
|
+
const isStale = generation !== undefined && generation < this.detectionGeneration;
|
|
158
|
+
if (isStale) {
|
|
159
|
+
// Benign race-guard: a newer detection (e.g. roots/list arriving after the
|
|
160
|
+
// initial workspace seed) superseded this one, so we discard the stale result.
|
|
161
|
+
// Expected during normal startup — gated behind DEBUG_LOGGING so it doesn't
|
|
162
|
+
// surface as a client-facing warning.
|
|
163
|
+
debugLog(`[ConfigManager] ⚠️ Stale workspace detection (gen ${generation} < current ${this.detectionGeneration}) — skipping project assignment`);
|
|
164
|
+
// Do NOT return early: D365FO_SOLUTIONS_PATH scan below must still run so
|
|
165
|
+
// that allDetectedProjects is populated for future matchProjectForWorkspace calls.
|
|
166
|
+
}
|
|
167
|
+
else if (detectedProject) {
|
|
168
|
+
this.autoDetectedProject = detectedProject;
|
|
169
|
+
console.error('[ConfigManager] ✅ Auto-detection successful:');
|
|
170
|
+
console.error(` ProjectPath: ${detectedProject.projectPath}`);
|
|
171
|
+
console.error(` ModelName: ${detectedProject.modelName}`);
|
|
172
|
+
console.error(` SolutionPath: ${detectedProject.solutionPath}`);
|
|
173
|
+
// ✨ Register the auto-detected model as custom
|
|
174
|
+
registerCustomModel(detectedProject.modelName);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
console.error('[ConfigManager] ⚠️ Auto-detection failed - no .rnrproj files found');
|
|
178
|
+
}
|
|
179
|
+
// Scan D365FO_SOLUTIONS_PATH for all available projects (for solution-switching support).
|
|
180
|
+
// ALWAYS runs — even on stale scans — because allDetectedProjects must be ready for
|
|
181
|
+
// matchProjectForWorkspace() which is called from setRuntimeContextFromRoots().
|
|
182
|
+
const solutionsRoot = process.env.D365FO_SOLUTIONS_PATH;
|
|
183
|
+
if (solutionsRoot) {
|
|
184
|
+
// Skip re-scan if initEagerScan() already populated the list (avoids duplicate log output).
|
|
185
|
+
const needsScan = this.allDetectedProjects.length === 0;
|
|
186
|
+
if (needsScan) {
|
|
187
|
+
const all = await scanAllD365Projects(solutionsRoot);
|
|
188
|
+
if (all.length > 0) {
|
|
189
|
+
this.allDetectedProjects = all;
|
|
190
|
+
const byModel = new Map();
|
|
191
|
+
for (const p of all)
|
|
192
|
+
byModel.set(p.modelName, (byModel.get(p.modelName) ?? 0) + 1);
|
|
193
|
+
console.error(`[ConfigManager] Found ${all.length} project(s) across ${byModel.size} model(s) under D365FO_SOLUTIONS_PATH`);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
const all = this.allDetectedProjects;
|
|
197
|
+
// Re-check staleness: time has passed since the initial check above.
|
|
198
|
+
const isNowStale = generation !== undefined && generation < this.detectionGeneration;
|
|
199
|
+
// Use first found as primary if workspace detection yielded nothing and scan is current.
|
|
200
|
+
// Skip Microsoft demo/tutorial model names (e.g. FleetManagement) — these appear when
|
|
201
|
+
// a developer creates a new VS project and leaves the default model name unchanged.
|
|
202
|
+
// Prefer the first custom (non-demo) model; only fall back to demo models when that
|
|
203
|
+
// is ALL that was found (unusual, but possible in purely tutorial repos).
|
|
204
|
+
if (all.length > 0 && !this.autoDetectedProject && !isNowStale) {
|
|
205
|
+
const primary = all.find(p => !isMicrosoftDemoModel(p.modelName)) ?? all[0];
|
|
206
|
+
if (isMicrosoftDemoModel(primary.modelName)) {
|
|
207
|
+
console.error(`[ConfigManager] ⚠️ All detected projects are Microsoft demo models — using "${primary.modelName}" as fallback.`, `This usually means the VS project wizard default model was not changed.`);
|
|
208
|
+
}
|
|
209
|
+
this.autoDetectedProject = primary;
|
|
210
|
+
registerCustomModel(primary.modelName);
|
|
211
|
+
console.error(`[ConfigManager] ✅ Using first found project as primary: ${primary.modelName}`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Set runtime context (e.g., from GitHub Copilot workspace detection)
|
|
217
|
+
* This allows dynamic context that overrides .mcp.json configuration
|
|
218
|
+
* PERFORMANCE: Uses cache, only resets when workspace differs from cached value.
|
|
219
|
+
*/
|
|
220
|
+
setRuntimeContext(context) {
|
|
221
|
+
const workspaceChanged = context.workspacePath &&
|
|
222
|
+
context.workspacePath !== this.runtimeContext.workspacePath;
|
|
223
|
+
const projectChanged = context.projectPath &&
|
|
224
|
+
context.projectPath !== this.runtimeContext.projectPath;
|
|
225
|
+
this.runtimeContext = { ...this.runtimeContext, ...context };
|
|
226
|
+
// Only reset if workspace changed AND not in cache (PERFORMANCE FIX)
|
|
227
|
+
if (workspaceChanged || projectChanged) {
|
|
228
|
+
const cacheKey = context.workspacePath || context.projectPath || 'default';
|
|
229
|
+
if (!this.autoDetectionCache.has(cacheKey)) {
|
|
230
|
+
this.autoDetectionAttempted = false;
|
|
231
|
+
this.autoDetectedProject = null;
|
|
232
|
+
// Fast-path: try exact or close match against known projects.
|
|
233
|
+
// Falls through to BFS only when nothing specific is found.
|
|
234
|
+
if (this.allDetectedProjects.length > 0 && context.workspacePath) {
|
|
235
|
+
const matched = this.matchProjectForWorkspace(context.workspacePath);
|
|
236
|
+
if (matched) {
|
|
237
|
+
// Increment generation so any in-flight BFS (started earlier) treats
|
|
238
|
+
// its result as stale and will not overwrite this fast-path assignment.
|
|
239
|
+
++this.detectionGeneration;
|
|
240
|
+
this.autoDetectedProject = matched;
|
|
241
|
+
this.autoDetectionAttempted = true;
|
|
242
|
+
this.autoDetectionCache.set(cacheKey, matched);
|
|
243
|
+
console.error(`[ConfigManager] ⚡ Workspace matched known project: ${matched.modelName} (gen ${this.detectionGeneration})`);
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
console.error(`[ConfigManager] New workspace — eager auto-detect starting: ${cacheKey}`);
|
|
248
|
+
// Increment generation so any previous background scan that finishes later
|
|
249
|
+
// will recognise its result as stale and discard it.
|
|
250
|
+
const gen = ++this.detectionGeneration;
|
|
251
|
+
// Eager: kick off detection immediately (background) so the result is
|
|
252
|
+
// ready in cache before the first tool call arrives.
|
|
253
|
+
// Store the promise so getWorkspaceInfoDiagnostics() can await it when
|
|
254
|
+
// autoDetectedProject is still null (fixes "null on first call" race).
|
|
255
|
+
this.detectionInProgress = this.autoDetectProject(context.workspacePath, gen);
|
|
256
|
+
this.detectionInProgress.catch(() => { });
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
// Cache hit — recycle result without re-scanning disk
|
|
260
|
+
this.autoDetectedProject = this.autoDetectionCache.get(cacheKey) || null;
|
|
261
|
+
this.autoDetectionAttempted = true;
|
|
262
|
+
if (this.autoDetectedProject) {
|
|
263
|
+
console.error(`[ConfigManager] ⚡ Cache hit — recycled detection for: ${cacheKey}`);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Called by mcpServer when roots/list arrives (all roots from VS 2022 / VS Code).
|
|
270
|
+
* Tries every root path to find an unambiguous project match.
|
|
271
|
+
*
|
|
272
|
+
* Detection order:
|
|
273
|
+
* 1. Exact/contained path match (workspace IS or is INSIDE a project dir)
|
|
274
|
+
* 2. Git branch name → project name substring match
|
|
275
|
+
* (handles VS 2022 sending solution root K:\repos\Contoso for ALL projects;
|
|
276
|
+
* branch feature/4105-ContosoBankPaymProposal → matches model "ContosoBank")
|
|
277
|
+
* 3. BFS fallback
|
|
278
|
+
*/
|
|
279
|
+
async setRuntimeContextFromRoots(rootPaths) {
|
|
280
|
+
// Increment generation upfront so any in-flight BFS scan started earlier
|
|
281
|
+
// will recognise its result as stale and discard it.
|
|
282
|
+
const gen = ++this.detectionGeneration;
|
|
283
|
+
// Await the eager D365FO_SOLUTIONS_PATH scan so allDetectedProjects is populated
|
|
284
|
+
// before we try matchProjectForWorkspace (otherwise it always returns null).
|
|
285
|
+
// Cap at 5 s — consistent with the timeout used in getAutoDetectedProject().
|
|
286
|
+
if (this.allDetectedProjectsReady) {
|
|
287
|
+
await Promise.race([
|
|
288
|
+
this.allDetectedProjectsReady,
|
|
289
|
+
new Promise(resolve => setTimeout(resolve, 5_000)),
|
|
290
|
+
]);
|
|
291
|
+
}
|
|
292
|
+
// Priority 1: exact / unambiguous path match
|
|
293
|
+
for (const rootPath of rootPaths) {
|
|
294
|
+
const match = this.matchProjectForWorkspace(rootPath);
|
|
295
|
+
if (match) {
|
|
296
|
+
this.runtimeContext = { ...this.runtimeContext, workspacePath: rootPath };
|
|
297
|
+
this.autoDetectedProject = match;
|
|
298
|
+
this.autoDetectionAttempted = true;
|
|
299
|
+
this.autoDetectionCache.set(rootPath, match);
|
|
300
|
+
registerCustomModel(match.modelName);
|
|
301
|
+
console.error(`[ConfigManager] ⚡ Root matched project: ${match.modelName} (gen ${gen}, ${match.projectPath})`);
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
// Priority 2: git branch name → project name fuzzy match.
|
|
306
|
+
// VS 2022 always sends the solution root (ancestor of ALL projects) so path
|
|
307
|
+
// matching is always ambiguous. The git branch, however, usually encodes the
|
|
308
|
+
// feature/project being worked on, e.g. "feature/4105-ContosoBankPaymProposal".
|
|
309
|
+
if (this.allDetectedProjects.length > 0 && rootPaths.length > 0) {
|
|
310
|
+
for (const rootPath of rootPaths) {
|
|
311
|
+
const branch = await detectGitBranch(rootPath);
|
|
312
|
+
if (branch) {
|
|
313
|
+
const gitMatch = this.findProjectByBranchName(branch);
|
|
314
|
+
if (gitMatch) {
|
|
315
|
+
this.runtimeContext = { ...this.runtimeContext, workspacePath: rootPath };
|
|
316
|
+
this.autoDetectedProject = gitMatch;
|
|
317
|
+
this.autoDetectionAttempted = true;
|
|
318
|
+
this.autoDetectionCache.set(rootPath, gitMatch);
|
|
319
|
+
registerCustomModel(gitMatch.modelName);
|
|
320
|
+
console.error(`[ConfigManager] 🌿 Git branch "${branch}" → project: ${gitMatch.modelName} (gen ${gen})`);
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
console.error(`[ConfigManager] 🌿 Git branch "${branch}" — no project name match (gen ${gen})`);
|
|
324
|
+
break; // only try git on the first root that has a branch
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
// Priority 3: BFS fallback — only when no cached result exists.
|
|
329
|
+
// We deliberately do NOT delete the cache here: if forceProject() stored a
|
|
330
|
+
// specific project for this workspace path, we want to honour that choice
|
|
331
|
+
// across roots/list notifications (e.g. git branch switch that produces no
|
|
332
|
+
// project-name match). The user can always call get_workspace_info with
|
|
333
|
+
// projectPath to explicitly override.
|
|
334
|
+
if (rootPaths.length > 0) {
|
|
335
|
+
const firstPath = rootPaths[0];
|
|
336
|
+
const normalizedFirst = normalizePath(firstPath);
|
|
337
|
+
if (this.autoDetectionCache.has(normalizedFirst)) {
|
|
338
|
+
// Use the cached (possibly user-forced) result instead of running BFS.
|
|
339
|
+
const cached = this.autoDetectionCache.get(normalizedFirst);
|
|
340
|
+
this.runtimeContext = { ...this.runtimeContext, workspacePath: firstPath };
|
|
341
|
+
this.autoDetectedProject = cached ?? null;
|
|
342
|
+
this.autoDetectionAttempted = true;
|
|
343
|
+
if (cached) {
|
|
344
|
+
console.error(`[ConfigManager] ⚡ BFS skipped — cache hit for workspace: ${cached.modelName} (gen ${gen})`);
|
|
345
|
+
registerCustomModel(cached.modelName);
|
|
346
|
+
}
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
console.error(`[ConfigManager] Roots ambiguous (gen ${gen}) — BFS fallback on: ${firstPath}`);
|
|
350
|
+
// If stored workspace already equals firstPath, setRuntimeContext sees
|
|
351
|
+
// workspaceChanged=false and skips detection — prevent that.
|
|
352
|
+
if (this.runtimeContext.workspacePath === firstPath) {
|
|
353
|
+
this.runtimeContext = { ...this.runtimeContext, workspacePath: undefined };
|
|
354
|
+
}
|
|
355
|
+
this.autoDetectionAttempted = false;
|
|
356
|
+
this.autoDetectedProject = null;
|
|
357
|
+
this.setRuntimeContext({ workspacePath: firstPath });
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Find the project whose model name appears as a substring of the git branch name.
|
|
362
|
+
* Prefer the LONGEST match to avoid short-prefix false positives
|
|
363
|
+
* (e.g. "Con" would match everything; "ContosoBank" is more specific than "Contoso").
|
|
364
|
+
*
|
|
365
|
+
* Examples:
|
|
366
|
+
* branch "feature/4105-ContosoBankPaymProposal" → model "ContosoBank" (prefix of "ContosoBankPaymProposal")
|
|
367
|
+
* branch "feature/ContosoEDS-cleanup" → model "ContosoEDS"
|
|
368
|
+
*/
|
|
369
|
+
findProjectByBranchName(branchName) {
|
|
370
|
+
const lowerBranch = branchName.toLowerCase();
|
|
371
|
+
let bestMatch = null;
|
|
372
|
+
let bestMatchLength = 0;
|
|
373
|
+
for (const project of this.allDetectedProjects) {
|
|
374
|
+
const lowerModel = project.modelName.toLowerCase();
|
|
375
|
+
// Require at least 4 characters to avoid accidental single-letter matches
|
|
376
|
+
if (lowerModel.length >= 4 && lowerBranch.includes(lowerModel) && lowerModel.length > bestMatchLength) {
|
|
377
|
+
bestMatch = project;
|
|
378
|
+
bestMatchLength = lowerModel.length;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
if (bestMatch) {
|
|
382
|
+
console.error(`[ConfigManager] 🌿 Branch "${branchName}" → longest model match: "${bestMatch.modelName}" (${bestMatchLength} chars)`);
|
|
383
|
+
}
|
|
384
|
+
return bestMatch;
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Find the single unambiguous project that corresponds to a workspace path.
|
|
388
|
+
* Returns null when:
|
|
389
|
+
* - no known projects (allDetectedProjects is empty)
|
|
390
|
+
* - workspace is a BROAD ancestor that contains MULTIPLE projects (ambiguous)
|
|
391
|
+
*
|
|
392
|
+
* Only returns a project when the match is specific:
|
|
393
|
+
* a) workspace == project directory (exact)
|
|
394
|
+
* b) workspace is INSIDE the project directory (workspace is a sub-folder)
|
|
395
|
+
* c) workspace is DIRECT parent of EXACTLY ONE project (unambiguous ancestor)
|
|
396
|
+
*/
|
|
397
|
+
matchProjectForWorkspace(workspacePath) {
|
|
398
|
+
if (!this.allDetectedProjects.length)
|
|
399
|
+
return null;
|
|
400
|
+
const normalizedWp = path.normalize(workspacePath).toLowerCase();
|
|
401
|
+
// Priority A: workspace IS or is INSIDE a project directory
|
|
402
|
+
// (most specific — unambiguous by definition)
|
|
403
|
+
for (const p of this.allDetectedProjects) {
|
|
404
|
+
if (!p.projectPath)
|
|
405
|
+
continue;
|
|
406
|
+
const projectDir = path.normalize(path.dirname(p.projectPath)).toLowerCase();
|
|
407
|
+
if (normalizedWp === projectDir || normalizedWp.startsWith(projectDir + path.sep)) {
|
|
408
|
+
return p;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
// Priority B: workspace is an ancestor — but only if EXACTLY ONE project lives under it
|
|
412
|
+
const children = this.allDetectedProjects.filter(p => {
|
|
413
|
+
if (!p.projectPath)
|
|
414
|
+
return false;
|
|
415
|
+
const projectDir = path.normalize(path.dirname(p.projectPath)).toLowerCase();
|
|
416
|
+
return projectDir.startsWith(normalizedWp + path.sep);
|
|
417
|
+
});
|
|
418
|
+
if (children.length === 1) {
|
|
419
|
+
console.error(`[ConfigManager] Single project under workspace — using: ${children[0].modelName}`);
|
|
420
|
+
return children[0];
|
|
421
|
+
}
|
|
422
|
+
if (children.length > 1) {
|
|
423
|
+
// Priority C: D365FO convention — the "primary" project in a solution folder
|
|
424
|
+
// usually has the SAME NAME as the solution folder itself.
|
|
425
|
+
// e.g. VS 2022 sends root "ContosoCore - FeatureManagement/" which contains
|
|
426
|
+
// ContosoReports - FeatureManagement/, ContosoCore - FeatureManagement/, …
|
|
427
|
+
// → prefer the project whose own folder name matches the workspace base name.
|
|
428
|
+
const wpBase = path.basename(workspacePath).toLowerCase();
|
|
429
|
+
const nameMatch = children.find(p => {
|
|
430
|
+
const projectFolderName = path.basename(path.dirname(p.projectPath)).toLowerCase();
|
|
431
|
+
return projectFolderName === wpBase;
|
|
432
|
+
});
|
|
433
|
+
if (nameMatch) {
|
|
434
|
+
console.error(`[ConfigManager] ⚡ Solution-name match (${children.length} candidates): ${nameMatch.modelName}`);
|
|
435
|
+
return nameMatch;
|
|
436
|
+
}
|
|
437
|
+
console.error(`[ConfigManager] Workspace is ancestor of ${children.length} projects — ambiguous, not switching`);
|
|
438
|
+
}
|
|
439
|
+
return null;
|
|
440
|
+
}
|
|
441
|
+
/**
|
|
442
|
+
* Clear runtime context
|
|
443
|
+
*/
|
|
444
|
+
clearRuntimeContext() {
|
|
445
|
+
this.runtimeContext = {};
|
|
446
|
+
}
|
|
447
|
+
/**
|
|
448
|
+
* Find .mcp.json file.
|
|
449
|
+
* Priority:
|
|
450
|
+
* 1. MCP_CONFIG_PATH env var (explicit override)
|
|
451
|
+
* 2. User home directory — single canonical config location (~/.mcp.json)
|
|
452
|
+
* 3. Current directory and up to 5 parent directories (project-specific override, rare)
|
|
453
|
+
* 4. Current directory fallback (file may not exist yet)
|
|
454
|
+
*/
|
|
455
|
+
findConfigFile() {
|
|
456
|
+
// Step 1: Explicit override via MCP_CONFIG_PATH env var
|
|
457
|
+
const envConfigPath = process.env.MCP_CONFIG_PATH;
|
|
458
|
+
if (envConfigPath && existsSync(envConfigPath)) {
|
|
459
|
+
console.error(`[ConfigManager] Using MCP_CONFIG_PATH: ${envConfigPath}`);
|
|
460
|
+
return envConfigPath;
|
|
461
|
+
}
|
|
462
|
+
// Step 2: User home directory — primary location, use os.homedir() which is reliable
|
|
463
|
+
// even when USERPROFILE / HOME env vars are not set in the server process.
|
|
464
|
+
const homeDir = os.homedir();
|
|
465
|
+
if (homeDir) {
|
|
466
|
+
const homeConfigPath = path.join(homeDir, '.mcp.json');
|
|
467
|
+
try {
|
|
468
|
+
if (existsSync(homeConfigPath)) {
|
|
469
|
+
console.error(`[ConfigManager] Using config from home directory: ${homeConfigPath}`);
|
|
470
|
+
return homeConfigPath;
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
catch {
|
|
474
|
+
// Continue searching
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
// Step 3: Search in current directory and parent directories (project-specific override)
|
|
478
|
+
let currentDir = process.cwd();
|
|
479
|
+
const maxDepth = 5;
|
|
480
|
+
let depth = 0;
|
|
481
|
+
while (depth < maxDepth) {
|
|
482
|
+
const configPath = path.join(currentDir, '.mcp.json');
|
|
483
|
+
try {
|
|
484
|
+
if (existsSync(configPath)) {
|
|
485
|
+
console.error(`[ConfigManager] Using project config: ${configPath}`);
|
|
486
|
+
return configPath;
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
catch {
|
|
490
|
+
// Continue searching
|
|
491
|
+
}
|
|
492
|
+
const parentDir = path.dirname(currentDir);
|
|
493
|
+
if (parentDir === currentDir) {
|
|
494
|
+
break; // Reached root
|
|
495
|
+
}
|
|
496
|
+
currentDir = parentDir;
|
|
497
|
+
depth++;
|
|
498
|
+
}
|
|
499
|
+
// Step 4: Fallback to current directory (file may not exist yet)
|
|
500
|
+
return path.join(process.cwd(), '.mcp.json');
|
|
501
|
+
}
|
|
502
|
+
/**
|
|
503
|
+
* Load configuration from .mcp.json file.
|
|
504
|
+
* Idempotent — skips re-reading if config is already loaded.
|
|
505
|
+
* Call ensureLoaded() for lazy initialization.
|
|
506
|
+
*/
|
|
507
|
+
async load() {
|
|
508
|
+
if (this.config) {
|
|
509
|
+
return this.config; // Already loaded — skip
|
|
510
|
+
}
|
|
511
|
+
try {
|
|
512
|
+
console.error(`[ConfigManager] Loading config from: ${this.configPath}`);
|
|
513
|
+
const content = await fs.readFile(this.configPath, 'utf-8');
|
|
514
|
+
this.config = JSON.parse(content);
|
|
515
|
+
console.error('[ConfigManager] Config loaded successfully');
|
|
516
|
+
return this.config;
|
|
517
|
+
}
|
|
518
|
+
catch (error) {
|
|
519
|
+
if (error?.code === 'ENOENT') {
|
|
520
|
+
// .mcp.json is optional — not present on Azure/cloud deployments, only on local Windows VM.
|
|
521
|
+
console.error(`[ConfigManager] .mcp.json not found at ${this.configPath} — running without local config (expected on Azure)`);
|
|
522
|
+
}
|
|
523
|
+
else {
|
|
524
|
+
console.error('[ConfigManager] Failed to load .mcp.json:', error);
|
|
525
|
+
}
|
|
526
|
+
return null;
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
/**
|
|
530
|
+
* Ensure config is loaded — lazy initializer.
|
|
531
|
+
* Safe to call multiple times; loads only once.
|
|
532
|
+
*/
|
|
533
|
+
async ensureLoaded() {
|
|
534
|
+
await this.load();
|
|
535
|
+
// Register the explicitly-configured custom models exactly once. The target
|
|
536
|
+
// model resolved from configuration (D365FO_MODEL_NAME env var or a modelName
|
|
537
|
+
// key in .mcp.json) is custom by definition, as are any CUSTOM_MODELS entries.
|
|
538
|
+
// Registering them here makes isCustomModel() deterministic regardless of call
|
|
539
|
+
// ordering — without it, a long model name whose ISV prefix is only an
|
|
540
|
+
// abbreviation (e.g. prefix "CR" for "ContosoRobotics") is misclassified as a
|
|
541
|
+
// Microsoft standard model until some later operation happens to register it.
|
|
542
|
+
if (!this.configuredModelsRegistered) {
|
|
543
|
+
this.configuredModelsRegistered = true;
|
|
544
|
+
const configuredModel = this.getContext()?.modelName?.trim();
|
|
545
|
+
if (configuredModel) {
|
|
546
|
+
registerCustomModel(configuredModel);
|
|
547
|
+
}
|
|
548
|
+
// CUSTOM_MODELS literals (wildcard patterns are matched directly by
|
|
549
|
+
// isCustomModel, so they don't need to be registered as exact names).
|
|
550
|
+
for (const entry of getCustomModels()) {
|
|
551
|
+
if (!entry.includes('*')) {
|
|
552
|
+
registerCustomModel(entry);
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
/**
|
|
558
|
+
* Get context configuration
|
|
559
|
+
* Merges .mcp.json config with runtime context (runtime takes priority)
|
|
560
|
+
*/
|
|
561
|
+
getContext() {
|
|
562
|
+
// Prefer top-level context (doesn't clash with VS 2022 server discovery).
|
|
563
|
+
// Fall back to servers.context for backward compatibility.
|
|
564
|
+
const fileContext = this.config?.context || this.config?.servers?.context || null;
|
|
565
|
+
// Environment variables (D365FO_* prefix) — safe in .mcp.json env{} blocks
|
|
566
|
+
// because VS 2022 passes them to the server subprocess without side effects.
|
|
567
|
+
const envContext = {};
|
|
568
|
+
if (process.env.D365FO_WORKSPACE_PATH)
|
|
569
|
+
envContext.workspacePath = process.env.D365FO_WORKSPACE_PATH;
|
|
570
|
+
if (process.env.D365FO_PACKAGE_PATH)
|
|
571
|
+
envContext.packagePath = process.env.D365FO_PACKAGE_PATH;
|
|
572
|
+
if (process.env.D365FO_MODEL_NAME)
|
|
573
|
+
envContext.modelName = process.env.D365FO_MODEL_NAME;
|
|
574
|
+
if (process.env.D365FO_CUSTOM_PACKAGES_PATH)
|
|
575
|
+
envContext.customPackagesPath = process.env.D365FO_CUSTOM_PACKAGES_PATH;
|
|
576
|
+
if (process.env.D365FO_MICROSOFT_PACKAGES_PATH)
|
|
577
|
+
envContext.microsoftPackagesPath = process.env.D365FO_MICROSOFT_PACKAGES_PATH;
|
|
578
|
+
if (process.env.D365FO_PROJECT_PATH)
|
|
579
|
+
envContext.projectPath = process.env.D365FO_PROJECT_PATH;
|
|
580
|
+
if (process.env.D365FO_SOLUTION_PATH)
|
|
581
|
+
envContext.solutionPath = process.env.D365FO_SOLUTION_PATH;
|
|
582
|
+
if (process.env.D365FO_DEV_ENVIRONMENT_TYPE)
|
|
583
|
+
envContext.devEnvironmentType = process.env.D365FO_DEV_ENVIRONMENT_TYPE;
|
|
584
|
+
if (process.env.D365FO_BRIDGE_LOG_FILE)
|
|
585
|
+
envContext.bridgeLogFile = process.env.D365FO_BRIDGE_LOG_FILE;
|
|
586
|
+
// Per-request context (AsyncLocalStorage) takes priority over the shared
|
|
587
|
+
// runtimeContext singleton — this prevents workspace paths from bleeding
|
|
588
|
+
// between concurrent HTTP requests from different users.
|
|
589
|
+
const requestCtx = this.requestContextStorage.getStore() ?? {};
|
|
590
|
+
const effectiveRuntime = Object.keys(requestCtx).length > 0
|
|
591
|
+
? { ...this.runtimeContext, ...requestCtx }
|
|
592
|
+
: this.runtimeContext;
|
|
593
|
+
const hasEnvContext = Object.keys(envContext).length > 0;
|
|
594
|
+
if (!fileContext && !hasEnvContext && Object.keys(effectiveRuntime).length === 0) {
|
|
595
|
+
return null;
|
|
596
|
+
}
|
|
597
|
+
// Priority: runtime > env vars > file config
|
|
598
|
+
return {
|
|
599
|
+
...fileContext,
|
|
600
|
+
...envContext,
|
|
601
|
+
...effectiveRuntime,
|
|
602
|
+
};
|
|
603
|
+
}
|
|
604
|
+
/**
|
|
605
|
+
* Run fn inside an isolated per-request AsyncLocalStorage context.
|
|
606
|
+
* All calls to getContext() within fn (and any awaited Promises it starts)
|
|
607
|
+
* will see ctx merged over runtimeContext, without mutating shared state.
|
|
608
|
+
*/
|
|
609
|
+
runWithRequestContext(ctx, fn) {
|
|
610
|
+
return this.requestContextStorage.run(ctx, fn);
|
|
611
|
+
}
|
|
612
|
+
/**
|
|
613
|
+
* Returns true when the current async call stack runs inside a request-scoped
|
|
614
|
+
* AsyncLocalStorage context. HTTP transport uses this for per-request
|
|
615
|
+
* isolation, so callers should avoid mutating the shared runtimeContext.
|
|
616
|
+
*/
|
|
617
|
+
hasRequestContext() {
|
|
618
|
+
return this.requestContextStorage.getStore() !== undefined;
|
|
619
|
+
}
|
|
620
|
+
/**
|
|
621
|
+
* Returns true when the static configuration (`.mcp.json` + `D365FO_*` env vars)
|
|
622
|
+
* already provides enough workspace context to work without calling `roots/list`.
|
|
623
|
+
*
|
|
624
|
+
* In instanced mode every project has its own dedicated server instance whose
|
|
625
|
+
* config contains both a model name and at least one path. Calling `roots/list`
|
|
626
|
+
* is then unnecessary and causes a -32001 timeout when `mcp-remote` is the
|
|
627
|
+
* transport (it has a hard-coded 60 s request timeout and cannot complete a
|
|
628
|
+
* server-initiated request over HTTP). In instanced mode the workspace is also
|
|
629
|
+
* immutable per instance, so `roots_list_changed` notifications are irrelevant.
|
|
630
|
+
*
|
|
631
|
+
* Awaits `ensureLoaded()` so it is safe to call before the first tool invocation.
|
|
632
|
+
*/
|
|
633
|
+
async isStaticallyConfigured() {
|
|
634
|
+
await this.ensureLoaded();
|
|
635
|
+
const ctx = this.getContext();
|
|
636
|
+
const hasModelName = !!ctx?.modelName;
|
|
637
|
+
const hasPath = !!(ctx?.workspacePath ||
|
|
638
|
+
ctx?.packagePath ||
|
|
639
|
+
ctx?.customPackagesPath ||
|
|
640
|
+
ctx?.projectPath ||
|
|
641
|
+
ctx?.solutionPath);
|
|
642
|
+
return hasModelName && hasPath;
|
|
643
|
+
}
|
|
644
|
+
/**
|
|
645
|
+
* Get workspace path from configuration
|
|
646
|
+
* Returns the base PackagesLocalDirectory path if workspacePath contains it
|
|
647
|
+
*/
|
|
648
|
+
getPackagePath() {
|
|
649
|
+
const context = this.getContext();
|
|
650
|
+
// If packagePath is explicitly set, use it
|
|
651
|
+
if (context?.packagePath) {
|
|
652
|
+
const resolved = normalizePath(context.packagePath);
|
|
653
|
+
console.error(`[ConfigManager] Using explicit packagePath: ${resolved}`);
|
|
654
|
+
return resolved;
|
|
655
|
+
}
|
|
656
|
+
// If workspacePath contains PackagesLocalDirectory, extract the base path.
|
|
657
|
+
// Supports both one-level and two-level paths:
|
|
658
|
+
// K:\AosService\PackagesLocalDirectory\MyPackage\MyModel → K:\AosService\PackagesLocalDirectory
|
|
659
|
+
// K:\AosService\PackagesLocalDirectory\MyModel → K:\AosService\PackagesLocalDirectory
|
|
660
|
+
if (context?.workspacePath) {
|
|
661
|
+
const normalized = path.normalize(context.workspacePath);
|
|
662
|
+
const match = normalized.match(/^(.+[\\\/]PackagesLocalDirectory)(?:[\\\/]|$)/i);
|
|
663
|
+
if (match) {
|
|
664
|
+
// Normalize path separators: D365FO paths are always Windows paths (backslashes)
|
|
665
|
+
const extracted = match[1].replace(/\//g, '\\');
|
|
666
|
+
const resolved = normalizePath(extracted);
|
|
667
|
+
console.error(`[ConfigManager] Extracted packagePath from workspacePath: ${resolved}`);
|
|
668
|
+
return resolved;
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
// Fallback: check if auto-detection already ran and found packagePath
|
|
672
|
+
if (this.autoDetectedProject?.packagePath) {
|
|
673
|
+
return normalizePath(this.autoDetectedProject.packagePath);
|
|
674
|
+
}
|
|
675
|
+
// UDE mode: prefer customPackagesPath from XPP config over well-known path probes.
|
|
676
|
+
// On UDE boxes, C:\AosService\PackagesLocalDirectory may exist but be empty.
|
|
677
|
+
if (this.xppConfig?.customPackagesPath && existsSync(this.xppConfig.customPackagesPath)) {
|
|
678
|
+
if (!this._packagePathLoggedOnce) {
|
|
679
|
+
console.error(`[ConfigManager] ✅ UDE customPackagesPath: ${this.xppConfig.customPackagesPath}`);
|
|
680
|
+
this._packagePathLoggedOnce = true;
|
|
681
|
+
}
|
|
682
|
+
return normalizePath(this.xppConfig.customPackagesPath);
|
|
683
|
+
}
|
|
684
|
+
// Last resort (Windows only): probe well-known PackagesLocalDirectory locations.
|
|
685
|
+
// Covers the two standard D365FO installation scenarios without requiring .mcp.json config:
|
|
686
|
+
// C:\AosService\PackagesLocalDirectory → VHD / local developer machine
|
|
687
|
+
// K:\AosService\PackagesLocalDirectory → cloud-hosted VM (standard Azure Dev/Test image)
|
|
688
|
+
if (process.platform === 'win32') {
|
|
689
|
+
const wellKnownCandidates = [
|
|
690
|
+
'C:\\AosService\\PackagesLocalDirectory',
|
|
691
|
+
'J:\\AosService\\PackagesLocalDirectory',
|
|
692
|
+
'K:\\AosService\\PackagesLocalDirectory',
|
|
693
|
+
];
|
|
694
|
+
for (const candidate of wellKnownCandidates) {
|
|
695
|
+
if (existsSync(candidate)) {
|
|
696
|
+
if (!this._packagePathLoggedOnce) {
|
|
697
|
+
console.error(`[ConfigManager] ✅ Auto-probed packagePath: ${candidate}`);
|
|
698
|
+
this._packagePathLoggedOnce = true;
|
|
699
|
+
}
|
|
700
|
+
return candidate;
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
}
|
|
704
|
+
return null;
|
|
705
|
+
}
|
|
706
|
+
/**
|
|
707
|
+
* Get workspace path (specific model path)
|
|
708
|
+
*/
|
|
709
|
+
getWorkspacePath() {
|
|
710
|
+
const context = this.getContext();
|
|
711
|
+
return context?.workspacePath || null;
|
|
712
|
+
}
|
|
713
|
+
/**
|
|
714
|
+
* Get model name from the last segment of workspacePath.
|
|
715
|
+
* Supports both path formats:
|
|
716
|
+
* K:\AOSService\PackagesLocalDirectory\MyPackage\MyModel → "MyModel"
|
|
717
|
+
* K:\AOSService\PackagesLocalDirectory\MyModel → "MyModel"
|
|
718
|
+
* This allows automatic model detection on non-Windows (Azure) without D365FO_MODEL_NAME env var.
|
|
719
|
+
*/
|
|
720
|
+
getModelNameFromWorkspacePath() {
|
|
721
|
+
const workspacePath = this.getContext()?.workspacePath;
|
|
722
|
+
if (!workspacePath)
|
|
723
|
+
return null;
|
|
724
|
+
// Handle Windows paths on non-Windows: normalize both slash types and strip trailing slashes
|
|
725
|
+
const normalized = workspacePath.replace(/\\/g, '/').replace(/\/+$/, '');
|
|
726
|
+
const segment = normalized.split('/').pop() || null;
|
|
727
|
+
return segment || null;
|
|
728
|
+
}
|
|
729
|
+
/**
|
|
730
|
+
* Get package name from workspacePath when it follows the two-level format:
|
|
731
|
+
* K:\AOSService\PackagesLocalDirectory\YourPackageName\YourModelName → "YourPackageName"
|
|
732
|
+
* Returns null for one-level paths or when workspacePath is not set.
|
|
733
|
+
*/
|
|
734
|
+
getPackageNameFromWorkspacePath() {
|
|
735
|
+
const workspacePath = this.getContext()?.workspacePath;
|
|
736
|
+
if (!workspacePath)
|
|
737
|
+
return null;
|
|
738
|
+
const normalized = path.normalize(workspacePath);
|
|
739
|
+
const twoLevel = normalized.match(/^.+[\\\/]PackagesLocalDirectory[\\\/]([^\\\/]+)[\\\/][^\\\/]+\\?\/?$/i);
|
|
740
|
+
return twoLevel ? twoLevel[1] : null;
|
|
741
|
+
}
|
|
742
|
+
/**
|
|
743
|
+
* Get model name from configuration.
|
|
744
|
+
* Priority:
|
|
745
|
+
* 1) Explicit modelName in mcp.json context
|
|
746
|
+
* 2) Last segment of workspacePath — ONLY when path contains PackagesLocalDirectory
|
|
747
|
+
* (AOT paths like K:\AosService\PackagesLocalDirectory\MyModel).
|
|
748
|
+
* Skipped for solution/repo paths like K:\repos\Contoso — those would wrongly
|
|
749
|
+
* return "Contoso" instead of the real model name from the .rnrproj file.
|
|
750
|
+
* 3) Auto-detected model name from .rnrproj scan
|
|
751
|
+
* 4) D365FO_MODEL_NAME env var
|
|
752
|
+
*/
|
|
753
|
+
getModelName() {
|
|
754
|
+
const context = this.getContext();
|
|
755
|
+
// 1. Explicit config always wins
|
|
756
|
+
if (context?.modelName)
|
|
757
|
+
return context.modelName;
|
|
758
|
+
// 2. WorkspacePath derivation ONLY for AOT paths inside PackagesLocalDirectory
|
|
759
|
+
const wp = context?.workspacePath;
|
|
760
|
+
if (wp && /PackagesLocalDirectory/i.test(wp)) {
|
|
761
|
+
const fromWp = this.getModelNameFromWorkspacePath();
|
|
762
|
+
// Skip kebab-case names (repo slugs, not D365FO package names)
|
|
763
|
+
if (fromWp && !fromWp.includes('-'))
|
|
764
|
+
return fromWp;
|
|
765
|
+
}
|
|
766
|
+
// 3. Result from background auto-detection (.rnrproj scan)
|
|
767
|
+
if (this.autoDetectedProject?.modelName) {
|
|
768
|
+
return this.autoDetectedProject.modelName;
|
|
769
|
+
}
|
|
770
|
+
// 4. Env var fallback
|
|
771
|
+
return process.env.D365FO_MODEL_NAME || null;
|
|
772
|
+
}
|
|
773
|
+
/**
|
|
774
|
+
* Get model name together with its detection source for diagnostics.
|
|
775
|
+
* Mirrors the exact priority chain of getModelName() but also returns
|
|
776
|
+
* a human-readable source string for display in get_workspace_info.
|
|
777
|
+
*/
|
|
778
|
+
getModelNameWithSource() {
|
|
779
|
+
const context = this.getContext();
|
|
780
|
+
if (context?.modelName) {
|
|
781
|
+
// getContext() merges three sources with precedence runtime > env var > file.
|
|
782
|
+
// Report the one that actually produced the value, so the diagnostics don't
|
|
783
|
+
// send the developer looking in .mcp.json for a value that came from the
|
|
784
|
+
// D365FO_MODEL_NAME environment variable.
|
|
785
|
+
const fileContext = this.config?.context || this.config?.servers?.context || null;
|
|
786
|
+
const requestModel = this.requestContextStorage.getStore()?.modelName;
|
|
787
|
+
const runtimeModel = requestModel ?? this.runtimeContext.modelName;
|
|
788
|
+
const envModel = process.env.D365FO_MODEL_NAME?.trim() || undefined;
|
|
789
|
+
let source = '.mcp.json';
|
|
790
|
+
if (runtimeModel) {
|
|
791
|
+
source = 'runtime context (from VS / VS Code)';
|
|
792
|
+
}
|
|
793
|
+
else if (envModel) {
|
|
794
|
+
source = 'D365FO_MODEL_NAME env var';
|
|
795
|
+
}
|
|
796
|
+
else if (fileContext?.modelName) {
|
|
797
|
+
source = '.mcp.json';
|
|
798
|
+
}
|
|
799
|
+
return { modelName: context.modelName, source };
|
|
800
|
+
}
|
|
801
|
+
const wp = context?.workspacePath;
|
|
802
|
+
if (wp && /PackagesLocalDirectory/i.test(wp)) {
|
|
803
|
+
const fromWp = this.getModelNameFromWorkspacePath();
|
|
804
|
+
if (fromWp && !fromWp.includes('-')) {
|
|
805
|
+
return { modelName: fromWp, source: 'workspacePath segment' };
|
|
806
|
+
}
|
|
807
|
+
}
|
|
808
|
+
if (this.autoDetectedProject?.modelName) {
|
|
809
|
+
return { modelName: this.autoDetectedProject.modelName, source: 'auto-detected from .rnrproj' };
|
|
810
|
+
}
|
|
811
|
+
return { modelName: null, source: '(not configured)' };
|
|
812
|
+
}
|
|
813
|
+
/**
|
|
814
|
+
* Returns all workspace-info diagnostics in one async call, including
|
|
815
|
+
* the human-readable source for each resolved value.
|
|
816
|
+
* Used by the get_workspace_info tool to produce the Phase-5 diagnostics output.
|
|
817
|
+
*/
|
|
818
|
+
async getWorkspaceInfoDiagnostics() {
|
|
819
|
+
// Ensure config is loaded and auto-detection has had a chance to run
|
|
820
|
+
await this.ensureLoaded();
|
|
821
|
+
// If the D365FO_SOLUTIONS_PATH eager scan is still running, wait for it
|
|
822
|
+
// first — that scan populates allDetectedProjects which setRuntimeContextFromRoots
|
|
823
|
+
// needs to do a path-match. Cap at 5 s so we never block Copilot past its timeout.
|
|
824
|
+
if (this.allDetectedProjectsReady) {
|
|
825
|
+
await Promise.race([
|
|
826
|
+
this.allDetectedProjectsReady,
|
|
827
|
+
new Promise(resolve => setTimeout(resolve, 5_000)),
|
|
828
|
+
]);
|
|
829
|
+
}
|
|
830
|
+
if (!this.autoDetectionAttempted) {
|
|
831
|
+
const ctx = this.config?.servers?.context;
|
|
832
|
+
await this.autoDetectProject(this.runtimeContext.workspacePath || ctx?.workspacePath);
|
|
833
|
+
}
|
|
834
|
+
else if (!this.autoDetectedProject && this.detectionInProgress) {
|
|
835
|
+
// autoDetectionAttempted was set immediately when background scan started,
|
|
836
|
+
// but the scan hasn't finished yet — wait up to 5 s for the result.
|
|
837
|
+
await Promise.race([
|
|
838
|
+
this.detectionInProgress,
|
|
839
|
+
new Promise(resolve => setTimeout(resolve, 5_000)),
|
|
840
|
+
]);
|
|
841
|
+
this.detectionInProgress = null;
|
|
842
|
+
}
|
|
843
|
+
// Model name
|
|
844
|
+
const { modelName, source: modelSource } = this.getModelNameWithSource();
|
|
845
|
+
// Project path
|
|
846
|
+
let projectPath = null;
|
|
847
|
+
let projectSource = '(not detected)';
|
|
848
|
+
if (this.runtimeContext.projectPath) {
|
|
849
|
+
projectPath = this.runtimeContext.projectPath;
|
|
850
|
+
projectSource = 'runtime context (from VS Code)';
|
|
851
|
+
}
|
|
852
|
+
else if (this.config?.servers?.context?.projectPath) {
|
|
853
|
+
projectPath = this.config?.servers?.context?.projectPath ?? null;
|
|
854
|
+
projectSource = '.mcp.json';
|
|
855
|
+
}
|
|
856
|
+
else if (this.autoDetectedProject?.projectPath) {
|
|
857
|
+
projectPath = this.autoDetectedProject.projectPath;
|
|
858
|
+
projectSource = 'auto-detected from .rnrproj';
|
|
859
|
+
}
|
|
860
|
+
// Package path (MS framework / standard packages — read-only reference root)
|
|
861
|
+
const packagePath = this.getPackagePath();
|
|
862
|
+
let packageSource = '(not configured)';
|
|
863
|
+
const context = this.getContext();
|
|
864
|
+
const fileContext = this.config?.context || this.config?.servers?.context || null;
|
|
865
|
+
if (context?.packagePath) {
|
|
866
|
+
// getContext() merges env vars with higher priority than .mcp.json.
|
|
867
|
+
// Report the actual source so diagnostics don't mislead the developer.
|
|
868
|
+
if (process.env.D365FO_PACKAGE_PATH?.trim()) {
|
|
869
|
+
packageSource = 'D365FO_PACKAGE_PATH env var';
|
|
870
|
+
}
|
|
871
|
+
else if (fileContext?.packagePath) {
|
|
872
|
+
packageSource = '.mcp.json';
|
|
873
|
+
}
|
|
874
|
+
else {
|
|
875
|
+
packageSource = 'env var';
|
|
876
|
+
}
|
|
877
|
+
}
|
|
878
|
+
else if (context?.workspacePath && /PackagesLocalDirectory/i.test(context.workspacePath)) {
|
|
879
|
+
packageSource = 'workspacePath';
|
|
880
|
+
}
|
|
881
|
+
else if (this.autoDetectedProject?.packagePath) {
|
|
882
|
+
packageSource = 'auto-detected from .rnrproj';
|
|
883
|
+
}
|
|
884
|
+
else if (packagePath) {
|
|
885
|
+
packageSource = 'well-known path probe';
|
|
886
|
+
}
|
|
887
|
+
// Custom write path (D365FO_CUSTOM_PACKAGES_PATH / customPackagesPath in context)
|
|
888
|
+
// — this is the repo working tree where custom model XML is written and tracked by git.
|
|
889
|
+
const customPackagesPath = await this.getCustomPackagesPath();
|
|
890
|
+
let customPackagesSource = '(not configured)';
|
|
891
|
+
if (customPackagesPath) {
|
|
892
|
+
if (process.env.D365FO_CUSTOM_PACKAGES_PATH?.trim()) {
|
|
893
|
+
customPackagesSource = 'D365FO_CUSTOM_PACKAGES_PATH env var';
|
|
894
|
+
}
|
|
895
|
+
else if (fileContext?.customPackagesPath) {
|
|
896
|
+
customPackagesSource = '.mcp.json';
|
|
897
|
+
}
|
|
898
|
+
else {
|
|
899
|
+
customPackagesSource = 'XPP config auto-detection';
|
|
900
|
+
}
|
|
901
|
+
}
|
|
902
|
+
const isModelSourceAutoDetected = modelSource.includes('auto-detected');
|
|
903
|
+
return {
|
|
904
|
+
modelName, modelSource, isModelSourceAutoDetected,
|
|
905
|
+
projectPath, projectSource,
|
|
906
|
+
packagePath, packageSource,
|
|
907
|
+
customPackagesPath, customPackagesSource,
|
|
908
|
+
};
|
|
909
|
+
}
|
|
910
|
+
/**
|
|
911
|
+
* Returns all projects discovered by the D365FO_SOLUTIONS_PATH scan.
|
|
912
|
+
* Used by get_workspace_info to list available projects for solution switching.
|
|
913
|
+
*/
|
|
914
|
+
getAllDetectedProjects() {
|
|
915
|
+
return this.allDetectedProjects;
|
|
916
|
+
}
|
|
917
|
+
/**
|
|
918
|
+
* Explicitly force a specific .rnrproj as the active project.
|
|
919
|
+
* Called when the user passes projectPath to get_workspace_info() to switch solutions.
|
|
920
|
+
* Bypasses the auto-detection cache — takes effect immediately.
|
|
921
|
+
*/
|
|
922
|
+
async forceProject(projectPath) {
|
|
923
|
+
try {
|
|
924
|
+
const normalizedPath = path.normalize(projectPath);
|
|
925
|
+
const modelName = await extractModelNameFromProject(normalizedPath);
|
|
926
|
+
if (!modelName) {
|
|
927
|
+
console.error(`[ConfigManager] forceProject: could not read model name from ${projectPath}`);
|
|
928
|
+
return null;
|
|
929
|
+
}
|
|
930
|
+
const project = {
|
|
931
|
+
projectPath: normalizedPath,
|
|
932
|
+
modelName,
|
|
933
|
+
solutionPath: path.dirname(path.dirname(normalizedPath)),
|
|
934
|
+
};
|
|
935
|
+
this.autoDetectedProject = project;
|
|
936
|
+
this.autoDetectionAttempted = true;
|
|
937
|
+
// Cache under the project path key so direct lookups work.
|
|
938
|
+
this.autoDetectionCache.set(normalizedPath, project);
|
|
939
|
+
// ALSO cache under the current workspace path key.
|
|
940
|
+
// setRuntimeContext() (called per HTTP request with the VS 2022 workspace path)
|
|
941
|
+
// does a cache lookup by workspace path. Without this, it would overwrite
|
|
942
|
+
// autoDetectedProject with the OLD cached value on the very next request.
|
|
943
|
+
const currentWorkspace = this.runtimeContext.workspacePath;
|
|
944
|
+
if (currentWorkspace) {
|
|
945
|
+
this.autoDetectionCache.set(normalizePath(currentWorkspace), project);
|
|
946
|
+
}
|
|
947
|
+
// Persist projectPath in runtimeContext so getWorkspaceInfoDiagnostics()
|
|
948
|
+
// displays the correct project path even if autoDetectedProject is later
|
|
949
|
+
// overridden by automatic detection (git branch / roots/list).
|
|
950
|
+
// NOTE: we intentionally do NOT pin modelName here — automatic detection
|
|
951
|
+
// (setRuntimeContextFromRoots) should be able to override the model when
|
|
952
|
+
// the user switches git branches or opens a different workspace.
|
|
953
|
+
this.runtimeContext = { ...this.runtimeContext, projectPath: normalizedPath };
|
|
954
|
+
registerCustomModel(modelName);
|
|
955
|
+
console.error(`[ConfigManager] ✅ forceProject: switched to ${modelName} (${normalizedPath})`);
|
|
956
|
+
return project;
|
|
957
|
+
}
|
|
958
|
+
catch (err) {
|
|
959
|
+
console.error(`[ConfigManager] forceProject error:`, err);
|
|
960
|
+
return null;
|
|
961
|
+
}
|
|
962
|
+
}
|
|
963
|
+
/**
|
|
964
|
+
* Get project path
|
|
965
|
+
* Priority: 1) Runtime context 2) .mcp.json config 3) Auto-detection from workspace
|
|
966
|
+
*/
|
|
967
|
+
async getProjectPath() {
|
|
968
|
+
// Priority 1: Runtime context
|
|
969
|
+
if (this.runtimeContext.projectPath) {
|
|
970
|
+
return this.runtimeContext.projectPath;
|
|
971
|
+
}
|
|
972
|
+
// Priority 2: Config file
|
|
973
|
+
const context = this.config?.servers?.context;
|
|
974
|
+
if (context?.projectPath) {
|
|
975
|
+
return context.projectPath;
|
|
976
|
+
}
|
|
977
|
+
// Priority 3: Auto-detection
|
|
978
|
+
if (!this.autoDetectionAttempted) {
|
|
979
|
+
await this.autoDetectProject(this.runtimeContext.workspacePath || context?.workspacePath);
|
|
980
|
+
}
|
|
981
|
+
return this.autoDetectedProject?.projectPath || null;
|
|
982
|
+
}
|
|
983
|
+
/**
|
|
984
|
+
* Get solution path
|
|
985
|
+
* Priority: 1) Runtime context 2) .mcp.json config 3) Auto-detection from workspace
|
|
986
|
+
*/
|
|
987
|
+
async getSolutionPath() {
|
|
988
|
+
// Priority 1: Runtime context
|
|
989
|
+
if (this.runtimeContext.solutionPath) {
|
|
990
|
+
return this.runtimeContext.solutionPath;
|
|
991
|
+
}
|
|
992
|
+
// Priority 2: Config file
|
|
993
|
+
const context = this.config?.servers?.context;
|
|
994
|
+
if (context?.solutionPath) {
|
|
995
|
+
return context.solutionPath;
|
|
996
|
+
}
|
|
997
|
+
// Priority 3: Auto-detection
|
|
998
|
+
if (!this.autoDetectionAttempted) {
|
|
999
|
+
await this.autoDetectProject(this.runtimeContext.workspacePath || context?.workspacePath);
|
|
1000
|
+
}
|
|
1001
|
+
return this.autoDetectedProject?.solutionPath || null;
|
|
1002
|
+
}
|
|
1003
|
+
/**
|
|
1004
|
+
* Returns a snapshot of the currently detected project for diagnostic logging.
|
|
1005
|
+
* All fields are resolved synchronously from the in-memory state — no async I/O.
|
|
1006
|
+
*/
|
|
1007
|
+
getDetectionSummary() {
|
|
1008
|
+
const { modelName, source } = this.getModelNameWithSource();
|
|
1009
|
+
return {
|
|
1010
|
+
modelName,
|
|
1011
|
+
source,
|
|
1012
|
+
projectPath: this.runtimeContext.projectPath ??
|
|
1013
|
+
this.autoDetectedProject?.projectPath ??
|
|
1014
|
+
this.config?.servers?.context?.projectPath ?? null,
|
|
1015
|
+
solutionPath: this.runtimeContext.solutionPath ??
|
|
1016
|
+
this.autoDetectedProject?.solutionPath ??
|
|
1017
|
+
this.config?.servers?.context?.solutionPath ?? null,
|
|
1018
|
+
workspacePath: this.runtimeContext.workspacePath ??
|
|
1019
|
+
this.config?.servers?.context?.workspacePath ?? null,
|
|
1020
|
+
};
|
|
1021
|
+
}
|
|
1022
|
+
/**
|
|
1023
|
+
* Returns ONLY the model name found by scanning .rnrproj files on disk,
|
|
1024
|
+
* ignoring whatever is written in .mcp.json / env vars.
|
|
1025
|
+
* Useful when the configured modelName is a placeholder and we want to suggest
|
|
1026
|
+
* the real model to the user.
|
|
1027
|
+
*/
|
|
1028
|
+
async getRawAutoDetectedModelName() {
|
|
1029
|
+
if (!this.autoDetectionAttempted) {
|
|
1030
|
+
const context = this.config?.servers?.context;
|
|
1031
|
+
await this.autoDetectProject(this.runtimeContext.workspacePath || context?.workspacePath);
|
|
1032
|
+
}
|
|
1033
|
+
return this.autoDetectedProject?.modelName || null;
|
|
1034
|
+
}
|
|
1035
|
+
/**
|
|
1036
|
+
* Get auto-detected model name
|
|
1037
|
+
* Returns the model name discovered through auto-detection.
|
|
1038
|
+
* Skips the scan when modelName is already configured — avoids needless filesystem traversal.
|
|
1039
|
+
*/
|
|
1040
|
+
async getAutoDetectedModelName() {
|
|
1041
|
+
// Short-circuit: if .mcp.json / env already provides a model name, skip the disk scan entirely.
|
|
1042
|
+
const alreadyKnown = this.getModelName();
|
|
1043
|
+
if (alreadyKnown) {
|
|
1044
|
+
return alreadyKnown;
|
|
1045
|
+
}
|
|
1046
|
+
if (!this.autoDetectionAttempted) {
|
|
1047
|
+
const context = this.config?.servers?.context;
|
|
1048
|
+
await this.autoDetectProject(this.runtimeContext.workspacePath || context?.workspacePath);
|
|
1049
|
+
}
|
|
1050
|
+
return this.autoDetectedProject?.modelName || null;
|
|
1051
|
+
}
|
|
1052
|
+
/**
|
|
1053
|
+
* Get the resolved dev environment type.
|
|
1054
|
+
* Priority: 1) Explicit env var 2) .mcp.json context 3) Auto-detect
|
|
1055
|
+
*/
|
|
1056
|
+
async getDevEnvironmentType() {
|
|
1057
|
+
const explicit = process.env.DEV_ENVIRONMENT_TYPE || this.getContext()?.devEnvironmentType;
|
|
1058
|
+
if (explicit === 'ude')
|
|
1059
|
+
return 'ude';
|
|
1060
|
+
if (explicit === 'traditional')
|
|
1061
|
+
return 'traditional';
|
|
1062
|
+
// Auto-detect: check if XPP configs exist
|
|
1063
|
+
await this.ensureXppConfig();
|
|
1064
|
+
return this.xppConfig ? 'ude' : 'traditional';
|
|
1065
|
+
}
|
|
1066
|
+
/**
|
|
1067
|
+
* Get the custom packages path (UDE: ModelStoreFolder).
|
|
1068
|
+
*/
|
|
1069
|
+
async getCustomPackagesPath() {
|
|
1070
|
+
// Priority 1: .mcp.json context
|
|
1071
|
+
const ctx = this.getContext();
|
|
1072
|
+
if (ctx?.customPackagesPath)
|
|
1073
|
+
return ctx.customPackagesPath;
|
|
1074
|
+
// Priority 2: XPP config auto-detection
|
|
1075
|
+
await this.ensureXppConfig();
|
|
1076
|
+
return this.xppConfig?.customPackagesPath || null;
|
|
1077
|
+
}
|
|
1078
|
+
/**
|
|
1079
|
+
* Get the Microsoft packages path (UDE: FrameworkDirectory).
|
|
1080
|
+
*/
|
|
1081
|
+
async getMicrosoftPackagesPath() {
|
|
1082
|
+
// Priority 1: .mcp.json context
|
|
1083
|
+
const ctx = this.getContext();
|
|
1084
|
+
if (ctx?.microsoftPackagesPath)
|
|
1085
|
+
return ctx.microsoftPackagesPath;
|
|
1086
|
+
// Priority 2: XPP config auto-detection
|
|
1087
|
+
await this.ensureXppConfig();
|
|
1088
|
+
return this.xppConfig?.microsoftPackagesPath || null;
|
|
1089
|
+
}
|
|
1090
|
+
/**
|
|
1091
|
+
* Get the full active XPP environment config, including ReferencePackagesPaths.
|
|
1092
|
+
* Returns null when no XPP config exists (CHE / non-UDE environment).
|
|
1093
|
+
*/
|
|
1094
|
+
async getActiveXppConfig() {
|
|
1095
|
+
await this.ensureXppConfig();
|
|
1096
|
+
return this.xppConfig;
|
|
1097
|
+
}
|
|
1098
|
+
/**
|
|
1099
|
+
* Get the cross-reference database server (UDE: CrossReferencesDbServerName).
|
|
1100
|
+
*/
|
|
1101
|
+
async getXrefDbServer() {
|
|
1102
|
+
await this.ensureXppConfig();
|
|
1103
|
+
return this.xppConfig?.xrefDbServer || null;
|
|
1104
|
+
}
|
|
1105
|
+
/**
|
|
1106
|
+
* Get the cross-reference database name (UDE: CrossReferencesDatabaseName).
|
|
1107
|
+
*/
|
|
1108
|
+
async getXrefDbName() {
|
|
1109
|
+
await this.ensureXppConfig();
|
|
1110
|
+
return this.xppConfig?.xrefDbName || null;
|
|
1111
|
+
}
|
|
1112
|
+
async ensureXppConfig() {
|
|
1113
|
+
if (this.xppConfigLoaded)
|
|
1114
|
+
return;
|
|
1115
|
+
this.xppConfigLoaded = true;
|
|
1116
|
+
this.xppConfigProvider = new XppConfigProvider();
|
|
1117
|
+
const configName = process.env.XPP_CONFIG_NAME || undefined;
|
|
1118
|
+
this.xppConfig = await this.xppConfigProvider.getActiveConfig(configName);
|
|
1119
|
+
if (this.xppConfig) {
|
|
1120
|
+
console.error(`[ConfigManager] XPP config loaded: ${this.xppConfig.configName} v${this.xppConfig.version}`);
|
|
1121
|
+
console.error(` Custom packages: ${this.xppConfig.customPackagesPath}`);
|
|
1122
|
+
console.error(` Microsoft packages: ${this.xppConfig.microsoftPackagesPath}`);
|
|
1123
|
+
}
|
|
1124
|
+
}
|
|
1125
|
+
}
|
|
1126
|
+
// Singleton instance
|
|
1127
|
+
let configManager = null;
|
|
1128
|
+
/**
|
|
1129
|
+
* Get or create ConfigManager instance
|
|
1130
|
+
*/
|
|
1131
|
+
export function getConfigManager(configPath) {
|
|
1132
|
+
if (!configManager) {
|
|
1133
|
+
configManager = new ConfigManager(configPath);
|
|
1134
|
+
}
|
|
1135
|
+
return configManager;
|
|
1136
|
+
}
|
|
1137
|
+
/**
|
|
1138
|
+
* Initialize configuration (load from file)
|
|
1139
|
+
*/
|
|
1140
|
+
export async function initializeConfig(configPath) {
|
|
1141
|
+
const manager = getConfigManager(configPath);
|
|
1142
|
+
return await manager.load();
|
|
1143
|
+
}
|
|
1144
|
+
/**
|
|
1145
|
+
* Fallback package path when configManager.getPackagePath() returns null.
|
|
1146
|
+
* This only happens when no config is loaded AND none of the well-known
|
|
1147
|
+
* candidate paths (C:, J:, K:) exist on the filesystem.
|
|
1148
|
+
* The value is a safe sentinel — callers will get a clear 'file not found'
|
|
1149
|
+
* rather than silently defaulting to a specific drive letter.
|
|
1150
|
+
*/
|
|
1151
|
+
const FALLBACK_PACKAGE_PATH = 'C:\\AosService\\PackagesLocalDirectory';
|
|
1152
|
+
export function fallbackPackagePath() {
|
|
1153
|
+
return FALLBACK_PACKAGE_PATH;
|
|
1154
|
+
}
|
|
1155
|
+
/**
|
|
1156
|
+
* Extract the package name from a D365FO file path.
|
|
1157
|
+
* Standard AOT layout: .../PackagesLocalDirectory/{Package}/{Model}/Ax{Type}/{Name}.xml
|
|
1158
|
+
* Returns the package name (first segment after PackagesLocalDirectory), or null.
|
|
1159
|
+
* The package name is what isStandardModel() checks against (e.g. ApplicationSuite).
|
|
1160
|
+
*/
|
|
1161
|
+
export function extractModelFromFilePath(filePath) {
|
|
1162
|
+
const normalised = filePath.replace(/\\/g, '/');
|
|
1163
|
+
const match = normalised.match(/PackagesLocalDirectory\/([^/]+)\/[^/]+\/Ax[^/]+\//i);
|
|
1164
|
+
if (match) {
|
|
1165
|
+
return match[1]; // package name (first segment, e.g. ApplicationSuite)
|
|
1166
|
+
}
|
|
1167
|
+
return null;
|
|
1168
|
+
}
|
|
1169
|
+
//# sourceMappingURL=configManager.js.map
|