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
package/dist/index.js
ADDED
|
@@ -0,0 +1,753 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* X++ MCP Code Completion Server
|
|
3
|
+
* Main entry point
|
|
4
|
+
*/
|
|
5
|
+
// Load .env โ supports ENV_FILE env var for multi-instance setups (see src/utils/loadEnv.ts).
|
|
6
|
+
import { loadEnv } from './utils/loadEnv.js';
|
|
7
|
+
loadEnv(import.meta.url);
|
|
8
|
+
import { fileURLToPath } from 'url';
|
|
9
|
+
import { dirname, resolve } from 'path';
|
|
10
|
+
import express from 'express';
|
|
11
|
+
import compression from 'compression';
|
|
12
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
13
|
+
import { createXppMcpServer } from './server/mcpServer.js';
|
|
14
|
+
import { createStreamableHttpTransport } from './server/transport.js';
|
|
15
|
+
import { XppSymbolIndex } from './metadata/symbolIndex.js';
|
|
16
|
+
import { XppMetadataParser } from './metadata/xmlParser.js';
|
|
17
|
+
import { WorkspaceScanner } from './workspace/workspaceScanner.js';
|
|
18
|
+
import { HybridSearch } from './workspace/hybridSearch.js';
|
|
19
|
+
import { initializeDatabase } from './database/download.js';
|
|
20
|
+
import { initializeConfig, getConfigManager } from './utils/configManager.js';
|
|
21
|
+
import { SERVER_MODE, LOCAL_TOOLS, isToolAllowedInMode } from './server/serverMode.js';
|
|
22
|
+
import { TOOL_ANNOTATIONS } from './server/toolAnnotations.js';
|
|
23
|
+
import { apiKeyAuth } from './middleware/apiKeyAuth.js';
|
|
24
|
+
import { setInitializeParams } from './utils/stdioSessionInfo.js';
|
|
25
|
+
import { box, kv, sectionTitle, statusLine, spread, c, glyph, sanitize, supportsUnicode, log, shortPath, startupWarnings } from './utils/terminalUi.js';
|
|
26
|
+
import * as fs from 'fs/promises';
|
|
27
|
+
import * as fsSync from 'node:fs';
|
|
28
|
+
import { Transform } from 'node:stream';
|
|
29
|
+
// Filter verbose debug progress messages unless DEBUG_LOGGING is enabled.
|
|
30
|
+
const originalConsoleError = console.error;
|
|
31
|
+
const DEBUG_LOGGING = process.env.DEBUG_LOGGING === 'true';
|
|
32
|
+
// Optional file-based logging: set LOG_FILE to an absolute path to mirror stderr
|
|
33
|
+
// to a file (useful when the IDE doesn't expose MCP subprocess stderr).
|
|
34
|
+
const LOG_FILE = process.env.LOG_FILE;
|
|
35
|
+
let _logStream;
|
|
36
|
+
if (LOG_FILE) {
|
|
37
|
+
try {
|
|
38
|
+
_logStream = fsSync.createWriteStream(LOG_FILE, { flags: 'a', encoding: 'utf8' });
|
|
39
|
+
const banner = `\n${'โ'.repeat(72)}\n[d365fo-mcp] Started at ${new Date().toISOString()} pid=${process.pid}\n${'โ'.repeat(72)}\n`;
|
|
40
|
+
_logStream.write(banner);
|
|
41
|
+
// Tee: intercept process.stderr so every write also goes to the log file
|
|
42
|
+
const origStderrWrite = process.stderr.write.bind(process.stderr);
|
|
43
|
+
process.stderr.write = function (chunk, ...rest) {
|
|
44
|
+
_logStream.write(typeof chunk === 'string' ? chunk : chunk.toString('utf8'));
|
|
45
|
+
return origStderrWrite(chunk, ...rest);
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
// Don't crash the server if the log file can't be opened
|
|
50
|
+
process.stderr.write(`[d365fo-mcp] โ ๏ธ Cannot open LOG_FILE=${LOG_FILE}: ${e}\n`);
|
|
51
|
+
_logStream = undefined;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
console.error = (...args) => {
|
|
55
|
+
if (DEBUG_LOGGING) {
|
|
56
|
+
originalConsoleError(...args);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const firstArg = String(args[0]);
|
|
60
|
+
// Suppress verbose operational debug messages from any tool/component prefix
|
|
61
|
+
// (pattern: message starts with "[module_name]"), but NEVER suppress if the
|
|
62
|
+
// message contains error/warning indicators โ those must always reach the client.
|
|
63
|
+
const hasErrorIndicator = firstArg.includes('Failed') ||
|
|
64
|
+
firstArg.includes('failed') ||
|
|
65
|
+
firstArg.includes('Error') ||
|
|
66
|
+
firstArg.includes('error') ||
|
|
67
|
+
firstArg.includes('โ') ||
|
|
68
|
+
firstArg.includes('โ ๏ธ') ||
|
|
69
|
+
firstArg.includes('[WARN]') ||
|
|
70
|
+
firstArg.includes('[ERROR]');
|
|
71
|
+
const isModuleDebugMessage = /^\[[\w\- ]+\]/.test(firstArg) && !hasErrorIndicator;
|
|
72
|
+
if (!isModuleDebugMessage) {
|
|
73
|
+
originalConsoleError(...args);
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
// โโโ Global safety net โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
77
|
+
// An unhandled promise rejection terminates the Node process by default
|
|
78
|
+
// (Node โฅ15, --unhandled-rejections=throw). In stdio mode that kills the MCP
|
|
79
|
+
// subprocess and the client must restart it โ observed as "the server crashes
|
|
80
|
+
// on the first request and has to be restarted" when a background task (e.g.
|
|
81
|
+
// the async DB load) rejects before any tool call awaits it. Log and keep the
|
|
82
|
+
// server alive instead of dying. (stderr is already tee'd to LOG_FILE above.)
|
|
83
|
+
process.on('unhandledRejection', (reason) => {
|
|
84
|
+
const msg = reason instanceof Error ? (reason.stack ?? reason.message) : String(reason);
|
|
85
|
+
process.stderr.write(`[d365fo-mcp] โ ๏ธ Unhandled promise rejection (server staying up): ${msg}\n`);
|
|
86
|
+
});
|
|
87
|
+
// Same protection for SYNCHRONOUS uncaught exceptions โ a throw that escapes a
|
|
88
|
+
// timer/stream/event callback (not an awaited promise) would otherwise stop the
|
|
89
|
+
// process outright. For a stdio server that means the MCP client must respawn
|
|
90
|
+
// the subprocess after the very first failing request. Log the full stack so the
|
|
91
|
+
// root cause is diagnosable, then keep serving. (Genuinely fatal startup errors
|
|
92
|
+
// are still surfaced via main().catch โ process.exit below.)
|
|
93
|
+
process.on('uncaughtException', (err) => {
|
|
94
|
+
process.stderr.write(`[d365fo-mcp] โ ๏ธ Uncaught exception (server staying up): ${err?.stack ?? err}\n`);
|
|
95
|
+
});
|
|
96
|
+
const PORT = parseInt(process.env.PORT || '8080');
|
|
97
|
+
// Derive server root from this file's location so paths are absolute
|
|
98
|
+
// regardless of process.cwd() โ critical when VS Code launches this as stdio subprocess.
|
|
99
|
+
const __serverDir = dirname(fileURLToPath(import.meta.url));
|
|
100
|
+
const DB_PATH = process.env.DB_PATH
|
|
101
|
+
? resolve(process.env.DB_PATH)
|
|
102
|
+
: resolve(__serverDir, '../data/xpp-metadata.db');
|
|
103
|
+
const LABELS_DB_PATH = process.env.LABELS_DB_PATH
|
|
104
|
+
? resolve(process.env.LABELS_DB_PATH)
|
|
105
|
+
: resolve(__serverDir, '../data/xpp-metadata-labels.db');
|
|
106
|
+
const METADATA_PATH = process.env.METADATA_PATH
|
|
107
|
+
? resolve(process.env.METADATA_PATH)
|
|
108
|
+
: resolve(__serverDir, '../metadata');
|
|
109
|
+
// Detect if running in stdio mode (launched by MCP client as subprocess).
|
|
110
|
+
// Primary signal: stdin is NOT a TTY โ in Node.js isTTY is `true` for terminals
|
|
111
|
+
// and `undefined` (never `false`) for pipes, so use !isTTY, not === false.
|
|
112
|
+
// WEBSITES_PORT guards Azure App Service (HTTP-only, stdin may also be non-TTY there).
|
|
113
|
+
// MCP_FORCE_HTTP lets an operator explicitly keep HTTP even when stdin is piped.
|
|
114
|
+
const isStdioMode = !process.env.WEBSITES_PORT &&
|
|
115
|
+
process.env.MCP_FORCE_HTTP !== 'true' &&
|
|
116
|
+
(process.env.MCP_STDIO_MODE === 'true' || !process.stdin.isTTY);
|
|
117
|
+
const serverState = {
|
|
118
|
+
isReady: false,
|
|
119
|
+
isHealthy: false,
|
|
120
|
+
statusMessage: 'Starting...',
|
|
121
|
+
};
|
|
122
|
+
async function initializeServices() {
|
|
123
|
+
// -----------------------------------------------------------------------
|
|
124
|
+
// write-only mode: skip all database/symbol work โ LOCAL_TOOLS
|
|
125
|
+
// (create_d365fo_file, modify_d365fo_file, labels, verify_d365fo_project,
|
|
126
|
+
// get_workspace_info etc.) only need the config manager for path resolution,
|
|
127
|
+
// not the 1.5 GB symbol database.
|
|
128
|
+
// -----------------------------------------------------------------------
|
|
129
|
+
if (SERVER_MODE === 'write-only') {
|
|
130
|
+
log.info('Mode: write-only (local file-operations companion)');
|
|
131
|
+
log.detail('skipping database download and symbol index โ not needed here');
|
|
132
|
+
const config = await initializeConfig();
|
|
133
|
+
if (config?.servers?.context) {
|
|
134
|
+
log.ok('Configuration loaded from .mcp.json (servers.context)');
|
|
135
|
+
if (config.servers.context.workspacePath) {
|
|
136
|
+
log.detail(`workspace: ${config.servers.context.workspacePath}`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
else if (config) {
|
|
140
|
+
log.info('Configuration from environment (.mcp.json uses VS/Copilot registry format)');
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
log.info('Configuration from environment variables');
|
|
144
|
+
}
|
|
145
|
+
const symbolIndex = new XppSymbolIndex(':memory:', ':memory:');
|
|
146
|
+
const parser = new XppMetadataParser();
|
|
147
|
+
const workspaceScanner = new WorkspaceScanner();
|
|
148
|
+
const hybridSearch = new HybridSearch(symbolIndex, workspaceScanner);
|
|
149
|
+
serverState.symbolIndex = symbolIndex;
|
|
150
|
+
serverState.parser = parser;
|
|
151
|
+
const context = { symbolIndex, parser, workspaceScanner, hybridSearch };
|
|
152
|
+
const mcpServer = createXppMcpServer(context);
|
|
153
|
+
log.ok('MCP Server initialized (write-only mode)');
|
|
154
|
+
return { mcpServer, symbolIndex, parser, workspaceScanner, hybridSearch, context };
|
|
155
|
+
}
|
|
156
|
+
// -----------------------------------------------------------------------
|
|
157
|
+
// full / read-only mode: full initialization with database
|
|
158
|
+
// -----------------------------------------------------------------------
|
|
159
|
+
try {
|
|
160
|
+
// Resolve configuration source โ report the outcome in a single line rather
|
|
161
|
+
// than a "loadingโฆ" step followed by a result (the load is instant, and an
|
|
162
|
+
// absent .mcp.json is a normal case, not a warning).
|
|
163
|
+
const config = await initializeConfig();
|
|
164
|
+
if (config?.servers?.context) {
|
|
165
|
+
log.ok('Configuration loaded from .mcp.json (servers.context)');
|
|
166
|
+
if (config.servers.context.workspacePath) {
|
|
167
|
+
log.detail(`workspace: ${config.servers.context.workspacePath}`);
|
|
168
|
+
}
|
|
169
|
+
if (config.servers.context.packagePath) {
|
|
170
|
+
log.detail(`packages: ${config.servers.context.packagePath}`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
else if (config) {
|
|
174
|
+
// Home .mcp.json found but uses VS/Copilot server-registry format (servers.<name>).
|
|
175
|
+
// D365FO paths are supplied via process.env (D365FO_SOLUTIONS_PATH, DB_PATH, โฆ).
|
|
176
|
+
log.info('Configuration from environment (.mcp.json uses VS/Copilot registry format)');
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
log.info('Configuration from environment variables');
|
|
180
|
+
}
|
|
181
|
+
// Download database from blob storage if configured (only if remote is newer than local)
|
|
182
|
+
if (process.env.AZURE_STORAGE_CONNECTION_STRING && process.env.BLOB_CONTAINER_NAME) {
|
|
183
|
+
try {
|
|
184
|
+
serverState.statusMessage = 'Checking database version...';
|
|
185
|
+
await initializeDatabase();
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
console.error(statusLine('warn', 'Failed to download database from blob storage:'), error);
|
|
189
|
+
log.detail('will attempt to use existing local database' + glyph.ellipsis);
|
|
190
|
+
// If download failed, check if local database exists and is valid
|
|
191
|
+
try {
|
|
192
|
+
await fs.access(DB_PATH);
|
|
193
|
+
log.detail('local database file exists, will attempt to use it');
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
log.warn('No local database available โ server will start with empty index');
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// Initialize symbol index and parser (DB path is shown in the startup header).
|
|
201
|
+
// The open is synchronous and can block briefly on a large DB, so announce
|
|
202
|
+
// it first โ otherwise the output looks frozen during the load.
|
|
203
|
+
log.step('Loading symbols' + glyph.ellipsis);
|
|
204
|
+
serverState.statusMessage = 'Loading metadata database...';
|
|
205
|
+
const dbLoadStart = Date.now();
|
|
206
|
+
// Yield event loop so any pending MCP protocol messages (initialize exchange,
|
|
207
|
+
// roots/list, first tool call) can be queued before new Database() blocks.
|
|
208
|
+
// better-sqlite3 open is synchronous โ a 1.5 GB file can stall the loop for
|
|
209
|
+
// several seconds, causing the first client request to time out and cancel.
|
|
210
|
+
await new Promise(r => setImmediate(r));
|
|
211
|
+
let symbolIndex;
|
|
212
|
+
let dbHasSymbols = false;
|
|
213
|
+
try {
|
|
214
|
+
symbolIndex = new XppSymbolIndex(DB_PATH, LABELS_DB_PATH);
|
|
215
|
+
// Cheap O(1) probe โ NOT getSymbolCount(): a full COUNT scan of a 2 GB DB
|
|
216
|
+
// blocks the event loop for 30-60 s, which starves the MCP handshake and
|
|
217
|
+
// makes clients (VS Code Copilot) time out and kill the server.
|
|
218
|
+
dbHasSymbols = symbolIndex.hasAnySymbols();
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
console.error(statusLine('err', 'Failed to open database:'), error);
|
|
222
|
+
// If database is corrupted, delete it and create new empty one
|
|
223
|
+
if (error.code === 'SQLITE_CORRUPT' || error.message?.includes('malformed')) {
|
|
224
|
+
log.warn('Database is corrupted โ removing and creating a fresh one' + glyph.ellipsis);
|
|
225
|
+
try {
|
|
226
|
+
await fs.unlink(DB_PATH);
|
|
227
|
+
log.detail('corrupted database removed');
|
|
228
|
+
}
|
|
229
|
+
catch (unlinkError) {
|
|
230
|
+
console.error(statusLine('warn', 'Failed to remove corrupted database:'), unlinkError);
|
|
231
|
+
}
|
|
232
|
+
// Try again with fresh database
|
|
233
|
+
symbolIndex = new XppSymbolIndex(DB_PATH, LABELS_DB_PATH);
|
|
234
|
+
dbHasSymbols = symbolIndex.hasAnySymbols();
|
|
235
|
+
log.warn('Symbol index is now empty. To restore, run: npm run index-metadata');
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
throw error;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
const parser = new XppMetadataParser();
|
|
242
|
+
// Check if database needs indexing
|
|
243
|
+
if (!dbHasSymbols) {
|
|
244
|
+
log.warn('No symbols found in database โ run `npm run index-metadata` first');
|
|
245
|
+
log.detail('or set METADATA_PATH and the server will index on startup');
|
|
246
|
+
// If metadata path exists, index it
|
|
247
|
+
try {
|
|
248
|
+
await fs.access(METADATA_PATH);
|
|
249
|
+
log.step(`Indexing metadata from ${METADATA_PATH}` + glyph.ellipsis);
|
|
250
|
+
serverState.statusMessage = 'Indexing metadata...';
|
|
251
|
+
const modelNamesStr = process.env.CUSTOM_MODELS || 'CustomModel';
|
|
252
|
+
const modelNames = modelNamesStr.split(',').map(m => m.trim()).filter(Boolean);
|
|
253
|
+
log.detail(`model names: ${modelNames.join(', ')}`);
|
|
254
|
+
// Single pass over all requested models โ the FTS index is rebuilt once at the
|
|
255
|
+
// end of the call, so looping per model would repeat a full-table rebuild.
|
|
256
|
+
log.detail(`indexing ${modelNames.join(', ')}` + glyph.ellipsis);
|
|
257
|
+
await symbolIndex.indexMetadataDirectory(METADATA_PATH, modelNames);
|
|
258
|
+
log.ok(`Indexed ${symbolIndex.getSymbolCount().toLocaleString('en-US')} symbols from ${modelNames.length} model(s)`);
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
log.warn('Metadata path not accessible โ starting with empty index');
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
else {
|
|
265
|
+
log.ok(`Database opened in ${((Date.now() - dbLoadStart) / 1000).toFixed(1)}s ${glyph.dot} counting symbols in background`);
|
|
266
|
+
// The count scan runs in a worker thread (getSymbolCounts) so it never
|
|
267
|
+
// blocks MCP requests; the breakdown is logged when it lands.
|
|
268
|
+
void symbolIndex.getSymbolCounts().then(({ total, byType: b }) => {
|
|
269
|
+
const n = (x) => (x || 0).toLocaleString('en-US');
|
|
270
|
+
log.ok(`Counted ${total.toLocaleString('en-US')} symbols in ${((Date.now() - dbLoadStart) / 1000).toFixed(1)}s`);
|
|
271
|
+
log.detail(`${n(b.class)} classes ${glyph.dot} ${n(b.table)} tables ${glyph.dot} ${n(b.form)} forms ${glyph.dot} ${n(b.query)} queries ${glyph.dot} ${n(b.view)} views`);
|
|
272
|
+
}).catch(err => {
|
|
273
|
+
console.error(statusLine('warn', 'Symbol count failed:'), err);
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
serverState.symbolIndex = symbolIndex;
|
|
277
|
+
serverState.parser = parser;
|
|
278
|
+
// Initialize workspace scanner and hybrid search
|
|
279
|
+
const workspaceScanner = new WorkspaceScanner();
|
|
280
|
+
const hybridSearch = new HybridSearch(symbolIndex, workspaceScanner);
|
|
281
|
+
// Create MCP server with full context
|
|
282
|
+
serverState.statusMessage = 'Initializing MCP server...';
|
|
283
|
+
const context = {
|
|
284
|
+
symbolIndex,
|
|
285
|
+
parser,
|
|
286
|
+
workspaceScanner,
|
|
287
|
+
hybridSearch,
|
|
288
|
+
};
|
|
289
|
+
const mcpServer = createXppMcpServer(context);
|
|
290
|
+
return { mcpServer, symbolIndex, parser, workspaceScanner, hybridSearch, context };
|
|
291
|
+
}
|
|
292
|
+
catch (error) {
|
|
293
|
+
console.error(statusLine('err', 'Initialization error:'), error);
|
|
294
|
+
serverState.statusMessage = `Initialization failed: ${error}`;
|
|
295
|
+
throw error;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
async function initializeBridge(targetContext) {
|
|
299
|
+
try {
|
|
300
|
+
const { createBridgeClient } = await import('./bridge/bridgeClient.js');
|
|
301
|
+
const configMgr = getConfigManager();
|
|
302
|
+
await configMgr.ensureLoaded();
|
|
303
|
+
// Call getDevEnvironmentType() BEFORE getPackagePath() โ it triggers
|
|
304
|
+
// ensureXppConfig() which populates xppConfig.customPackagesPath.
|
|
305
|
+
// Without this ordering, getPackagePath() can't use the UDE custom path.
|
|
306
|
+
const devEnvType = await configMgr.getDevEnvironmentType();
|
|
307
|
+
// For UDE environments use getCustomPackagesPath() explicitly for the primary
|
|
308
|
+
// path. getPackagePath() has a priority chain where .rnrproj auto-detection
|
|
309
|
+
// (priority #3) can resolve to the Microsoft PackagesLocalDirectory before
|
|
310
|
+
// the UDE customPackagesPath check (priority #4), causing both
|
|
311
|
+
// --packages-path and --reference-packages-path to point to the same
|
|
312
|
+
// Microsoft directory and leaving custom metadata unresolvable.
|
|
313
|
+
let packagesPath;
|
|
314
|
+
let binPath;
|
|
315
|
+
let referencePackagesPath;
|
|
316
|
+
if (devEnvType === 'ude') {
|
|
317
|
+
const customPath = await configMgr.getCustomPackagesPath();
|
|
318
|
+
if (customPath)
|
|
319
|
+
packagesPath = customPath;
|
|
320
|
+
const msPath = await configMgr.getMicrosoftPackagesPath();
|
|
321
|
+
if (msPath) {
|
|
322
|
+
const { existsSync } = await import('fs');
|
|
323
|
+
const { join } = await import('path');
|
|
324
|
+
const candidate = join(msPath, 'bin');
|
|
325
|
+
if (existsSync(candidate))
|
|
326
|
+
binPath = candidate;
|
|
327
|
+
// Pass Microsoft packages as reference provider so both custom and
|
|
328
|
+
// Microsoft-shipped objects (forms, tables, classes, etc.) are resolvable.
|
|
329
|
+
referencePackagesPath = msPath;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
// Traditional: the MS PackagesLocalDirectory is the canonical metadata root.
|
|
334
|
+
const pldPath = configMgr.getPackagePath() ?? undefined;
|
|
335
|
+
// A custom metadata root โ e.g. a repo checkout configured via
|
|
336
|
+
// context.customPackagesPath / D365FO_CUSTOM_PACKAGES_PATH โ may hold the
|
|
337
|
+
// model being edited. If it differs from the PLD, make it the PRIMARY
|
|
338
|
+
// provider and keep the PLD as the reference provider so BOTH custom and
|
|
339
|
+
// Microsoft-shipped objects resolve. Without this, modify/create via the
|
|
340
|
+
// bridge can't find objects whose metadata lives outside the PLD (the
|
|
341
|
+
// bridge resolves objects by its configured roots, not per-call paths).
|
|
342
|
+
const customPath = await configMgr.getCustomPackagesPath();
|
|
343
|
+
const { existsSync } = await import('fs');
|
|
344
|
+
const { join, resolve } = await import('path');
|
|
345
|
+
const samePath = (a, b) => !!a && !!b && resolve(a).toLowerCase() === resolve(b).toLowerCase();
|
|
346
|
+
if (customPath && existsSync(customPath) && !samePath(customPath, pldPath)) {
|
|
347
|
+
packagesPath = customPath;
|
|
348
|
+
if (pldPath) {
|
|
349
|
+
referencePackagesPath = pldPath;
|
|
350
|
+
const candidate = join(pldPath, 'bin');
|
|
351
|
+
if (existsSync(candidate))
|
|
352
|
+
binPath = candidate;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
else {
|
|
356
|
+
packagesPath = pldPath;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
// Pass xref connection details for UDE environments
|
|
360
|
+
const xrefServer = await configMgr.getXrefDbServer() ?? undefined;
|
|
361
|
+
const xrefDatabase = await configMgr.getXrefDbName() ?? undefined;
|
|
362
|
+
const bridge = await createBridgeClient({
|
|
363
|
+
packagesPath,
|
|
364
|
+
referencePackagesPath,
|
|
365
|
+
binPath,
|
|
366
|
+
xrefServer,
|
|
367
|
+
xrefDatabase,
|
|
368
|
+
logFile: configMgr.getContext()?.bridgeLogFile ?? undefined,
|
|
369
|
+
});
|
|
370
|
+
if (bridge) {
|
|
371
|
+
targetContext.bridge = bridge;
|
|
372
|
+
const cap = `metadata ${bridge.metadataAvailable ? 'yes' : 'no'} ${glyph.dot} xref ${bridge.xrefAvailable ? 'yes' : 'no'}`;
|
|
373
|
+
return { ok: true, summary: `C# bridge connected (${devEnvType}) ${glyph.dot} ${cap}` };
|
|
374
|
+
}
|
|
375
|
+
return {
|
|
376
|
+
ok: false,
|
|
377
|
+
summary: `C# bridge unavailable (${devEnvType}) โ live metadata off, using the symbol index`,
|
|
378
|
+
detail: `packages: ${packagesPath ?? '(not detected โ check .mcp.json context.packagePath or PackagesLocalDirectory)'}`,
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
catch (err) {
|
|
382
|
+
return { ok: false, summary: `C# bridge unavailable: ${err}` };
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
async function main() {
|
|
386
|
+
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
387
|
+
// Stdin sniffer: capture the `initialize` request params for get_workspace_info.
|
|
388
|
+
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
389
|
+
/**
|
|
390
|
+
* Wraps process.stdin to capture the `initialize` request params (clientInfo,
|
|
391
|
+
* capabilities, roots) so get_workspace_info can surface them. Passes every
|
|
392
|
+
* byte through unchanged โ this feeds a real tool, it is not a diagnostic trace.
|
|
393
|
+
*/
|
|
394
|
+
function createInitializeParamsSniffer() {
|
|
395
|
+
let buf = Buffer.alloc(0);
|
|
396
|
+
const t = new Transform({
|
|
397
|
+
transform(chunk, _enc, cb) {
|
|
398
|
+
buf = Buffer.concat([buf, chunk]);
|
|
399
|
+
// MCP stdio transport uses newline-delimited JSON: one object per line.
|
|
400
|
+
let newlineIdx;
|
|
401
|
+
while ((newlineIdx = buf.indexOf(0x0a)) !== -1) {
|
|
402
|
+
const line = buf.slice(0, newlineIdx).toString('utf8').replace(/\r$/, '');
|
|
403
|
+
buf = buf.slice(newlineIdx + 1);
|
|
404
|
+
if (!line.trim())
|
|
405
|
+
continue;
|
|
406
|
+
try {
|
|
407
|
+
const msg = JSON.parse(line);
|
|
408
|
+
if (msg.method === 'initialize' && msg.params) {
|
|
409
|
+
setInitializeParams(msg.params);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
catch { /* non-JSON line, skip */ }
|
|
413
|
+
}
|
|
414
|
+
cb(null, chunk); // pass data through unchanged
|
|
415
|
+
},
|
|
416
|
+
});
|
|
417
|
+
process.stdin.pipe(t);
|
|
418
|
+
return t;
|
|
419
|
+
}
|
|
420
|
+
// CRITICAL: In STDIO mode, redirect all console.log/info/warn to stderr.
|
|
421
|
+
// GitHub Copilot reads stdout for MCP protocol only!
|
|
422
|
+
// Suppress verbose operational messages unless DEBUG_LOGGING=true โ every
|
|
423
|
+
// stderr line appears as "[warning] [server stderr]" in the MCP client UI,
|
|
424
|
+
// which is confusing when it's just normal startup/metrics output.
|
|
425
|
+
if (isStdioMode) {
|
|
426
|
+
const stderrWrite = (...args) => {
|
|
427
|
+
if (DEBUG_LOGGING) {
|
|
428
|
+
process.stderr.write(args.join(' ') + '\n');
|
|
429
|
+
return;
|
|
430
|
+
}
|
|
431
|
+
const msg = args.join(' ');
|
|
432
|
+
// Only forward genuine errors/warnings; suppress operational info.
|
|
433
|
+
if (msg.includes('โ') || msg.includes('โ ๏ธ') ||
|
|
434
|
+
msg.includes('Error') || msg.includes('error') ||
|
|
435
|
+
msg.includes('Failed') || msg.includes('failed')) {
|
|
436
|
+
process.stderr.write(msg + '\n');
|
|
437
|
+
}
|
|
438
|
+
};
|
|
439
|
+
console.log = stderrWrite;
|
|
440
|
+
console.info = stderrWrite;
|
|
441
|
+
console.warn = (...args) => process.stderr.write('[WARN] ' + args.join(' ') + '\n');
|
|
442
|
+
}
|
|
443
|
+
else {
|
|
444
|
+
// HTTP mode (e.g. `npm run dev` in PowerShell, or Azure App Service).
|
|
445
|
+
// Sanitise at the stream level so the classic Windows console (cp852) shows
|
|
446
|
+
// clean ASCII glyphs instead of mojibake, while modern terminals (Windows
|
|
447
|
+
// Terminal, VS Code) keep the emoji. Wrapping process.stdout/stderr.write โ
|
|
448
|
+
// rather than the console.* methods โ keeps the error-detection filter above
|
|
449
|
+
// working on the original (emoji-bearing) text, and catches direct
|
|
450
|
+
// process.stderr.write calls too. No-op when Unicode is supported.
|
|
451
|
+
// Safe in HTTP mode: the MCP protocol travels over HTTP sockets, not stdout.
|
|
452
|
+
if (!supportsUnicode) {
|
|
453
|
+
const wrapWrite = (stream) => {
|
|
454
|
+
const orig = stream.write.bind(stream);
|
|
455
|
+
stream.write = (chunk, ...rest) => typeof chunk === 'string' ? orig(sanitize(chunk), ...rest) : orig(chunk, ...rest);
|
|
456
|
+
};
|
|
457
|
+
wrapWrite(process.stdout);
|
|
458
|
+
wrapWrite(process.stderr);
|
|
459
|
+
}
|
|
460
|
+
// Redirect console.warn to stdout so Azure Log Stream shows red ONLY for
|
|
461
|
+
// console.error (real errors), not warnings.
|
|
462
|
+
console.warn = (...args) => process.stdout.write('[WARN] ' + args.join(' ') + '\n');
|
|
463
|
+
}
|
|
464
|
+
if (isStdioMode) {
|
|
465
|
+
// Pre-seed workspace so auto-detection starts before the first tool call.
|
|
466
|
+
// VS Code sets process.cwd() to the first workspace folder for stdio servers.
|
|
467
|
+
// VSCODE_WORKSPACE_FOLDER_PATHS is a more reliable VS Code-specific env var.
|
|
468
|
+
const envRoots = process.env.VSCODE_WORKSPACE_FOLDER_PATHS
|
|
469
|
+
?.split(';')
|
|
470
|
+
.filter(Boolean)
|
|
471
|
+
.map(u => u.startsWith('file:///')
|
|
472
|
+
? decodeURIComponent(u.slice(8)).replace(/\//g, '\\')
|
|
473
|
+
: u);
|
|
474
|
+
const initialWorkspace = envRoots?.[0] ?? process.cwd();
|
|
475
|
+
// Eagerly scan D365FO_SOLUTIONS_PATH so allDetectedProjects is populated before
|
|
476
|
+
// VS 2022 sends roots/list (usually within 1โ2 s of startup).
|
|
477
|
+
getConfigManager().initEagerScan();
|
|
478
|
+
getConfigManager().setRuntimeContext({ workspacePath: initialWorkspace });
|
|
479
|
+
// STDIO mode: connect transport BEFORE the heavy database open so the MCP
|
|
480
|
+
// handshake completes within VS 2022's initialization timeout (~10 s).
|
|
481
|
+
//
|
|
482
|
+
// Strategy:
|
|
483
|
+
// 1. Create a lightweight "stub" server with an in-memory (empty) symbol index.
|
|
484
|
+
// 2. Connect the stdio transport โ handshake completes immediately.
|
|
485
|
+
// 3. Yield the event loop (setImmediate) so VS 2022's `initialized` notification
|
|
486
|
+
// and the roots/list exchange are processed BEFORE the synchronous DB open
|
|
487
|
+
// blocks the event loop. Without this yield, project auto-detection via
|
|
488
|
+
// roots/list could be delayed until after DB load.
|
|
489
|
+
// 4. Run full initializeServices() in the background.
|
|
490
|
+
// 5. Swap the real symbol index into the context once init finishes.
|
|
491
|
+
// Tool handlers await ctx.dbReady so they always use the real index โ
|
|
492
|
+
// they will block (showing a spinner in the IDE) until the DB is ready,
|
|
493
|
+
// then execute immediately with full results.
|
|
494
|
+
// Step 1: lightweight stub + deferred dbReady promise
|
|
495
|
+
const stubIndex = new XppSymbolIndex(':memory:', ':memory:');
|
|
496
|
+
const stubParser = new XppMetadataParser();
|
|
497
|
+
const stubScanner = new WorkspaceScanner();
|
|
498
|
+
const stubHybrid = new HybridSearch(stubIndex, stubScanner);
|
|
499
|
+
let resolveDbReady;
|
|
500
|
+
let rejectDbReady;
|
|
501
|
+
const dbReadyPromise = new Promise((res, rej) => {
|
|
502
|
+
resolveDbReady = res;
|
|
503
|
+
rejectDbReady = rej;
|
|
504
|
+
});
|
|
505
|
+
// Floor handler: if the background DB load fails before any tool call awaits
|
|
506
|
+
// dbReady (e.g. the first request is a LOCAL tool, which skips the wait in
|
|
507
|
+
// toolHandler), the rejection would otherwise float and crash the stdio
|
|
508
|
+
// process. Attaching a catch here marks it handled; tool handlers that do
|
|
509
|
+
// await context.dbReady still receive and surface the rejection themselves.
|
|
510
|
+
dbReadyPromise.catch(() => { });
|
|
511
|
+
const stubContext = {
|
|
512
|
+
symbolIndex: stubIndex,
|
|
513
|
+
parser: stubParser,
|
|
514
|
+
workspaceScanner: stubScanner,
|
|
515
|
+
hybridSearch: stubHybrid,
|
|
516
|
+
dbReady: dbReadyPromise,
|
|
517
|
+
};
|
|
518
|
+
const mcpServer = createXppMcpServer(stubContext);
|
|
519
|
+
// Step 2: connect transport โ handshake completes here
|
|
520
|
+
// Always wrap stdin with the initialize-params sniffer so we can capture the
|
|
521
|
+
// `initialize` request params (clientInfo, capabilities) for get_workspace_info.
|
|
522
|
+
const transport = new StdioServerTransport(createInitializeParamsSniffer(), process.stdout);
|
|
523
|
+
await mcpServer.connect(transport);
|
|
524
|
+
log.ok('Stdio transport connected (DB loading in background)');
|
|
525
|
+
// Step 3: yield the event loop so `initialized` + roots/list can be processed
|
|
526
|
+
// BEFORE the synchronous new Database() call blocks the event loop.
|
|
527
|
+
await new Promise(resolve => setImmediate(resolve));
|
|
528
|
+
// Step 3b: Initialize C# bridge in parallel with DB load (non-blocking)
|
|
529
|
+
// The bridge provides live metadata from Microsoft's IMetadataProvider API
|
|
530
|
+
// and cross-reference queries โ only available on Windows VMs with D365FO.
|
|
531
|
+
void initializeBridge(stubContext).then(s => (s.ok ? log.ok(s.summary) : log.warn(s.summary)));
|
|
532
|
+
// Step 4: load real database in the background
|
|
533
|
+
const dbLoadStart = Date.now();
|
|
534
|
+
initializeServices().then(({ symbolIndex, parser, workspaceScanner, hybridSearch }) => {
|
|
535
|
+
// Step 5: patch the context references used by tool handlers
|
|
536
|
+
stubContext.symbolIndex = symbolIndex;
|
|
537
|
+
stubContext.parser = parser;
|
|
538
|
+
stubContext.workspaceScanner = workspaceScanner;
|
|
539
|
+
stubContext.hybridSearch = hybridSearch;
|
|
540
|
+
serverState.symbolIndex = symbolIndex;
|
|
541
|
+
serverState.parser = parser;
|
|
542
|
+
serverState.statusMessage = 'Ready';
|
|
543
|
+
// Resolve dbReady AFTER context is patched โ tools can now run with real index.
|
|
544
|
+
resolveDbReady();
|
|
545
|
+
log.ok(`Database loaded in ${Date.now() - dbLoadStart} ms โ all tools fully operational`);
|
|
546
|
+
// The in-memory stub symbol index is also unreachable once swapped.
|
|
547
|
+
try {
|
|
548
|
+
stubIndex.close();
|
|
549
|
+
}
|
|
550
|
+
catch { /* ignore */ }
|
|
551
|
+
}).catch(err => {
|
|
552
|
+
rejectDbReady(err);
|
|
553
|
+
console.error(statusLine('err', 'Background initialization failed:'), err);
|
|
554
|
+
});
|
|
555
|
+
// Log tool count immediately (transport is already connected).
|
|
556
|
+
// TOOL_ANNOTATIONS is guaranteed complete by tests/utils/toolInventory.test.ts,
|
|
557
|
+
// so its size tracks the real tool count without a hardcoded literal.
|
|
558
|
+
const totalTools = Object.keys(TOOL_ANNOTATIONS).length;
|
|
559
|
+
const localToolCount = LOCAL_TOOLS.size;
|
|
560
|
+
const toolCount = SERVER_MODE === 'write-only' ? localToolCount :
|
|
561
|
+
SERVER_MODE === 'read-only' ? totalTools - localToolCount : totalTools;
|
|
562
|
+
const toolDesc = SERVER_MODE === 'write-only' ? `(${Array.from(LOCAL_TOOLS).join(', ')})` :
|
|
563
|
+
SERVER_MODE === 'read-only' ? '(all except local tools)' :
|
|
564
|
+
'(2 discovery + 1 labels + 3 object-info + 2 intelligent + 2 smart-gen + 1 file-ops + 1 pattern-analysis + 5 security-ext + 5 sdlc-build + 2 code-review + 2 code-quality)';
|
|
565
|
+
log.ok(`Registered ${toolCount} X++ MCP tools ${toolDesc}`);
|
|
566
|
+
serverState.isReady = true;
|
|
567
|
+
serverState.isHealthy = true;
|
|
568
|
+
serverState.statusMessage = 'Loading database...';
|
|
569
|
+
}
|
|
570
|
+
else {
|
|
571
|
+
// HTTP mode โ bind the port immediately so Azure App Service does not kill
|
|
572
|
+
// the process during the (potentially long) database initialisation phase.
|
|
573
|
+
// The health endpoint returns 503 while the server is starting and 200 once
|
|
574
|
+
// fully ready. MCP routes are registered dynamically after initializeServices().
|
|
575
|
+
// Branded banner first โ connection details are known immediately, before
|
|
576
|
+
// the (potentially long) database load. Symbol counts are intentionally NOT
|
|
577
|
+
// shown here; they appear once during the load (`โ Loaded โฆ symbols`).
|
|
578
|
+
const host = process.env.HOST || '0.0.0.0';
|
|
579
|
+
const W = 50;
|
|
580
|
+
console.log('');
|
|
581
|
+
for (const line of box([
|
|
582
|
+
spread(c.bold('D365 F&O MCP Server'), c.dim('v1.0.0'), W),
|
|
583
|
+
c.gray('X++ Code Intelligence'),
|
|
584
|
+
], W)) {
|
|
585
|
+
console.log(line);
|
|
586
|
+
}
|
|
587
|
+
console.log('');
|
|
588
|
+
console.log(kv('Mode', `HTTP ${c.dim(glyph.dot)} ${SERVER_MODE}`));
|
|
589
|
+
console.log(kv('Endpoint', c.cyan(`http://${host}:${PORT}/mcp`)));
|
|
590
|
+
console.log(kv('Health', c.cyan(`http://localhost:${PORT}/health`)));
|
|
591
|
+
console.log(kv('Runtime', `Node ${process.version} ${c.dim(glyph.dot)} pid ${process.pid}`));
|
|
592
|
+
console.log(kv('Database', c.dim(shortPath(DB_PATH))));
|
|
593
|
+
console.log('');
|
|
594
|
+
// Create Express app
|
|
595
|
+
const app = express();
|
|
596
|
+
// Trust proxy - required for Azure App Service (behind reverse proxy)
|
|
597
|
+
app.set('trust proxy', 1);
|
|
598
|
+
// Compress responses โ JSON search results can be 50โ200 KB;
|
|
599
|
+
// gzip typically gives 70โ80 % reduction and Azure egress billing benefits.
|
|
600
|
+
app.use(compression());
|
|
601
|
+
app.use(express.json());
|
|
602
|
+
// API key authentication โ enforced when API_KEY env var is set.
|
|
603
|
+
// Must be after express.json() but before route handlers.
|
|
604
|
+
// /health is excluded so Azure health probes still work unauthenticated.
|
|
605
|
+
app.use(apiKeyAuth);
|
|
606
|
+
// Health check endpoint โ dynamic: reflects serverState at request time
|
|
607
|
+
app.get('/health', (_req, res) => {
|
|
608
|
+
const ready = serverState.isReady;
|
|
609
|
+
return res.status(ready ? 200 : 503).json({
|
|
610
|
+
status: ready ? 'healthy' : 'starting',
|
|
611
|
+
ready,
|
|
612
|
+
service: 'd365fo-mcp-server',
|
|
613
|
+
version: '1.0.0',
|
|
614
|
+
message: serverState.statusMessage,
|
|
615
|
+
// Cached-only: a health probe must never trigger a 30-60 s COUNT scan.
|
|
616
|
+
symbols: serverState.symbolIndex?.getCachedSymbolCounts()?.total || 0,
|
|
617
|
+
});
|
|
618
|
+
});
|
|
619
|
+
// Early /mcp route โ returns 503 while services are loading so MCP clients
|
|
620
|
+
// (VS 2022, VS Code Copilot) get a proper JSON-RPC error instead of a 404
|
|
621
|
+
// during Azure cold start. Once initializeServices() finishes, the real
|
|
622
|
+
// transport route (registered later in the Express stack) handles requests.
|
|
623
|
+
// We call next() when ready so the real handler takes over.
|
|
624
|
+
app.post('/mcp', (_req, res, next) => {
|
|
625
|
+
if (serverState.isReady) {
|
|
626
|
+
// Services loaded โ let the real transport handler take over
|
|
627
|
+
next();
|
|
628
|
+
return;
|
|
629
|
+
}
|
|
630
|
+
res.status(503).json({
|
|
631
|
+
jsonrpc: '2.0',
|
|
632
|
+
error: { code: -32000, message: `Server is starting: ${serverState.statusMessage}` },
|
|
633
|
+
id: _req.body?.id ?? null,
|
|
634
|
+
});
|
|
635
|
+
});
|
|
636
|
+
// Bind port immediately โ Azure requires the port to be open within ~230 s
|
|
637
|
+
await new Promise(resolve => app.listen(PORT, host, () => resolve()));
|
|
638
|
+
// Initialise services in the background; register MCP routes once ready
|
|
639
|
+
initializeServices().then(async ({ mcpServer, symbolIndex, parser, workspaceScanner, hybridSearch, context }) => {
|
|
640
|
+
// Register MCP transport (Express supports dynamic route registration)
|
|
641
|
+
createStreamableHttpTransport(mcpServer, app, { symbolIndex, parser, workspaceScanner, hybridSearch });
|
|
642
|
+
serverState.isReady = true;
|
|
643
|
+
serverState.isHealthy = true;
|
|
644
|
+
serverState.statusMessage = 'Ready';
|
|
645
|
+
console.log('');
|
|
646
|
+
console.log(statusLine('ok', c.green(`Ready in ${process.uptime().toFixed(1)}s`)));
|
|
647
|
+
// C# bridge โ await its connection (bounded) so its status prints here, in
|
|
648
|
+
// order, instead of trailing after the tool list. A slow/hung bridge must
|
|
649
|
+
// never block startup, so cap the wait; it keeps connecting in the
|
|
650
|
+
// background afterwards and attaches to the context once ready.
|
|
651
|
+
if (context) {
|
|
652
|
+
const status = await Promise.race([
|
|
653
|
+
initializeBridge(context),
|
|
654
|
+
new Promise(r => setTimeout(() => r({ ok: true, summary: 'C# bridge still connecting in the background' + glyph.ellipsis }), 6000)),
|
|
655
|
+
]);
|
|
656
|
+
if (status.ok)
|
|
657
|
+
log.ok(status.summary);
|
|
658
|
+
else
|
|
659
|
+
log.warn(status.summary);
|
|
660
|
+
if (status.detail)
|
|
661
|
+
log.detail(status.detail);
|
|
662
|
+
}
|
|
663
|
+
console.log('');
|
|
664
|
+
const toolCatalog = [
|
|
665
|
+
{ icon: '๐', category: 'Search & Discovery', tools: [
|
|
666
|
+
{ name: 'search', desc: 'Search 584K+ symbols: single, batch (queries[]) or scope=extensions' },
|
|
667
|
+
{ name: 'batch_get_info', desc: 'Get detailed info for up to 10 objects in one parallel call' },
|
|
668
|
+
] },
|
|
669
|
+
{ icon: '๐ท๏ธ ', category: 'Label Management', tools: [
|
|
670
|
+
{ name: 'labels', desc: 'Unified label ops: action=search|info|create|rename (read/write)' },
|
|
671
|
+
] },
|
|
672
|
+
{ icon: '๐', category: 'Advanced Object Info', tools: [
|
|
673
|
+
{ name: 'get_object_info', desc: 'Read any object by objectType: class/table/form/query/view/enum/edt/report/data-entity/menu-item/service/map/config-key/security-policy/macro' },
|
|
674
|
+
{ name: 'get_method', desc: 'Method signature/source/both via include= (required before CoC extensions)' },
|
|
675
|
+
{ name: 'find_references', desc: 'Where-used analysis across the entire codebase' },
|
|
676
|
+
] },
|
|
677
|
+
{ icon: '๐ง ', category: 'Intelligent Code Generation', tools: [
|
|
678
|
+
{ name: 'get_knowledge', desc: 'kind=knowledge|error โ X++ rulebook/patterns or D365FO error diagnosis' },
|
|
679
|
+
{ name: 'analyze_code', desc: 'Learn from the codebase: mode=patterns|implementations|completeness|api-usage' },
|
|
680
|
+
] },
|
|
681
|
+
{ icon: '๐จ', category: 'Smart Object Generation', tools: [
|
|
682
|
+
{ name: 'generate_object', desc: 'mode=pattern (named X++ skeleton) | scaffold (whole table/form/report)' },
|
|
683
|
+
{ name: 'suggest_edt', desc: 'Suggest EDT for field name using fuzzy matching' },
|
|
684
|
+
] },
|
|
685
|
+
{ icon: '๐', category: 'File & Metadata Operations', tools: [
|
|
686
|
+
{ name: 'd365fo_file', desc: 'action=create|modify|generate โ write/edit AOT objects or emit XML (cloud)' },
|
|
687
|
+
] },
|
|
688
|
+
{ icon: '๐', category: 'Pattern Analysis', tools: [
|
|
689
|
+
{ name: 'object_patterns', desc: 'domain=table|form โ table field/index patterns, or form-pattern toolkit (analyze/spec/validate)' },
|
|
690
|
+
] },
|
|
691
|
+
{ icon: '๐', category: 'Security & Extensions', tools: [
|
|
692
|
+
{ name: 'security_info', desc: 'mode=artifact|coverage โ Privilege/Duty/Role chain, or who can access an object' },
|
|
693
|
+
{ name: 'extension_info', desc: 'mode=coc|events|table-merge|points|strategy โ CoC/event-handler/extension analysis + strategy advice' },
|
|
694
|
+
{ name: 'validate_object_naming', desc: 'Validate proposed extensions and object names against D365FO conventions' },
|
|
695
|
+
{ name: 'get_workspace_info', desc: 'Detected workspace paths, model name, project file, and server mode' },
|
|
696
|
+
{ name: 'verify_d365fo_project', desc: 'Verify objects exist on disk and are referenced in the .rnrproj project file' },
|
|
697
|
+
] },
|
|
698
|
+
{ icon: '๐๏ธ ', category: 'SDLC & Build Tools', tools: [
|
|
699
|
+
{ name: 'update_symbol_index', desc: 'Index a newly generated XML file immediately (no restart needed)' },
|
|
700
|
+
{ name: 'build_d365fo_project', desc: 'Run MSBuild compilation locally to capture errors' },
|
|
701
|
+
{ name: 'trigger_db_sync', desc: 'Run a database sync for the current model' },
|
|
702
|
+
{ name: 'run_bp_check', desc: 'Run Microsoft Best Practices (xppbp.exe) analysis' },
|
|
703
|
+
{ name: 'run_systest_class', desc: 'Execute unit tests using SysTestConsole.exe' },
|
|
704
|
+
] },
|
|
705
|
+
{ icon: '๐', category: 'Code Review & Source Control', tools: [
|
|
706
|
+
{ name: 'review_workspace_changes', desc: 'AI-based D365FO code review on uncommitted X++ changes (git diff)' },
|
|
707
|
+
{ name: 'undo_last_modification', desc: 'Safely revert last file change: checkout HEAD or delete untracked file' },
|
|
708
|
+
] },
|
|
709
|
+
{ icon: '๐งช', category: 'Code Quality & Grounding', tools: [
|
|
710
|
+
{ name: 'validate_code', desc: 'mode=syntax (offline BP validator, SEL/COC/BP/TTS/XML) | references (semantic symbol resolver vs index)' },
|
|
711
|
+
{ name: 'prepare', desc: 'Single-call context aggregator + grounding token: mode=change|create' },
|
|
712
|
+
] },
|
|
713
|
+
];
|
|
714
|
+
const filteredCatalog = toolCatalog
|
|
715
|
+
.map(cat => ({
|
|
716
|
+
...cat,
|
|
717
|
+
// Same predicate as the ListTools filter and runtime gate, so the
|
|
718
|
+
// startup banner matches what the server actually exposes.
|
|
719
|
+
tools: cat.tools.filter(t => isToolAllowedInMode(SERVER_MODE, t.name)),
|
|
720
|
+
}))
|
|
721
|
+
.filter(cat => cat.tools.length > 0);
|
|
722
|
+
const totalTools = filteredCatalog.reduce((sum, cat) => sum + cat.tools.length, 0);
|
|
723
|
+
// Align tool names into a column (cap so long names don't push descriptions off-screen).
|
|
724
|
+
const nameW = Math.min(26, Math.max(...filteredCatalog.flatMap(cat => cat.tools.map(t => t.name.length))) + 2);
|
|
725
|
+
console.log(sectionTitle(`Tools (${totalTools})`));
|
|
726
|
+
console.log('');
|
|
727
|
+
for (const cat of filteredCatalog) {
|
|
728
|
+
console.log(` ${cat.icon} ${c.bold(c.cyan(cat.category))} ${c.dim(`(${cat.tools.length})`)}`);
|
|
729
|
+
for (const t of cat.tools) {
|
|
730
|
+
console.log(` ${t.name.padEnd(nameW)}${c.dim(t.desc)}`);
|
|
731
|
+
}
|
|
732
|
+
console.log('');
|
|
733
|
+
}
|
|
734
|
+
// End-of-startup recap โ surfaces any warnings the long tool list scrolled
|
|
735
|
+
// past, so the operator sees them without scrolling back up.
|
|
736
|
+
if (startupWarnings.length > 0) {
|
|
737
|
+
console.log(statusLine('warn', c.yellow(`${startupWarnings.length} warning${startupWarnings.length > 1 ? 's' : ''} during startup:`)));
|
|
738
|
+
for (const w of startupWarnings)
|
|
739
|
+
log.detail(w);
|
|
740
|
+
console.log('');
|
|
741
|
+
}
|
|
742
|
+
}).catch((err) => {
|
|
743
|
+
console.error(statusLine('err', 'Initialisation failed:'), err);
|
|
744
|
+
serverState.isHealthy = false;
|
|
745
|
+
serverState.statusMessage = `Initialisation failed: ${err}`;
|
|
746
|
+
});
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
main().catch((error) => {
|
|
750
|
+
console.error(statusLine('err', 'Fatal error:'), error);
|
|
751
|
+
process.exit(1);
|
|
752
|
+
});
|
|
753
|
+
//# sourceMappingURL=index.js.map
|