d365fo-mcp 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +205 -0
- package/dist/bridge/bridgeAdapter.d.ts +319 -0
- package/dist/bridge/bridgeAdapter.d.ts.map +1 -0
- package/dist/bridge/bridgeAdapter.js +2003 -0
- package/dist/bridge/bridgeAdapter.js.map +1 -0
- package/dist/bridge/bridgeClient.d.ts +255 -0
- package/dist/bridge/bridgeClient.d.ts.map +1 -0
- package/dist/bridge/bridgeClient.js +741 -0
- package/dist/bridge/bridgeClient.js.map +1 -0
- package/dist/bridge/bridgeTypes.d.ts +561 -0
- package/dist/bridge/bridgeTypes.d.ts.map +1 -0
- package/dist/bridge/bridgeTypes.js +6 -0
- package/dist/bridge/bridgeTypes.js.map +1 -0
- package/dist/bridge/debouncedRefresh.d.ts +16 -0
- package/dist/bridge/debouncedRefresh.d.ts.map +1 -0
- package/dist/bridge/debouncedRefresh.js +77 -0
- package/dist/bridge/debouncedRefresh.js.map +1 -0
- package/dist/bridge/index.d.ts +21 -0
- package/dist/bridge/index.d.ts.map +1 -0
- package/dist/bridge/index.js +20 -0
- package/dist/bridge/index.js.map +1 -0
- package/dist/cli/commands/config.d.ts +8 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +77 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +2 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +177 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/indexCmd.d.ts +8 -0
- package/dist/cli/commands/indexCmd.d.ts.map +1 -0
- package/dist/cli/commands/indexCmd.js +78 -0
- package/dist/cli/commands/indexCmd.js.map +1 -0
- package/dist/cli/commands/instance.d.ts +4 -0
- package/dist/cli/commands/instance.d.ts.map +1 -0
- package/dist/cli/commands/instance.js +183 -0
- package/dist/cli/commands/instance.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +4 -0
- package/dist/cli/commands/setup.d.ts.map +1 -0
- package/dist/cli/commands/setup.js +246 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/commands/start.d.ts +2 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +49 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/update.d.ts +4 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +55 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/context.d.ts +26 -0
- package/dist/cli/context.d.ts.map +1 -0
- package/dist/cli/context.js +38 -0
- package/dist/cli/context.js.map +1 -0
- package/dist/cli/envFile.d.ts +23 -0
- package/dist/cli/envFile.d.ts.map +1 -0
- package/dist/cli/envFile.js +79 -0
- package/dist/cli/envFile.js.map +1 -0
- package/dist/cli/exec.d.ts +13 -0
- package/dist/cli/exec.d.ts.map +1 -0
- package/dist/cli/exec.js +47 -0
- package/dist/cli/exec.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +122 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/instances.d.ts +19 -0
- package/dist/cli/instances.d.ts.map +1 -0
- package/dist/cli/instances.js +60 -0
- package/dist/cli/instances.js.map +1 -0
- package/dist/cli/mcpJson.d.ts +15 -0
- package/dist/cli/mcpJson.d.ts.map +1 -0
- package/dist/cli/mcpJson.js +44 -0
- package/dist/cli/mcpJson.js.map +1 -0
- package/dist/cli/settingsPrompt.d.ts +20 -0
- package/dist/cli/settingsPrompt.d.ts.map +1 -0
- package/dist/cli/settingsPrompt.js +150 -0
- package/dist/cli/settingsPrompt.js.map +1 -0
- package/dist/cli/settingsStore.d.ts +47 -0
- package/dist/cli/settingsStore.d.ts.map +1 -0
- package/dist/cli/settingsStore.js +144 -0
- package/dist/cli/settingsStore.js.map +1 -0
- package/dist/cli/target.d.ts +23 -0
- package/dist/cli/target.d.ts.map +1 -0
- package/dist/cli/target.js +62 -0
- package/dist/cli/target.js.map +1 -0
- package/dist/cli/ui.d.ts +26 -0
- package/dist/cli/ui.d.ts.map +1 -0
- package/dist/cli/ui.js +48 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/cli/xppConfig.d.ts +35 -0
- package/dist/cli/xppConfig.d.ts.map +1 -0
- package/dist/cli/xppConfig.js +97 -0
- package/dist/cli/xppConfig.js.map +1 -0
- package/dist/config/configFile.d.ts +50 -0
- package/dist/config/configFile.d.ts.map +1 -0
- package/dist/config/configFile.js +152 -0
- package/dist/config/configFile.js.map +1 -0
- package/dist/config/settings.d.ts +58 -0
- package/dist/config/settings.d.ts.map +1 -0
- package/dist/config/settings.js +641 -0
- package/dist/config/settings.js.map +1 -0
- package/dist/database/download.d.ts +27 -0
- package/dist/database/download.d.ts.map +1 -0
- package/dist/database/download.js +241 -0
- package/dist/database/download.js.map +1 -0
- package/dist/eval/audit/knowledgeAudit.d.ts +66 -0
- package/dist/eval/audit/knowledgeAudit.d.ts.map +1 -0
- package/dist/eval/audit/knowledgeAudit.js +117 -0
- package/dist/eval/audit/knowledgeAudit.js.map +1 -0
- package/dist/eval/audit/knowledgeAuditCli.d.ts +17 -0
- package/dist/eval/audit/knowledgeAuditCli.d.ts.map +1 -0
- package/dist/eval/audit/knowledgeAuditCli.js +83 -0
- package/dist/eval/audit/knowledgeAuditCli.js.map +1 -0
- package/dist/eval/audit/knowledgeRefs.d.ts +37 -0
- package/dist/eval/audit/knowledgeRefs.d.ts.map +1 -0
- package/dist/eval/audit/knowledgeRefs.js +150 -0
- package/dist/eval/audit/knowledgeRefs.js.map +1 -0
- package/dist/eval/audit/symbolLookup.d.ts +23 -0
- package/dist/eval/audit/symbolLookup.d.ts.map +1 -0
- package/dist/eval/audit/symbolLookup.js +80 -0
- package/dist/eval/audit/symbolLookup.js.map +1 -0
- package/dist/eval/coverage/coverage.d.ts +65 -0
- package/dist/eval/coverage/coverage.d.ts.map +1 -0
- package/dist/eval/coverage/coverage.js +136 -0
- package/dist/eval/coverage/coverage.js.map +1 -0
- package/dist/eval/coverage/coverageCli.d.ts +13 -0
- package/dist/eval/coverage/coverageCli.d.ts.map +1 -0
- package/dist/eval/coverage/coverageCli.js +106 -0
- package/dist/eval/coverage/coverageCli.js.map +1 -0
- package/dist/eval/coverage/sources.d.ts +17 -0
- package/dist/eval/coverage/sources.d.ts.map +1 -0
- package/dist/eval/coverage/sources.js +40 -0
- package/dist/eval/coverage/sources.js.map +1 -0
- package/dist/eval/coverage/taxonomy.d.ts +59 -0
- package/dist/eval/coverage/taxonomy.d.ts.map +1 -0
- package/dist/eval/coverage/taxonomy.js +400 -0
- package/dist/eval/coverage/taxonomy.js.map +1 -0
- package/dist/eval/improver/caseMining.d.ts +55 -0
- package/dist/eval/improver/caseMining.d.ts.map +1 -0
- package/dist/eval/improver/caseMining.js +64 -0
- package/dist/eval/improver/caseMining.js.map +1 -0
- package/dist/eval/improver/caseMiningCli.d.ts +10 -0
- package/dist/eval/improver/caseMiningCli.d.ts.map +1 -0
- package/dist/eval/improver/caseMiningCli.js +50 -0
- package/dist/eval/improver/caseMiningCli.js.map +1 -0
- package/dist/eval/improver/cli.d.ts +11 -0
- package/dist/eval/improver/cli.d.ts.map +1 -0
- package/dist/eval/improver/cli.js +73 -0
- package/dist/eval/improver/cli.js.map +1 -0
- package/dist/eval/improver/cluster.d.ts +47 -0
- package/dist/eval/improver/cluster.d.ts.map +1 -0
- package/dist/eval/improver/cluster.js +0 -0
- package/dist/eval/improver/cluster.js.map +1 -0
- package/dist/eval/improver/corpusIO.d.ts +26 -0
- package/dist/eval/improver/corpusIO.d.ts.map +1 -0
- package/dist/eval/improver/corpusIO.js +50 -0
- package/dist/eval/improver/corpusIO.js.map +1 -0
- package/dist/eval/improver/fixBrief.d.ts +34 -0
- package/dist/eval/improver/fixBrief.d.ts.map +1 -0
- package/dist/eval/improver/fixBrief.js +69 -0
- package/dist/eval/improver/fixBrief.js.map +1 -0
- package/dist/eval/improver/fixBriefCli.d.ts +11 -0
- package/dist/eval/improver/fixBriefCli.d.ts.map +1 -0
- package/dist/eval/improver/fixBriefCli.js +46 -0
- package/dist/eval/improver/fixBriefCli.js.map +1 -0
- package/dist/eval/improver/flakeDetection.d.ts +50 -0
- package/dist/eval/improver/flakeDetection.d.ts.map +1 -0
- package/dist/eval/improver/flakeDetection.js +0 -0
- package/dist/eval/improver/flakeDetection.js.map +1 -0
- package/dist/eval/improver/flakeDetectionCli.d.ts +8 -0
- package/dist/eval/improver/flakeDetectionCli.d.ts.map +1 -0
- package/dist/eval/improver/flakeDetectionCli.js +27 -0
- package/dist/eval/improver/flakeDetectionCli.js.map +1 -0
- package/dist/eval/improver/heldout.d.ts +44 -0
- package/dist/eval/improver/heldout.d.ts.map +1 -0
- package/dist/eval/improver/heldout.js +52 -0
- package/dist/eval/improver/heldout.js.map +1 -0
- package/dist/eval/improver/knowledgeFeedback.d.ts +56 -0
- package/dist/eval/improver/knowledgeFeedback.d.ts.map +1 -0
- package/dist/eval/improver/knowledgeFeedback.js +88 -0
- package/dist/eval/improver/knowledgeFeedback.js.map +1 -0
- package/dist/eval/improver/knowledgeFeedbackCli.d.ts +8 -0
- package/dist/eval/improver/knowledgeFeedbackCli.d.ts.map +1 -0
- package/dist/eval/improver/knowledgeFeedbackCli.js +28 -0
- package/dist/eval/improver/knowledgeFeedbackCli.js.map +1 -0
- package/dist/eval/improver/report.d.ts +36 -0
- package/dist/eval/improver/report.d.ts.map +1 -0
- package/dist/eval/improver/report.js +61 -0
- package/dist/eval/improver/report.js.map +1 -0
- package/dist/eval/improver/reportCli.d.ts +7 -0
- package/dist/eval/improver/reportCli.d.ts.map +1 -0
- package/dist/eval/improver/reportCli.js +27 -0
- package/dist/eval/improver/reportCli.js.map +1 -0
- package/dist/eval/oracle/actualArtifactResolution.d.ts +49 -0
- package/dist/eval/oracle/actualArtifactResolution.d.ts.map +1 -0
- package/dist/eval/oracle/actualArtifactResolution.js +73 -0
- package/dist/eval/oracle/actualArtifactResolution.js.map +1 -0
- package/dist/eval/oracle/cli.d.ts +30 -0
- package/dist/eval/oracle/cli.d.ts.map +1 -0
- package/dist/eval/oracle/cli.js +179 -0
- package/dist/eval/oracle/cli.js.map +1 -0
- package/dist/eval/oracle/diff.d.ts +26 -0
- package/dist/eval/oracle/diff.d.ts.map +1 -0
- package/dist/eval/oracle/diff.js +51 -0
- package/dist/eval/oracle/diff.js.map +1 -0
- package/dist/eval/oracle/index.d.ts +81 -0
- package/dist/eval/oracle/index.d.ts.map +1 -0
- package/dist/eval/oracle/index.js +55 -0
- package/dist/eval/oracle/index.js.map +1 -0
- package/dist/eval/oracle/normalize.d.ts +85 -0
- package/dist/eval/oracle/normalize.d.ts.map +1 -0
- package/dist/eval/oracle/normalize.js +321 -0
- package/dist/eval/oracle/normalize.js.map +1 -0
- package/dist/eval/oracle/score.d.ts +26 -0
- package/dist/eval/oracle/score.d.ts.map +1 -0
- package/dist/eval/oracle/score.js +15 -0
- package/dist/eval/oracle/score.js.map +1 -0
- package/dist/eval/oracle/systest.d.ts +30 -0
- package/dist/eval/oracle/systest.d.ts.map +1 -0
- package/dist/eval/oracle/systest.js +98 -0
- package/dist/eval/oracle/systest.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +753 -0
- package/dist/index.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/customFilters.d.ts +10 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/customFilters.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/customFilters.js +38 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/customFilters.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/fields.d.ts +21 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/fields.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/fields.js +168 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/fields.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/panels.d.ts +9 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/panels.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/panels.js +47 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/panels.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/toolbar.d.ts +16 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/toolbar.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/toolbar.js +124 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/toolbar.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/workspaceSections.d.ts +12 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/workspaceSections.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/workspaceSections.js +36 -0
- package/dist/knowledge/formPatterns/catalog/subPatterns/workspaceSections.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/common.d.ts +11 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/common.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/common.js +37 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/common.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/detailsMaster.d.ts +8 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/detailsMaster.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/detailsMaster.js +86 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/detailsMaster.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/detailsTransaction.d.ts +7 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/detailsTransaction.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/detailsTransaction.js +69 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/detailsTransaction.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/dialog.d.ts +14 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/dialog.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/dialog.js +187 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/dialog.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/factBox.d.ts +10 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/factBox.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/factBox.js +54 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/factBox.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/listPage.d.ts +7 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/listPage.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/listPage.js +33 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/listPage.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/lookup.d.ts +10 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/lookup.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/lookup.js +95 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/lookup.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/simpleDetails.d.ts +16 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/simpleDetails.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/simpleDetails.js +158 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/simpleDetails.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/simpleList.d.ts +7 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/simpleList.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/simpleList.js +34 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/simpleList.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/simpleListDetails.d.ts +9 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/simpleListDetails.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/simpleListDetails.js +99 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/simpleListDetails.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/tableOfContents.d.ts +8 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/tableOfContents.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/tableOfContents.js +95 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/tableOfContents.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/task.d.ts +9 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/task.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/task.js +42 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/task.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/wizard.d.ts +7 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/wizard.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/wizard.js +42 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/wizard.js.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/workspace.d.ts +17 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/workspace.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/workspace.js +157 -0
- package/dist/knowledge/formPatterns/catalog/topLevel/workspace.js.map +1 -0
- package/dist/knowledge/formPatterns/crossCheck.d.ts +44 -0
- package/dist/knowledge/formPatterns/crossCheck.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/crossCheck.js +109 -0
- package/dist/knowledge/formPatterns/crossCheck.js.map +1 -0
- package/dist/knowledge/formPatterns/index.d.ts +30 -0
- package/dist/knowledge/formPatterns/index.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/index.js +158 -0
- package/dist/knowledge/formPatterns/index.js.map +1 -0
- package/dist/knowledge/formPatterns/methodStubs.d.ts +45 -0
- package/dist/knowledge/formPatterns/methodStubs.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/methodStubs.js +257 -0
- package/dist/knowledge/formPatterns/methodStubs.js.map +1 -0
- package/dist/knowledge/formPatterns/types.d.ts +115 -0
- package/dist/knowledge/formPatterns/types.d.ts.map +1 -0
- package/dist/knowledge/formPatterns/types.js +44 -0
- package/dist/knowledge/formPatterns/types.js.map +1 -0
- package/dist/metadata/enhancedParser.d.ts +91 -0
- package/dist/metadata/enhancedParser.d.ts.map +1 -0
- package/dist/metadata/enhancedParser.js +379 -0
- package/dist/metadata/enhancedParser.js.map +1 -0
- package/dist/metadata/formPatternMiner.d.ts +78 -0
- package/dist/metadata/formPatternMiner.d.ts.map +1 -0
- package/dist/metadata/formPatternMiner.js +220 -0
- package/dist/metadata/formPatternMiner.js.map +1 -0
- package/dist/metadata/labelParser.d.ts +71 -0
- package/dist/metadata/labelParser.d.ts.map +1 -0
- package/dist/metadata/labelParser.js +258 -0
- package/dist/metadata/labelParser.js.map +1 -0
- package/dist/metadata/symbolCountsWorker.d.ts +16 -0
- package/dist/metadata/symbolCountsWorker.d.ts.map +1 -0
- package/dist/metadata/symbolCountsWorker.js +42 -0
- package/dist/metadata/symbolCountsWorker.js.map +1 -0
- package/dist/metadata/symbolIndex.d.ts +474 -0
- package/dist/metadata/symbolIndex.d.ts.map +1 -0
- package/dist/metadata/symbolIndex.js +3152 -0
- package/dist/metadata/symbolIndex.js.map +1 -0
- package/dist/metadata/types.d.ts +267 -0
- package/dist/metadata/types.d.ts.map +1 -0
- package/dist/metadata/types.js +5 -0
- package/dist/metadata/types.js.map +1 -0
- package/dist/metadata/xmlParser.d.ts +232 -0
- package/dist/metadata/xmlParser.d.ts.map +1 -0
- package/dist/metadata/xmlParser.js +1021 -0
- package/dist/metadata/xmlParser.js.map +1 -0
- package/dist/metadata/xppDeclaration.d.ts +116 -0
- package/dist/metadata/xppDeclaration.d.ts.map +1 -0
- package/dist/metadata/xppDeclaration.js +350 -0
- package/dist/metadata/xppDeclaration.js.map +1 -0
- package/dist/middleware/apiKeyAuth.d.ts +7 -0
- package/dist/middleware/apiKeyAuth.d.ts.map +1 -0
- package/dist/middleware/apiKeyAuth.js +70 -0
- package/dist/middleware/apiKeyAuth.js.map +1 -0
- package/dist/middleware/rateLimiter.d.ts +7 -0
- package/dist/middleware/rateLimiter.d.ts.map +1 -0
- package/dist/middleware/rateLimiter.js +78 -0
- package/dist/middleware/rateLimiter.js.map +1 -0
- package/dist/prompts/codeReview.d.ts +8 -0
- package/dist/prompts/codeReview.d.ts.map +1 -0
- package/dist/prompts/codeReview.js +619 -0
- package/dist/prompts/codeReview.js.map +1 -0
- package/dist/prompts/index.d.ts +6 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +6 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/systemInstructions.d.ts +33 -0
- package/dist/prompts/systemInstructions.d.ts.map +1 -0
- package/dist/prompts/systemInstructions.js +154 -0
- package/dist/prompts/systemInstructions.js.map +1 -0
- package/dist/resources/classResource.d.ts +17 -0
- package/dist/resources/classResource.d.ts.map +1 -0
- package/dist/resources/classResource.js +33 -0
- package/dist/resources/classResource.js.map +1 -0
- package/dist/resources/index.d.ts +20 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +154 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/server/mcpServer.d.ts +11 -0
- package/dist/server/mcpServer.d.ts.map +1 -0
- package/dist/server/mcpServer.js +185 -0
- package/dist/server/mcpServer.js.map +1 -0
- package/dist/server/serverMode.d.ts +53 -0
- package/dist/server/serverMode.d.ts.map +1 -0
- package/dist/server/serverMode.js +72 -0
- package/dist/server/serverMode.js.map +1 -0
- package/dist/server/toolAnnotations.d.ts +28 -0
- package/dist/server/toolAnnotations.d.ts.map +1 -0
- package/dist/server/toolAnnotations.js +70 -0
- package/dist/server/toolAnnotations.js.map +1 -0
- package/dist/server/toolSchemas/analyzeCode.d.ts +71 -0
- package/dist/server/toolSchemas/analyzeCode.d.ts.map +1 -0
- package/dist/server/toolSchemas/analyzeCode.js +50 -0
- package/dist/server/toolSchemas/analyzeCode.js.map +1 -0
- package/dist/server/toolSchemas/batchGetInfo.d.ts +32 -0
- package/dist/server/toolSchemas/batchGetInfo.d.ts.map +1 -0
- package/dist/server/toolSchemas/batchGetInfo.js +35 -0
- package/dist/server/toolSchemas/batchGetInfo.js.map +1 -0
- package/dist/server/toolSchemas/buildD365foProject.d.ts +44 -0
- package/dist/server/toolSchemas/buildD365foProject.d.ts.map +1 -0
- package/dist/server/toolSchemas/buildD365foProject.js +47 -0
- package/dist/server/toolSchemas/buildD365foProject.js.map +1 -0
- package/dist/server/toolSchemas/d365foFile.d.ts +99 -0
- package/dist/server/toolSchemas/d365foFile.d.ts.map +1 -0
- package/dist/server/toolSchemas/d365foFile.js +163 -0
- package/dist/server/toolSchemas/d365foFile.js.map +1 -0
- package/dist/server/toolSchemas/extensionInfo.d.ts +65 -0
- package/dist/server/toolSchemas/extensionInfo.d.ts.map +1 -0
- package/dist/server/toolSchemas/extensionInfo.js +73 -0
- package/dist/server/toolSchemas/extensionInfo.js.map +1 -0
- package/dist/server/toolSchemas/findReferences.d.ts +35 -0
- package/dist/server/toolSchemas/findReferences.d.ts.map +1 -0
- package/dist/server/toolSchemas/findReferences.js +35 -0
- package/dist/server/toolSchemas/findReferences.js.map +1 -0
- package/dist/server/toolSchemas/generateObject.d.ts +246 -0
- package/dist/server/toolSchemas/generateObject.d.ts.map +1 -0
- package/dist/server/toolSchemas/generateObject.js +158 -0
- package/dist/server/toolSchemas/generateObject.js.map +1 -0
- package/dist/server/toolSchemas/getKnowledge.d.ts +39 -0
- package/dist/server/toolSchemas/getKnowledge.d.ts.map +1 -0
- package/dist/server/toolSchemas/getKnowledge.js +46 -0
- package/dist/server/toolSchemas/getKnowledge.js.map +1 -0
- package/dist/server/toolSchemas/getMethod.d.ts +30 -0
- package/dist/server/toolSchemas/getMethod.d.ts.map +1 -0
- package/dist/server/toolSchemas/getMethod.js +34 -0
- package/dist/server/toolSchemas/getMethod.js.map +1 -0
- package/dist/server/toolSchemas/getObjectInfo.d.ts +24 -0
- package/dist/server/toolSchemas/getObjectInfo.d.ts.map +1 -0
- package/dist/server/toolSchemas/getObjectInfo.js +30 -0
- package/dist/server/toolSchemas/getObjectInfo.js.map +1 -0
- package/dist/server/toolSchemas/getWorkspaceInfo.d.ts +29 -0
- package/dist/server/toolSchemas/getWorkspaceInfo.d.ts.map +1 -0
- package/dist/server/toolSchemas/getWorkspaceInfo.js +29 -0
- package/dist/server/toolSchemas/getWorkspaceInfo.js.map +1 -0
- package/dist/server/toolSchemas/index.d.ts +1142 -0
- package/dist/server/toolSchemas/index.d.ts.map +1 -0
- package/dist/server/toolSchemas/index.js +60 -0
- package/dist/server/toolSchemas/index.js.map +1 -0
- package/dist/server/toolSchemas/labels.d.ts +172 -0
- package/dist/server/toolSchemas/labels.d.ts.map +1 -0
- package/dist/server/toolSchemas/labels.js +159 -0
- package/dist/server/toolSchemas/labels.js.map +1 -0
- package/dist/server/toolSchemas/objectPatterns.d.ts +93 -0
- package/dist/server/toolSchemas/objectPatterns.d.ts.map +1 -0
- package/dist/server/toolSchemas/objectPatterns.js +104 -0
- package/dist/server/toolSchemas/objectPatterns.js.map +1 -0
- package/dist/server/toolSchemas/prepare.d.ts +49 -0
- package/dist/server/toolSchemas/prepare.d.ts.map +1 -0
- package/dist/server/toolSchemas/prepare.js +57 -0
- package/dist/server/toolSchemas/prepare.js.map +1 -0
- package/dist/server/toolSchemas/reviewWorkspaceChanges.d.ts +20 -0
- package/dist/server/toolSchemas/reviewWorkspaceChanges.d.ts.map +1 -0
- package/dist/server/toolSchemas/reviewWorkspaceChanges.js +19 -0
- package/dist/server/toolSchemas/reviewWorkspaceChanges.js.map +1 -0
- package/dist/server/toolSchemas/runBpCheck.d.ts +36 -0
- package/dist/server/toolSchemas/runBpCheck.d.ts.map +1 -0
- package/dist/server/toolSchemas/runBpCheck.js +21 -0
- package/dist/server/toolSchemas/runBpCheck.js.map +1 -0
- package/dist/server/toolSchemas/runSystestClass.d.ts +32 -0
- package/dist/server/toolSchemas/runSystestClass.d.ts.map +1 -0
- package/dist/server/toolSchemas/runSystestClass.js +20 -0
- package/dist/server/toolSchemas/runSystestClass.js.map +1 -0
- package/dist/server/toolSchemas/search.d.ts +109 -0
- package/dist/server/toolSchemas/search.d.ts.map +1 -0
- package/dist/server/toolSchemas/search.js +123 -0
- package/dist/server/toolSchemas/search.js.map +1 -0
- package/dist/server/toolSchemas/securityInfo.d.ts +45 -0
- package/dist/server/toolSchemas/securityInfo.d.ts.map +1 -0
- package/dist/server/toolSchemas/securityInfo.js +39 -0
- package/dist/server/toolSchemas/securityInfo.js.map +1 -0
- package/dist/server/toolSchemas/suggestEdt.d.ts +29 -0
- package/dist/server/toolSchemas/suggestEdt.d.ts.map +1 -0
- package/dist/server/toolSchemas/suggestEdt.js +29 -0
- package/dist/server/toolSchemas/suggestEdt.js.map +1 -0
- package/dist/server/toolSchemas/triggerDbSync.d.ts +47 -0
- package/dist/server/toolSchemas/triggerDbSync.d.ts.map +1 -0
- package/dist/server/toolSchemas/triggerDbSync.js +31 -0
- package/dist/server/toolSchemas/triggerDbSync.js.map +1 -0
- package/dist/server/toolSchemas/undoLastModification.d.ts +20 -0
- package/dist/server/toolSchemas/undoLastModification.d.ts.map +1 -0
- package/dist/server/toolSchemas/undoLastModification.js +17 -0
- package/dist/server/toolSchemas/undoLastModification.js.map +1 -0
- package/dist/server/toolSchemas/updateSymbolIndex.d.ts +19 -0
- package/dist/server/toolSchemas/updateSymbolIndex.d.ts.map +1 -0
- package/dist/server/toolSchemas/updateSymbolIndex.js +18 -0
- package/dist/server/toolSchemas/updateSymbolIndex.js.map +1 -0
- package/dist/server/toolSchemas/validateCode.d.ts +35 -0
- package/dist/server/toolSchemas/validateCode.d.ts.map +1 -0
- package/dist/server/toolSchemas/validateCode.js +38 -0
- package/dist/server/toolSchemas/validateCode.js.map +1 -0
- package/dist/server/toolSchemas/validateObjectNaming.d.ts +33 -0
- package/dist/server/toolSchemas/validateObjectNaming.d.ts.map +1 -0
- package/dist/server/toolSchemas/validateObjectNaming.js +32 -0
- package/dist/server/toolSchemas/validateObjectNaming.js.map +1 -0
- package/dist/server/toolSchemas/verifyD365foProject.d.ts +50 -0
- package/dist/server/toolSchemas/verifyD365foProject.d.ts.map +1 -0
- package/dist/server/toolSchemas/verifyD365foProject.js +46 -0
- package/dist/server/toolSchemas/verifyD365foProject.js.map +1 -0
- package/dist/server/transport.d.ts +30 -0
- package/dist/server/transport.d.ts.map +1 -0
- package/dist/server/transport.js +391 -0
- package/dist/server/transport.js.map +1 -0
- package/dist/tools/analyzeCode.d.ts +17 -0
- package/dist/tools/analyzeCode.d.ts.map +1 -0
- package/dist/tools/analyzeCode.js +63 -0
- package/dist/tools/analyzeCode.js.map +1 -0
- package/dist/tools/analyzeCompleteness.d.ts +20 -0
- package/dist/tools/analyzeCompleteness.d.ts.map +1 -0
- package/dist/tools/analyzeCompleteness.js +103 -0
- package/dist/tools/analyzeCompleteness.js.map +1 -0
- package/dist/tools/analyzeExtensionPoints.d.ts +21 -0
- package/dist/tools/analyzeExtensionPoints.d.ts.map +1 -0
- package/dist/tools/analyzeExtensionPoints.js +343 -0
- package/dist/tools/analyzeExtensionPoints.js.map +1 -0
- package/dist/tools/analyzePatterns.d.ts +20 -0
- package/dist/tools/analyzePatterns.d.ts.map +1 -0
- package/dist/tools/analyzePatterns.js +71 -0
- package/dist/tools/analyzePatterns.js.map +1 -0
- package/dist/tools/apiUsagePatterns.d.ts +20 -0
- package/dist/tools/apiUsagePatterns.d.ts.map +1 -0
- package/dist/tools/apiUsagePatterns.js +136 -0
- package/dist/tools/apiUsagePatterns.js.map +1 -0
- package/dist/tools/batchGetInfo.d.ts +50 -0
- package/dist/tools/batchGetInfo.d.ts.map +1 -0
- package/dist/tools/batchGetInfo.js +52 -0
- package/dist/tools/batchGetInfo.js.map +1 -0
- package/dist/tools/batchSearch.d.ts +64 -0
- package/dist/tools/batchSearch.d.ts.map +1 -0
- package/dist/tools/batchSearch.js +265 -0
- package/dist/tools/batchSearch.js.map +1 -0
- package/dist/tools/buildProject.d.ts +28 -0
- package/dist/tools/buildProject.d.ts.map +1 -0
- package/dist/tools/buildProject.js +929 -0
- package/dist/tools/buildProject.js.map +1 -0
- package/dist/tools/classInfo.d.ts +8 -0
- package/dist/tools/classInfo.d.ts.map +1 -0
- package/dist/tools/classInfo.js +235 -0
- package/dist/tools/classInfo.js.map +1 -0
- package/dist/tools/codeGen.d.ts +19 -0
- package/dist/tools/codeGen.d.ts.map +1 -0
- package/dist/tools/codeGen.js +1956 -0
- package/dist/tools/codeGen.js.map +1 -0
- package/dist/tools/completion.d.ts +8 -0
- package/dist/tools/completion.d.ts.map +1 -0
- package/dist/tools/completion.js +272 -0
- package/dist/tools/completion.js.map +1 -0
- package/dist/tools/configKeyInfo.d.ts +22 -0
- package/dist/tools/configKeyInfo.d.ts.map +1 -0
- package/dist/tools/configKeyInfo.js +74 -0
- package/dist/tools/configKeyInfo.js.map +1 -0
- package/dist/tools/createD365File.d.ts +479 -0
- package/dist/tools/createD365File.d.ts.map +1 -0
- package/dist/tools/createD365File.js +4185 -0
- package/dist/tools/createD365File.js.map +1 -0
- package/dist/tools/createLabel.d.ts +51 -0
- package/dist/tools/createLabel.d.ts.map +1 -0
- package/dist/tools/createLabel.js +761 -0
- package/dist/tools/createLabel.js.map +1 -0
- package/dist/tools/d365foErrorHelp.d.ts +29 -0
- package/dist/tools/d365foErrorHelp.d.ts.map +1 -0
- package/dist/tools/d365foErrorHelp.js +389 -0
- package/dist/tools/d365foErrorHelp.js.map +1 -0
- package/dist/tools/d365foFile.d.ts +20 -0
- package/dist/tools/d365foFile.d.ts.map +1 -0
- package/dist/tools/d365foFile.js +58 -0
- package/dist/tools/d365foFile.js.map +1 -0
- package/dist/tools/d365foFileOpSpecs.d.ts +41 -0
- package/dist/tools/d365foFileOpSpecs.d.ts.map +1 -0
- package/dist/tools/d365foFileOpSpecs.js +336 -0
- package/dist/tools/d365foFileOpSpecs.js.map +1 -0
- package/dist/tools/dataEntityInfo.d.ts +23 -0
- package/dist/tools/dataEntityInfo.d.ts.map +1 -0
- package/dist/tools/dataEntityInfo.js +45 -0
- package/dist/tools/dataEntityInfo.js.map +1 -0
- package/dist/tools/dataEntityXml.d.ts +31 -0
- package/dist/tools/dataEntityXml.d.ts.map +1 -0
- package/dist/tools/dataEntityXml.js +131 -0
- package/dist/tools/dataEntityXml.js.map +1 -0
- package/dist/tools/dbSync.d.ts +8 -0
- package/dist/tools/dbSync.d.ts.map +1 -0
- package/dist/tools/dbSync.js +285 -0
- package/dist/tools/dbSync.js.map +1 -0
- package/dist/tools/edtInfo.d.ts +23 -0
- package/dist/tools/edtInfo.d.ts.map +1 -0
- package/dist/tools/edtInfo.js +122 -0
- package/dist/tools/edtInfo.js.map +1 -0
- package/dist/tools/enumInfo.d.ts +17 -0
- package/dist/tools/enumInfo.d.ts.map +1 -0
- package/dist/tools/enumInfo.js +44 -0
- package/dist/tools/enumInfo.js.map +1 -0
- package/dist/tools/extensionInfo.d.ts +26 -0
- package/dist/tools/extensionInfo.d.ts.map +1 -0
- package/dist/tools/extensionInfo.js +73 -0
- package/dist/tools/extensionInfo.js.map +1 -0
- package/dist/tools/extensionSearch.d.ts +20 -0
- package/dist/tools/extensionSearch.d.ts.map +1 -0
- package/dist/tools/extensionSearch.js +72 -0
- package/dist/tools/extensionSearch.js.map +1 -0
- package/dist/tools/extensionStrategyAdvisor.d.ts +15 -0
- package/dist/tools/extensionStrategyAdvisor.d.ts.map +1 -0
- package/dist/tools/extensionStrategyAdvisor.js +519 -0
- package/dist/tools/extensionStrategyAdvisor.js.map +1 -0
- package/dist/tools/findCocExtensions.d.ts +20 -0
- package/dist/tools/findCocExtensions.d.ts.map +1 -0
- package/dist/tools/findCocExtensions.js +285 -0
- package/dist/tools/findCocExtensions.js.map +1 -0
- package/dist/tools/findEventHandlers.d.ts +21 -0
- package/dist/tools/findEventHandlers.d.ts.map +1 -0
- package/dist/tools/findEventHandlers.js +196 -0
- package/dist/tools/findEventHandlers.js.map +1 -0
- package/dist/tools/findReferences.d.ts +30 -0
- package/dist/tools/findReferences.d.ts.map +1 -0
- package/dist/tools/findReferences.js +551 -0
- package/dist/tools/findReferences.js.map +1 -0
- package/dist/tools/formInfo.d.ts +13 -0
- package/dist/tools/formInfo.d.ts.map +1 -0
- package/dist/tools/formInfo.js +407 -0
- package/dist/tools/formInfo.js.map +1 -0
- package/dist/tools/formPattern.d.ts +19 -0
- package/dist/tools/formPattern.d.ts.map +1 -0
- package/dist/tools/formPattern.js +52 -0
- package/dist/tools/formPattern.js.map +1 -0
- package/dist/tools/generateD365Xml.d.ts +12 -0
- package/dist/tools/generateD365Xml.d.ts.map +1 -0
- package/dist/tools/generateD365Xml.js +1454 -0
- package/dist/tools/generateD365Xml.js.map +1 -0
- package/dist/tools/generateFindMethods.d.ts +69 -0
- package/dist/tools/generateFindMethods.d.ts.map +1 -0
- package/dist/tools/generateFindMethods.js +207 -0
- package/dist/tools/generateFindMethods.js.map +1 -0
- package/dist/tools/generateMetadata.d.ts +37 -0
- package/dist/tools/generateMetadata.d.ts.map +1 -0
- package/dist/tools/generateMetadata.js +213 -0
- package/dist/tools/generateMetadata.js.map +1 -0
- package/dist/tools/generateObject.d.ts +34 -0
- package/dist/tools/generateObject.d.ts.map +1 -0
- package/dist/tools/generateObject.js +47 -0
- package/dist/tools/generateObject.js.map +1 -0
- package/dist/tools/generateRelationXpp.d.ts +45 -0
- package/dist/tools/generateRelationXpp.d.ts.map +1 -0
- package/dist/tools/generateRelationXpp.js +129 -0
- package/dist/tools/generateRelationXpp.js.map +1 -0
- package/dist/tools/generateSmart.d.ts +32 -0
- package/dist/tools/generateSmart.d.ts.map +1 -0
- package/dist/tools/generateSmart.js +52 -0
- package/dist/tools/generateSmart.js.map +1 -0
- package/dist/tools/generateSmartForm.d.ts +82 -0
- package/dist/tools/generateSmartForm.d.ts.map +1 -0
- package/dist/tools/generateSmartForm.js +996 -0
- package/dist/tools/generateSmartForm.js.map +1 -0
- package/dist/tools/generateSmartReport.d.ts +90 -0
- package/dist/tools/generateSmartReport.d.ts.map +1 -0
- package/dist/tools/generateSmartReport.js +1254 -0
- package/dist/tools/generateSmartReport.js.map +1 -0
- package/dist/tools/generateSmartTable.d.ts +138 -0
- package/dist/tools/generateSmartTable.d.ts.map +1 -0
- package/dist/tools/generateSmartTable.js +1305 -0
- package/dist/tools/generateSmartTable.js.map +1 -0
- package/dist/tools/generateTableFields.d.ts +48 -0
- package/dist/tools/generateTableFields.d.ts.map +1 -0
- package/dist/tools/generateTableFields.js +186 -0
- package/dist/tools/generateTableFields.js.map +1 -0
- package/dist/tools/generateTableRelation.d.ts +35 -0
- package/dist/tools/generateTableRelation.d.ts.map +1 -0
- package/dist/tools/generateTableRelation.js +161 -0
- package/dist/tools/generateTableRelation.js.map +1 -0
- package/dist/tools/getFormPatternSpec.d.ts +13 -0
- package/dist/tools/getFormPatternSpec.d.ts.map +1 -0
- package/dist/tools/getFormPatternSpec.js +290 -0
- package/dist/tools/getFormPatternSpec.js.map +1 -0
- package/dist/tools/getFormPatterns.d.ts +68 -0
- package/dist/tools/getFormPatterns.d.ts.map +1 -0
- package/dist/tools/getFormPatterns.js +471 -0
- package/dist/tools/getFormPatterns.js.map +1 -0
- package/dist/tools/getKnowledge.d.ts +27 -0
- package/dist/tools/getKnowledge.d.ts.map +1 -0
- package/dist/tools/getKnowledge.js +50 -0
- package/dist/tools/getKnowledge.js.map +1 -0
- package/dist/tools/getLabelInfo.d.ts +21 -0
- package/dist/tools/getLabelInfo.d.ts.map +1 -0
- package/dist/tools/getLabelInfo.js +138 -0
- package/dist/tools/getLabelInfo.js.map +1 -0
- package/dist/tools/getMethod.d.ts +19 -0
- package/dist/tools/getMethod.d.ts.map +1 -0
- package/dist/tools/getMethod.js +77 -0
- package/dist/tools/getMethod.js.map +1 -0
- package/dist/tools/getMethodSource.d.ts +17 -0
- package/dist/tools/getMethodSource.d.ts.map +1 -0
- package/dist/tools/getMethodSource.js +161 -0
- package/dist/tools/getMethodSource.js.map +1 -0
- package/dist/tools/getObjectInfo.d.ts +17 -0
- package/dist/tools/getObjectInfo.d.ts.map +1 -0
- package/dist/tools/getObjectInfo.js +88 -0
- package/dist/tools/getObjectInfo.js.map +1 -0
- package/dist/tools/getTablePatterns.d.ts +45 -0
- package/dist/tools/getTablePatterns.d.ts.map +1 -0
- package/dist/tools/getTablePatterns.js +235 -0
- package/dist/tools/getTablePatterns.js.map +1 -0
- package/dist/tools/index.d.ts +11 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +11 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/labels.d.ts +25 -0
- package/dist/tools/labels.d.ts.map +1 -0
- package/dist/tools/labels.js +111 -0
- package/dist/tools/labels.js.map +1 -0
- package/dist/tools/macroInfo.d.ts +23 -0
- package/dist/tools/macroInfo.d.ts.map +1 -0
- package/dist/tools/macroInfo.js +62 -0
- package/dist/tools/macroInfo.js.map +1 -0
- package/dist/tools/mapInfo.d.ts +21 -0
- package/dist/tools/mapInfo.d.ts.map +1 -0
- package/dist/tools/mapInfo.js +54 -0
- package/dist/tools/mapInfo.js.map +1 -0
- package/dist/tools/mapXml.d.ts +26 -0
- package/dist/tools/mapXml.d.ts.map +1 -0
- package/dist/tools/mapXml.js +88 -0
- package/dist/tools/mapXml.js.map +1 -0
- package/dist/tools/menuItemInfo.d.ts +20 -0
- package/dist/tools/menuItemInfo.d.ts.map +1 -0
- package/dist/tools/menuItemInfo.js +185 -0
- package/dist/tools/menuItemInfo.js.map +1 -0
- package/dist/tools/methodSignature.d.ts +33 -0
- package/dist/tools/methodSignature.d.ts.map +1 -0
- package/dist/tools/methodSignature.js +348 -0
- package/dist/tools/methodSignature.js.map +1 -0
- package/dist/tools/modifyD365File.d.ts +130 -0
- package/dist/tools/modifyD365File.d.ts.map +1 -0
- package/dist/tools/modifyD365File.js +2179 -0
- package/dist/tools/modifyD365File.js.map +1 -0
- package/dist/tools/objectInfoRegistry.d.ts +36 -0
- package/dist/tools/objectInfoRegistry.d.ts.map +1 -0
- package/dist/tools/objectInfoRegistry.js +98 -0
- package/dist/tools/objectInfoRegistry.js.map +1 -0
- package/dist/tools/objectPatterns.d.ts +16 -0
- package/dist/tools/objectPatterns.d.ts.map +1 -0
- package/dist/tools/objectPatterns.js +84 -0
- package/dist/tools/objectPatterns.js.map +1 -0
- package/dist/tools/prepare.d.ts +18 -0
- package/dist/tools/prepare.d.ts.map +1 -0
- package/dist/tools/prepare.js +47 -0
- package/dist/tools/prepare.js.map +1 -0
- package/dist/tools/prepareChange.d.ts +43 -0
- package/dist/tools/prepareChange.d.ts.map +1 -0
- package/dist/tools/prepareChange.js +327 -0
- package/dist/tools/prepareChange.js.map +1 -0
- package/dist/tools/prepareCreate.d.ts +45 -0
- package/dist/tools/prepareCreate.d.ts.map +1 -0
- package/dist/tools/prepareCreate.js +263 -0
- package/dist/tools/prepareCreate.js.map +1 -0
- package/dist/tools/queryInfo.d.ts +17 -0
- package/dist/tools/queryInfo.d.ts.map +1 -0
- package/dist/tools/queryInfo.js +46 -0
- package/dist/tools/queryInfo.js.map +1 -0
- package/dist/tools/queryViewXml.d.ts +36 -0
- package/dist/tools/queryViewXml.d.ts.map +1 -0
- package/dist/tools/queryViewXml.js +129 -0
- package/dist/tools/queryViewXml.js.map +1 -0
- package/dist/tools/renameLabel.d.ts +29 -0
- package/dist/tools/renameLabel.d.ts.map +1 -0
- package/dist/tools/renameLabel.js +377 -0
- package/dist/tools/renameLabel.js.map +1 -0
- package/dist/tools/repairFormControls.d.ts +21 -0
- package/dist/tools/repairFormControls.d.ts.map +1 -0
- package/dist/tools/repairFormControls.js +151 -0
- package/dist/tools/repairFormControls.js.map +1 -0
- package/dist/tools/reportInfo.d.ts +14 -0
- package/dist/tools/reportInfo.d.ts.map +1 -0
- package/dist/tools/reportInfo.js +302 -0
- package/dist/tools/reportInfo.js.map +1 -0
- package/dist/tools/resolveReferences.d.ts +89 -0
- package/dist/tools/resolveReferences.d.ts.map +1 -0
- package/dist/tools/resolveReferences.js +791 -0
- package/dist/tools/resolveReferences.js.map +1 -0
- package/dist/tools/reviewWorkspaceChanges.d.ts +14 -0
- package/dist/tools/reviewWorkspaceChanges.d.ts.map +1 -0
- package/dist/tools/reviewWorkspaceChanges.js +73 -0
- package/dist/tools/reviewWorkspaceChanges.js.map +1 -0
- package/dist/tools/runBpCheck.d.ts +14 -0
- package/dist/tools/runBpCheck.d.ts.map +1 -0
- package/dist/tools/runBpCheck.js +241 -0
- package/dist/tools/runBpCheck.js.map +1 -0
- package/dist/tools/search.d.ts +20 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +246 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/searchLabels.d.ts +26 -0
- package/dist/tools/searchLabels.d.ts.map +1 -0
- package/dist/tools/searchLabels.js +91 -0
- package/dist/tools/searchLabels.js.map +1 -0
- package/dist/tools/searchUnified.d.ts +28 -0
- package/dist/tools/searchUnified.d.ts.map +1 -0
- package/dist/tools/searchUnified.js +48 -0
- package/dist/tools/searchUnified.js.map +1 -0
- package/dist/tools/securityArtifactInfo.d.ts +14 -0
- package/dist/tools/securityArtifactInfo.d.ts.map +1 -0
- package/dist/tools/securityArtifactInfo.js +192 -0
- package/dist/tools/securityArtifactInfo.js.map +1 -0
- package/dist/tools/securityCoverageInfo.d.ts +21 -0
- package/dist/tools/securityCoverageInfo.d.ts.map +1 -0
- package/dist/tools/securityCoverageInfo.js +248 -0
- package/dist/tools/securityCoverageInfo.js.map +1 -0
- package/dist/tools/securityInfo.d.ts +22 -0
- package/dist/tools/securityInfo.d.ts.map +1 -0
- package/dist/tools/securityInfo.js +43 -0
- package/dist/tools/securityInfo.js.map +1 -0
- package/dist/tools/securityPolicyInfo.d.ts +22 -0
- package/dist/tools/securityPolicyInfo.d.ts.map +1 -0
- package/dist/tools/securityPolicyInfo.js +49 -0
- package/dist/tools/securityPolicyInfo.js.map +1 -0
- package/dist/tools/securityPrivilegeXml.d.ts +21 -0
- package/dist/tools/securityPrivilegeXml.d.ts.map +1 -0
- package/dist/tools/securityPrivilegeXml.js +61 -0
- package/dist/tools/securityPrivilegeXml.js.map +1 -0
- package/dist/tools/serviceInfo.d.ts +25 -0
- package/dist/tools/serviceInfo.d.ts.map +1 -0
- package/dist/tools/serviceInfo.js +93 -0
- package/dist/tools/serviceInfo.js.map +1 -0
- package/dist/tools/suggestEdt.d.ts +15 -0
- package/dist/tools/suggestEdt.d.ts.map +1 -0
- package/dist/tools/suggestEdt.js +348 -0
- package/dist/tools/suggestEdt.js.map +1 -0
- package/dist/tools/suggestImplementation.d.ts +20 -0
- package/dist/tools/suggestImplementation.d.ts.map +1 -0
- package/dist/tools/suggestImplementation.js +144 -0
- package/dist/tools/suggestImplementation.js.map +1 -0
- package/dist/tools/sysTestRunner.d.ts +14 -0
- package/dist/tools/sysTestRunner.d.ts.map +1 -0
- package/dist/tools/sysTestRunner.js +145 -0
- package/dist/tools/sysTestRunner.js.map +1 -0
- package/dist/tools/tableExtensionInfo.d.ts +91 -0
- package/dist/tools/tableExtensionInfo.d.ts.map +1 -0
- package/dist/tools/tableExtensionInfo.js +305 -0
- package/dist/tools/tableExtensionInfo.js.map +1 -0
- package/dist/tools/tableInfo.d.ts +23 -0
- package/dist/tools/tableInfo.d.ts.map +1 -0
- package/dist/tools/tableInfo.js +125 -0
- package/dist/tools/tableInfo.js.map +1 -0
- package/dist/tools/toolHandler.d.ts +4 -0
- package/dist/tools/toolHandler.d.ts.map +1 -0
- package/dist/tools/toolHandler.js +508 -0
- package/dist/tools/toolHandler.js.map +1 -0
- package/dist/tools/undoLastModification.d.ts +15 -0
- package/dist/tools/undoLastModification.d.ts.map +1 -0
- package/dist/tools/undoLastModification.js +147 -0
- package/dist/tools/undoLastModification.js.map +1 -0
- package/dist/tools/updateSymbolIndex.d.ts +15 -0
- package/dist/tools/updateSymbolIndex.d.ts.map +1 -0
- package/dist/tools/updateSymbolIndex.js +520 -0
- package/dist/tools/updateSymbolIndex.js.map +1 -0
- package/dist/tools/validateCode.d.ts +24 -0
- package/dist/tools/validateCode.d.ts.map +1 -0
- package/dist/tools/validateCode.js +201 -0
- package/dist/tools/validateCode.js.map +1 -0
- package/dist/tools/validateFormPattern.d.ts +51 -0
- package/dist/tools/validateFormPattern.d.ts.map +1 -0
- package/dist/tools/validateFormPattern.js +201 -0
- package/dist/tools/validateFormPattern.js.map +1 -0
- package/dist/tools/validateObjectNaming.d.ts +21 -0
- package/dist/tools/validateObjectNaming.d.ts.map +1 -0
- package/dist/tools/validateObjectNaming.js +319 -0
- package/dist/tools/validateObjectNaming.js.map +1 -0
- package/dist/tools/validateXpp.d.ts +79 -0
- package/dist/tools/validateXpp.d.ts.map +1 -0
- package/dist/tools/validateXpp.js +705 -0
- package/dist/tools/validateXpp.js.map +1 -0
- package/dist/tools/verifyD365Project.d.ts +21 -0
- package/dist/tools/verifyD365Project.d.ts.map +1 -0
- package/dist/tools/verifyD365Project.js +299 -0
- package/dist/tools/verifyD365Project.js.map +1 -0
- package/dist/tools/viewInfo.d.ts +17 -0
- package/dist/tools/viewInfo.d.ts.map +1 -0
- package/dist/tools/viewInfo.js +46 -0
- package/dist/tools/viewInfo.js.map +1 -0
- package/dist/tools/xppKnowledge.d.ts +45 -0
- package/dist/tools/xppKnowledge.d.ts.map +1 -0
- package/dist/tools/xppKnowledge.js +2815 -0
- package/dist/tools/xppKnowledge.js.map +1 -0
- package/dist/types/context.d.ts +56 -0
- package/dist/types/context.d.ts.map +1 -0
- package/dist/types/context.js +5 -0
- package/dist/types/context.js.map +1 -0
- package/dist/utils/callDedup.d.ts +29 -0
- package/dist/utils/callDedup.d.ts.map +1 -0
- package/dist/utils/callDedup.js +87 -0
- package/dist/utils/callDedup.js.map +1 -0
- package/dist/utils/configManager.d.ts +307 -0
- package/dist/utils/configManager.d.ts.map +1 -0
- package/dist/utils/configManager.js +1169 -0
- package/dist/utils/configManager.js.map +1 -0
- package/dist/utils/d365XmlNormalizer.d.ts +9 -0
- package/dist/utils/d365XmlNormalizer.d.ts.map +1 -0
- package/dist/utils/d365XmlNormalizer.js +24 -0
- package/dist/utils/d365XmlNormalizer.js.map +1 -0
- package/dist/utils/edtExtensionValidator.d.ts +110 -0
- package/dist/utils/edtExtensionValidator.d.ts.map +1 -0
- package/dist/utils/edtExtensionValidator.js +367 -0
- package/dist/utils/edtExtensionValidator.js.map +1 -0
- package/dist/utils/eolUtils.d.ts +15 -0
- package/dist/utils/eolUtils.d.ts.map +1 -0
- package/dist/utils/eolUtils.js +21 -0
- package/dist/utils/eolUtils.js.map +1 -0
- package/dist/utils/extractManifest.d.ts +34 -0
- package/dist/utils/extractManifest.d.ts.map +1 -0
- package/dist/utils/extractManifest.js +43 -0
- package/dist/utils/extractManifest.js.map +1 -0
- package/dist/utils/fieldControlTypes.d.ts +44 -0
- package/dist/utils/fieldControlTypes.d.ts.map +1 -0
- package/dist/utils/fieldControlTypes.js +97 -0
- package/dist/utils/fieldControlTypes.js.map +1 -0
- package/dist/utils/formCloner.d.ts +77 -0
- package/dist/utils/formCloner.d.ts.map +1 -0
- package/dist/utils/formCloner.js +364 -0
- package/dist/utils/formCloner.js.map +1 -0
- package/dist/utils/formControlExpander.d.ts +68 -0
- package/dist/utils/formControlExpander.d.ts.map +1 -0
- package/dist/utils/formControlExpander.js +207 -0
- package/dist/utils/formControlExpander.js.map +1 -0
- package/dist/utils/formControlRepair.d.ts +81 -0
- package/dist/utils/formControlRepair.d.ts.map +1 -0
- package/dist/utils/formControlRepair.js +203 -0
- package/dist/utils/formControlRepair.js.map +1 -0
- package/dist/utils/formExtensionShapeValidator.d.ts +44 -0
- package/dist/utils/formExtensionShapeValidator.d.ts.map +1 -0
- package/dist/utils/formExtensionShapeValidator.js +99 -0
- package/dist/utils/formExtensionShapeValidator.js.map +1 -0
- package/dist/utils/formPatternTemplates.d.ts +77 -0
- package/dist/utils/formPatternTemplates.d.ts.map +1 -0
- package/dist/utils/formPatternTemplates.js +1917 -0
- package/dist/utils/formPatternTemplates.js.map +1 -0
- package/dist/utils/fsExtensionScanner.d.ts +76 -0
- package/dist/utils/fsExtensionScanner.d.ts.map +1 -0
- package/dist/utils/fsExtensionScanner.js +271 -0
- package/dist/utils/fsExtensionScanner.js.map +1 -0
- package/dist/utils/fuzzyMatching.d.ts +41 -0
- package/dist/utils/fuzzyMatching.d.ts.map +1 -0
- package/dist/utils/fuzzyMatching.js +186 -0
- package/dist/utils/fuzzyMatching.js.map +1 -0
- package/dist/utils/indexStaleness.d.ts +30 -0
- package/dist/utils/indexStaleness.d.ts.map +1 -0
- package/dist/utils/indexStaleness.js +104 -0
- package/dist/utils/indexStaleness.js.map +1 -0
- package/dist/utils/loadEnv.d.ts +32 -0
- package/dist/utils/loadEnv.d.ts.map +1 -0
- package/dist/utils/loadEnv.js +83 -0
- package/dist/utils/loadEnv.js.map +1 -0
- package/dist/utils/logger.d.ts +4 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +11 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/metadataResolver.d.ts +155 -0
- package/dist/utils/metadataResolver.d.ts.map +1 -0
- package/dist/utils/metadataResolver.js +277 -0
- package/dist/utils/metadataResolver.js.map +1 -0
- package/dist/utils/modelClassifier.d.ts +180 -0
- package/dist/utils/modelClassifier.d.ts.map +1 -0
- package/dist/utils/modelClassifier.js +373 -0
- package/dist/utils/modelClassifier.js.map +1 -0
- package/dist/utils/operationLocks.d.ts +26 -0
- package/dist/utils/operationLocks.d.ts.map +1 -0
- package/dist/utils/operationLocks.js +182 -0
- package/dist/utils/operationLocks.js.map +1 -0
- package/dist/utils/packageResolver.d.ts +52 -0
- package/dist/utils/packageResolver.d.ts.map +1 -0
- package/dist/utils/packageResolver.js +174 -0
- package/dist/utils/packageResolver.js.map +1 -0
- package/dist/utils/pathContainment.d.ts +60 -0
- package/dist/utils/pathContainment.d.ts.map +1 -0
- package/dist/utils/pathContainment.js +270 -0
- package/dist/utils/pathContainment.js.map +1 -0
- package/dist/utils/projectUtils.d.ts +14 -0
- package/dist/utils/projectUtils.d.ts.map +1 -0
- package/dist/utils/projectUtils.js +48 -0
- package/dist/utils/projectUtils.js.map +1 -0
- package/dist/utils/provenanceStore.d.ts +54 -0
- package/dist/utils/provenanceStore.d.ts.map +1 -0
- package/dist/utils/provenanceStore.js +203 -0
- package/dist/utils/provenanceStore.js.map +1 -0
- package/dist/utils/richContext.d.ts +45 -0
- package/dist/utils/richContext.d.ts.map +1 -0
- package/dist/utils/richContext.js +316 -0
- package/dist/utils/richContext.js.map +1 -0
- package/dist/utils/smartXmlBuilder.d.ts +187 -0
- package/dist/utils/smartXmlBuilder.d.ts.map +1 -0
- package/dist/utils/smartXmlBuilder.js +504 -0
- package/dist/utils/smartXmlBuilder.js.map +1 -0
- package/dist/utils/stdioSessionInfo.d.ts +53 -0
- package/dist/utils/stdioSessionInfo.d.ts.map +1 -0
- package/dist/utils/stdioSessionInfo.js +47 -0
- package/dist/utils/stdioSessionInfo.js.map +1 -0
- package/dist/utils/suggestionEngine.d.ts +20 -0
- package/dist/utils/suggestionEngine.d.ts.map +1 -0
- package/dist/utils/suggestionEngine.js +145 -0
- package/dist/utils/suggestionEngine.js.map +1 -0
- package/dist/utils/symbolLookup.d.ts +60 -0
- package/dist/utils/symbolLookup.d.ts.map +1 -0
- package/dist/utils/symbolLookup.js +0 -0
- package/dist/utils/symbolLookup.js.map +1 -0
- package/dist/utils/terminalUi.d.ts +85 -0
- package/dist/utils/terminalUi.d.ts.map +1 -0
- package/dist/utils/terminalUi.js +182 -0
- package/dist/utils/terminalUi.js.map +1 -0
- package/dist/utils/toolMetrics.d.ts +32 -0
- package/dist/utils/toolMetrics.d.ts.map +1 -0
- package/dist/utils/toolMetrics.js +89 -0
- package/dist/utils/toolMetrics.js.map +1 -0
- package/dist/utils/toolProgressMessage.d.ts +8 -0
- package/dist/utils/toolProgressMessage.d.ts.map +1 -0
- package/dist/utils/toolProgressMessage.js +182 -0
- package/dist/utils/toolProgressMessage.js.map +1 -0
- package/dist/utils/workspaceDetector.d.ts +51 -0
- package/dist/utils/workspaceDetector.d.ts.map +1 -0
- package/dist/utils/workspaceDetector.js +328 -0
- package/dist/utils/workspaceDetector.js.map +1 -0
- package/dist/utils/xppConfigProvider.d.ts +48 -0
- package/dist/utils/xppConfigProvider.d.ts.map +1 -0
- package/dist/utils/xppConfigProvider.js +121 -0
- package/dist/utils/xppConfigProvider.js.map +1 -0
- package/dist/utils/xppDocGen.d.ts +39 -0
- package/dist/utils/xppDocGen.d.ts.map +1 -0
- package/dist/utils/xppDocGen.js +518 -0
- package/dist/utils/xppDocGen.js.map +1 -0
- package/dist/utils/xppFormat.d.ts +21 -0
- package/dist/utils/xppFormat.d.ts.map +1 -0
- package/dist/utils/xppFormat.js +102 -0
- package/dist/utils/xppFormat.js.map +1 -0
- package/dist/utils/xppSelectLint.d.ts +18 -0
- package/dist/utils/xppSelectLint.d.ts.map +1 -0
- package/dist/utils/xppSelectLint.js +80 -0
- package/dist/utils/xppSelectLint.js.map +1 -0
- package/dist/validation/formPatternValidator.d.ts +53 -0
- package/dist/validation/formPatternValidator.d.ts.map +1 -0
- package/dist/validation/formPatternValidator.js +454 -0
- package/dist/validation/formPatternValidator.js.map +1 -0
- package/dist/workspace/contextRanker.d.ts +58 -0
- package/dist/workspace/contextRanker.d.ts.map +1 -0
- package/dist/workspace/contextRanker.js +216 -0
- package/dist/workspace/contextRanker.js.map +1 -0
- package/dist/workspace/contextSnapshot.d.ts +68 -0
- package/dist/workspace/contextSnapshot.d.ts.map +1 -0
- package/dist/workspace/contextSnapshot.js +193 -0
- package/dist/workspace/contextSnapshot.js.map +1 -0
- package/dist/workspace/hybridSearch.d.ts +39 -0
- package/dist/workspace/hybridSearch.d.ts.map +1 -0
- package/dist/workspace/hybridSearch.js +96 -0
- package/dist/workspace/hybridSearch.js.map +1 -0
- package/dist/workspace/workspaceScanner.d.ts +95 -0
- package/dist/workspace/workspaceScanner.d.ts.map +1 -0
- package/dist/workspace/workspaceScanner.js +247 -0
- package/dist/workspace/workspaceScanner.js.map +1 -0
- package/dist/workspace/workspaceUtils.d.ts +23 -0
- package/dist/workspace/workspaceUtils.d.ts.map +1 -0
- package/dist/workspace/workspaceUtils.js +77 -0
- package/dist/workspace/workspaceUtils.js.map +1 -0
- package/package.json +94 -0
|
@@ -0,0 +1,929 @@
|
|
|
1
|
+
import { execFile, spawn } from 'child_process';
|
|
2
|
+
import util from 'util';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { access, writeFile, readFile, unlink, appendFile, readdir } from 'fs/promises';
|
|
5
|
+
import { openSync as openSyncFs, closeSync as closeSyncFs } from 'fs';
|
|
6
|
+
import os from 'os';
|
|
7
|
+
import crypto from 'crypto';
|
|
8
|
+
import { getConfigManager } from '../utils/configManager.js';
|
|
9
|
+
import { forceReleaseLock } from '../utils/operationLocks.js';
|
|
10
|
+
import { lookupErrorFix } from './d365foErrorHelp.js';
|
|
11
|
+
import { generateRuntimeMetadata } from './generateMetadata.js';
|
|
12
|
+
const execFileAsync = util.promisify(execFile);
|
|
13
|
+
// Build-tool file logger
|
|
14
|
+
async function buildLog(level, message) {
|
|
15
|
+
console.error(`[build_d365fo_project] ${message}`);
|
|
16
|
+
try {
|
|
17
|
+
const configManager = getConfigManager();
|
|
18
|
+
const logFile = configManager.getContext()?.bridgeLogFile;
|
|
19
|
+
if (!logFile)
|
|
20
|
+
return;
|
|
21
|
+
const line = `[${new Date().toISOString()}] [BuildTool] [${level}] ${message}\n`;
|
|
22
|
+
await appendFile(logFile, line, 'utf-8');
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
// Best-effort — never throw from logging
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function assertSafePath(value, label) {
|
|
29
|
+
if (/[&|<>^`!;$%"'\n\r]/.test(value)) {
|
|
30
|
+
throw new Error(`${label} contains potentially dangerous characters and cannot be used in a build command: ${value}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// xppc.exe writes this prefix on error lines in the -log file (standalone/non-VS mode)
|
|
34
|
+
const XPPC_COMPILE_ERROR_RE = /^Compile Error:/m;
|
|
35
|
+
// When xppc reports stale symbols from a previous incremental build, a full build is needed
|
|
36
|
+
const XPPC_STALE_SYMBOL_RE = /has not been successfully compiled since it was last changed|Do a Full Build/i;
|
|
37
|
+
const XPPC_DIAG_LINE_RE = /^(Compile Fatal Error|Compile Error|Compile Warning|Generation Warning|Best Practice Warning):\s*(?:(.*?)\s+)?dynamics:\/\/([^/\s:]+)\/([^/\s:]+)(?:\/([^\s:]+))?\s*:?\s*\[\((\d+),(\d+)\)(?:,\(\d+,\d+\))?\]\s*:\s*(.*)$/;
|
|
38
|
+
/** Parse xppc log content into structured diagnostics. */
|
|
39
|
+
export function parseXppcDiagnostics(logContent) {
|
|
40
|
+
const diagnostics = [];
|
|
41
|
+
for (const rawLine of logContent.split(/\r?\n/)) {
|
|
42
|
+
const line = rawLine.trim();
|
|
43
|
+
const m = XPPC_DIAG_LINE_RE.exec(line);
|
|
44
|
+
if (m) {
|
|
45
|
+
diagnostics.push({
|
|
46
|
+
severity: m[1].includes('Error') ? 'error' : 'warning',
|
|
47
|
+
kind: m[2] || undefined,
|
|
48
|
+
model: m[3],
|
|
49
|
+
object: m[4],
|
|
50
|
+
member: m[5] || undefined,
|
|
51
|
+
line: Number(m[6]),
|
|
52
|
+
column: Number(m[7]),
|
|
53
|
+
message: m[8].trim(),
|
|
54
|
+
});
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
// Fallback: severity prefix without the dynamics:// location part
|
|
58
|
+
const simple = /^(Compile Fatal Error|Compile Error|Compile Warning|Generation Warning):\s*(.+)$/.exec(line);
|
|
59
|
+
if (simple) {
|
|
60
|
+
diagnostics.push({
|
|
61
|
+
severity: simple[1].includes('Error') ? 'error' : 'warning',
|
|
62
|
+
message: simple[2].trim(),
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return diagnostics;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Render diagnostics as a numbered, machine-actionable block. Errors come
|
|
70
|
+
* first; duplicate messages are collapsed; the first few distinct errors are
|
|
71
|
+
* enriched with a fix hint from the get_d365fo_error_help knowledge base so
|
|
72
|
+
* the model can correct everything in one round.
|
|
73
|
+
*/
|
|
74
|
+
export function formatStructuredDiagnostics(diagnostics, maxItems = 25) {
|
|
75
|
+
if (diagnostics.length === 0)
|
|
76
|
+
return '';
|
|
77
|
+
const errors = diagnostics.filter(d => d.severity === 'error');
|
|
78
|
+
const warnings = diagnostics.filter(d => d.severity === 'warning');
|
|
79
|
+
const ordered = [...errors, ...warnings];
|
|
80
|
+
const seen = new Set();
|
|
81
|
+
const lines = [
|
|
82
|
+
`📋 Structured diagnostics: ${errors.length} error(s), ${warnings.length} warning(s)`,
|
|
83
|
+
'',
|
|
84
|
+
];
|
|
85
|
+
let shown = 0;
|
|
86
|
+
let enriched = 0;
|
|
87
|
+
for (const d of ordered) {
|
|
88
|
+
const key = `${d.object ?? ''}|${d.member ?? ''}|${d.line ?? ''}|${d.message}`;
|
|
89
|
+
if (seen.has(key))
|
|
90
|
+
continue;
|
|
91
|
+
seen.add(key);
|
|
92
|
+
if (shown >= maxItems) {
|
|
93
|
+
lines.push(`… and ${ordered.length - shown} more (see raw log below).`);
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
shown++;
|
|
97
|
+
const location = d.object
|
|
98
|
+
? `${d.object}${d.member ? `.${d.member}` : ''}${d.line ? ` (line ${d.line}, col ${d.column})` : ''}`
|
|
99
|
+
: '(no location)';
|
|
100
|
+
lines.push(`${shown}. ${d.severity === 'error' ? '🔴' : '🟡'} ${location}: ${d.message}`);
|
|
101
|
+
// Enrich the first few distinct errors with a known fix
|
|
102
|
+
if (d.severity === 'error' && enriched < 3) {
|
|
103
|
+
const help = lookupErrorFix(d.message);
|
|
104
|
+
if (help) {
|
|
105
|
+
enriched++;
|
|
106
|
+
lines.push(` 💡 ${help.title}: ${help.fix[0]}`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (errors.length > 0) {
|
|
111
|
+
lines.push('');
|
|
112
|
+
lines.push('Fix the errors with d365fo_file(action="modify") (use the object/line references above), then rebuild.');
|
|
113
|
+
}
|
|
114
|
+
return lines.join('\n');
|
|
115
|
+
}
|
|
116
|
+
// State file is keyed by targetModel so it remains findable throughout a
|
|
117
|
+
// multi-model build even while a dependency is building. Each model in the
|
|
118
|
+
// queue gets its own log file (keyed by targetModel + index).
|
|
119
|
+
function stateFilePath(targetModel, customPackagesPath) {
|
|
120
|
+
const hash = crypto
|
|
121
|
+
.createHash('md5')
|
|
122
|
+
.update(`${targetModel.toLowerCase()}|${customPackagesPath.toLowerCase()}`)
|
|
123
|
+
.digest('hex')
|
|
124
|
+
.slice(0, 10);
|
|
125
|
+
return path.join(os.tmpdir(), `d365build_state_${hash}.json`);
|
|
126
|
+
}
|
|
127
|
+
function logFilePath(targetModel, queueIndex, customPackagesPath) {
|
|
128
|
+
const hash = crypto
|
|
129
|
+
.createHash('md5')
|
|
130
|
+
.update(`log:${targetModel.toLowerCase()}|${queueIndex}|${customPackagesPath.toLowerCase()}`)
|
|
131
|
+
.digest('hex')
|
|
132
|
+
.slice(0, 10);
|
|
133
|
+
return path.join(os.tmpdir(), `d365build_log_${hash}.log`);
|
|
134
|
+
}
|
|
135
|
+
async function readBuildState(targetModel, customPackagesPath) {
|
|
136
|
+
try {
|
|
137
|
+
const raw = await readFile(stateFilePath(targetModel, customPackagesPath), 'utf-8');
|
|
138
|
+
return JSON.parse(raw);
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
async function writeBuildState(state, customPackagesPath) {
|
|
145
|
+
await writeFile(stateFilePath(state.targetModel, customPackagesPath), JSON.stringify(state, null, 2), 'utf-8');
|
|
146
|
+
}
|
|
147
|
+
async function clearBuildState(targetModel, customPackagesPath) {
|
|
148
|
+
await unlink(stateFilePath(targetModel, customPackagesPath)).catch(() => { });
|
|
149
|
+
}
|
|
150
|
+
function isProcessAlive(pid) {
|
|
151
|
+
try {
|
|
152
|
+
process.kill(pid, 0);
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/** Last N lines of a log file (used while a build is running). */
|
|
160
|
+
async function readLogTail(logFile, lines = 60) {
|
|
161
|
+
try {
|
|
162
|
+
const content = await readFile(logFile, 'utf-8');
|
|
163
|
+
const all = content.split(/\r?\n/);
|
|
164
|
+
return all.slice(-lines).join('\n').trim();
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
return '(log not yet available)';
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/** Read the entire log without truncation — used for diagnostics parsing only. */
|
|
171
|
+
async function readWholeLog(logFile) {
|
|
172
|
+
try {
|
|
173
|
+
return await readFile(logFile, 'utf-8');
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
return '';
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Log excerpt for a failed build that always includes diagnostic lines. A
|
|
181
|
+
* naive head+tail can miss errors when long phase-timing tables precede them,
|
|
182
|
+
* so instead: find every diagnostic line, include a context window around
|
|
183
|
+
* each, always include the trailing summary lines, and cap the number of
|
|
184
|
+
* diagnostic windows shown (MAX_DIAGS) to bound the response size.
|
|
185
|
+
*/
|
|
186
|
+
async function readFullLog(logFile, maxLines = 300) {
|
|
187
|
+
const CONTEXT = 3; // lines before/after each diagnostic
|
|
188
|
+
const TAIL_LINES = 30; // always-included trailing lines
|
|
189
|
+
const MAX_DIAGS = 30; // cap on diagnostic windows to bound response size
|
|
190
|
+
try {
|
|
191
|
+
const content = await readFile(logFile, 'utf-8');
|
|
192
|
+
const all = content.split(/\r?\n/);
|
|
193
|
+
if (all.length <= maxLines)
|
|
194
|
+
return content.trim();
|
|
195
|
+
const DIAG_RE = /^(Compile Fatal Error|Compile Error|Compile Warning|Generation Warning|Best Practice Warning):/;
|
|
196
|
+
const diagIndices = [];
|
|
197
|
+
for (let i = 0; i < all.length; i++) {
|
|
198
|
+
if (DIAG_RE.test(all[i].trim()))
|
|
199
|
+
diagIndices.push(i);
|
|
200
|
+
}
|
|
201
|
+
if (diagIndices.length > 0) {
|
|
202
|
+
const totalDiags = diagIndices.length;
|
|
203
|
+
const shownDiags = diagIndices.slice(0, MAX_DIAGS);
|
|
204
|
+
const included = new Set();
|
|
205
|
+
for (const idx of shownDiags) {
|
|
206
|
+
for (let i = Math.max(0, idx - CONTEXT); i <= Math.min(all.length - 1, idx + CONTEXT); i++) {
|
|
207
|
+
included.add(i);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
for (let i = Math.max(0, all.length - TAIL_LINES); i < all.length; i++) {
|
|
211
|
+
included.add(i);
|
|
212
|
+
}
|
|
213
|
+
const sorted = [...included].sort((a, b) => a - b);
|
|
214
|
+
const header = totalDiags > shownDiags.length
|
|
215
|
+
? `[Phase table omitted — first ${shownDiags.length} of ${totalDiags} diagnostic line(s) with context shown below]\n`
|
|
216
|
+
: `[Phase table omitted — ${totalDiags} diagnostic line(s) with context shown below]\n`;
|
|
217
|
+
const out = [header];
|
|
218
|
+
let prev = -1;
|
|
219
|
+
for (const i of sorted) {
|
|
220
|
+
if (prev !== -1 && i > prev + 1) {
|
|
221
|
+
out.push(`... (${i - prev - 1} lines omitted) ...`);
|
|
222
|
+
}
|
|
223
|
+
out.push(all[i]);
|
|
224
|
+
prev = i;
|
|
225
|
+
}
|
|
226
|
+
return out.join('\n').trim();
|
|
227
|
+
}
|
|
228
|
+
// No diagnostic lines found — fall back to head+tail.
|
|
229
|
+
const half = Math.floor(maxLines / 2);
|
|
230
|
+
return (`[First ${half} lines]\n` +
|
|
231
|
+
all.slice(0, half).join('\n') +
|
|
232
|
+
`\n\n... (${all.length - maxLines} lines omitted) ...\n\n` +
|
|
233
|
+
`[Last ${half} lines]\n` +
|
|
234
|
+
all.slice(-half).join('\n').trim());
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
return '(log not available)';
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
async function getModelFromRnrproj(projectPath) {
|
|
241
|
+
try {
|
|
242
|
+
const content = await readFile(projectPath, 'utf-8');
|
|
243
|
+
const match = content.match(/<Model>\s*([^<]+)\s*<\/Model>/i);
|
|
244
|
+
return match ? match[1].trim() : null;
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
return null;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
async function findXppcExe(microsoftPackagesPath) {
|
|
251
|
+
const candidates = [];
|
|
252
|
+
if (microsoftPackagesPath) {
|
|
253
|
+
candidates.push(path.join(microsoftPackagesPath, 'bin', 'xppc.exe'));
|
|
254
|
+
}
|
|
255
|
+
// Search AppData for any installed UDE version
|
|
256
|
+
const appDataLocal = process.env.LOCALAPPDATA ||
|
|
257
|
+
path.join(process.env.USERPROFILE || 'C:\\Users\\Default', 'AppData', 'Local');
|
|
258
|
+
const d365Base = path.join(appDataLocal, 'Microsoft', 'Dynamics365');
|
|
259
|
+
try {
|
|
260
|
+
const versions = await readdir(d365Base);
|
|
261
|
+
for (const ver of versions.sort().reverse()) {
|
|
262
|
+
candidates.push(path.join(d365Base, ver, 'PackagesLocalDirectory', 'bin', 'xppc.exe'));
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
catch { /* ignore */ }
|
|
266
|
+
// CHE well-known locations
|
|
267
|
+
candidates.push('C:\\AOSService\\PackagesLocalDirectory\\bin\\xppc.exe', 'K:\\AOSService\\PackagesLocalDirectory\\bin\\xppc.exe', 'J:\\AOSService\\PackagesLocalDirectory\\bin\\xppc.exe', 'I:\\AOSService\\PackagesLocalDirectory\\bin\\xppc.exe');
|
|
268
|
+
for (const c of candidates) {
|
|
269
|
+
try {
|
|
270
|
+
await access(c);
|
|
271
|
+
return c;
|
|
272
|
+
}
|
|
273
|
+
catch { /* next */ }
|
|
274
|
+
}
|
|
275
|
+
return null;
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Reads <ModuleReferences> from the target model's descriptor, recursively
|
|
279
|
+
* follows custom/ISV dependencies (models present in customPackagesPath), and
|
|
280
|
+
* returns a topologically sorted build order (deepest dep first, target
|
|
281
|
+
* last). Microsoft standard models (only in microsoftPackagesPath) are
|
|
282
|
+
* silently skipped.
|
|
283
|
+
*/
|
|
284
|
+
async function resolveBuildQueue(targetModel, customPackagesPath, _microsoftPackagesPath) {
|
|
285
|
+
const visited = new Set();
|
|
286
|
+
const order = [];
|
|
287
|
+
async function visit(modelName) {
|
|
288
|
+
if (visited.has(modelName.toLowerCase()))
|
|
289
|
+
return;
|
|
290
|
+
visited.add(modelName.toLowerCase());
|
|
291
|
+
// Read descriptor
|
|
292
|
+
const descriptorPath = path.join(customPackagesPath, modelName, 'Descriptor', `${modelName}.xml`);
|
|
293
|
+
let content;
|
|
294
|
+
try {
|
|
295
|
+
content = await readFile(descriptorPath, 'utf-8');
|
|
296
|
+
}
|
|
297
|
+
catch {
|
|
298
|
+
// No descriptor — still include this model but can't follow its deps
|
|
299
|
+
order.push(modelName);
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
// Extract all <d2p1:string> entries inside <ModuleReferences>
|
|
303
|
+
const refs = Array.from(content.matchAll(/<d2p1:string>\s*([^<\s]+)\s*<\/d2p1:string>/g))
|
|
304
|
+
.map(m => m[1].trim())
|
|
305
|
+
.filter(Boolean);
|
|
306
|
+
// Visit custom/ISV dependencies first (skip Microsoft standard models)
|
|
307
|
+
for (const ref of refs) {
|
|
308
|
+
if (visited.has(ref.toLowerCase()))
|
|
309
|
+
continue;
|
|
310
|
+
try {
|
|
311
|
+
await access(path.join(customPackagesPath, ref));
|
|
312
|
+
await visit(ref); // Recurse into custom dep
|
|
313
|
+
}
|
|
314
|
+
catch {
|
|
315
|
+
// Not found in customPackagesPath → Microsoft standard → skip
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
order.push(modelName); // Post-order DFS = topological sort
|
|
319
|
+
}
|
|
320
|
+
await visit(targetModel);
|
|
321
|
+
return order; // Dependencies first, targetModel last
|
|
322
|
+
}
|
|
323
|
+
async function killOrphanedBuildProcesses() {
|
|
324
|
+
await execFileAsync('taskkill', ['/F', '/IM', 'xppc.exe'], { timeout: 10_000, windowsHide: true })
|
|
325
|
+
.then(({ stdout }) => console.error(`[build_d365fo_project] killed xppc.exe: ${stdout.trim() || '(no output)'}`))
|
|
326
|
+
.catch(() => { });
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Spawns xppc.exe for state.modelName, writes the updated state (with real
|
|
330
|
+
* PID) to disk, and wires up close/error handlers. The close handler
|
|
331
|
+
* automatically advances the queue when a dependency finishes successfully.
|
|
332
|
+
* Returns the PID of the spawned process.
|
|
333
|
+
*/
|
|
334
|
+
async function spawnXppcForState(ctx, state) {
|
|
335
|
+
const { xppcExe, customPackagesPath, microsoftPackagesPath, extraReferenceFolders } = ctx;
|
|
336
|
+
const { modelName, fullBuild, targetModel } = state;
|
|
337
|
+
// fullBuild only applies to the TARGET model — dependencies always run
|
|
338
|
+
// incremental. They are already compiled; a full rebuild of every dep in
|
|
339
|
+
// the chain would be very slow and is only needed when a dep itself has
|
|
340
|
+
// stale symbols, which the user can fix by building that model directly.
|
|
341
|
+
const useFullBuild = fullBuild && modelName === targetModel;
|
|
342
|
+
assertSafePath(xppcExe, 'xppc.exe path');
|
|
343
|
+
assertSafePath(modelName, 'Model name');
|
|
344
|
+
assertSafePath(customPackagesPath, 'Custom packages path');
|
|
345
|
+
assertSafePath(microsoftPackagesPath, 'Microsoft packages path');
|
|
346
|
+
const outputPath = path.join(customPackagesPath, modelName, 'bin');
|
|
347
|
+
const xppcErrLog = state.logFile.replace('.log', '.xppc.err');
|
|
348
|
+
await unlink(xppcErrLog).catch(() => { });
|
|
349
|
+
// Deduplicate reference folders
|
|
350
|
+
const seenRefFolders = new Set();
|
|
351
|
+
const referenceFolderArgs = [];
|
|
352
|
+
for (const folder of [microsoftPackagesPath, customPackagesPath, ...extraReferenceFolders]) {
|
|
353
|
+
const norm = folder.toLowerCase();
|
|
354
|
+
if (!seenRefFolders.has(norm)) {
|
|
355
|
+
seenRefFolders.add(norm);
|
|
356
|
+
referenceFolderArgs.push(`-referenceFolder=${folder}`);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
const xppcArgs = [
|
|
360
|
+
`-metadata=${customPackagesPath}`,
|
|
361
|
+
`-compilermetadata=${microsoftPackagesPath}`,
|
|
362
|
+
`-modelmodule=${modelName}`,
|
|
363
|
+
...referenceFolderArgs,
|
|
364
|
+
`-output=${outputPath}`,
|
|
365
|
+
// Full build = omit -incremental (xppc recompiles all elements).
|
|
366
|
+
// Only applied to the target model — deps always run incremental.
|
|
367
|
+
...(useFullBuild ? [] : ['-incremental']),
|
|
368
|
+
`-log=${xppcErrLog}`,
|
|
369
|
+
// -verbose surfaces metadata loading errors (XML failures, missing refs)
|
|
370
|
+
// that are otherwise silently swallowed in non-VS standalone mode.
|
|
371
|
+
'-verbose',
|
|
372
|
+
];
|
|
373
|
+
await buildLog('INFO', `xppc.exe args: ${xppcArgs.join(' ')}`);
|
|
374
|
+
const logFd = openSyncFs(state.logFile, 'w');
|
|
375
|
+
const child = spawn(xppcExe, xppcArgs, {
|
|
376
|
+
detached: false,
|
|
377
|
+
windowsHide: true,
|
|
378
|
+
stdio: ['ignore', logFd, logFd],
|
|
379
|
+
});
|
|
380
|
+
child.unref();
|
|
381
|
+
const pid = child.pid;
|
|
382
|
+
// Write state with actual PID immediately so polls see it
|
|
383
|
+
const liveState = { ...state, pid };
|
|
384
|
+
await writeBuildState(liveState, customPackagesPath);
|
|
385
|
+
await buildLog('INFO', `xppc.exe launched — PID: ${pid} | model: ${modelName} | log: ${state.logFile}`);
|
|
386
|
+
child.on('error', async (err) => {
|
|
387
|
+
closeSyncFs(logFd);
|
|
388
|
+
const failed = { ...liveState, status: 'failed', exitCode: -1, endTime: new Date().toISOString() };
|
|
389
|
+
await writeBuildState(failed, customPackagesPath).catch(() => { });
|
|
390
|
+
await buildLog('ERROR', `xppc.exe spawn error — PID: ${pid}: ${err.message}`);
|
|
391
|
+
});
|
|
392
|
+
child.on('close', async (code) => {
|
|
393
|
+
closeSyncFs(logFd);
|
|
394
|
+
const exitCode = code ?? -1;
|
|
395
|
+
// Read the -log file (authoritative source of X++ compiler errors)
|
|
396
|
+
let xppcErrContent = '';
|
|
397
|
+
try {
|
|
398
|
+
xppcErrContent = await readFile(xppcErrLog, 'utf-8');
|
|
399
|
+
}
|
|
400
|
+
catch { /* no -log file = no diagnostics */ }
|
|
401
|
+
const hasCompileErrors = XPPC_COMPILE_ERROR_RE.test(xppcErrContent);
|
|
402
|
+
const hasStaleSymbol = XPPC_STALE_SYMBOL_RE.test(xppcErrContent);
|
|
403
|
+
// xppc can exit 0 while still emitting Compile Error lines, so success
|
|
404
|
+
// requires both exit 0 AND no Compile Error lines in the -log.
|
|
405
|
+
const succeeded = exitCode === 0 && !hasCompileErrors;
|
|
406
|
+
// Append compiler diagnostics to the main log so a single tail read finds everything
|
|
407
|
+
if (xppcErrContent.trim()) {
|
|
408
|
+
let diagnostics = '\n--- xppc compiler diagnostics ---\n' + xppcErrContent + '\n';
|
|
409
|
+
if (hasStaleSymbol) {
|
|
410
|
+
diagnostics +=
|
|
411
|
+
'\n💡 STALE SYMBOL DETECTED: Call build_d365fo_project with fullBuild: true\n' +
|
|
412
|
+
' to recompile all symbols from scratch.\n';
|
|
413
|
+
}
|
|
414
|
+
await appendFile(state.logFile, diagnostics, 'utf-8').catch(() => { });
|
|
415
|
+
}
|
|
416
|
+
else if (!succeeded) {
|
|
417
|
+
// No diagnostics at all — the failure happened before the compiler ran
|
|
418
|
+
await appendFile(state.logFile, '\n⚠️ No compiler diagnostics from xppc — build failed before compilation started.\n' +
|
|
419
|
+
' Possible causes: missing metadata path, missing referenced model, or a\n' +
|
|
420
|
+
' malformed XML file that slipped past pre-validation (e.g. in the Descriptor).\n', 'utf-8').catch(() => { });
|
|
421
|
+
}
|
|
422
|
+
const duration = Math.round((Date.now() - new Date(liveState.startTime).getTime()) / 1000);
|
|
423
|
+
const newResult = {
|
|
424
|
+
modelName,
|
|
425
|
+
status: succeeded ? 'succeeded' : 'failed',
|
|
426
|
+
duration,
|
|
427
|
+
logFile: state.logFile,
|
|
428
|
+
};
|
|
429
|
+
const allResults = [...(liveState.queueResults ?? []), newResult];
|
|
430
|
+
if (!succeeded) {
|
|
431
|
+
// Failure — stop the queue and finalise
|
|
432
|
+
const final = {
|
|
433
|
+
...liveState,
|
|
434
|
+
status: 'failed',
|
|
435
|
+
exitCode,
|
|
436
|
+
endTime: new Date().toISOString(),
|
|
437
|
+
queueResults: allResults,
|
|
438
|
+
};
|
|
439
|
+
await writeBuildState(final, customPackagesPath).catch(() => { });
|
|
440
|
+
await buildLog('ERROR', `xppc.exe FAILED — PID: ${pid} | model: ${modelName} | exit: ${exitCode} | compileErrors: ${hasCompileErrors}`);
|
|
441
|
+
return;
|
|
442
|
+
}
|
|
443
|
+
// Success — advance queue if there are more models
|
|
444
|
+
if (liveState.buildQueue &&
|
|
445
|
+
liveState.queueIndex !== undefined &&
|
|
446
|
+
liveState.queueIndex + 1 < liveState.buildQueue.length) {
|
|
447
|
+
const nextIdx = liveState.queueIndex + 1;
|
|
448
|
+
const nextModel = liveState.buildQueue[nextIdx];
|
|
449
|
+
const nextLog = logFilePath(liveState.targetModel, nextIdx, customPackagesPath);
|
|
450
|
+
const nextState = {
|
|
451
|
+
...liveState,
|
|
452
|
+
pid: 0, // will be updated by the recursive spawnXppcForState call
|
|
453
|
+
modelName: nextModel,
|
|
454
|
+
queueIndex: nextIdx,
|
|
455
|
+
queueResults: allResults,
|
|
456
|
+
logFile: nextLog,
|
|
457
|
+
status: 'running',
|
|
458
|
+
startTime: new Date().toISOString(),
|
|
459
|
+
exitCode: undefined,
|
|
460
|
+
endTime: undefined,
|
|
461
|
+
};
|
|
462
|
+
await writeBuildState(nextState, customPackagesPath);
|
|
463
|
+
await buildLog('INFO', `Queue advancing: ${nextIdx + 1}/${liveState.buildQueue.length} — ${nextModel}`);
|
|
464
|
+
spawnXppcForState(ctx, nextState).catch(async (err) => {
|
|
465
|
+
await buildLog('ERROR', `Failed to spawn next model ${nextModel}: ${err.message}`);
|
|
466
|
+
const errState = {
|
|
467
|
+
...nextState,
|
|
468
|
+
status: 'failed',
|
|
469
|
+
exitCode: -1,
|
|
470
|
+
endTime: new Date().toISOString(),
|
|
471
|
+
queueResults: [...allResults, { modelName: nextModel, status: 'failed', duration: 0, logFile: nextLog }],
|
|
472
|
+
};
|
|
473
|
+
await writeBuildState(errState, customPackagesPath).catch(() => { });
|
|
474
|
+
});
|
|
475
|
+
return;
|
|
476
|
+
}
|
|
477
|
+
// xppc produces the compiled .netmodule but does not update the binary .md
|
|
478
|
+
// manifests the AOS uses to resolve class names at runtime — regenerate them
|
|
479
|
+
// here, otherwise newly added classes stay invisible to D365 after deployment.
|
|
480
|
+
const metaResult = await generateRuntimeMetadata(microsoftPackagesPath, customPackagesPath, liveState.targetModel);
|
|
481
|
+
if (metaResult.skipped) {
|
|
482
|
+
await buildLog('WARN', `Runtime metadata regeneration skipped: ${metaResult.message}`);
|
|
483
|
+
}
|
|
484
|
+
else if (metaResult.success) {
|
|
485
|
+
await buildLog('INFO', `Runtime metadata regenerated: ${metaResult.message}`);
|
|
486
|
+
await appendFile(state.logFile, `\n✅ Runtime metadata (.md) regenerated for ${liveState.targetModel}\n`, 'utf-8').catch(() => { });
|
|
487
|
+
}
|
|
488
|
+
else {
|
|
489
|
+
await buildLog('WARN', `Runtime metadata regeneration failed (build still succeeded): ${metaResult.message}`);
|
|
490
|
+
await appendFile(state.logFile, `\n⚠️ Runtime metadata (.md) regeneration failed — VS build required for deployment of new classes:\n${metaResult.message}\n`, 'utf-8').catch(() => { });
|
|
491
|
+
}
|
|
492
|
+
// All models built — finalise as succeeded
|
|
493
|
+
const final = {
|
|
494
|
+
...liveState,
|
|
495
|
+
status: 'succeeded',
|
|
496
|
+
exitCode,
|
|
497
|
+
endTime: new Date().toISOString(),
|
|
498
|
+
queueResults: allResults,
|
|
499
|
+
};
|
|
500
|
+
await writeBuildState(final, customPackagesPath).catch(() => { });
|
|
501
|
+
await buildLog('INFO', `xppc.exe SUCCEEDED — PID: ${pid} | model: ${modelName} | ${duration}s`);
|
|
502
|
+
});
|
|
503
|
+
return pid;
|
|
504
|
+
}
|
|
505
|
+
// ---------------------------------------------------------------------------
|
|
506
|
+
// Tool definition
|
|
507
|
+
// ---------------------------------------------------------------------------
|
|
508
|
+
// Tool registration (name, description, inputSchema) lives inline in
|
|
509
|
+
// src/server/mcpServer.ts - the single source of truth for tool instructions.
|
|
510
|
+
// ---------------------------------------------------------------------------
|
|
511
|
+
// Render the final result of a finished build (succeeded or failed) as the
|
|
512
|
+
// MCP response payload. Shared between the "existing finished state" branch
|
|
513
|
+
// and the wait-for-completion branch so both code paths produce identical
|
|
514
|
+
// output. Caller is responsible for calling clearBuildState() afterwards
|
|
515
|
+
// when appropriate.
|
|
516
|
+
// ---------------------------------------------------------------------------
|
|
517
|
+
async function renderFinishedBuildResult(finalState, targetModel) {
|
|
518
|
+
const succeeded = finalState.status === 'succeeded';
|
|
519
|
+
const isQueued = !!(finalState.buildQueue && finalState.buildQueue.length > 1);
|
|
520
|
+
const allResults = finalState.queueResults ?? [];
|
|
521
|
+
if (isQueued) {
|
|
522
|
+
const totalDuration = allResults.reduce((sum, r) => sum + r.duration, 0);
|
|
523
|
+
const statusIcon = succeeded ? '✅ Build complete' : '❌ Build failed';
|
|
524
|
+
const modelLines = allResults
|
|
525
|
+
.map(r => ` ${r.status === 'succeeded' ? '✅' : '❌'} ${r.modelName}: ${r.duration}s`)
|
|
526
|
+
.join('\n');
|
|
527
|
+
const relevantResult = succeeded
|
|
528
|
+
? allResults[allResults.length - 1]
|
|
529
|
+
: allResults.find(r => r.status === 'failed');
|
|
530
|
+
const relevantLogFile = relevantResult?.logFile ?? finalState.logFile;
|
|
531
|
+
const logContent = succeeded
|
|
532
|
+
? await readLogTail(relevantLogFile)
|
|
533
|
+
: await readFullLog(relevantLogFile);
|
|
534
|
+
const structured = succeeded
|
|
535
|
+
? ''
|
|
536
|
+
: formatStructuredDiagnostics(parseXppcDiagnostics(await readWholeLog(relevantLogFile)));
|
|
537
|
+
return {
|
|
538
|
+
content: [{
|
|
539
|
+
type: 'text',
|
|
540
|
+
text: `${statusIcon} — ${allResults.length} models, ${totalDuration}s total\n\n${modelLines}\n\n` +
|
|
541
|
+
(structured ? `${structured}\n\n` : '') +
|
|
542
|
+
`--- Log (${relevantResult?.modelName ?? targetModel}) ---\n${logContent}`,
|
|
543
|
+
}],
|
|
544
|
+
...(succeeded ? {} : { isError: true }),
|
|
545
|
+
};
|
|
546
|
+
}
|
|
547
|
+
const logTail = await readLogTail(finalState.logFile);
|
|
548
|
+
const logContent = succeeded ? logTail : await readFullLog(finalState.logFile);
|
|
549
|
+
const hasWarnings = succeeded && /^(Generation Warning|Compile Warning):/m.test(logTail);
|
|
550
|
+
const statusIcon = !succeeded ? '❌ Build FAILED' : hasWarnings ? '⚠️ Build succeeded with warnings' : '✅ Build succeeded';
|
|
551
|
+
const buildMode = finalState.fullBuild ? 'full build (target), incremental (deps)' : 'incremental';
|
|
552
|
+
const duration = finalState.endTime
|
|
553
|
+
? Math.round((new Date(finalState.endTime).getTime() - new Date(finalState.startTime).getTime()) / 1000)
|
|
554
|
+
: '?';
|
|
555
|
+
const structured = succeeded
|
|
556
|
+
? ''
|
|
557
|
+
: formatStructuredDiagnostics(parseXppcDiagnostics(await readWholeLog(finalState.logFile)));
|
|
558
|
+
return {
|
|
559
|
+
content: [{
|
|
560
|
+
type: 'text',
|
|
561
|
+
text: `${statusIcon} (${finalState.tool}, ${buildMode}, ${duration}s)\n\nModel: ${targetModel}\n\n` +
|
|
562
|
+
(structured ? `${structured}\n\n--- Raw log ---\n` : '') +
|
|
563
|
+
`${logContent || '(no output)'}`,
|
|
564
|
+
}],
|
|
565
|
+
...((!succeeded) ? { isError: true } : {}),
|
|
566
|
+
};
|
|
567
|
+
}
|
|
568
|
+
// ---------------------------------------------------------------------------
|
|
569
|
+
// Block until the build for `targetModel` reaches a non-running state, the
|
|
570
|
+
// tracked process is no longer alive, or `timeoutMs` elapses. Returns the
|
|
571
|
+
// final state when finished, or null when the timeout was hit.
|
|
572
|
+
// ---------------------------------------------------------------------------
|
|
573
|
+
async function waitForBuildCompletion(targetModel, customPackagesPath, timeoutMs) {
|
|
574
|
+
const deadline = Date.now() + timeoutMs;
|
|
575
|
+
// Poll roughly every second; xppc builds typically take many seconds to
|
|
576
|
+
// many minutes, so a 1 s cadence is fine and keeps responsiveness high.
|
|
577
|
+
const pollIntervalMs = 1000;
|
|
578
|
+
let lastState = null;
|
|
579
|
+
while (Date.now() < deadline) {
|
|
580
|
+
const state = await readBuildState(targetModel, customPackagesPath);
|
|
581
|
+
if (state) {
|
|
582
|
+
lastState = state;
|
|
583
|
+
if (state.status !== 'running')
|
|
584
|
+
return state;
|
|
585
|
+
// Process disappeared without writing a final state — give the close
|
|
586
|
+
// handler up to ~2 s to settle, then return whatever we have so the
|
|
587
|
+
// caller can surface a sensible "exited unexpectedly" message.
|
|
588
|
+
if (state.pid && !isProcessAlive(state.pid)) {
|
|
589
|
+
for (let i = 0; i < 4; i++) {
|
|
590
|
+
await new Promise(r => setTimeout(r, 500));
|
|
591
|
+
const refreshed = await readBuildState(targetModel, customPackagesPath);
|
|
592
|
+
if (refreshed && refreshed.status !== 'running')
|
|
593
|
+
return refreshed;
|
|
594
|
+
}
|
|
595
|
+
return state;
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
await new Promise(r => setTimeout(r, pollIntervalMs));
|
|
599
|
+
}
|
|
600
|
+
// Timed out — return null so the caller emits a "still running" snapshot.
|
|
601
|
+
return lastState && lastState.status !== 'running' ? lastState : null;
|
|
602
|
+
}
|
|
603
|
+
// ---------------------------------------------------------------------------
|
|
604
|
+
// Tool handler
|
|
605
|
+
// ---------------------------------------------------------------------------
|
|
606
|
+
export const buildProjectTool = async (params, _context) => {
|
|
607
|
+
try {
|
|
608
|
+
const force = params.force === true;
|
|
609
|
+
const fullBuild = params.fullBuild === true;
|
|
610
|
+
const buildReferencedModels = params.buildReferencedModels === true;
|
|
611
|
+
const configManager = getConfigManager();
|
|
612
|
+
await configManager.ensureLoaded();
|
|
613
|
+
// ------------------------------------------------------------------
|
|
614
|
+
// Resolve D365FO package paths
|
|
615
|
+
// Supports UDE (Unified Developer Experience) and CHE (Cloud-Hosted Env).
|
|
616
|
+
// ------------------------------------------------------------------
|
|
617
|
+
let customPackagesPath = null;
|
|
618
|
+
let microsoftPackagesPath = null;
|
|
619
|
+
let extraReferenceFolders = [];
|
|
620
|
+
// Priority 1: XPP config (UDE) — authoritative source for all paths
|
|
621
|
+
const xppConfig = await configManager.getActiveXppConfig();
|
|
622
|
+
if (xppConfig) {
|
|
623
|
+
customPackagesPath = xppConfig.customPackagesPath;
|
|
624
|
+
microsoftPackagesPath = xppConfig.microsoftPackagesPath;
|
|
625
|
+
extraReferenceFolders = xppConfig.referencePackagesPaths ?? [];
|
|
626
|
+
}
|
|
627
|
+
// Priority 2: configManager explicit methods (.mcp.json overrides)
|
|
628
|
+
if (!customPackagesPath)
|
|
629
|
+
customPackagesPath = await configManager.getCustomPackagesPath();
|
|
630
|
+
if (!microsoftPackagesPath)
|
|
631
|
+
microsoftPackagesPath = await configManager.getMicrosoftPackagesPath() ?? configManager.getPackagePath();
|
|
632
|
+
// Priority 3: CHE fallback — probe well-known PackagesLocalDirectory locations
|
|
633
|
+
if (!microsoftPackagesPath) {
|
|
634
|
+
for (const candidate of [
|
|
635
|
+
'C:\\AOSService\\PackagesLocalDirectory',
|
|
636
|
+
'K:\\AOSService\\PackagesLocalDirectory',
|
|
637
|
+
'J:\\AOSService\\PackagesLocalDirectory',
|
|
638
|
+
'I:\\AOSService\\PackagesLocalDirectory',
|
|
639
|
+
]) {
|
|
640
|
+
try {
|
|
641
|
+
await access(candidate);
|
|
642
|
+
microsoftPackagesPath = candidate;
|
|
643
|
+
break;
|
|
644
|
+
}
|
|
645
|
+
catch { /* next */ }
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
// In CHE, custom and Microsoft packages share the same PackagesLocalDirectory
|
|
649
|
+
if (!customPackagesPath && microsoftPackagesPath)
|
|
650
|
+
customPackagesPath = microsoftPackagesPath;
|
|
651
|
+
if (!customPackagesPath || !microsoftPackagesPath) {
|
|
652
|
+
return {
|
|
653
|
+
content: [{
|
|
654
|
+
type: 'text',
|
|
655
|
+
text: [
|
|
656
|
+
`❌ Cannot resolve D365FO package paths.`,
|
|
657
|
+
``,
|
|
658
|
+
`Custom packages path: ${customPackagesPath ?? '(not found)'}`,
|
|
659
|
+
`Microsoft packages path: ${microsoftPackagesPath ?? '(not found)'}`,
|
|
660
|
+
``,
|
|
661
|
+
`For UDE: ensure an XPP config is present at %LOCALAPPDATA%\\Microsoft\\Dynamics365\\XPPConfig\\`,
|
|
662
|
+
`For CHE: ensure PackagesLocalDirectory exists at C:\\AOSService\\PackagesLocalDirectory (or K:\\, J:\\, I:\\)`,
|
|
663
|
+
].join('\n'),
|
|
664
|
+
}],
|
|
665
|
+
isError: true,
|
|
666
|
+
};
|
|
667
|
+
}
|
|
668
|
+
// ------------------------------------------------------------------
|
|
669
|
+
// Resolve model name
|
|
670
|
+
// ------------------------------------------------------------------
|
|
671
|
+
let modelName = params.modelName || configManager.getModelName();
|
|
672
|
+
if (!modelName && params.projectPath) {
|
|
673
|
+
modelName = await getModelFromRnrproj(params.projectPath);
|
|
674
|
+
}
|
|
675
|
+
if (!modelName) {
|
|
676
|
+
return {
|
|
677
|
+
content: [{
|
|
678
|
+
type: 'text',
|
|
679
|
+
text: [
|
|
680
|
+
`❌ Cannot determine model name.`,
|
|
681
|
+
``,
|
|
682
|
+
`Provide modelName parameter, or configure it in .mcp.json / D365FO_MODEL_NAME env var.`,
|
|
683
|
+
].join('\n'),
|
|
684
|
+
}],
|
|
685
|
+
isError: true,
|
|
686
|
+
};
|
|
687
|
+
}
|
|
688
|
+
const targetModel = modelName;
|
|
689
|
+
// ------------------------------------------------------------------
|
|
690
|
+
// Check for an existing background build (keyed by targetModel)
|
|
691
|
+
// ------------------------------------------------------------------
|
|
692
|
+
const existingState = await readBuildState(targetModel, customPackagesPath);
|
|
693
|
+
if (existingState && !force) {
|
|
694
|
+
// If the caller requests a DIFFERENT build mode than what's cached (e.g. incremental → fullBuild),
|
|
695
|
+
// and the build is not currently running, discard the stale cached state and fall through
|
|
696
|
+
// to start a fresh build with the requested mode.
|
|
697
|
+
const buildModeChanged = existingState.status !== 'running' && fullBuild && !existingState.fullBuild;
|
|
698
|
+
if (buildModeChanged) {
|
|
699
|
+
await clearBuildState(targetModel, customPackagesPath);
|
|
700
|
+
// intentional fall-through to "start new build" below
|
|
701
|
+
}
|
|
702
|
+
else {
|
|
703
|
+
const alive = isProcessAlive(existingState.pid);
|
|
704
|
+
const logTail = await readLogTail(existingState.logFile);
|
|
705
|
+
if (existingState.status === 'running' && alive) {
|
|
706
|
+
const elapsed = Math.round((Date.now() - new Date(existingState.startTime).getTime()) / 1000);
|
|
707
|
+
const isQueued = !!(existingState.buildQueue && existingState.buildQueue.length > 1);
|
|
708
|
+
const queueProgress = isQueued
|
|
709
|
+
? `Building ${(existingState.queueIndex ?? 0) + 1}/${existingState.buildQueue.length}: ${existingState.modelName}`
|
|
710
|
+
: `Model: ${existingState.modelName}`;
|
|
711
|
+
const completedLine = (existingState.queueResults ?? []).length > 0
|
|
712
|
+
? '\nCompleted: ' + existingState.queueResults
|
|
713
|
+
.map(r => `${r.status === 'succeeded' ? '✅' : '❌'} ${r.modelName} (${r.duration}s)`)
|
|
714
|
+
.join(', ')
|
|
715
|
+
: '';
|
|
716
|
+
// When wait:true (default) and a build is already running for this
|
|
717
|
+
// model, attach to it and block until completion instead of returning
|
|
718
|
+
// a snapshot — this matches the "single call per build" contract.
|
|
719
|
+
const waitForFinish = params.wait !== false;
|
|
720
|
+
if (waitForFinish) {
|
|
721
|
+
const timeoutMs = (typeof params.waitTimeoutMs === 'number' && params.waitTimeoutMs > 0)
|
|
722
|
+
? params.waitTimeoutMs
|
|
723
|
+
: 30 * 60 * 1000;
|
|
724
|
+
const finalState = await waitForBuildCompletion(targetModel, customPackagesPath, timeoutMs);
|
|
725
|
+
if (finalState && finalState.status !== 'running') {
|
|
726
|
+
await clearBuildState(targetModel, customPackagesPath);
|
|
727
|
+
return await renderFinishedBuildResult(finalState, targetModel);
|
|
728
|
+
}
|
|
729
|
+
// Timed out — emit a "still running" snapshot so the caller can choose
|
|
730
|
+
// to extend the wait window with another call.
|
|
731
|
+
const tailLog = await readLogTail(existingState.logFile);
|
|
732
|
+
return {
|
|
733
|
+
content: [{
|
|
734
|
+
type: 'text',
|
|
735
|
+
text: `⏳ ${queueProgress} (PID: ${existingState.pid}, running ${elapsed}s; wait timeout reached)${completedLine}\n\n` +
|
|
736
|
+
`Build continues in background. Call again to collect the final result, ` +
|
|
737
|
+
`or pass waitTimeoutMs to extend the wait window.\n\n` +
|
|
738
|
+
`--- Latest log ---\n${tailLog}`,
|
|
739
|
+
}],
|
|
740
|
+
};
|
|
741
|
+
}
|
|
742
|
+
return {
|
|
743
|
+
content: [{
|
|
744
|
+
type: 'text',
|
|
745
|
+
text: `⏳ ${queueProgress} (PID: ${existingState.pid}, running ${elapsed}s)${completedLine}\n\nCall again to refresh.\n\n--- Latest log ---\n${logTail}`,
|
|
746
|
+
}],
|
|
747
|
+
};
|
|
748
|
+
}
|
|
749
|
+
if (existingState.status === 'running' && !alive) {
|
|
750
|
+
// Process has exited but the async close handler may still be writing the final state.
|
|
751
|
+
// Wait up to 2 s for it to settle.
|
|
752
|
+
let finalState = existingState;
|
|
753
|
+
for (let i = 0; i < 4; i++) {
|
|
754
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
755
|
+
const refreshed = await readBuildState(targetModel, customPackagesPath);
|
|
756
|
+
if (refreshed && refreshed.status !== 'running') {
|
|
757
|
+
finalState = refreshed;
|
|
758
|
+
break;
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
if (finalState.status !== 'running') {
|
|
762
|
+
existingState.status = finalState.status;
|
|
763
|
+
existingState.exitCode = finalState.exitCode;
|
|
764
|
+
existingState.endTime = finalState.endTime;
|
|
765
|
+
existingState.queueResults = finalState.queueResults;
|
|
766
|
+
}
|
|
767
|
+
else {
|
|
768
|
+
await clearBuildState(targetModel, customPackagesPath);
|
|
769
|
+
return {
|
|
770
|
+
content: [{
|
|
771
|
+
type: 'text',
|
|
772
|
+
text: `❌ Build process (PID: ${existingState.pid}) exited unexpectedly without reporting a result.\n\nModel: ${targetModel}\n\n--- Log ---\n${logTail}`,
|
|
773
|
+
}],
|
|
774
|
+
isError: true,
|
|
775
|
+
};
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
// Build finished — return result and clear state
|
|
779
|
+
await clearBuildState(targetModel, customPackagesPath);
|
|
780
|
+
return await renderFinishedBuildResult(existingState, targetModel);
|
|
781
|
+
} // end else (buildModeChanged)
|
|
782
|
+
}
|
|
783
|
+
// ------------------------------------------------------------------
|
|
784
|
+
// force=true: kill existing processes and clear state
|
|
785
|
+
// ------------------------------------------------------------------
|
|
786
|
+
if (force) {
|
|
787
|
+
await buildLog('WARN', `force=true — killing orphaned build processes for model: ${targetModel}`);
|
|
788
|
+
if (existingState?.pid) {
|
|
789
|
+
try {
|
|
790
|
+
process.kill(existingState.pid, 'SIGTERM');
|
|
791
|
+
}
|
|
792
|
+
catch { /* already gone */ }
|
|
793
|
+
}
|
|
794
|
+
await killOrphanedBuildProcesses();
|
|
795
|
+
await clearBuildState(targetModel, customPackagesPath);
|
|
796
|
+
await forceReleaseLock(`build:${targetModel}`);
|
|
797
|
+
}
|
|
798
|
+
// ------------------------------------------------------------------
|
|
799
|
+
// Find xppc.exe
|
|
800
|
+
// ------------------------------------------------------------------
|
|
801
|
+
const xppcExe = await findXppcExe(microsoftPackagesPath);
|
|
802
|
+
if (!xppcExe) {
|
|
803
|
+
return {
|
|
804
|
+
content: [{
|
|
805
|
+
type: 'text',
|
|
806
|
+
text: `❌ Cannot find xppc.exe.\n\nLooked in: ${microsoftPackagesPath}\\bin\\xppc.exe\n\nEnsure the D365FO UDE tools are installed.`,
|
|
807
|
+
}],
|
|
808
|
+
isError: true,
|
|
809
|
+
};
|
|
810
|
+
}
|
|
811
|
+
// ------------------------------------------------------------------
|
|
812
|
+
// Resolve build queue
|
|
813
|
+
// ------------------------------------------------------------------
|
|
814
|
+
let buildQueue;
|
|
815
|
+
if (buildReferencedModels) {
|
|
816
|
+
buildQueue = await resolveBuildQueue(targetModel, customPackagesPath, microsoftPackagesPath);
|
|
817
|
+
await buildLog('INFO', `Build queue (${buildQueue.length}): ${buildQueue.join(' → ')}`);
|
|
818
|
+
}
|
|
819
|
+
else {
|
|
820
|
+
buildQueue = [targetModel];
|
|
821
|
+
}
|
|
822
|
+
const firstModel = buildQueue[0];
|
|
823
|
+
const firstLogFile = logFilePath(targetModel, 0, customPackagesPath);
|
|
824
|
+
// ------------------------------------------------------------------
|
|
825
|
+
// Log build parameters
|
|
826
|
+
// ------------------------------------------------------------------
|
|
827
|
+
await buildLog('INFO', `Starting build — model: ${targetModel} | fullBuild: ${fullBuild} | queue: ${buildQueue.length}`);
|
|
828
|
+
await buildLog('INFO', ` xppc.exe: ${xppcExe}`);
|
|
829
|
+
await buildLog('INFO', ` customPackagesPath: ${customPackagesPath}`);
|
|
830
|
+
await buildLog('INFO', ` microsoftPackagesPath: ${microsoftPackagesPath}`);
|
|
831
|
+
if (extraReferenceFolders.length > 0) {
|
|
832
|
+
await buildLog('INFO', ` extraReferenceFolders: ${extraReferenceFolders.join(', ')}`);
|
|
833
|
+
}
|
|
834
|
+
// ------------------------------------------------------------------
|
|
835
|
+
// Build context (shared across the entire queue)
|
|
836
|
+
// ------------------------------------------------------------------
|
|
837
|
+
const ctx = {
|
|
838
|
+
xppcExe,
|
|
839
|
+
customPackagesPath,
|
|
840
|
+
microsoftPackagesPath,
|
|
841
|
+
extraReferenceFolders,
|
|
842
|
+
};
|
|
843
|
+
// ------------------------------------------------------------------
|
|
844
|
+
// Initial state
|
|
845
|
+
// ------------------------------------------------------------------
|
|
846
|
+
const initState = {
|
|
847
|
+
pid: 0, // updated by spawnXppcForState
|
|
848
|
+
modelName: firstModel,
|
|
849
|
+
targetModel,
|
|
850
|
+
tool: 'xppc.exe',
|
|
851
|
+
startTime: new Date().toISOString(),
|
|
852
|
+
logFile: firstLogFile,
|
|
853
|
+
status: 'running',
|
|
854
|
+
fullBuild,
|
|
855
|
+
buildQueue: buildQueue.length > 1 ? buildQueue : undefined,
|
|
856
|
+
queueIndex: buildQueue.length > 1 ? 0 : undefined,
|
|
857
|
+
queueResults: [],
|
|
858
|
+
};
|
|
859
|
+
await writeBuildState(initState, customPackagesPath);
|
|
860
|
+
const pid = await spawnXppcForState(ctx, initState);
|
|
861
|
+
// ------------------------------------------------------------------
|
|
862
|
+
// Return "build started" message OR wait for completion
|
|
863
|
+
// ------------------------------------------------------------------
|
|
864
|
+
// When deps are included: full build applies only to the target model
|
|
865
|
+
const modeLabel = fullBuild
|
|
866
|
+
? (buildQueue.length > 1 ? 'Full build (target), incremental (deps)' : 'Full build')
|
|
867
|
+
: 'Incremental build';
|
|
868
|
+
const queueDetail = buildQueue.length > 1
|
|
869
|
+
? `\n\nBuilding ${buildQueue.length} models in order:\n` +
|
|
870
|
+
buildQueue.map((m, i) => ` ${i + 1}. ${m}${m === targetModel ? ' (target)' : ' (dependency)'}`).join('\n')
|
|
871
|
+
: '';
|
|
872
|
+
// wait defaults to true — single call returns the final result. When the
|
|
873
|
+
// caller passes wait:false explicitly we keep the legacy fire-and-forget
|
|
874
|
+
// behaviour for compatibility with callers that intentionally poll.
|
|
875
|
+
const waitForFinish = params.wait !== false;
|
|
876
|
+
if (waitForFinish) {
|
|
877
|
+
const timeoutMs = (typeof params.waitTimeoutMs === 'number' && params.waitTimeoutMs > 0)
|
|
878
|
+
? params.waitTimeoutMs
|
|
879
|
+
: 30 * 60 * 1000; // 30 minutes default — covers full builds with referenced models
|
|
880
|
+
const finalState = await waitForBuildCompletion(targetModel, customPackagesPath, timeoutMs);
|
|
881
|
+
if (finalState && finalState.status !== 'running') {
|
|
882
|
+
await clearBuildState(targetModel, customPackagesPath);
|
|
883
|
+
return await renderFinishedBuildResult(finalState, targetModel);
|
|
884
|
+
}
|
|
885
|
+
// Timed out — leave the build running so a follow-up call can collect it.
|
|
886
|
+
const elapsed = Math.round((Date.now() - new Date(initState.startTime).getTime()) / 1000);
|
|
887
|
+
const tailLog = await readLogTail(firstLogFile);
|
|
888
|
+
return {
|
|
889
|
+
content: [{
|
|
890
|
+
type: 'text',
|
|
891
|
+
text: [
|
|
892
|
+
`⏳ ${modeLabel} still running after ${elapsed}s (timeout reached, build continues in background)`,
|
|
893
|
+
``,
|
|
894
|
+
`Target: ${targetModel}${queueDetail}`,
|
|
895
|
+
`Log: ${firstLogFile}`,
|
|
896
|
+
``,
|
|
897
|
+
`Call **build_d365fo_project** again to collect the final result. ` +
|
|
898
|
+
`Or pass waitTimeoutMs to extend the wait window in a single call.`,
|
|
899
|
+
``,
|
|
900
|
+
`--- Latest log ---`,
|
|
901
|
+
tailLog,
|
|
902
|
+
].join('\n'),
|
|
903
|
+
}],
|
|
904
|
+
};
|
|
905
|
+
}
|
|
906
|
+
// Legacy fire-and-forget mode: return immediately after spawning.
|
|
907
|
+
return {
|
|
908
|
+
content: [{
|
|
909
|
+
type: 'text',
|
|
910
|
+
text: [
|
|
911
|
+
`🔨 ${modeLabel} started (xppc.exe PID: ${pid})`,
|
|
912
|
+
``,
|
|
913
|
+
`Target: ${targetModel}${queueDetail}`,
|
|
914
|
+
`Log: ${firstLogFile}`,
|
|
915
|
+
``,
|
|
916
|
+
`Call **build_d365fo_project** again to check status and see output.`,
|
|
917
|
+
].join('\n'),
|
|
918
|
+
}],
|
|
919
|
+
};
|
|
920
|
+
}
|
|
921
|
+
catch (error) {
|
|
922
|
+
await buildLog('ERROR', `Unhandled error in build_d365fo_project: ${error?.message}`);
|
|
923
|
+
return {
|
|
924
|
+
content: [{ type: 'text', text: `❌ Internal error: ${error?.message ?? String(error)}` }],
|
|
925
|
+
isError: true,
|
|
926
|
+
};
|
|
927
|
+
}
|
|
928
|
+
};
|
|
929
|
+
//# sourceMappingURL=buildProject.js.map
|