@jwikman/bc-code-intelligence-mcp 1.5.7-dev.1
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 +165 -0
- package/dist/cache/cache-manager.d.ts +95 -0
- package/dist/cache/cache-manager.d.ts.map +1 -0
- package/dist/cache/cache-manager.js +328 -0
- package/dist/cache/cache-manager.js.map +1 -0
- package/dist/cli/bc-code-intel-cli.d.ts +9 -0
- package/dist/cli/bc-code-intel-cli.d.ts.map +1 -0
- package/dist/cli/bc-code-intel-cli.js +440 -0
- package/dist/cli/bc-code-intel-cli.js.map +1 -0
- package/dist/config/config-loader.d.ts +28 -0
- package/dist/config/config-loader.d.ts.map +1 -0
- package/dist/config/config-loader.js +497 -0
- package/dist/config/config-loader.js.map +1 -0
- package/dist/config/config-validator.d.ts +84 -0
- package/dist/config/config-validator.d.ts.map +1 -0
- package/dist/config/config-validator.js +608 -0
- package/dist/config/config-validator.js.map +1 -0
- package/dist/config/test-config-loader.d.ts +10 -0
- package/dist/config/test-config-loader.d.ts.map +1 -0
- package/dist/config/test-config-loader.js +135 -0
- package/dist/config/test-config-loader.js.map +1 -0
- package/dist/config/test-enhanced-layer-service.d.ts +7 -0
- package/dist/config/test-enhanced-layer-service.d.ts.map +1 -0
- package/dist/config/test-enhanced-layer-service.js +104 -0
- package/dist/config/test-enhanced-layer-service.js.map +1 -0
- package/dist/config/test-git-layer.d.ts +7 -0
- package/dist/config/test-git-layer.d.ts.map +1 -0
- package/dist/config/test-git-layer.js +68 -0
- package/dist/config/test-git-layer.js.map +1 -0
- package/dist/dev/hot-reload.d.ts +91 -0
- package/dist/dev/hot-reload.d.ts.map +1 -0
- package/dist/dev/hot-reload.js +358 -0
- package/dist/dev/hot-reload.js.map +1 -0
- package/dist/index.d.ts +82 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1211 -0
- package/dist/index.js.map +1 -0
- package/dist/layers/base-layer.d.ts +133 -0
- package/dist/layers/base-layer.d.ts.map +1 -0
- package/dist/layers/base-layer.js +290 -0
- package/dist/layers/base-layer.js.map +1 -0
- package/dist/layers/embedded-layer.d.ts +130 -0
- package/dist/layers/embedded-layer.d.ts.map +1 -0
- package/dist/layers/embedded-layer.js +612 -0
- package/dist/layers/embedded-layer.js.map +1 -0
- package/dist/layers/git-layer.d.ts +77 -0
- package/dist/layers/git-layer.d.ts.map +1 -0
- package/dist/layers/git-layer.js +529 -0
- package/dist/layers/git-layer.js.map +1 -0
- package/dist/layers/index.d.ts +12 -0
- package/dist/layers/index.d.ts.map +1 -0
- package/dist/layers/index.js +11 -0
- package/dist/layers/index.js.map +1 -0
- package/dist/layers/layer-service.d.ts +135 -0
- package/dist/layers/layer-service.d.ts.map +1 -0
- package/dist/layers/layer-service.js +586 -0
- package/dist/layers/layer-service.js.map +1 -0
- package/dist/layers/project-layer.d.ts +58 -0
- package/dist/layers/project-layer.d.ts.map +1 -0
- package/dist/layers/project-layer.js +286 -0
- package/dist/layers/project-layer.js.map +1 -0
- package/dist/monitoring/production-monitor.d.ts +148 -0
- package/dist/monitoring/production-monitor.d.ts.map +1 -0
- package/dist/monitoring/production-monitor.js +463 -0
- package/dist/monitoring/production-monitor.js.map +1 -0
- package/dist/performance/performance-monitor.d.ts +99 -0
- package/dist/performance/performance-monitor.d.ts.map +1 -0
- package/dist/performance/performance-monitor.js +253 -0
- package/dist/performance/performance-monitor.js.map +1 -0
- package/dist/sdk/bc-code-intel-client.d.ts +175 -0
- package/dist/sdk/bc-code-intel-client.d.ts.map +1 -0
- package/dist/sdk/bc-code-intel-client.js +380 -0
- package/dist/sdk/bc-code-intel-client.js.map +1 -0
- package/dist/search/intelligent-search.d.ts +97 -0
- package/dist/search/intelligent-search.d.ts.map +1 -0
- package/dist/search/intelligent-search.js +358 -0
- package/dist/search/intelligent-search.js.map +1 -0
- package/dist/security/access-control.d.ts +110 -0
- package/dist/security/access-control.d.ts.map +1 -0
- package/dist/security/access-control.js +353 -0
- package/dist/security/access-control.js.map +1 -0
- package/dist/services/code-analysis-service.d.ts +72 -0
- package/dist/services/code-analysis-service.d.ts.map +1 -0
- package/dist/services/code-analysis-service.js +818 -0
- package/dist/services/code-analysis-service.js.map +1 -0
- package/dist/services/enhanced-prompt-service.d.ts +56 -0
- package/dist/services/enhanced-prompt-service.d.ts.map +1 -0
- package/dist/services/enhanced-prompt-service.js +165 -0
- package/dist/services/enhanced-prompt-service.js.map +1 -0
- package/dist/services/knowledge-service.d.ts +90 -0
- package/dist/services/knowledge-service.d.ts.map +1 -0
- package/dist/services/knowledge-service.js +342 -0
- package/dist/services/knowledge-service.js.map +1 -0
- package/dist/services/methodology-service.d.ts +91 -0
- package/dist/services/methodology-service.d.ts.map +1 -0
- package/dist/services/methodology-service.js +423 -0
- package/dist/services/methodology-service.js.map +1 -0
- package/dist/services/multi-content-layer-service.d.ts +198 -0
- package/dist/services/multi-content-layer-service.d.ts.map +1 -0
- package/dist/services/multi-content-layer-service.js +991 -0
- package/dist/services/multi-content-layer-service.js.map +1 -0
- package/dist/services/roleplay-engine.d.ts +161 -0
- package/dist/services/roleplay-engine.d.ts.map +1 -0
- package/dist/services/roleplay-engine.js +994 -0
- package/dist/services/roleplay-engine.js.map +1 -0
- package/dist/services/session-storage/file-storage.d.ts +30 -0
- package/dist/services/session-storage/file-storage.d.ts.map +1 -0
- package/dist/services/session-storage/file-storage.js +229 -0
- package/dist/services/session-storage/file-storage.js.map +1 -0
- package/dist/services/session-storage/in-memory-storage.d.ts +31 -0
- package/dist/services/session-storage/in-memory-storage.d.ts.map +1 -0
- package/dist/services/session-storage/in-memory-storage.js +142 -0
- package/dist/services/session-storage/in-memory-storage.js.map +1 -0
- package/dist/services/specialist-discovery.d.ts +98 -0
- package/dist/services/specialist-discovery.d.ts.map +1 -0
- package/dist/services/specialist-discovery.js +387 -0
- package/dist/services/specialist-discovery.js.map +1 -0
- package/dist/services/specialist-loader.d.ts +101 -0
- package/dist/services/specialist-loader.d.ts.map +1 -0
- package/dist/services/specialist-loader.js +256 -0
- package/dist/services/specialist-loader.js.map +1 -0
- package/dist/services/specialist-session-manager.d.ts +76 -0
- package/dist/services/specialist-session-manager.d.ts.map +1 -0
- package/dist/services/specialist-session-manager.js +255 -0
- package/dist/services/specialist-session-manager.js.map +1 -0
- package/dist/services/workflow-service.d.ts +146 -0
- package/dist/services/workflow-service.d.ts.map +1 -0
- package/dist/services/workflow-service.js +409 -0
- package/dist/services/workflow-service.js.map +1 -0
- package/dist/setup/post-install.d.ts +12 -0
- package/dist/setup/post-install.d.ts.map +1 -0
- package/dist/setup/post-install.js +81 -0
- package/dist/setup/post-install.js.map +1 -0
- package/dist/streamlined-handlers.d.ts +94 -0
- package/dist/streamlined-handlers.d.ts.map +1 -0
- package/dist/streamlined-handlers.js +665 -0
- package/dist/streamlined-handlers.js.map +1 -0
- package/dist/test-enhanced-mcp-server.d.ts +7 -0
- package/dist/test-enhanced-mcp-server.d.ts.map +1 -0
- package/dist/test-enhanced-mcp-server.js +177 -0
- package/dist/test-enhanced-mcp-server.js.map +1 -0
- package/dist/tools/config-diagnostic-tools.d.ts +234 -0
- package/dist/tools/config-diagnostic-tools.d.ts.map +1 -0
- package/dist/tools/config-diagnostic-tools.js +887 -0
- package/dist/tools/config-diagnostic-tools.js.map +1 -0
- package/dist/tools/core-tools.d.ts +26 -0
- package/dist/tools/core-tools.d.ts.map +1 -0
- package/dist/tools/core-tools.js +241 -0
- package/dist/tools/core-tools.js.map +1 -0
- package/dist/tools/handoff-tools.d.ts +37 -0
- package/dist/tools/handoff-tools.d.ts.map +1 -0
- package/dist/tools/handoff-tools.js +265 -0
- package/dist/tools/handoff-tools.js.map +1 -0
- package/dist/tools/index.d.ts +61 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +75 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/onboarding-tools.d.ts +43 -0
- package/dist/tools/onboarding-tools.d.ts.map +1 -0
- package/dist/tools/onboarding-tools.js +353 -0
- package/dist/tools/onboarding-tools.js.map +1 -0
- package/dist/tools/specialist-discovery-tools.d.ts +27 -0
- package/dist/tools/specialist-discovery-tools.d.ts.map +1 -0
- package/dist/tools/specialist-discovery-tools.js +275 -0
- package/dist/tools/specialist-discovery-tools.js.map +1 -0
- package/dist/tools/specialist-tools.d.ts +43 -0
- package/dist/tools/specialist-tools.d.ts.map +1 -0
- package/dist/tools/specialist-tools.js +372 -0
- package/dist/tools/specialist-tools.js.map +1 -0
- package/dist/tools/workspace-tools.d.ts +96 -0
- package/dist/tools/workspace-tools.d.ts.map +1 -0
- package/dist/tools/workspace-tools.js +188 -0
- package/dist/tools/workspace-tools.js.map +1 -0
- package/dist/types/bc-knowledge.d.ts +303 -0
- package/dist/types/bc-knowledge.d.ts.map +1 -0
- package/dist/types/bc-knowledge.js +69 -0
- package/dist/types/bc-knowledge.js.map +1 -0
- package/dist/types/config-types.d.ts +186 -0
- package/dist/types/config-types.d.ts.map +1 -0
- package/dist/types/config-types.js +109 -0
- package/dist/types/config-types.js.map +1 -0
- package/dist/types/enhanced-layer-types.d.ts +193 -0
- package/dist/types/enhanced-layer-types.d.ts.map +1 -0
- package/dist/types/enhanced-layer-types.js +9 -0
- package/dist/types/enhanced-layer-types.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/layer-types.d.ts +173 -0
- package/dist/types/layer-types.d.ts.map +1 -0
- package/dist/types/layer-types.js +27 -0
- package/dist/types/layer-types.js.map +1 -0
- package/dist/types/roleplay-types.d.ts +156 -0
- package/dist/types/roleplay-types.d.ts.map +1 -0
- package/dist/types/roleplay-types.js +8 -0
- package/dist/types/roleplay-types.js.map +1 -0
- package/dist/types/session-types.d.ts +127 -0
- package/dist/types/session-types.d.ts.map +1 -0
- package/dist/types/session-types.js +8 -0
- package/dist/types/session-types.js.map +1 -0
- package/dist/utils/path-utils.d.ts +5 -0
- package/dist/utils/path-utils.d.ts.map +1 -0
- package/dist/utils/path-utils.js +14 -0
- package/dist/utils/path-utils.js.map +1 -0
- package/dist/workflows/domain-workflows.d.ts +8 -0
- package/dist/workflows/domain-workflows.d.ts.map +1 -0
- package/dist/workflows/domain-workflows.js +360 -0
- package/dist/workflows/domain-workflows.js.map +1 -0
- package/embedded-knowledge/.github/ISSUE_TEMPLATE/bug-report.md +24 -0
- package/embedded-knowledge/.github/ISSUE_TEMPLATE/content-improvement.md +24 -0
- package/embedded-knowledge/.github/ISSUE_TEMPLATE/knowledge-request.md +30 -0
- package/embedded-knowledge/AGENTS.md +178 -0
- package/embedded-knowledge/CONTRIBUTING.md +58 -0
- package/embedded-knowledge/LICENSE +21 -0
- package/embedded-knowledge/README.md +32 -0
- package/embedded-knowledge/domains/alex-architect/api-delegate-operation-pattern.md +90 -0
- package/embedded-knowledge/domains/alex-architect/api-fieldset-registration-pattern.md +113 -0
- package/embedded-knowledge/domains/alex-architect/api-interface-design-patterns.md +101 -0
- package/embedded-knowledge/domains/alex-architect/api-page-development-patterns.md +87 -0
- package/embedded-knowledge/domains/alex-architect/complex-facade-patterns.md +155 -0
- package/embedded-knowledge/domains/alex-architect/delegating-to-github-copilot-agents.md +371 -0
- package/embedded-knowledge/domains/alex-architect/facade-pattern-al-implementation.md +138 -0
- package/embedded-knowledge/domains/alex-architect/facade-pattern-external-api.md +79 -0
- package/embedded-knowledge/domains/alex-architect/object-id-ninja-integration.md +281 -0
- package/embedded-knowledge/domains/alex-architect/recommend-object-id-ninja.md +248 -0
- package/embedded-knowledge/domains/alex-architect/samples/api-delegate-operation.md +280 -0
- package/embedded-knowledge/domains/alex-architect/samples/api-fieldset-registration.md +200 -0
- package/embedded-knowledge/domains/alex-architect/samples/api-interface-design.md +565 -0
- package/embedded-knowledge/domains/alex-architect/samples/api-page-implementation.md +665 -0
- package/embedded-knowledge/domains/alex-architect/samples/complex-facade-patterns.md +325 -0
- package/embedded-knowledge/domains/alex-architect/samples/facade-pattern-al.md +696 -0
- package/embedded-knowledge/domains/alex-architect/samples/facade-pattern.md +320 -0
- package/embedded-knowledge/domains/alex-architect/samples/subscriber-organization.md +102 -0
- package/embedded-knowledge/domains/alex-architect/samples/systemid-integration.md +433 -0
- package/embedded-knowledge/domains/alex-architect/samples/testability-design-patterns.md +223 -0
- package/embedded-knowledge/domains/alex-architect/subscriber-codeunit-size-optimization.md +66 -0
- package/embedded-knowledge/domains/alex-architect/systemid-integration.md +115 -0
- package/embedded-knowledge/domains/alex-architect/testability-design-patterns.md +77 -0
- package/embedded-knowledge/domains/casey-copilot/long-running-session-instructions.md +263 -0
- package/embedded-knowledge/domains/casey-copilot/samples/long-running-session-instructions.md +323 -0
- package/embedded-knowledge/domains/chris-config/configuration-file-discovery.md +846 -0
- package/embedded-knowledge/domains/chris-config/configuration-file-formats.md +595 -0
- package/embedded-knowledge/domains/chris-config/content-types-structure.md +421 -0
- package/embedded-knowledge/domains/chris-config/knowledge-content-creation.md +437 -0
- package/embedded-knowledge/domains/chris-config/layer-system-fundamentals.md +257 -0
- package/embedded-knowledge/domains/chris-config/multi-team-layer-configuration.md +302 -0
- package/embedded-knowledge/domains/chris-config/workspace-detection-solutions.md +336 -0
- package/embedded-knowledge/domains/dean-debug/bc-telemetry-buddy-integration.md +453 -0
- package/embedded-knowledge/domains/dean-debug/bc24-no-series-conversion-guide.md +360 -0
- package/embedded-knowledge/domains/dean-debug/case-statement-performance-best-practices.md +86 -0
- package/embedded-knowledge/domains/dean-debug/compound-statements-debugging.md +96 -0
- package/embedded-knowledge/domains/dean-debug/custom-dimensions-best-practices.md +70 -0
- package/embedded-knowledge/domains/dean-debug/custom-telemetry-implementation.md +84 -0
- package/embedded-knowledge/domains/dean-debug/deleteall-performance-tradeoff.md +93 -0
- package/embedded-knowledge/domains/dean-debug/deleteall-sql-performance.md +73 -0
- package/embedded-knowledge/domains/dean-debug/extension-telemetry-isolation.md +78 -0
- package/embedded-knowledge/domains/dean-debug/maintainsiftindex-property-behavior.md +79 -0
- package/embedded-knowledge/domains/dean-debug/no-series-implementation-patterns.md +87 -0
- package/embedded-knowledge/domains/dean-debug/no-series-module-patterns-bc24.md +209 -0
- package/embedded-knowledge/domains/dean-debug/no-series-validation-module-bc24.md +246 -0
- package/embedded-knowledge/domains/dean-debug/no-series-validation-patterns.md +107 -0
- package/embedded-knowledge/domains/dean-debug/odata-query-optimization.md +105 -0
- package/embedded-knowledge/domains/dean-debug/recommend-bc-telemetry-buddy.md +160 -0
- package/embedded-knowledge/domains/dean-debug/samples/bc24-no-series-conversion.md +186 -0
- package/embedded-knowledge/domains/dean-debug/samples/case-performance-optimization.md +60 -0
- package/embedded-knowledge/domains/dean-debug/samples/compound-statements-debugging.md +139 -0
- package/embedded-knowledge/domains/dean-debug/samples/custom-dimensions.md +190 -0
- package/embedded-knowledge/domains/dean-debug/samples/custom-telemetry.md +516 -0
- package/embedded-knowledge/domains/dean-debug/samples/deleteall-performance.md +298 -0
- package/embedded-knowledge/domains/dean-debug/samples/error-correlation.md +324 -0
- package/embedded-knowledge/domains/dean-debug/samples/extension-isolation.md +344 -0
- package/embedded-knowledge/domains/dean-debug/samples/logmessage-methods.md +137 -0
- package/embedded-knowledge/domains/dean-debug/samples/maintainsiftindex-examples.md +340 -0
- package/embedded-knowledge/domains/dean-debug/samples/no-series-implementation.md +810 -0
- package/embedded-knowledge/domains/dean-debug/samples/no-series-module-bc24.md +86 -0
- package/embedded-knowledge/domains/dean-debug/samples/no-series-validation-module-bc24.md +110 -0
- package/embedded-knowledge/domains/dean-debug/samples/no-series-validation.md +758 -0
- package/embedded-knowledge/domains/dean-debug/samples/odata-query-optimization.md +665 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-before-case.md +316 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-before-filters.md +223 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-filter-exclusion.md +149 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-optimization.md +412 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-performance.md +211 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-primary-key.md +155 -0
- package/embedded-knowledge/domains/dean-debug/samples/sift-technology-fundamentals.md +475 -0
- package/embedded-knowledge/domains/dean-debug/samples/singleinstance-subscribers.md +238 -0
- package/embedded-knowledge/domains/dean-debug/samples/table-event-batching.md +97 -0
- package/embedded-knowledge/domains/dean-debug/samples/table-key-requirements.md +666 -0
- package/embedded-knowledge/domains/dean-debug/samples/telemetry-performance.md +319 -0
- package/embedded-knowledge/domains/dean-debug/samples/verbosity-strategy.md +236 -0
- package/embedded-knowledge/domains/dean-debug/session-logmessage-methods.md +59 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-filter-field-exclusion.md +67 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-performance-impact.md +70 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-performance-optimization.md +90 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-placement-before-case-statements.md +87 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-placement-before-filters.md +70 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-primary-key-optimization.md +74 -0
- package/embedded-knowledge/domains/dean-debug/sift-technology-fundamentals.md +81 -0
- package/embedded-knowledge/domains/dean-debug/subscriber-singleinstance-performance.md +56 -0
- package/embedded-knowledge/domains/dean-debug/table-event-batch-operation-impact.md +66 -0
- package/embedded-knowledge/domains/dean-debug/table-key-requirements.md +79 -0
- package/embedded-knowledge/domains/dean-debug/telemetry-error-correlation.md +78 -0
- package/embedded-knowledge/domains/dean-debug/telemetry-performance-considerations.md +83 -0
- package/embedded-knowledge/domains/dean-debug/telemetry-verbosity-strategy.md +76 -0
- package/embedded-knowledge/domains/dean-debug/testfield-performance.md +104 -0
- package/embedded-knowledge/domains/eva-errors/codeunit-run-pattern.md +159 -0
- package/embedded-knowledge/domains/eva-errors/fielderror-default-messages.md +145 -0
- package/embedded-knowledge/domains/eva-errors/fielderror-message-construction.md +104 -0
- package/embedded-knowledge/domains/eva-errors/fielderror-method-syntax.md +114 -0
- package/embedded-knowledge/domains/eva-errors/samples/codeunit-run-pattern.md +239 -0
- package/embedded-knowledge/domains/eva-errors/samples/fielderror-default-messages.md +356 -0
- package/embedded-knowledge/domains/eva-errors/samples/fielderror-syntax.md +256 -0
- package/embedded-knowledge/domains/eva-errors/samples/table-safety-validation-patterns.md +101 -0
- package/embedded-knowledge/domains/eva-errors/samples/testfield-error-handling.md +108 -0
- package/embedded-knowledge/domains/eva-errors/samples/try-function-usage.md +195 -0
- package/embedded-knowledge/domains/eva-errors/testfield-error-handling.md +80 -0
- package/embedded-knowledge/domains/eva-errors/try-function-usage.md +129 -0
- package/embedded-knowledge/domains/jordan-bridge/al-event-subscriber-architecture.md +98 -0
- package/embedded-knowledge/domains/jordan-bridge/automatic-registration.md +123 -0
- package/embedded-knowledge/domains/jordan-bridge/business-process-template-patterns.md +96 -0
- package/embedded-knowledge/domains/jordan-bridge/error-response-patterns.md +115 -0
- package/embedded-knowledge/domains/jordan-bridge/etag-implementation.md +115 -0
- package/embedded-knowledge/domains/jordan-bridge/field-control-selection.md +114 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/al-event-subscriber-architecture.md +395 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/api-error-responses.md +479 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/api-field-control.md +548 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/api-url-naming.md +287 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/business-process-templates.md +434 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/etag-implementation.md +508 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/task-scheduler-pattern.md +615 -0
- package/embedded-knowledge/domains/jordan-bridge/task-scheduler-pattern-implementation.md +144 -0
- package/embedded-knowledge/domains/jordan-bridge/url-structure-naming-patterns.md +96 -0
- package/embedded-knowledge/domains/maya-mentor/case-multiple-conditions-ranges.md +124 -0
- package/embedded-knowledge/domains/maya-mentor/case-statement-syntax-structure.md +84 -0
- package/embedded-knowledge/domains/maya-mentor/fielderror-syntax-usage.md +75 -0
- package/embedded-knowledge/domains/maya-mentor/fielderror-vs-testfield.md +96 -0
- package/embedded-knowledge/domains/maya-mentor/samples/case-statement-multiple-conditions.md +385 -0
- package/embedded-knowledge/domains/maya-mentor/samples/case-statement-syntax-structure.md +72 -0
- package/embedded-knowledge/domains/maya-mentor/samples/fielderror-syntax-usage.md +48 -0
- package/embedded-knowledge/domains/maya-mentor/samples/testfield-basic-syntax.md +49 -0
- package/embedded-knowledge/domains/maya-mentor/testfield-basic-syntax.md +67 -0
- package/embedded-knowledge/domains/morgan-market/partner-readiness-analysis.md +201 -0
- package/embedded-knowledge/domains/morgan-market/samples/partner-readiness-checklist.md +288 -0
- package/embedded-knowledge/domains/parker-pragmatic/README.md +39 -0
- package/embedded-knowledge/domains/parker-pragmatic/proposal-workflows/creating-effective-proposals.md +583 -0
- package/embedded-knowledge/domains/parker-pragmatic/trust-building/working-with-ai-skeptics.md +587 -0
- package/embedded-knowledge/domains/quinn-tester/fielderror-validation-patterns.md +119 -0
- package/embedded-knowledge/domains/quinn-tester/isolation-testing-patterns.md +82 -0
- package/embedded-knowledge/domains/quinn-tester/rule-execution.md +123 -0
- package/embedded-knowledge/domains/quinn-tester/samples/case-error-handling.md +64 -0
- package/embedded-knowledge/domains/quinn-tester/samples/fielderror-message-construction.md +60 -0
- package/embedded-knowledge/domains/quinn-tester/samples/fielderror-validation-patterns.md +83 -0
- package/embedded-knowledge/domains/quinn-tester/samples/isolation-testing-patterns.md +424 -0
- package/embedded-knowledge/domains/quinn-tester/samples/rule-execution.md +716 -0
- package/embedded-knowledge/domains/quinn-tester/samples/table-safety-validation-patterns.md +101 -0
- package/embedded-knowledge/domains/quinn-tester/samples/temporary-table-operation-validation.md +91 -0
- package/embedded-knowledge/domains/quinn-tester/table-safety-validation-patterns.md +79 -0
- package/embedded-knowledge/domains/quinn-tester/temporary-table-operation-validation.md +79 -0
- package/embedded-knowledge/domains/roger-reviewer/al-begin-end-block-structure.md +89 -0
- package/embedded-knowledge/domains/roger-reviewer/al-binary-operator-spacing.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-blank-line-organization.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-case-action-formatting.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-code-spacing-conventions.md +81 -0
- package/embedded-knowledge/domains/roger-reviewer/al-comment-spacing-standards.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-end-else-pairing.md +75 -0
- package/embedded-knowledge/domains/roger-reviewer/al-keyword-indentation-rules.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-line-start-keyword-positioning.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-separate-if-else-formatting.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-standard-abbreviations.md +96 -0
- package/embedded-knowledge/domains/roger-reviewer/al-statement-per-line-rule.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-unnecessary-else-elimination.md +86 -0
- package/embedded-knowledge/domains/roger-reviewer/al-variable-declaration-order.md +90 -0
- package/embedded-knowledge/domains/roger-reviewer/al-variable-naming-conventions.md +82 -0
- package/embedded-knowledge/domains/roger-reviewer/begin-block-statement-clarity.md +78 -0
- package/embedded-knowledge/domains/roger-reviewer/begin-end-positioning-patterns.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/binary-operator-line-positioning.md +78 -0
- package/embedded-knowledge/domains/roger-reviewer/boolean-expression-simplification-al.md +100 -0
- package/embedded-knowledge/domains/roger-reviewer/case-statement-error-handling-troubleshooting.md +115 -0
- package/embedded-knowledge/domains/roger-reviewer/compound-statement-readability.md +124 -0
- package/embedded-knowledge/domains/roger-reviewer/lonely-repeat-statement-pattern.md +110 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-begin-end-blocks.md +438 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-binary-operator-spacing.md +255 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-comment-spacing-standards.md +209 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-keyword-indentation-rules.md +218 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-line-start-keyword-positioning.md +218 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-separate-if-else-formatting.md +280 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-statement-per-line-rule.md +188 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-unnecessary-else-elimination.md +245 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-variable-declaration-order.md +244 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/begin-end-positioning.md +278 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/boolean-simplification-examples.md +484 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/case-error-handling.md +64 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/compound-statement-readability.md +107 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/lonely-repeat-examples.md +280 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/testability-code-smells.md +256 -0
- package/embedded-knowledge/domains/roger-reviewer/testability-code-smells.md +67 -0
- package/embedded-knowledge/domains/sam-coder/al-formatting-consistency-patterns.md +75 -0
- package/embedded-knowledge/domains/sam-coder/al-line-comment-formatting.md +67 -0
- package/embedded-knowledge/domains/sam-coder/al-lonely-repeat-pattern.md +76 -0
- package/embedded-knowledge/domains/sam-coder/al-named-parameter-pattern.md +98 -0
- package/embedded-knowledge/domains/sam-coder/al-object-navigation-shortcuts.md +128 -0
- package/embedded-knowledge/domains/sam-coder/al-readability-optimization.md +75 -0
- package/embedded-knowledge/domains/sam-coder/al-record-find-early-exit.md +95 -0
- package/embedded-knowledge/domains/sam-coder/command-queue-pattern-al.md +141 -0
- package/embedded-knowledge/domains/sam-coder/deleteall-alternative-implementation.md +91 -0
- package/embedded-knowledge/domains/sam-coder/deleteall-method-usage.md +118 -0
- package/embedded-knowledge/domains/sam-coder/deleteall-trigger-execution.md +111 -0
- package/embedded-knowledge/domains/sam-coder/event-bridge-pattern-al.md +113 -0
- package/embedded-knowledge/domains/sam-coder/event-payload-design-patterns.md +127 -0
- package/embedded-knowledge/domains/sam-coder/generic-method-patterns-al.md +141 -0
- package/embedded-knowledge/domains/sam-coder/manual-binding-conditional-subscribers.md +66 -0
- package/embedded-knowledge/domains/sam-coder/nested-compound-best-practices.md +96 -0
- package/embedded-knowledge/domains/sam-coder/samples/al-blank-line-organization.md +161 -0
- package/embedded-knowledge/domains/sam-coder/samples/al-case-action-formatting.md +177 -0
- package/embedded-knowledge/domains/sam-coder/samples/al-lonely-repeat-pattern.md +239 -0
- package/embedded-knowledge/domains/sam-coder/samples/al-named-parameter-pattern.md +346 -0
- package/embedded-knowledge/domains/sam-coder/samples/al-record-find-early-exit.md +298 -0
- package/embedded-knowledge/domains/sam-coder/samples/command-queue-pattern.md +677 -0
- package/embedded-knowledge/domains/sam-coder/samples/deleteall-alternative-implementation.md +117 -0
- package/embedded-knowledge/domains/sam-coder/samples/deleteall-triggers.md +75 -0
- package/embedded-knowledge/domains/sam-coder/samples/deleteall-usage.md +169 -0
- package/embedded-knowledge/domains/sam-coder/samples/event-bridge-pattern.md +399 -0
- package/embedded-knowledge/domains/sam-coder/samples/event-payload-design.md +356 -0
- package/embedded-knowledge/domains/sam-coder/samples/generic-method-patterns.md +889 -0
- package/embedded-knowledge/domains/sam-coder/samples/manual-binding.md +84 -0
- package/embedded-knowledge/domains/sam-coder/samples/nested-compound-best-practices.md +127 -0
- package/embedded-knowledge/domains/sam-coder/samples/single-to-compound-conversion.md +89 -0
- package/embedded-knowledge/domains/sam-coder/samples/template-method-pattern.md +516 -0
- package/embedded-knowledge/domains/sam-coder/samples/testfield-patterns.md +61 -0
- package/embedded-knowledge/domains/sam-coder/samples/type-safe-operations.md +427 -0
- package/embedded-knowledge/domains/sam-coder/single-to-compound-conversion.md +122 -0
- package/embedded-knowledge/domains/sam-coder/template-method-pattern-al.md +96 -0
- package/embedded-knowledge/domains/sam-coder/testfield-patterns.md +101 -0
- package/embedded-knowledge/domains/sam-coder/type-safe-operations-al.md +149 -0
- package/embedded-knowledge/domains/sam-coder/vs-code-al-keyboard-shortcuts.md +107 -0
- package/embedded-knowledge/domains/seth-security/al-temporary-table-safety.md +95 -0
- package/embedded-knowledge/domains/seth-security/api-permission-model.md +115 -0
- package/embedded-knowledge/domains/seth-security/istemporary-safeguard-pattern.md +78 -0
- package/embedded-knowledge/domains/seth-security/samples/al-temporary-table-safety.md +373 -0
- package/embedded-knowledge/domains/seth-security/samples/api-permission-model.md +308 -0
- package/embedded-knowledge/domains/shared/al-file-naming-conventions.md +146 -0
- package/embedded-knowledge/domains/taylor-docs/al-xml-documentation-structure.md +79 -0
- package/embedded-knowledge/domains/uma-ux/bc-action-shortcuts-syntax.md +78 -0
- package/embedded-knowledge/domains/uma-ux/shortcut-key-user-experience-design.md +81 -0
- package/embedded-knowledge/indexes/bc-version-matrix.json +188 -0
- package/embedded-knowledge/indexes/domain-catalog.json +106 -0
- package/embedded-knowledge/indexes/tags/abbreviations.json +1 -0
- package/embedded-knowledge/indexes/tags/abstraction.json +1 -0
- package/embedded-knowledge/indexes/tags/access-control.json +1 -0
- package/embedded-knowledge/indexes/tags/accessibility.json +1 -0
- package/embedded-knowledge/indexes/tags/actions.json +1 -0
- package/embedded-knowledge/indexes/tags/advanced-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/advanced.json +1 -0
- package/embedded-knowledge/indexes/tags/al-extension.json +1 -0
- package/embedded-knowledge/indexes/tags/al-generics.json +1 -0
- package/embedded-knowledge/indexes/tags/al-objects.json +1 -0
- package/embedded-knowledge/indexes/tags/al-syntax.json +1 -0
- package/embedded-knowledge/indexes/tags/algorithm-structure.json +1 -0
- package/embedded-knowledge/indexes/tags/alternatives.json +1 -0
- package/embedded-knowledge/indexes/tags/analytics.json +1 -0
- package/embedded-knowledge/indexes/tags/api-delegates.json +1 -0
- package/embedded-knowledge/indexes/tags/api-design.json +1 -0
- package/embedded-knowledge/indexes/tags/api-documentation.json +1 -0
- package/embedded-knowledge/indexes/tags/api-endpoints.json +1 -0
- package/embedded-knowledge/indexes/tags/api-extensibility.json +1 -0
- package/embedded-knowledge/indexes/tags/api-fieldsets.json +1 -0
- package/embedded-knowledge/indexes/tags/api-integration.json +1 -0
- package/embedded-knowledge/indexes/tags/api-interfaces.json +1 -0
- package/embedded-knowledge/indexes/tags/api-optimization.json +1 -0
- package/embedded-knowledge/indexes/tags/api-pages.json +1 -0
- package/embedded-knowledge/indexes/tags/api-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/api-permissions.json +1 -0
- package/embedded-knowledge/indexes/tags/api-responses.json +1 -0
- package/embedded-knowledge/indexes/tags/api-simplification.json +1 -0
- package/embedded-knowledge/indexes/tags/api.json +1 -0
- package/embedded-knowledge/indexes/tags/architecture.json +1 -0
- package/embedded-knowledge/indexes/tags/async-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/async-processing.json +1 -0
- package/embedded-knowledge/indexes/tags/automatic-registration.json +1 -0
- package/embedded-knowledge/indexes/tags/batch-operations.json +1 -0
- package/embedded-knowledge/indexes/tags/bc24-migration.json +1 -0
- package/embedded-knowledge/indexes/tags/begin-blocks.json +1 -0
- package/embedded-knowledge/indexes/tags/begin-end.json +1 -0
- package/embedded-knowledge/indexes/tags/behavioral-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/best-practices.json +1 -0
- package/embedded-knowledge/indexes/tags/binding.json +1 -0
- package/embedded-knowledge/indexes/tags/block-structure.json +1 -0
- package/embedded-knowledge/indexes/tags/blocks.json +1 -0
- package/embedded-knowledge/indexes/tags/boolean-expressions.json +1 -0
- package/embedded-knowledge/indexes/tags/branching.json +1 -0
- package/embedded-knowledge/indexes/tags/breaking-changes.json +1 -0
- package/embedded-knowledge/indexes/tags/breakpoints.json +1 -0
- package/embedded-knowledge/indexes/tags/business-foundation.json +1 -0
- package/embedded-knowledge/indexes/tags/business-infrastructure.json +1 -0
- package/embedded-knowledge/indexes/tags/business-process.json +1 -0
- package/embedded-knowledge/indexes/tags/business-rules.json +1 -0
- package/embedded-knowledge/indexes/tags/caching.json +1 -0
- package/embedded-knowledge/indexes/tags/case-statements.json +1 -0
- package/embedded-knowledge/indexes/tags/case.json +1 -0
- package/embedded-knowledge/indexes/tags/code-analysis.json +1 -0
- package/embedded-knowledge/indexes/tags/code-clarity.json +1 -0
- package/embedded-knowledge/indexes/tags/code-comprehension.json +1 -0
- package/embedded-knowledge/indexes/tags/code-conversion.json +1 -0
- package/embedded-knowledge/indexes/tags/code-formatting.json +1 -0
- package/embedded-knowledge/indexes/tags/code-organization.json +1 -0
- package/embedded-knowledge/indexes/tags/code-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/code-quality.json +1 -0
- package/embedded-knowledge/indexes/tags/code-reuse.json +1 -0
- package/embedded-knowledge/indexes/tags/code-simplification.json +1 -0
- package/embedded-knowledge/indexes/tags/code-standards.json +1 -0
- package/embedded-knowledge/indexes/tags/code-structure.json +1 -0
- package/embedded-knowledge/indexes/tags/code-style.json +1 -0
- package/embedded-knowledge/indexes/tags/codeunit-design.json +1 -0
- package/embedded-knowledge/indexes/tags/command-queue.json +1 -0
- package/embedded-knowledge/indexes/tags/comments.json +1 -0
- package/embedded-knowledge/indexes/tags/compile-time-validation.json +1 -0
- package/embedded-knowledge/indexes/tags/complex-facade.json +1 -0
- package/embedded-knowledge/indexes/tags/complexity-hiding.json +1 -0
- package/embedded-knowledge/indexes/tags/complexity-management.json +1 -0
- package/embedded-knowledge/indexes/tags/compound-statements.json +1 -0
- package/embedded-knowledge/indexes/tags/concurrency.json +1 -0
- package/embedded-knowledge/indexes/tags/conditional-logic.json +1 -0
- package/embedded-knowledge/indexes/tags/conditional.json +1 -0
- package/embedded-knowledge/indexes/tags/conflict-resolution.json +1 -0
- package/embedded-knowledge/indexes/tags/consistency.json +1 -0
- package/embedded-knowledge/indexes/tags/contract-design.json +1 -0
- package/embedded-knowledge/indexes/tags/control-flow.json +1 -0
- package/embedded-knowledge/indexes/tags/conversion-guide.json +1 -0
- package/embedded-knowledge/indexes/tags/correlation.json +1 -0
- package/embedded-knowledge/indexes/tags/custom-messages.json +1 -0
- package/embedded-knowledge/indexes/tags/data-access.json +1 -0
- package/embedded-knowledge/indexes/tags/data-exposure.json +1 -0
- package/embedded-knowledge/indexes/tags/data-integrity.json +1 -0
- package/embedded-knowledge/indexes/tags/data-loading.json +1 -0
- package/embedded-knowledge/indexes/tags/data-manipulation.json +1 -0
- package/embedded-knowledge/indexes/tags/data-modeling.json +1 -0
- package/embedded-knowledge/indexes/tags/data-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/data-protection.json +1 -0
- package/embedded-knowledge/indexes/tags/data-validation.json +1 -0
- package/embedded-knowledge/indexes/tags/database.json +1 -0
- package/embedded-knowledge/indexes/tags/debugging.json +1 -0
- package/embedded-knowledge/indexes/tags/decision-making.json +1 -0
- package/embedded-knowledge/indexes/tags/declaration.json +1 -0
- package/embedded-knowledge/indexes/tags/default-messages.json +1 -0
- package/embedded-knowledge/indexes/tags/defensive-programming.json +1 -0
- package/embedded-knowledge/indexes/tags/deleteall.json +1 -0
- package/embedded-knowledge/indexes/tags/dependencies.json +1 -0
- package/embedded-knowledge/indexes/tags/deployment.json +1 -0
- package/embedded-knowledge/indexes/tags/developer-productivity.json +1 -0
- package/embedded-knowledge/indexes/tags/development-workflow.json +1 -0
- package/embedded-knowledge/indexes/tags/diagnostics.json +1 -0
- package/embedded-knowledge/indexes/tags/dimensions.json +1 -0
- package/embedded-knowledge/indexes/tags/documentation.json +1 -0
- package/embedded-knowledge/indexes/tags/early-exit.json +1 -0
- package/embedded-knowledge/indexes/tags/else-clauses.json +1 -0
- package/embedded-knowledge/indexes/tags/end-statements.json +1 -0
- package/embedded-knowledge/indexes/tags/enterprise-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/entity-relationships.json +1 -0
- package/embedded-knowledge/indexes/tags/error-handling.json +1 -0
- package/embedded-knowledge/indexes/tags/error-messages.json +1 -0
- package/embedded-knowledge/indexes/tags/error-prevention.json +1 -0
- package/embedded-knowledge/indexes/tags/error-text.json +1 -0
- package/embedded-knowledge/indexes/tags/etag.json +1 -0
- package/embedded-knowledge/indexes/tags/event-bridge.json +1 -0
- package/embedded-knowledge/indexes/tags/event-payload.json +1 -0
- package/embedded-knowledge/indexes/tags/event-routing.json +1 -0
- package/embedded-knowledge/indexes/tags/events.json +1 -0
- package/embedded-knowledge/indexes/tags/execution-flow.json +1 -0
- package/embedded-knowledge/indexes/tags/expressions.json +1 -0
- package/embedded-knowledge/indexes/tags/extensibility.json +1 -0
- package/embedded-knowledge/indexes/tags/extensions.json +1 -0
- package/embedded-knowledge/indexes/tags/facade-composition.json +1 -0
- package/embedded-knowledge/indexes/tags/facade-pattern.json +1 -0
- package/embedded-knowledge/indexes/tags/field-control.json +1 -0
- package/embedded-knowledge/indexes/tags/field-exclusion.json +1 -0
- package/embedded-knowledge/indexes/tags/field-registration.json +1 -0
- package/embedded-knowledge/indexes/tags/field-state.json +1 -0
- package/embedded-knowledge/indexes/tags/field-validation.json +1 -0
- package/embedded-knowledge/indexes/tags/fielderror.json +1 -0
- package/embedded-knowledge/indexes/tags/fields.json +1 -0
- package/embedded-knowledge/indexes/tags/filtering.json +1 -0
- package/embedded-knowledge/indexes/tags/filters.json +1 -0
- package/embedded-knowledge/indexes/tags/formatting.json +1 -0
- package/embedded-knowledge/indexes/tags/generic-methods.json +1 -0
- package/embedded-knowledge/indexes/tags/http-status.json +1 -0
- package/embedded-knowledge/indexes/tags/if-statements.json +1 -0
- package/embedded-knowledge/indexes/tags/implementation.json +1 -0
- package/embedded-knowledge/indexes/tags/indentation.json +1 -0
- package/embedded-knowledge/indexes/tags/index-summary.json +277 -0
- package/embedded-knowledge/indexes/tags/indexing.json +1 -0
- package/embedded-knowledge/indexes/tags/inheritance.json +1 -0
- package/embedded-knowledge/indexes/tags/integration.json +1 -0
- package/embedded-knowledge/indexes/tags/integrity-checking.json +1 -0
- package/embedded-knowledge/indexes/tags/intellisense.json +1 -0
- package/embedded-knowledge/indexes/tags/interface-design.json +1 -0
- package/embedded-knowledge/indexes/tags/interface-segregation.json +1 -0
- package/embedded-knowledge/indexes/tags/isolation.json +1 -0
- package/embedded-knowledge/indexes/tags/job-processing.json +1 -0
- package/embedded-knowledge/indexes/tags/keyboard-navigation.json +1 -0
- package/embedded-knowledge/indexes/tags/keywords.json +1 -0
- package/embedded-knowledge/indexes/tags/legacy-modernization.json +1 -0
- package/embedded-knowledge/indexes/tags/line-breaks.json +1 -0
- package/embedded-knowledge/indexes/tags/line-organization.json +1 -0
- package/embedded-knowledge/indexes/tags/line-positioning.json +1 -0
- package/embedded-knowledge/indexes/tags/localization.json +1 -0
- package/embedded-knowledge/indexes/tags/logging.json +1 -0
- package/embedded-knowledge/indexes/tags/loose-coupling.json +1 -0
- package/embedded-knowledge/indexes/tags/maintainability.json +1 -0
- package/embedded-knowledge/indexes/tags/memory-management.json +1 -0
- package/embedded-knowledge/indexes/tags/memory-optimization.json +1 -0
- package/embedded-knowledge/indexes/tags/memory.json +1 -0
- package/embedded-knowledge/indexes/tags/message-design.json +1 -0
- package/embedded-knowledge/indexes/tags/message-formatting.json +1 -0
- package/embedded-knowledge/indexes/tags/message-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/metadata-driven.json +1 -0
- package/embedded-knowledge/indexes/tags/method-comparison.json +1 -0
- package/embedded-knowledge/indexes/tags/module-architecture.json +1 -0
- package/embedded-knowledge/indexes/tags/module-validation.json +1 -0
- package/embedded-knowledge/indexes/tags/monitoring.json +1 -0
- package/embedded-knowledge/indexes/tags/multi-layer-facade.json +1 -0
- package/embedded-knowledge/indexes/tags/multi-tenancy.json +1 -0
- package/embedded-knowledge/indexes/tags/multiple-values.json +1 -0
- package/embedded-knowledge/indexes/tags/naming-conventions.json +1 -0
- package/embedded-knowledge/indexes/tags/naming.json +1 -0
- package/embedded-knowledge/indexes/tags/navigation.json +1 -0
- package/embedded-knowledge/indexes/tags/nested-statements.json +1 -0
- package/embedded-knowledge/indexes/tags/no-series-conversion.json +1 -0
- package/embedded-knowledge/indexes/tags/no-series-validation.json +1 -0
- package/embedded-knowledge/indexes/tags/no-series.json +1 -0
- package/embedded-knowledge/indexes/tags/number-generation.json +1 -0
- package/embedded-knowledge/indexes/tags/object-documentation.json +1 -0
- package/embedded-knowledge/indexes/tags/odata.json +1 -0
- package/embedded-knowledge/indexes/tags/ondelete.json +1 -0
- package/embedded-knowledge/indexes/tags/onvalidate.json +1 -0
- package/embedded-knowledge/indexes/tags/operation-delegation.json +1 -0
- package/embedded-knowledge/indexes/tags/operation-safety.json +1 -0
- package/embedded-knowledge/indexes/tags/operators.json +1 -0
- package/embedded-knowledge/indexes/tags/optimization.json +1 -0
- package/embedded-knowledge/indexes/tags/order.json +1 -0
- package/embedded-knowledge/indexes/tags/organization.json +1 -0
- package/embedded-knowledge/indexes/tags/pages.json +1 -0
- package/embedded-knowledge/indexes/tags/parameters.json +1 -0
- package/embedded-knowledge/indexes/tags/patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/performance-optimization.json +1 -0
- package/embedded-knowledge/indexes/tags/performance.json +1 -0
- package/embedded-knowledge/indexes/tags/placement.json +1 -0
- package/embedded-knowledge/indexes/tags/posting-codeunits.json +1 -0
- package/embedded-knowledge/indexes/tags/posting.json +1 -0
- package/embedded-knowledge/indexes/tags/preconditions.json +1 -0
- package/embedded-knowledge/indexes/tags/primary-key.json +1 -0
- package/embedded-knowledge/indexes/tags/privacy.json +1 -0
- package/embedded-knowledge/indexes/tags/process-automation.json +1 -0
- package/embedded-knowledge/indexes/tags/production.json +1 -0
- package/embedded-knowledge/indexes/tags/productivity.json +1 -0
- package/embedded-knowledge/indexes/tags/query-performance.json +1 -0
- package/embedded-knowledge/indexes/tags/queue-management.json +1 -0
- package/embedded-knowledge/indexes/tags/ranges.json +1 -0
- package/embedded-knowledge/indexes/tags/readability.json +1 -0
- package/embedded-knowledge/indexes/tags/record-access.json +1 -0
- package/embedded-knowledge/indexes/tags/record-methods.json +1 -0
- package/embedded-knowledge/indexes/tags/refactoring.json +1 -0
- package/embedded-knowledge/indexes/tags/reference.json +1 -0
- package/embedded-knowledge/indexes/tags/repeat-loops.json +1 -0
- package/embedded-knowledge/indexes/tags/repeat-statement.json +1 -0
- package/embedded-knowledge/indexes/tags/runtime-errors.json +1 -0
- package/embedded-knowledge/indexes/tags/runtime.json +1 -0
- package/embedded-knowledge/indexes/tags/safeguards.json +1 -0
- package/embedded-knowledge/indexes/tags/security.json +1 -0
- package/embedded-knowledge/indexes/tags/sequence-management.json +1 -0
- package/embedded-knowledge/indexes/tags/serialization.json +1 -0
- package/embedded-knowledge/indexes/tags/session-logmessage.json +1 -0
- package/embedded-knowledge/indexes/tags/session.json +1 -0
- package/embedded-knowledge/indexes/tags/setloadfields.json +1 -0
- package/embedded-knowledge/indexes/tags/shortcuts.json +1 -0
- package/embedded-knowledge/indexes/tags/sift.json +1 -0
- package/embedded-knowledge/indexes/tags/singleinstance.json +1 -0
- package/embedded-knowledge/indexes/tags/spacing.json +1 -0
- package/embedded-knowledge/indexes/tags/sql-translation.json +1 -0
- package/embedded-knowledge/indexes/tags/standards.json +1 -0
- package/embedded-knowledge/indexes/tags/statements.json +1 -0
- package/embedded-knowledge/indexes/tags/streaming.json +1 -0
- package/embedded-knowledge/indexes/tags/strong-typing.json +1 -0
- package/embedded-knowledge/indexes/tags/structural-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/structure.json +1 -0
- package/embedded-knowledge/indexes/tags/subscribers.json +1 -0
- package/embedded-knowledge/indexes/tags/switch.json +1 -0
- package/embedded-knowledge/indexes/tags/symbol-search.json +1 -0
- package/embedded-knowledge/indexes/tags/syntax.json +1 -0
- package/embedded-knowledge/indexes/tags/systemid.json +1 -0
- package/embedded-knowledge/indexes/tags/table-configuration.json +1 -0
- package/embedded-knowledge/indexes/tags/table-events.json +1 -0
- package/embedded-knowledge/indexes/tags/table-keys.json +1 -0
- package/embedded-knowledge/indexes/tags/table-safety.json +1 -0
- package/embedded-knowledge/indexes/tags/task-scheduler.json +1 -0
- package/embedded-knowledge/indexes/tags/telemetry.json +1 -0
- package/embedded-knowledge/indexes/tags/template-method.json +1 -0
- package/embedded-knowledge/indexes/tags/temporary-tables.json +1 -0
- package/embedded-knowledge/indexes/tags/testfield.json +1 -0
- package/embedded-knowledge/indexes/tags/tradeoffs.json +1 -0
- package/embedded-knowledge/indexes/tags/triggers.json +1 -0
- package/embedded-knowledge/indexes/tags/troubleshooting.json +1 -0
- package/embedded-knowledge/indexes/tags/type-safety.json +1 -0
- package/embedded-knowledge/indexes/tags/url-structure.json +1 -0
- package/embedded-knowledge/indexes/tags/user-experience.json +1 -0
- package/embedded-knowledge/indexes/tags/user-feedback.json +1 -0
- package/embedded-knowledge/indexes/tags/user-interface.json +1 -0
- package/embedded-knowledge/indexes/tags/validation-feedback.json +1 -0
- package/embedded-knowledge/indexes/tags/validation.json +1 -0
- package/embedded-knowledge/indexes/tags/variables.json +1 -0
- package/embedded-knowledge/indexes/tags/verbosity.json +1 -0
- package/embedded-knowledge/indexes/tags/vs-code.json +1 -0
- package/embedded-knowledge/indexes/tags/web-services.json +1 -0
- package/embedded-knowledge/indexes/tags/workflow-management.json +1 -0
- package/embedded-knowledge/indexes/tags/workflow-optimization.json +1 -0
- package/embedded-knowledge/indexes/tags/workflow-templates.json +1 -0
- package/embedded-knowledge/indexes/tags/workspace.json +1 -0
- package/embedded-knowledge/indexes/tags/xml-documentation.json +1 -0
- package/embedded-knowledge/indexes/topic-relationships.json +128 -0
- package/embedded-knowledge/methodologies/index.json +81 -0
- package/embedded-knowledge/methodologies/phases/analysis-full.md +208 -0
- package/embedded-knowledge/methodologies/phases/analysis-quick.md +44 -0
- package/embedded-knowledge/methodologies/phases/analysis.md +182 -0
- package/embedded-knowledge/methodologies/phases/execution-validation-full.md +174 -0
- package/embedded-knowledge/methodologies/phases/execution-validation-quick.md +31 -0
- package/embedded-knowledge/methodologies/phases/execution-validation.md +174 -0
- package/embedded-knowledge/methodologies/phases/performance-full.md +211 -0
- package/embedded-knowledge/methodologies/phases/performance-quick.md +32 -0
- package/embedded-knowledge/methodologies/phases/performance.md +211 -0
- package/embedded-knowledge/methodologies/phases/verification-full.md +162 -0
- package/embedded-knowledge/methodologies/phases/verification-quick.md +48 -0
- package/embedded-knowledge/methodologies/phases/verification.md +146 -0
- package/embedded-knowledge/methodologies/workflow-enforcement.md +142 -0
- package/embedded-knowledge/methodologies/workflows/code-review-workflow.md +99 -0
- package/embedded-knowledge/methodologies/workflows/proposal-review-workflow.md +535 -0
- package/embedded-knowledge/specialists/alex-architect.md +305 -0
- package/embedded-knowledge/specialists/casey-copilot.md +314 -0
- package/embedded-knowledge/specialists/chris-config.md +226 -0
- package/embedded-knowledge/specialists/dean-debug.md +365 -0
- package/embedded-knowledge/specialists/eva-errors.md +291 -0
- package/embedded-knowledge/specialists/jordan-bridge.md +291 -0
- package/embedded-knowledge/specialists/logan-legacy.md +265 -0
- package/embedded-knowledge/specialists/maya-mentor.md +299 -0
- package/embedded-knowledge/specialists/morgan-market.md +281 -0
- package/embedded-knowledge/specialists/parker-pragmatic.md +564 -0
- package/embedded-knowledge/specialists/quinn-tester.md +323 -0
- package/embedded-knowledge/specialists/roger-reviewer.md +317 -0
- package/embedded-knowledge/specialists/sam-coder.md +342 -0
- package/embedded-knowledge/specialists/seth-security.md +290 -0
- package/embedded-knowledge/specialists/taylor-docs.md +312 -0
- package/embedded-knowledge/specialists/uma-ux.md +291 -0
- package/package.json +82 -0
|
@@ -0,0 +1,994 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BC Specialist Roleplay Engine
|
|
3
|
+
*
|
|
4
|
+
* Brings specialist personas to life through personality-driven responses,
|
|
5
|
+
* consistent character adoption, and context-aware knowledge integration.
|
|
6
|
+
*/
|
|
7
|
+
export class BCSpecialistRoleplayEngine {
|
|
8
|
+
layerService;
|
|
9
|
+
knowledgeService;
|
|
10
|
+
config;
|
|
11
|
+
responseTemplates = new Map();
|
|
12
|
+
knowledgeRetriever;
|
|
13
|
+
constructor(layerService, knowledgeService, config) {
|
|
14
|
+
this.layerService = layerService;
|
|
15
|
+
this.knowledgeService = knowledgeService;
|
|
16
|
+
this.config = {
|
|
17
|
+
personality_strength: 'moderate',
|
|
18
|
+
response_length: 'adaptive',
|
|
19
|
+
knowledge_integration: 'balanced',
|
|
20
|
+
suggest_handoffs: true,
|
|
21
|
+
suggest_collaborations: true,
|
|
22
|
+
learn_user_preferences: true,
|
|
23
|
+
adapt_communication_style: true,
|
|
24
|
+
...config
|
|
25
|
+
};
|
|
26
|
+
this.knowledgeRetriever = new BCKnowledgeRetriever(layerService, knowledgeService);
|
|
27
|
+
this.initializeResponseTemplates();
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Generate a methodology-contextual response from a specialist
|
|
31
|
+
*/
|
|
32
|
+
async generateResponse(context) {
|
|
33
|
+
const { specialist, userMessage, session } = context;
|
|
34
|
+
// Check if methodology context is established
|
|
35
|
+
if (!session.methodology_context?.confirmed_by_user) {
|
|
36
|
+
return await this.establishMethodologyContext(specialist, userMessage, session);
|
|
37
|
+
}
|
|
38
|
+
// Apply knowledge within established methodology context
|
|
39
|
+
return await this.applyKnowledgeInMethodology(specialist, userMessage, session);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Establish methodology context before applying domain knowledge
|
|
43
|
+
*/
|
|
44
|
+
async establishMethodologyContext(specialist, userMessage, session) {
|
|
45
|
+
const personality = this.analyzePersonality(specialist);
|
|
46
|
+
// Check if user is asking a direct question or wants immediate help
|
|
47
|
+
const isDirectQuestion = this.isDirectQuestion(userMessage);
|
|
48
|
+
if (isDirectQuestion) {
|
|
49
|
+
// Provide immediate specialist response without methodology onboarding
|
|
50
|
+
return await this.provideDirectSpecialistResponse(specialist, userMessage, session);
|
|
51
|
+
}
|
|
52
|
+
// Suggest appropriate methodologies based on user request and specialist expertise
|
|
53
|
+
const suggestedMethodologies = await this.suggestMethodologies(userMessage, specialist);
|
|
54
|
+
// Build methodology onboarding response
|
|
55
|
+
const response = await this.buildMethodologyOnboardingResponse(specialist, personality, userMessage, suggestedMethodologies);
|
|
56
|
+
return {
|
|
57
|
+
content: response.content,
|
|
58
|
+
specialist_id: specialist.specialist_id,
|
|
59
|
+
personality_elements: response.personality_elements,
|
|
60
|
+
topics_referenced: [],
|
|
61
|
+
knowledge_applied: [],
|
|
62
|
+
suggested_handoffs: [],
|
|
63
|
+
context_updates: { methodology_suggested: true },
|
|
64
|
+
recommendations_added: response.recommendations || [],
|
|
65
|
+
response_type: 'methodology_onboarding',
|
|
66
|
+
confidence_level: 'high'
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Check if user message is a direct question that should get immediate response
|
|
71
|
+
*/
|
|
72
|
+
isDirectQuestion(userMessage) {
|
|
73
|
+
const message = userMessage.toLowerCase().trim();
|
|
74
|
+
// Patterns that indicate broader learning/guidance requests (should get methodology)
|
|
75
|
+
const methodologyPatterns = [
|
|
76
|
+
/^(i want to learn|i'd like to learn|teach me|i'm new to|can you guide me|guide me through|walk me through)/i,
|
|
77
|
+
/^(i need help with my.*project|i need guidance|i need training)/i,
|
|
78
|
+
/learn about.*in general/i,
|
|
79
|
+
/get started with/i,
|
|
80
|
+
/introduction to/i
|
|
81
|
+
];
|
|
82
|
+
// If it matches methodology patterns, it's not a direct question
|
|
83
|
+
if (methodologyPatterns.some(pattern => pattern.test(message))) {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
// Patterns that indicate direct questions (should get immediate response)
|
|
87
|
+
const directPatterns = [
|
|
88
|
+
/^(how|what|when|where|why|which|can|could|should|would|is|are|do|does|did)/i,
|
|
89
|
+
/\?/,
|
|
90
|
+
/tell me about.*specific/i,
|
|
91
|
+
/explain.*this/i,
|
|
92
|
+
/help me with.*\b(debug|fix|solve|resolve|optimize|review|analyze|check)\b/i,
|
|
93
|
+
/I need to (fix|debug|solve|resolve|optimize|review|analyze|check)/i,
|
|
94
|
+
/show me/i,
|
|
95
|
+
/review/i,
|
|
96
|
+
/analyze/i,
|
|
97
|
+
/check/i,
|
|
98
|
+
/look at/i,
|
|
99
|
+
/fix/i,
|
|
100
|
+
/debug/i
|
|
101
|
+
];
|
|
102
|
+
return directPatterns.some(pattern => pattern.test(message));
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Provide immediate specialist response without methodology onboarding
|
|
106
|
+
*/
|
|
107
|
+
async provideDirectSpecialistResponse(specialist, userMessage, session) {
|
|
108
|
+
const personality = this.analyzePersonality(specialist);
|
|
109
|
+
// Search for relevant knowledge topics based on user's question and specialist's expertise
|
|
110
|
+
const relevantTopics = await this.knowledgeRetriever.findRelevantTopics(userMessage, specialist.expertise.primary.concat(specialist.expertise.secondary || []), 5);
|
|
111
|
+
// Create a minimal methodology context for the direct response
|
|
112
|
+
const directMethodologyContext = {
|
|
113
|
+
confirmed_by_user: true,
|
|
114
|
+
methodology_id: 'direct_consultation',
|
|
115
|
+
title: 'Direct Specialist Consultation',
|
|
116
|
+
current_phase: 'analysis',
|
|
117
|
+
next_steps: []
|
|
118
|
+
};
|
|
119
|
+
// Update session with direct context
|
|
120
|
+
session.methodology_context = directMethodologyContext;
|
|
121
|
+
// Generate direct response using existing machinery
|
|
122
|
+
const response = await this.buildMethodologyResponse(specialist, personality, userMessage, directMethodologyContext, relevantTopics);
|
|
123
|
+
// Apply session context updates
|
|
124
|
+
const contextUpdates = this.generateContextUpdates({ specialist, userMessage, session, conversationHistory: [] }, relevantTopics);
|
|
125
|
+
// Check for collaboration opportunities
|
|
126
|
+
const suggestedHandoffs = await this.suggestCollaborations({ specialist, userMessage, session, conversationHistory: [] }, relevantTopics);
|
|
127
|
+
return {
|
|
128
|
+
content: response.content,
|
|
129
|
+
specialist_id: specialist.specialist_id,
|
|
130
|
+
personality_elements: response.personality_elements,
|
|
131
|
+
topics_referenced: relevantTopics.map(t => t.id),
|
|
132
|
+
knowledge_applied: relevantTopics.map(topic => ({
|
|
133
|
+
topic_id: topic.id,
|
|
134
|
+
application_context: this.getApplicationContext(topic, userMessage)
|
|
135
|
+
})),
|
|
136
|
+
suggested_handoffs: suggestedHandoffs,
|
|
137
|
+
context_updates: contextUpdates,
|
|
138
|
+
recommendations_added: response.recommendations,
|
|
139
|
+
response_type: 'direct_specialist_response',
|
|
140
|
+
confidence_level: response.confidence_level
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Apply knowledge within established methodology context
|
|
145
|
+
*/
|
|
146
|
+
async applyKnowledgeInMethodology(specialist, userMessage, session) {
|
|
147
|
+
const personality = this.analyzePersonality(specialist);
|
|
148
|
+
// Search for relevant knowledge topics based on user's question and specialist's expertise
|
|
149
|
+
const relevantTopics = await this.knowledgeRetriever.findRelevantTopics(userMessage, specialist.expertise.primary.concat(specialist.expertise.secondary || []), 5);
|
|
150
|
+
// Generate methodology-contextual response
|
|
151
|
+
const response = await this.buildMethodologyResponse(specialist, personality, userMessage, session.methodology_context, relevantTopics);
|
|
152
|
+
// Apply session context updates
|
|
153
|
+
const contextUpdates = this.generateContextUpdates({ specialist, userMessage, session, conversationHistory: [] }, relevantTopics);
|
|
154
|
+
// Check for collaboration opportunities
|
|
155
|
+
const suggestedHandoffs = await this.suggestCollaborations({ specialist, userMessage, session, conversationHistory: [] }, relevantTopics);
|
|
156
|
+
return {
|
|
157
|
+
content: response.content,
|
|
158
|
+
specialist_id: specialist.specialist_id,
|
|
159
|
+
personality_elements: response.personality_elements,
|
|
160
|
+
topics_referenced: relevantTopics.map(t => t.id),
|
|
161
|
+
knowledge_applied: relevantTopics.map(topic => ({
|
|
162
|
+
topic_id: topic.id,
|
|
163
|
+
application_context: this.getApplicationContext(topic, userMessage)
|
|
164
|
+
})),
|
|
165
|
+
suggested_handoffs: suggestedHandoffs,
|
|
166
|
+
context_updates: contextUpdates,
|
|
167
|
+
recommendations_added: response.recommendations,
|
|
168
|
+
response_type: response.response_type,
|
|
169
|
+
confidence_level: response.confidence_level
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Suggest appropriate methodologies based on user request and specialist expertise
|
|
174
|
+
*/
|
|
175
|
+
async suggestMethodologies(userMessage, specialist) {
|
|
176
|
+
// Analyze user message for methodology keywords and patterns
|
|
177
|
+
const methodologyKeywords = this.extractMethodologyKeywords(userMessage);
|
|
178
|
+
const specialistMethodologies = await this.getSpecialistMethodologies(specialist);
|
|
179
|
+
// Return suggested methodologies with confidence scores
|
|
180
|
+
return specialistMethodologies.filter(methodology => methodologyKeywords.some(keyword => methodology.title.toLowerCase().includes(keyword) ||
|
|
181
|
+
methodology.description.toLowerCase().includes(keyword))).slice(0, 3); // Top 3 suggestions
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Build methodology onboarding response
|
|
185
|
+
*/
|
|
186
|
+
async buildMethodologyOnboardingResponse(specialist, personality, userMessage, suggestedMethodologies) {
|
|
187
|
+
const greeting = specialist.persona.greeting;
|
|
188
|
+
if (suggestedMethodologies.length === 0) {
|
|
189
|
+
return {
|
|
190
|
+
content: `${greeting} I'd love to help! Before we dive in, could you tell me more about what you're trying to accomplish? This will help me suggest the best approach for our work together.`,
|
|
191
|
+
personality_elements: {},
|
|
192
|
+
recommendations: [],
|
|
193
|
+
response_type: 'clarification_needed',
|
|
194
|
+
confidence_level: 'medium'
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
const primaryMethodology = suggestedMethodologies[0];
|
|
198
|
+
const content = `${greeting} I can see you're interested in ${this.extractUserIntent(userMessage)}.
|
|
199
|
+
|
|
200
|
+
**Suggested Approach: "${primaryMethodology.title}"**
|
|
201
|
+
${primaryMethodology.description}
|
|
202
|
+
|
|
203
|
+
This methodology will help us work through this systematically. Does this approach sound right for your goals? Once we confirm this framework, I can provide targeted guidance with relevant knowledge applied in context.
|
|
204
|
+
|
|
205
|
+
What's your current experience level so I can tailor the approach accordingly?`;
|
|
206
|
+
return {
|
|
207
|
+
content,
|
|
208
|
+
personality_elements: { methodology_suggested: primaryMethodology.methodology_id },
|
|
209
|
+
recommendations: [`Follow ${primaryMethodology.title} methodology`],
|
|
210
|
+
response_type: 'methodology_suggestion',
|
|
211
|
+
confidence_level: 'high'
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Build response within established methodology context
|
|
216
|
+
*/
|
|
217
|
+
async buildMethodologyResponse(specialist, personality, userMessage, methodologyContext, relevantTopics) {
|
|
218
|
+
// Create a proper session context for the existing method
|
|
219
|
+
const sessionWithContext = {
|
|
220
|
+
sessionId: 'temp',
|
|
221
|
+
specialistId: specialist.specialist_id,
|
|
222
|
+
userId: 'temp',
|
|
223
|
+
startTime: new Date(),
|
|
224
|
+
lastActivity: new Date(),
|
|
225
|
+
messageCount: 1,
|
|
226
|
+
status: 'active',
|
|
227
|
+
messages: [],
|
|
228
|
+
context: {
|
|
229
|
+
methodology_context: methodologyContext,
|
|
230
|
+
solutions: [],
|
|
231
|
+
recommendations: [],
|
|
232
|
+
nextSteps: [],
|
|
233
|
+
userPreferences: {}
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
// Use existing buildPersonalityResponse with methodology context
|
|
237
|
+
return await this.buildPersonalityResponse(specialist, personality, { specialist, userMessage, session: sessionWithContext, conversationHistory: [] }, relevantTopics);
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Extract methodology keywords from user message
|
|
241
|
+
*/
|
|
242
|
+
extractMethodologyKeywords(userMessage) {
|
|
243
|
+
const keywords = [];
|
|
244
|
+
const message = userMessage.toLowerCase();
|
|
245
|
+
const patterns = {
|
|
246
|
+
'fundamentals': ['fundamental', 'basics', 'introduction', 'getting started', 'onboarding'],
|
|
247
|
+
'development': ['development', 'coding', 'programming', 'building'],
|
|
248
|
+
'architecture': ['architecture', 'design', 'structure', 'pattern'],
|
|
249
|
+
'performance': ['performance', 'optimization', 'speed', 'efficiency'],
|
|
250
|
+
'testing': ['testing', 'quality', 'validation', 'debugging'],
|
|
251
|
+
'workflow': ['workflow', 'methodology', 'process', 'approach']
|
|
252
|
+
};
|
|
253
|
+
for (const [category, terms] of Object.entries(patterns)) {
|
|
254
|
+
if (terms.some(term => message.includes(term))) {
|
|
255
|
+
keywords.push(category);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
return keywords;
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Get methodologies relevant to specialist
|
|
262
|
+
*/
|
|
263
|
+
async getSpecialistMethodologies(specialist) {
|
|
264
|
+
// Map specialists to their preferred methodologies
|
|
265
|
+
const specialistMethodologies = {
|
|
266
|
+
'maya-mentor': [
|
|
267
|
+
{ methodology_id: 'developer-introduction', title: 'BC Development Fundamentals', description: 'Introduction to Business Central development fundamentals and environment setup' },
|
|
268
|
+
{ methodology_id: 'skill-building', title: 'Skill Development Methodology', description: 'Structured approach to building BC development skills' }
|
|
269
|
+
],
|
|
270
|
+
'sam-coder': [
|
|
271
|
+
{ methodology_id: 'implementation', title: 'Implementation Methodology', description: 'Efficient code implementation and development practices' }
|
|
272
|
+
],
|
|
273
|
+
'alex-architect': [
|
|
274
|
+
{ methodology_id: 'architecture-design', title: 'Architecture Design Methodology', description: 'Systematic approach to BC solution architecture' }
|
|
275
|
+
],
|
|
276
|
+
'dean-debug': [
|
|
277
|
+
{ methodology_id: 'troubleshooting', title: 'Diagnostic Methodology', description: 'Systematic problem diagnosis and performance analysis' }
|
|
278
|
+
]
|
|
279
|
+
};
|
|
280
|
+
return specialistMethodologies[specialist.specialist_id] || [];
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Extract user intent from message
|
|
284
|
+
*/
|
|
285
|
+
extractUserIntent(userMessage) {
|
|
286
|
+
// Simple intent extraction - could be made more sophisticated
|
|
287
|
+
const message = userMessage.toLowerCase();
|
|
288
|
+
if (message.includes('fundamental') || message.includes('getting started')) {
|
|
289
|
+
return 'learning fundamentals';
|
|
290
|
+
}
|
|
291
|
+
if (message.includes('workflow') || message.includes('methodology')) {
|
|
292
|
+
return 'following a structured approach';
|
|
293
|
+
}
|
|
294
|
+
return 'getting help with BC development';
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Analyze user message to suggest appropriate specialist
|
|
298
|
+
*/
|
|
299
|
+
async suggestSpecialist(userMessage, currentContext) {
|
|
300
|
+
const specialists = await this.layerService.getAllSpecialists();
|
|
301
|
+
const suggestions = [];
|
|
302
|
+
for (const specialist of specialists) {
|
|
303
|
+
const confidence = await this.calculateSpecialistConfidence(userMessage, specialist, currentContext);
|
|
304
|
+
if (confidence > 0.15) { // Lowered threshold for token-based matching (Issue #17)
|
|
305
|
+
suggestions.push({
|
|
306
|
+
specialist_id: specialist.specialist_id,
|
|
307
|
+
confidence,
|
|
308
|
+
reasoning: this.generateSuggestionReasoning(userMessage, specialist, confidence)
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
return suggestions.sort((a, b) => b.confidence - a.confidence).slice(0, 3);
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Generate a specialist greeting for session start
|
|
316
|
+
*/
|
|
317
|
+
async generateGreeting(specialist, context) {
|
|
318
|
+
const personality = this.analyzePersonality(specialist);
|
|
319
|
+
const greeting = this.buildGreeting(specialist, personality, context);
|
|
320
|
+
return {
|
|
321
|
+
content: greeting,
|
|
322
|
+
specialist_id: specialist.specialist_id,
|
|
323
|
+
personality_elements: {
|
|
324
|
+
greeting_used: true,
|
|
325
|
+
characteristic_phrases: [specialist.persona.greeting],
|
|
326
|
+
expertise_demonstrated: specialist.expertise.primary.slice(0, 2),
|
|
327
|
+
communication_style_applied: specialist.persona.communication_style
|
|
328
|
+
},
|
|
329
|
+
topics_referenced: [],
|
|
330
|
+
knowledge_applied: [],
|
|
331
|
+
response_type: 'greeting',
|
|
332
|
+
confidence_level: 'high'
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Generate handoff message when transferring between specialists
|
|
337
|
+
*/
|
|
338
|
+
async generateHandoff(fromSpecialist, toSpecialist, context) {
|
|
339
|
+
const fromPersonality = this.analyzePersonality(fromSpecialist);
|
|
340
|
+
const toPersonality = this.analyzePersonality(toSpecialist);
|
|
341
|
+
const farewell = this.buildHandoffFarewell(fromSpecialist, toSpecialist, context);
|
|
342
|
+
const introduction = this.buildHandoffIntroduction(toSpecialist, fromSpecialist, context);
|
|
343
|
+
return {
|
|
344
|
+
farewell: {
|
|
345
|
+
content: farewell,
|
|
346
|
+
specialist_id: fromSpecialist.specialist_id,
|
|
347
|
+
personality_elements: {
|
|
348
|
+
greeting_used: false,
|
|
349
|
+
characteristic_phrases: [],
|
|
350
|
+
expertise_demonstrated: [],
|
|
351
|
+
communication_style_applied: fromSpecialist.persona.communication_style
|
|
352
|
+
},
|
|
353
|
+
topics_referenced: [],
|
|
354
|
+
knowledge_applied: [],
|
|
355
|
+
response_type: 'handoff',
|
|
356
|
+
confidence_level: 'high'
|
|
357
|
+
},
|
|
358
|
+
introduction: {
|
|
359
|
+
content: introduction,
|
|
360
|
+
specialist_id: toSpecialist.specialist_id,
|
|
361
|
+
personality_elements: {
|
|
362
|
+
greeting_used: true,
|
|
363
|
+
characteristic_phrases: [toSpecialist.persona.greeting],
|
|
364
|
+
expertise_demonstrated: toSpecialist.expertise.primary.slice(0, 2),
|
|
365
|
+
communication_style_applied: toSpecialist.persona.communication_style
|
|
366
|
+
},
|
|
367
|
+
topics_referenced: [],
|
|
368
|
+
knowledge_applied: [],
|
|
369
|
+
response_type: 'handoff',
|
|
370
|
+
confidence_level: 'high'
|
|
371
|
+
}
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Update configuration
|
|
376
|
+
*/
|
|
377
|
+
updateConfig(config) {
|
|
378
|
+
this.config = { ...this.config, ...config };
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Get personality analysis for a specialist
|
|
382
|
+
*/
|
|
383
|
+
analyzePersonality(specialist) {
|
|
384
|
+
return {
|
|
385
|
+
communication_style: specialist.persona.communication_style,
|
|
386
|
+
expertise_focus: specialist.expertise.primary,
|
|
387
|
+
problem_approach: this.extractProblemApproach(specialist),
|
|
388
|
+
collaboration_style: this.extractCollaborationStyle(specialist),
|
|
389
|
+
characteristic_phrases: [
|
|
390
|
+
specialist.persona.greeting,
|
|
391
|
+
...this.extractCharacteristicPhrases(specialist)
|
|
392
|
+
]
|
|
393
|
+
};
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Build personality-driven response
|
|
397
|
+
*/
|
|
398
|
+
async buildPersonalityResponse(specialist, personality, context, relevantTopics) {
|
|
399
|
+
const { userMessage, session } = context;
|
|
400
|
+
// Start with specialist greeting if it's a new conversation
|
|
401
|
+
let response = session.messageCount <= 1 ? `${specialist.persona.greeting} ` : '';
|
|
402
|
+
// Apply personality-driven response patterns
|
|
403
|
+
response += await this.generatePersonalityContent(specialist, personality, userMessage, relevantTopics, context);
|
|
404
|
+
// Add recommendations based on knowledge
|
|
405
|
+
const recommendations = this.generateRecommendations(relevantTopics, userMessage);
|
|
406
|
+
// Determine response type and confidence
|
|
407
|
+
const responseType = this.determineResponseType(userMessage, relevantTopics);
|
|
408
|
+
const confidenceLevel = this.calculateConfidenceLevel(specialist, userMessage, relevantTopics);
|
|
409
|
+
return {
|
|
410
|
+
content: response,
|
|
411
|
+
personality_elements: {
|
|
412
|
+
greeting_used: session.messageCount <= 1,
|
|
413
|
+
characteristic_phrases: personality.characteristic_phrases.slice(0, 2),
|
|
414
|
+
expertise_demonstrated: personality.expertise_focus.slice(0, 3),
|
|
415
|
+
communication_style_applied: personality.communication_style
|
|
416
|
+
},
|
|
417
|
+
recommendations,
|
|
418
|
+
response_type: responseType,
|
|
419
|
+
confidence_level: confidenceLevel
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* Generate personality-driven content
|
|
424
|
+
*/
|
|
425
|
+
async generatePersonalityContent(specialist, personality, userMessage, relevantTopics, context) {
|
|
426
|
+
// This is where we'd integrate with the actual BC knowledge to generate responses
|
|
427
|
+
// For now, let's create template-based responses that demonstrate personality
|
|
428
|
+
const templates = this.getResponseTemplates(specialist.specialist_id);
|
|
429
|
+
const selectedTemplate = this.selectBestTemplate(templates, userMessage, relevantTopics);
|
|
430
|
+
if (selectedTemplate) {
|
|
431
|
+
return this.fillTemplate(selectedTemplate, specialist, userMessage, relevantTopics, context);
|
|
432
|
+
}
|
|
433
|
+
// Fallback to basic personality-driven response
|
|
434
|
+
return this.generateBasicPersonalityResponse(specialist, userMessage, relevantTopics, context);
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* Generate agent roleplay instructions (NOT direct user response)
|
|
438
|
+
*/
|
|
439
|
+
generateBasicPersonalityResponse(specialist, userMessage, relevantTopics, context) {
|
|
440
|
+
// Generate AGENT INSTRUCTIONS using the FULL specialist instruction content
|
|
441
|
+
let instructions = `You are ${specialist.title} (${specialist.specialist_id}). Below are your complete instructions:\n\n`;
|
|
442
|
+
// **CRITICAL FIX**: Include the full specialist instruction content
|
|
443
|
+
instructions += `# SPECIALIST INSTRUCTIONS:\n${specialist.content}\n\n`;
|
|
444
|
+
instructions += `---\n\n# CURRENT REQUEST CONTEXT:\n`;
|
|
445
|
+
instructions += `**User Message**: "${userMessage}"\n\n`;
|
|
446
|
+
// **NO PRE-SELECTED KNOWLEDGE** - provide YAML-based hints instead
|
|
447
|
+
instructions += `**Knowledge Search Hints** (based on your YAML configuration):\n`;
|
|
448
|
+
instructions += `- Your Primary Expertise: ${specialist.expertise.primary.join(', ')}\n`;
|
|
449
|
+
instructions += `- Your Domains: ${specialist.domains.join(', ')}\n`;
|
|
450
|
+
instructions += `- Suggested find_bc_knowledge searches: "${specialist.expertise.primary.join('", "')}", "${specialist.domains.join('", "')}"\n\n`;
|
|
451
|
+
// Add introduction instructions if this is a new session or handoff
|
|
452
|
+
if (context.requiresIntroduction) {
|
|
453
|
+
instructions += `**Session Info**: This is a new session - introduce yourself using your greeting and explain your expertise.\n\n`;
|
|
454
|
+
}
|
|
455
|
+
instructions += `**CRITICAL REMINDER**: NO knowledge has been pre-selected for you. Follow your "Implementation Requirements" section exactly - you MUST use find_bc_knowledge to search for relevant information yourself.\n\n`;
|
|
456
|
+
instructions += `Now respond as ${specialist.title} following your complete instruction set above.`;
|
|
457
|
+
return instructions;
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Generate style-appropriate opening
|
|
461
|
+
*/
|
|
462
|
+
getStyleApproach(specialist) {
|
|
463
|
+
const communication = specialist.persona.communication_style.toLowerCase();
|
|
464
|
+
if (communication.includes('technical')) {
|
|
465
|
+
return "Let's dive into the technical details.";
|
|
466
|
+
}
|
|
467
|
+
else if (communication.includes('business')) {
|
|
468
|
+
return "Let's think about this from a business perspective.";
|
|
469
|
+
}
|
|
470
|
+
else if (communication.includes('practical')) {
|
|
471
|
+
return "Here's a practical approach to your question.";
|
|
472
|
+
}
|
|
473
|
+
else if (communication.includes('teaching')) {
|
|
474
|
+
return "Let me walk you through this step by step.";
|
|
475
|
+
}
|
|
476
|
+
return "I'd be happy to help with this!";
|
|
477
|
+
}
|
|
478
|
+
/**
|
|
479
|
+
* Generate knowledge-based guidance
|
|
480
|
+
*/
|
|
481
|
+
generateKnowledgeBasedGuidance(specialist, topic, userMessage) {
|
|
482
|
+
// Create specialist-specific framing of the knowledge
|
|
483
|
+
const specialistLens = this.getSpecialistPerspective(specialist, topic);
|
|
484
|
+
// Extract key points from the topic content
|
|
485
|
+
const keyPoints = this.extractKeyGuidancePoints(topic);
|
|
486
|
+
return `${specialistLens} Looking at **${topic.title}**, ${keyPoints}. This ${topic.frontmatter.difficulty === 'advanced' ? 'advanced' : topic.frontmatter.difficulty} pattern applies directly to your situation.`;
|
|
487
|
+
}
|
|
488
|
+
/**
|
|
489
|
+
* Get specialist-specific perspective on a topic
|
|
490
|
+
*/
|
|
491
|
+
getSpecialistPerspective(specialist, topic) {
|
|
492
|
+
const specialistId = specialist.specialist_id;
|
|
493
|
+
if (specialistId.includes('performance') || specialistId.includes('debug')) {
|
|
494
|
+
return `From a performance optimization standpoint,`;
|
|
495
|
+
}
|
|
496
|
+
else if (specialistId.includes('security')) {
|
|
497
|
+
return `From a security perspective,`;
|
|
498
|
+
}
|
|
499
|
+
else if (specialistId.includes('architect')) {
|
|
500
|
+
return `From an architectural design perspective,`;
|
|
501
|
+
}
|
|
502
|
+
else if (specialistId.includes('test')) {
|
|
503
|
+
return `From a testing and quality standpoint,`;
|
|
504
|
+
}
|
|
505
|
+
else if (specialistId.includes('mentor') || specialistId.includes('docs')) {
|
|
506
|
+
return `Let me explain this step by step:`;
|
|
507
|
+
}
|
|
508
|
+
return `Based on my expertise in ${specialist.expertise.primary[0]},`;
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Extract key guidance points from topic content
|
|
512
|
+
*/
|
|
513
|
+
extractKeyGuidancePoints(topic) {
|
|
514
|
+
const content = topic.content;
|
|
515
|
+
// Look for key implementation patterns
|
|
516
|
+
if (content.includes('## Implementation') || content.includes('## How to')) {
|
|
517
|
+
return `the key implementation approach focuses on ${this.extractImplementationFocus(content)}`;
|
|
518
|
+
}
|
|
519
|
+
// Look for best practices
|
|
520
|
+
if (content.includes('## Best Practices') || content.includes('### Best Practices')) {
|
|
521
|
+
return `the best practices emphasize ${this.extractBestPractices(content)}`;
|
|
522
|
+
}
|
|
523
|
+
// Look for common pitfalls
|
|
524
|
+
if (content.includes('## Common Pitfalls') || content.includes('### Pitfalls')) {
|
|
525
|
+
return `it's important to avoid ${this.extractPitfalls(content)}`;
|
|
526
|
+
}
|
|
527
|
+
// Default to title-based guidance
|
|
528
|
+
return `this pattern provides essential guidance for ${topic.title.toLowerCase()}`;
|
|
529
|
+
}
|
|
530
|
+
/**
|
|
531
|
+
* Extract implementation focus from content
|
|
532
|
+
*/
|
|
533
|
+
extractImplementationFocus(content) {
|
|
534
|
+
// Find implementation section and extract first few points
|
|
535
|
+
const lines = content.split('\n');
|
|
536
|
+
const implIndex = lines.findIndex(line => line.includes('## Implementation') || line.includes('## How to'));
|
|
537
|
+
if (implIndex >= 0 && implIndex < lines.length - 1) {
|
|
538
|
+
const nextFewLines = lines.slice(implIndex + 1, implIndex + 4)
|
|
539
|
+
.filter(line => line.trim() && !line.startsWith('#'))
|
|
540
|
+
.join(' ');
|
|
541
|
+
return this.summarizeIntoPhrase(nextFewLines);
|
|
542
|
+
}
|
|
543
|
+
return 'proper implementation patterns';
|
|
544
|
+
}
|
|
545
|
+
/**
|
|
546
|
+
* Extract best practices from content
|
|
547
|
+
*/
|
|
548
|
+
extractBestPractices(content) {
|
|
549
|
+
const lines = content.split('\n');
|
|
550
|
+
const practicesIndex = lines.findIndex(line => line.includes('Best Practices'));
|
|
551
|
+
if (practicesIndex >= 0 && practicesIndex < lines.length - 1) {
|
|
552
|
+
const nextFewLines = lines.slice(practicesIndex + 1, practicesIndex + 3)
|
|
553
|
+
.filter(line => line.trim() && !line.startsWith('#'))
|
|
554
|
+
.join(' ');
|
|
555
|
+
return this.summarizeIntoPhrase(nextFewLines);
|
|
556
|
+
}
|
|
557
|
+
return 'following established patterns and maintaining code quality';
|
|
558
|
+
}
|
|
559
|
+
/**
|
|
560
|
+
* Extract pitfalls from content
|
|
561
|
+
*/
|
|
562
|
+
extractPitfalls(content) {
|
|
563
|
+
const lines = content.split('\n');
|
|
564
|
+
const pitfallsIndex = lines.findIndex(line => line.includes('Pitfalls') || line.includes('Common Issues'));
|
|
565
|
+
if (pitfallsIndex >= 0 && pitfallsIndex < lines.length - 1) {
|
|
566
|
+
const nextFewLines = lines.slice(pitfallsIndex + 1, pitfallsIndex + 3)
|
|
567
|
+
.filter(line => line.trim() && !line.startsWith('#'))
|
|
568
|
+
.join(' ');
|
|
569
|
+
return this.summarizeIntoPhrase(nextFewLines);
|
|
570
|
+
}
|
|
571
|
+
return 'common implementation mistakes';
|
|
572
|
+
}
|
|
573
|
+
/**
|
|
574
|
+
* Summarize content into a concise phrase
|
|
575
|
+
*/
|
|
576
|
+
summarizeIntoPhrase(text) {
|
|
577
|
+
// Clean up the text and create a concise summary
|
|
578
|
+
const cleaned = text
|
|
579
|
+
.replace(/[*#-]/g, '')
|
|
580
|
+
.replace(/\s+/g, ' ')
|
|
581
|
+
.trim();
|
|
582
|
+
// Take first sentence or first 60 characters
|
|
583
|
+
const firstSentence = cleaned.split('.')[0];
|
|
584
|
+
const truncated = firstSentence.length > 60
|
|
585
|
+
? firstSentence.substring(0, 60) + '...'
|
|
586
|
+
: firstSentence;
|
|
587
|
+
return truncated.toLowerCase();
|
|
588
|
+
}
|
|
589
|
+
/**
|
|
590
|
+
* Generate general guidance when no specific topics match
|
|
591
|
+
*/
|
|
592
|
+
generateGeneralGuidance(specialist, userMessage) {
|
|
593
|
+
return `I'd suggest we start by understanding the specific requirements and then I can point you toward the right specialist or resources that would be most helpful.`;
|
|
594
|
+
}
|
|
595
|
+
// Additional helper methods...
|
|
596
|
+
initializeResponseTemplates() {
|
|
597
|
+
// Initialize with basic templates - these could be loaded from configuration
|
|
598
|
+
this.responseTemplates.set('performance', [
|
|
599
|
+
{
|
|
600
|
+
trigger_keywords: ['slow', 'performance', 'optimize', 'speed'],
|
|
601
|
+
specialist_types: ['dean-debug'],
|
|
602
|
+
template_pattern: "🔧 Dean here! Performance issues are my specialty. {problem_analysis} {solution_approach} {next_steps}",
|
|
603
|
+
personality_emphasis: ['technical', 'systematic', 'thorough'],
|
|
604
|
+
knowledge_domains: ['performance', 'optimization']
|
|
605
|
+
}
|
|
606
|
+
]);
|
|
607
|
+
}
|
|
608
|
+
getResponseTemplates(specialistId) {
|
|
609
|
+
// Return templates relevant to this specialist
|
|
610
|
+
return Array.from(this.responseTemplates.values()).flat()
|
|
611
|
+
.filter(template => template.specialist_types.includes(specialistId));
|
|
612
|
+
}
|
|
613
|
+
selectBestTemplate(templates, userMessage, relevantTopics) {
|
|
614
|
+
// Simple keyword matching for now
|
|
615
|
+
const messageLower = userMessage.toLowerCase();
|
|
616
|
+
for (const template of templates) {
|
|
617
|
+
if (template.trigger_keywords.some(keyword => messageLower.includes(keyword))) {
|
|
618
|
+
return template;
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
return null;
|
|
622
|
+
}
|
|
623
|
+
fillTemplate(template, specialist, userMessage, relevantTopics, context) {
|
|
624
|
+
// Basic template filling - would be more sophisticated in practice
|
|
625
|
+
let content = template.template_pattern;
|
|
626
|
+
content = content.replace('{problem_analysis}', 'Let me analyze this issue systematically.');
|
|
627
|
+
content = content.replace('{solution_approach}', 'Here\'s how I\'d approach solving this:');
|
|
628
|
+
content = content.replace('{next_steps}', 'Next steps would be to examine the specific implementation details.');
|
|
629
|
+
return content;
|
|
630
|
+
}
|
|
631
|
+
extractProblemApproach(specialist) {
|
|
632
|
+
// Extract problem-solving approach from specialist definition
|
|
633
|
+
return specialist.persona.communication_style;
|
|
634
|
+
}
|
|
635
|
+
extractCollaborationStyle(specialist) {
|
|
636
|
+
// Extract collaboration preferences
|
|
637
|
+
return specialist.collaboration?.natural_handoffs?.length > 0 ? 'collaborative' : 'independent';
|
|
638
|
+
}
|
|
639
|
+
extractCharacteristicPhrases(specialist) {
|
|
640
|
+
// Extract characteristic phrases from the content
|
|
641
|
+
return []; // Would parse from the specialist's content
|
|
642
|
+
}
|
|
643
|
+
buildGreeting(specialist, personality, context) {
|
|
644
|
+
let greeting = specialist.persona.greeting;
|
|
645
|
+
if (context?.problem) {
|
|
646
|
+
greeting += ` I understand you're working on ${context.problem}. `;
|
|
647
|
+
}
|
|
648
|
+
greeting += ` I'm here to help with ${specialist.expertise.primary.join(', ')}. What specific challenge are you facing?`;
|
|
649
|
+
return greeting;
|
|
650
|
+
}
|
|
651
|
+
buildHandoffFarewell(fromSpecialist, toSpecialist, context) {
|
|
652
|
+
return `I think ${toSpecialist.persona.greeting.replace('!', '')} would be perfect for this! They're our expert in ${toSpecialist.expertise.primary.join(' and ')}. Let me hand you over to them.`;
|
|
653
|
+
}
|
|
654
|
+
buildHandoffIntroduction(toSpecialist, fromSpecialist, context) {
|
|
655
|
+
return `${toSpecialist.persona.greeting} ${fromSpecialist.specialist_id.split('-')[0]} filled me in on what you're working on. I'm excited to help with ${toSpecialist.expertise.primary[0]}! Let's dive in.`;
|
|
656
|
+
}
|
|
657
|
+
async calculateSpecialistConfidence(userMessage, specialist, context) {
|
|
658
|
+
const messageLower = userMessage.toLowerCase();
|
|
659
|
+
// Tokenize the user message into individual keywords (filter out short words)
|
|
660
|
+
const messageTokens = messageLower
|
|
661
|
+
.split(/[\s,]+/)
|
|
662
|
+
.filter(token => token.length > 3)
|
|
663
|
+
.map(token => token.replace(/[^a-z0-9]/g, ''));
|
|
664
|
+
let confidence = 0;
|
|
665
|
+
const matchedTokens = new Set(); // Track matched tokens to avoid double-counting
|
|
666
|
+
// Check against primary expertise with token-based matching
|
|
667
|
+
for (const expertise of specialist.expertise.primary) {
|
|
668
|
+
const expertiseTokens = expertise
|
|
669
|
+
.toLowerCase()
|
|
670
|
+
.replace(/[-_]/g, ' ')
|
|
671
|
+
.split(/\s+/)
|
|
672
|
+
.filter(t => t.length > 3);
|
|
673
|
+
// Award points for any token match (bidirectional partial matching)
|
|
674
|
+
for (const msgToken of messageTokens) {
|
|
675
|
+
if (matchedTokens.has(msgToken))
|
|
676
|
+
continue; // Skip already matched tokens
|
|
677
|
+
for (const expToken of expertiseTokens) {
|
|
678
|
+
if (expToken.includes(msgToken) || msgToken.includes(expToken)) {
|
|
679
|
+
confidence += 0.15; // Lower increment for more granular scoring
|
|
680
|
+
matchedTokens.add(msgToken);
|
|
681
|
+
break; // Found a match for this message token
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
// Check against secondary expertise with token-based matching
|
|
687
|
+
for (const expertise of specialist.expertise.secondary) {
|
|
688
|
+
const expertiseTokens = expertise
|
|
689
|
+
.toLowerCase()
|
|
690
|
+
.replace(/[-_]/g, ' ')
|
|
691
|
+
.split(/\s+/)
|
|
692
|
+
.filter(t => t.length > 3);
|
|
693
|
+
for (const msgToken of messageTokens) {
|
|
694
|
+
if (matchedTokens.has(msgToken))
|
|
695
|
+
continue;
|
|
696
|
+
for (const expToken of expertiseTokens) {
|
|
697
|
+
if (expToken.includes(msgToken) || msgToken.includes(expToken)) {
|
|
698
|
+
confidence += 0.1;
|
|
699
|
+
matchedTokens.add(msgToken);
|
|
700
|
+
break;
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
}
|
|
704
|
+
}
|
|
705
|
+
// Check against domains with token-based matching
|
|
706
|
+
for (const domain of specialist.domains) {
|
|
707
|
+
const domainTokens = domain
|
|
708
|
+
.toLowerCase()
|
|
709
|
+
.replace(/[-_]/g, ' ')
|
|
710
|
+
.split(/\s+/)
|
|
711
|
+
.filter(t => t.length > 3);
|
|
712
|
+
for (const msgToken of messageTokens) {
|
|
713
|
+
if (matchedTokens.has(msgToken))
|
|
714
|
+
continue;
|
|
715
|
+
for (const domToken of domainTokens) {
|
|
716
|
+
if (domToken.includes(msgToken) || msgToken.includes(domToken)) {
|
|
717
|
+
confidence += 0.05;
|
|
718
|
+
matchedTokens.add(msgToken);
|
|
719
|
+
break;
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
return Math.min(confidence, 1.0);
|
|
725
|
+
}
|
|
726
|
+
generateSuggestionReasoning(userMessage, specialist, confidence) {
|
|
727
|
+
return `${specialist.specialist_id} specializes in ${specialist.expertise.primary.join(', ')} which aligns with your question about ${userMessage.substring(0, 50)}...`;
|
|
728
|
+
}
|
|
729
|
+
generateContextUpdates(context, relevantTopics) {
|
|
730
|
+
return {
|
|
731
|
+
// Add discovered topics to context
|
|
732
|
+
// Update problem understanding
|
|
733
|
+
// Track user preferences
|
|
734
|
+
};
|
|
735
|
+
}
|
|
736
|
+
async suggestCollaborations(context, relevantTopics) {
|
|
737
|
+
const suggestions = [];
|
|
738
|
+
// Check if other specialists might be helpful
|
|
739
|
+
const { specialist } = context;
|
|
740
|
+
if (specialist.collaboration?.natural_handoffs) {
|
|
741
|
+
for (const handoffId of specialist.collaboration.natural_handoffs) {
|
|
742
|
+
suggestions.push({
|
|
743
|
+
specialist_id: handoffId,
|
|
744
|
+
reason: `Natural collaboration partner for ${specialist.expertise.primary[0]}`
|
|
745
|
+
});
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
return suggestions.slice(0, 2); // Limit suggestions
|
|
749
|
+
}
|
|
750
|
+
getApplicationContext(topic, userMessage) {
|
|
751
|
+
const messageWords = userMessage.toLowerCase().split(' ');
|
|
752
|
+
const topicTags = topic.frontmatter.tags || [];
|
|
753
|
+
// Identify context based on user message and topic
|
|
754
|
+
let context = `Applied ${topic.title} to address`;
|
|
755
|
+
if (messageWords.some(word => ['performance', 'slow', 'optimize', 'speed'].includes(word))) {
|
|
756
|
+
context += ` performance concerns in ${this.extractEntityFromMessage(userMessage)}`;
|
|
757
|
+
}
|
|
758
|
+
else if (messageWords.some(word => ['security', 'permission', 'access'].includes(word))) {
|
|
759
|
+
context += ` security requirements for ${this.extractEntityFromMessage(userMessage)}`;
|
|
760
|
+
}
|
|
761
|
+
else if (messageWords.some(word => ['integration', 'api', 'connect'].includes(word))) {
|
|
762
|
+
context += ` integration challenges with ${this.extractEntityFromMessage(userMessage)}`;
|
|
763
|
+
}
|
|
764
|
+
else if (messageWords.some(word => ['test', 'testing', 'validation'].includes(word))) {
|
|
765
|
+
context += ` testing strategy for ${this.extractEntityFromMessage(userMessage)}`;
|
|
766
|
+
}
|
|
767
|
+
else {
|
|
768
|
+
context += ` the development challenge in ${userMessage.substring(0, 50)}...`;
|
|
769
|
+
}
|
|
770
|
+
// Add BC version context if available
|
|
771
|
+
if (topic.frontmatter.bc_versions) {
|
|
772
|
+
context += ` (BC ${topic.frontmatter.bc_versions} compatible)`;
|
|
773
|
+
}
|
|
774
|
+
return context;
|
|
775
|
+
}
|
|
776
|
+
/**
|
|
777
|
+
* Extract business entity or object from user message
|
|
778
|
+
*/
|
|
779
|
+
extractEntityFromMessage(message) {
|
|
780
|
+
const commonEntities = [
|
|
781
|
+
'table', 'page', 'report', 'codeunit', 'api', 'service',
|
|
782
|
+
'customer', 'vendor', 'item', 'purchase', 'sales', 'inventory'
|
|
783
|
+
];
|
|
784
|
+
const messageLower = message.toLowerCase();
|
|
785
|
+
for (const entity of commonEntities) {
|
|
786
|
+
if (messageLower.includes(entity)) {
|
|
787
|
+
return entity;
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
return 'your BC implementation';
|
|
791
|
+
}
|
|
792
|
+
generateRecommendations(topics, userMessage) {
|
|
793
|
+
const recommendations = [];
|
|
794
|
+
for (const topic of topics.slice(0, 3)) {
|
|
795
|
+
// Create actionable recommendations based on the topic
|
|
796
|
+
if (topic.frontmatter.bc_versions) {
|
|
797
|
+
recommendations.push(`Apply **${topic.title}** patterns (compatible with ${topic.frontmatter.bc_versions})`);
|
|
798
|
+
}
|
|
799
|
+
else {
|
|
800
|
+
recommendations.push(`Consider implementing **${topic.title}** best practices`);
|
|
801
|
+
}
|
|
802
|
+
// Add specific action based on topic type
|
|
803
|
+
if (topic.frontmatter.tags?.includes('performance')) {
|
|
804
|
+
recommendations.push(`Measure performance impact of ${topic.title.toLowerCase()} implementation`);
|
|
805
|
+
}
|
|
806
|
+
else if (topic.frontmatter.tags?.includes('security')) {
|
|
807
|
+
recommendations.push(`Review security implications when applying ${topic.title.toLowerCase()}`);
|
|
808
|
+
}
|
|
809
|
+
else if (topic.frontmatter.tags?.includes('testing')) {
|
|
810
|
+
recommendations.push(`Create test cases to validate ${topic.title.toLowerCase()} implementation`);
|
|
811
|
+
}
|
|
812
|
+
}
|
|
813
|
+
return recommendations.slice(0, 4); // Limit to 4 recommendations
|
|
814
|
+
}
|
|
815
|
+
determineResponseType(userMessage, topics) {
|
|
816
|
+
const messageLower = userMessage.toLowerCase();
|
|
817
|
+
if (messageLower.includes('how') || messageLower.includes('help')) {
|
|
818
|
+
return 'guidance';
|
|
819
|
+
}
|
|
820
|
+
else if (messageLower.includes('fix') || messageLower.includes('solve')) {
|
|
821
|
+
return 'solution';
|
|
822
|
+
}
|
|
823
|
+
else if (messageLower.includes('?')) {
|
|
824
|
+
return 'question';
|
|
825
|
+
}
|
|
826
|
+
return 'guidance';
|
|
827
|
+
}
|
|
828
|
+
calculateConfidenceLevel(specialist, userMessage, topics) {
|
|
829
|
+
if (topics.length >= 2)
|
|
830
|
+
return 'high';
|
|
831
|
+
if (topics.length === 1)
|
|
832
|
+
return 'medium';
|
|
833
|
+
return 'low';
|
|
834
|
+
}
|
|
835
|
+
}
|
|
836
|
+
/**
|
|
837
|
+
* Knowledge retriever implementation for BC topics
|
|
838
|
+
*/
|
|
839
|
+
class BCKnowledgeRetriever {
|
|
840
|
+
layerService;
|
|
841
|
+
knowledgeService;
|
|
842
|
+
constructor(layerService, knowledgeService) {
|
|
843
|
+
this.layerService = layerService;
|
|
844
|
+
this.knowledgeService = knowledgeService;
|
|
845
|
+
}
|
|
846
|
+
async findRelevantTopics(userMessage, specialistExpertise, limit = 5) {
|
|
847
|
+
try {
|
|
848
|
+
// Convert specialist expertise to broader search terms that match topic content
|
|
849
|
+
const broadSearchTerms = specialistExpertise.map(exp => {
|
|
850
|
+
// Map specific expertise terms to broader, more searchable terms
|
|
851
|
+
const mappings = {
|
|
852
|
+
'performance-analysis': 'performance',
|
|
853
|
+
'error-diagnosis': 'error',
|
|
854
|
+
'system-monitoring': 'monitoring',
|
|
855
|
+
'optimization-implementation': 'optimization',
|
|
856
|
+
'query-optimization': 'query performance',
|
|
857
|
+
'memory-management': 'memory',
|
|
858
|
+
'integration-performance': 'integration',
|
|
859
|
+
'user-experience-optimization': 'user experience'
|
|
860
|
+
};
|
|
861
|
+
return mappings[exp] || exp.replace('-', ' ');
|
|
862
|
+
});
|
|
863
|
+
// Search for topics using the user's message in code_context field
|
|
864
|
+
const searchParams = {
|
|
865
|
+
code_context: `${userMessage} ${broadSearchTerms.join(' ')}`, // Combine user message with expertise terms
|
|
866
|
+
limit,
|
|
867
|
+
bc_version: 'BC22' // Default - could be made configurable
|
|
868
|
+
};
|
|
869
|
+
// Use the existing knowledge service to find relevant topics
|
|
870
|
+
const searchResults = await this.knowledgeService.searchTopics(searchParams);
|
|
871
|
+
// Get full topic details for each search result
|
|
872
|
+
if (searchResults && Array.isArray(searchResults)) {
|
|
873
|
+
const topics = [];
|
|
874
|
+
for (const result of searchResults.slice(0, limit)) {
|
|
875
|
+
const topic = await this.knowledgeService.getTopic(result.id);
|
|
876
|
+
if (topic) {
|
|
877
|
+
topics.push(topic);
|
|
878
|
+
}
|
|
879
|
+
}
|
|
880
|
+
return topics;
|
|
881
|
+
}
|
|
882
|
+
return [];
|
|
883
|
+
}
|
|
884
|
+
catch (error) {
|
|
885
|
+
console.error('Error finding relevant topics:', error);
|
|
886
|
+
return [];
|
|
887
|
+
}
|
|
888
|
+
}
|
|
889
|
+
/**
|
|
890
|
+
* Find relevant topics within methodology context
|
|
891
|
+
*/
|
|
892
|
+
async findRelevantTopicsInMethodology(userMessage, methodologyContext, specialistExpertise, limit = 5) {
|
|
893
|
+
try {
|
|
894
|
+
// Focus search on methodology-specific topics and current phase context
|
|
895
|
+
const methodologyTerms = [
|
|
896
|
+
methodologyContext.methodology_id,
|
|
897
|
+
methodologyContext.current_phase,
|
|
898
|
+
...specialistExpertise
|
|
899
|
+
];
|
|
900
|
+
const searchParams = {
|
|
901
|
+
code_context: `${userMessage} ${methodologyTerms.join(' ')}`,
|
|
902
|
+
limit,
|
|
903
|
+
bc_version: 'BC22'
|
|
904
|
+
};
|
|
905
|
+
const searchResults = await this.knowledgeService.searchTopics(searchParams);
|
|
906
|
+
if (searchResults && Array.isArray(searchResults)) {
|
|
907
|
+
const topics = [];
|
|
908
|
+
for (const result of searchResults.slice(0, limit)) {
|
|
909
|
+
const topic = await this.knowledgeService.getTopic(result.id);
|
|
910
|
+
if (topic) {
|
|
911
|
+
topics.push(topic);
|
|
912
|
+
}
|
|
913
|
+
}
|
|
914
|
+
return topics;
|
|
915
|
+
}
|
|
916
|
+
return [];
|
|
917
|
+
}
|
|
918
|
+
catch (error) {
|
|
919
|
+
console.error('Error finding methodology-relevant topics:', error);
|
|
920
|
+
return [];
|
|
921
|
+
}
|
|
922
|
+
}
|
|
923
|
+
async getRelatedTopics(topicId, limit = 3) {
|
|
924
|
+
try {
|
|
925
|
+
// Get the main topic first
|
|
926
|
+
const mainTopic = await this.knowledgeService.getTopic(topicId);
|
|
927
|
+
if (!mainTopic) {
|
|
928
|
+
return [];
|
|
929
|
+
}
|
|
930
|
+
// Use domain-based search to find related topics
|
|
931
|
+
const searchParams = {
|
|
932
|
+
query: mainTopic.frontmatter.domain,
|
|
933
|
+
search_type: 'fuzzy',
|
|
934
|
+
limit: limit + 1, // Get one extra to exclude the main topic
|
|
935
|
+
bc_version: 'BC22',
|
|
936
|
+
domains: [mainTopic.frontmatter.domain]
|
|
937
|
+
};
|
|
938
|
+
const searchResults = await this.knowledgeService.searchTopics(searchParams);
|
|
939
|
+
const relatedTopics = [];
|
|
940
|
+
for (const result of searchResults) {
|
|
941
|
+
if (result.id !== topicId && relatedTopics.length < limit) {
|
|
942
|
+
const topic = await this.knowledgeService.getTopic(result.id);
|
|
943
|
+
if (topic) {
|
|
944
|
+
relatedTopics.push(topic);
|
|
945
|
+
}
|
|
946
|
+
}
|
|
947
|
+
}
|
|
948
|
+
return relatedTopics;
|
|
949
|
+
}
|
|
950
|
+
catch (error) {
|
|
951
|
+
console.error('Error getting related topics:', error);
|
|
952
|
+
return [];
|
|
953
|
+
}
|
|
954
|
+
}
|
|
955
|
+
async searchSolutions(problemDescription, domains, limit = 5) {
|
|
956
|
+
try {
|
|
957
|
+
// Search for solution-oriented topics in the specified domains
|
|
958
|
+
const searchParams = {
|
|
959
|
+
query: `${problemDescription} solution implementation fix pattern`,
|
|
960
|
+
search_type: 'hybrid',
|
|
961
|
+
limit: limit * 2, // Get more results to filter
|
|
962
|
+
bc_version: 'BC22',
|
|
963
|
+
domains
|
|
964
|
+
};
|
|
965
|
+
const searchResults = await this.knowledgeService.searchTopics(searchParams);
|
|
966
|
+
const solutionTopics = [];
|
|
967
|
+
for (const result of searchResults) {
|
|
968
|
+
if (solutionTopics.length >= limit)
|
|
969
|
+
break;
|
|
970
|
+
const topic = await this.knowledgeService.getTopic(result.id);
|
|
971
|
+
if (topic) {
|
|
972
|
+
// Filter for topics that are more solution-oriented
|
|
973
|
+
const content = topic.content.toLowerCase();
|
|
974
|
+
const title = topic.title.toLowerCase();
|
|
975
|
+
if (content.includes('solution') ||
|
|
976
|
+
content.includes('implementation') ||
|
|
977
|
+
content.includes('fix') ||
|
|
978
|
+
content.includes('pattern') ||
|
|
979
|
+
title.includes('pattern') ||
|
|
980
|
+
title.includes('optimization') ||
|
|
981
|
+
title.includes('best practice')) {
|
|
982
|
+
solutionTopics.push(topic);
|
|
983
|
+
}
|
|
984
|
+
}
|
|
985
|
+
}
|
|
986
|
+
return solutionTopics;
|
|
987
|
+
}
|
|
988
|
+
catch (error) {
|
|
989
|
+
console.error('Error searching solutions:', error);
|
|
990
|
+
return [];
|
|
991
|
+
}
|
|
992
|
+
}
|
|
993
|
+
}
|
|
994
|
+
//# sourceMappingURL=roleplay-engine.js.map
|