snow-flow 1.4.6 → 1.4.7
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/.husky/pre-commit +4 -0
- package/.releaserc.json +47 -0
- package/LICENSE +1 -1
- package/dist/agents/base-agent.d.ts +1 -1
- package/dist/agents/base-agent.d.ts.map +1 -1
- package/dist/agents/base-agent.js +2 -1
- package/dist/agents/base-agent.js.map +1 -1
- package/dist/agents/coordinator.d.ts.map +1 -1
- package/dist/agents/coordinator.js +5 -2
- package/dist/agents/coordinator.js.map +1 -1
- package/dist/agents/index.d.ts +0 -4
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +1 -0
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/queen-403-handler.d.ts +2 -2
- package/dist/agents/queen-403-handler.d.ts.map +1 -1
- package/dist/agents/queen-403-handler.js +3 -2
- package/dist/agents/queen-403-handler.js.map +1 -1
- package/dist/agents/queen-agent.d.ts +4 -0
- package/dist/agents/queen-agent.d.ts.map +1 -1
- package/dist/agents/queen-agent.js +137 -34
- package/dist/agents/queen-agent.js.map +1 -1
- package/dist/agents/script-writer-agent.js +1 -0
- package/dist/agents/security-agent.js +28 -27
- package/dist/agents/security-agent.js.map +1 -1
- package/dist/agents/widget-creator-agent.d.ts.map +1 -1
- package/dist/agents/widget-creator-agent.js +121 -62
- package/dist/agents/widget-creator-agent.js.map +1 -1
- package/dist/api/error-handling.d.ts +112 -1
- package/dist/api/error-handling.d.ts.map +1 -1
- package/dist/api/error-handling.js +2 -1
- package/dist/api/error-handling.js.map +1 -1
- package/dist/api/natural-language-mapper.d.ts +3 -5
- package/dist/api/natural-language-mapper.d.ts.map +1 -1
- package/dist/api/natural-language-mapper.js +1 -0
- package/dist/api/natural-language-mapper.js.map +1 -1
- package/dist/api/performance-optimizer.d.ts.map +1 -1
- package/dist/api/performance-optimizer.js +1 -0
- package/dist/api/performance-optimizer.js.map +1 -1
- package/dist/api/transaction-manager.js +1 -0
- package/dist/cli/deploy-artifact.js +1 -0
- package/dist/cli/snow-flow-cli-integration.d.ts.map +1 -1
- package/dist/cli/snow-flow-cli-integration.js +1 -0
- package/dist/cli/snow-flow-cli-integration.js.map +1 -1
- package/dist/cli.js +10 -9
- package/dist/cli.js.map +1 -1
- package/dist/compliance/advanced-compliance-system.d.ts +316 -0
- package/dist/compliance/advanced-compliance-system.d.ts.map +1 -0
- package/dist/compliance/advanced-compliance-system.js +1 -0
- package/dist/compliance/advanced-compliance-system.js.map +1 -0
- package/dist/compliance/index.d.ts +6 -0
- package/dist/compliance/index.d.ts.map +1 -0
- package/dist/compliance/index.js +1 -0
- package/dist/compliance/index.js.map +1 -0
- package/dist/config/snow-flow-config.d.ts +279 -241
- package/dist/config/snow-flow-config.d.ts.map +1 -1
- package/dist/config/snow-flow-config.js +1 -0
- package/dist/config/snow-flow-config.js.map +1 -1
- package/dist/documentation/index.d.ts +6 -0
- package/dist/documentation/index.d.ts.map +1 -0
- package/dist/documentation/index.js +1 -0
- package/dist/documentation/index.js.map +1 -0
- package/dist/documentation/self-documenting-system.d.ts +287 -0
- package/dist/documentation/self-documenting-system.d.ts.map +1 -0
- package/dist/documentation/self-documenting-system.js +38 -37
- package/dist/documentation/self-documenting-system.js.map +1 -0
- package/dist/healing/index.d.ts +6 -0
- package/dist/healing/index.d.ts.map +1 -0
- package/dist/healing/index.js +1 -0
- package/dist/healing/index.js.map +1 -0
- package/dist/healing/self-healing-system.d.ts +315 -0
- package/dist/healing/self-healing-system.d.ts.map +1 -0
- package/dist/healing/self-healing-system.js +1 -0
- package/dist/healing/self-healing-system.js.map +1 -0
- package/dist/health/system-health.d.ts +34 -0
- package/dist/health/system-health.d.ts.map +1 -1
- package/dist/health/system-health.js +1 -0
- package/dist/health/system-health.js.map +1 -1
- package/dist/index.js +1 -0
- package/dist/intelligence/acl-analyzer.d.ts +1 -1
- package/dist/intelligence/acl-analyzer.d.ts.map +1 -1
- package/dist/intelligence/acl-analyzer.js +4 -3
- package/dist/intelligence/acl-analyzer.js.map +1 -1
- package/dist/intelligence/auto-resolution-engine.js +1 -0
- package/dist/intelligence/auto-resolution-engine.js.map +1 -1
- package/dist/intelligence/gap-analysis-engine.d.ts +3 -3
- package/dist/intelligence/gap-analysis-engine.js +14 -13
- package/dist/intelligence/gap-analysis-engine.js.map +1 -1
- package/dist/intelligence/manual-instructions-generator.d.ts +1 -1
- package/dist/intelligence/manual-instructions-generator.d.ts.map +1 -1
- package/dist/intelligence/manual-instructions-generator.js +2 -1
- package/dist/intelligence/manual-instructions-generator.js.map +1 -1
- package/dist/intelligence/mcp-coverage-analyzer.js +4 -3
- package/dist/intelligence/mcp-coverage-analyzer.js.map +1 -1
- package/dist/intelligence/multi-pass-requirements-analyzer.d.ts +79 -0
- package/dist/intelligence/multi-pass-requirements-analyzer.d.ts.map +1 -0
- package/dist/intelligence/multi-pass-requirements-analyzer.js +13 -12
- package/dist/intelligence/multi-pass-requirements-analyzer.js.map +1 -0
- package/dist/intelligence/performance-recommendations-engine.d.ts +236 -0
- package/dist/intelligence/performance-recommendations-engine.d.ts.map +1 -0
- package/dist/intelligence/performance-recommendations-engine.js +5 -4
- package/dist/intelligence/performance-recommendations-engine.js.map +1 -0
- package/dist/intelligence/requirements-analyzer.d.ts +1 -1
- package/dist/intelligence/requirements-analyzer.d.ts.map +1 -1
- package/dist/intelligence/requirements-analyzer.js +4 -3
- package/dist/intelligence/requirements-analyzer.js.map +1 -1
- package/dist/intelligence/task-analyzer.d.ts +2 -2
- package/dist/intelligence/task-analyzer.d.ts.map +1 -1
- package/dist/intelligence/task-analyzer.js +40 -39
- package/dist/intelligence/task-analyzer.js.map +1 -1
- package/dist/managers/scope-manager.d.ts.map +1 -1
- package/dist/managers/scope-manager.js +2 -1
- package/dist/managers/scope-manager.js.map +1 -1
- package/dist/mcp/base-mcp-server.d.ts +26 -2
- package/dist/mcp/base-mcp-server.d.ts.map +1 -1
- package/dist/mcp/base-mcp-server.js +2 -1
- package/dist/mcp/base-mcp-server.js.map +1 -1
- package/dist/mcp/http-transport-wrapper.d.ts +1 -0
- package/dist/mcp/http-transport-wrapper.d.ts.map +1 -1
- package/dist/mcp/http-transport-wrapper.js +1 -0
- package/dist/mcp/http-transport-wrapper.js.map +1 -1
- package/dist/mcp/service-discovery-client.js +1 -0
- package/dist/mcp/servicenow-automation-mcp-refactored.d.ts.map +1 -1
- package/dist/mcp/servicenow-automation-mcp-refactored.js +1 -1
- package/dist/mcp/servicenow-automation-mcp-refactored.js.map +1 -1
- package/dist/mcp/servicenow-automation-mcp.js +1 -0
- package/dist/mcp/servicenow-deployment-mcp-refactored.d.ts +5 -0
- package/dist/mcp/servicenow-deployment-mcp-refactored.d.ts.map +1 -1
- package/dist/mcp/servicenow-deployment-mcp-refactored.js +1 -0
- package/dist/mcp/servicenow-deployment-mcp-refactored.js.map +1 -1
- package/dist/mcp/servicenow-deployment-mcp.js +500 -131
- package/dist/mcp/servicenow-deployment-mcp.js.map +1 -1
- package/dist/mcp/servicenow-graph-memory-mcp-refactored.js +5 -4
- package/dist/mcp/servicenow-graph-memory-mcp-refactored.js.map +1 -1
- package/dist/mcp/servicenow-graph-memory-mcp.js +6 -5
- package/dist/mcp/servicenow-graph-memory-mcp.js.map +1 -1
- package/dist/mcp/servicenow-integration-mcp-refactored.d.ts.map +1 -1
- package/dist/mcp/servicenow-integration-mcp-refactored.js +1 -0
- package/dist/mcp/servicenow-integration-mcp-refactored.js.map +1 -1
- package/dist/mcp/servicenow-integration-mcp.js +1 -0
- package/dist/mcp/servicenow-intelligent-mcp-refactored.js +24 -23
- package/dist/mcp/servicenow-intelligent-mcp-refactored.js.map +1 -1
- package/dist/mcp/servicenow-intelligent-mcp.d.ts +38 -1
- package/dist/mcp/servicenow-intelligent-mcp.d.ts.map +1 -1
- package/dist/mcp/servicenow-intelligent-mcp.js +35 -34
- package/dist/mcp/servicenow-intelligent-mcp.js.map +1 -1
- package/dist/mcp/servicenow-mcp-server.js +1 -0
- package/dist/mcp/servicenow-memory-mcp.d.ts +5 -4
- package/dist/mcp/servicenow-memory-mcp.d.ts.map +1 -1
- package/dist/mcp/servicenow-memory-mcp.js +1 -0
- package/dist/mcp/servicenow-memory-mcp.js.map +1 -1
- package/dist/mcp/servicenow-operations-mcp-refactored.d.ts +1 -1
- package/dist/mcp/servicenow-operations-mcp-refactored.d.ts.map +1 -1
- package/dist/mcp/servicenow-operations-mcp-refactored.js +34 -33
- package/dist/mcp/servicenow-operations-mcp-refactored.js.map +1 -1
- package/dist/mcp/servicenow-operations-mcp.d.ts +1 -1
- package/dist/mcp/servicenow-operations-mcp.js +68 -67
- package/dist/mcp/servicenow-operations-mcp.js.map +1 -1
- package/dist/mcp/servicenow-platform-development-mcp-refactored.js +1 -0
- package/dist/mcp/servicenow-platform-development-mcp.js +2 -1
- package/dist/mcp/servicenow-platform-development-mcp.js.map +1 -1
- package/dist/mcp/servicenow-progressive-indexer.js +1 -0
- package/dist/mcp/servicenow-reporting-analytics-mcp-refactored.d.ts.map +1 -1
- package/dist/mcp/servicenow-reporting-analytics-mcp-refactored.js +6 -5
- package/dist/mcp/servicenow-reporting-analytics-mcp-refactored.js.map +1 -1
- package/dist/mcp/servicenow-reporting-analytics-mcp.js +9 -8
- package/dist/mcp/servicenow-reporting-analytics-mcp.js.map +1 -1
- package/dist/mcp/servicenow-security-compliance-mcp-refactored.js +3 -2
- package/dist/mcp/servicenow-security-compliance-mcp-refactored.js.map +1 -1
- package/dist/mcp/servicenow-security-compliance-mcp.js +6 -5
- package/dist/mcp/servicenow-security-compliance-mcp.js.map +1 -1
- package/dist/mcp/servicenow-update-set-mcp-refactored.d.ts.map +1 -1
- package/dist/mcp/servicenow-update-set-mcp-refactored.js +1 -0
- package/dist/mcp/servicenow-update-set-mcp-refactored.js.map +1 -1
- package/dist/mcp/servicenow-update-set-mcp.js +1 -0
- package/dist/mcp/servicenow-update-set-mcp.js.map +1 -1
- package/dist/mcp/servicenow-xml-flow-mcp.d.ts +53 -0
- package/dist/mcp/servicenow-xml-flow-mcp.d.ts.map +1 -0
- package/dist/mcp/servicenow-xml-flow-mcp.js +14 -13
- package/dist/mcp/servicenow-xml-flow-mcp.js.map +1 -0
- package/dist/mcp/shared/agent-context-provider.js +1 -0
- package/dist/mcp/shared/base-mcp-server.d.ts +142 -0
- package/dist/mcp/shared/base-mcp-server.d.ts.map +1 -1
- package/dist/mcp/shared/base-mcp-server.js +5 -4
- package/dist/mcp/shared/base-mcp-server.js.map +1 -1
- package/dist/mcp/shared/mcp-memory-manager.js +1 -0
- package/dist/mcp/shared/mcp-resource-manager.d.ts +99 -0
- package/dist/mcp/shared/mcp-resource-manager.d.ts.map +1 -0
- package/dist/mcp/shared/mcp-resource-manager.js +1 -0
- package/dist/mcp/shared/mcp-resource-manager.js.map +1 -0
- package/dist/mcp/start-all-mcp-servers.js +1 -0
- package/dist/mcp/start-servicenow-mcp.js +1 -0
- package/dist/memory/hierarchical-memory-system.d.ts +90 -0
- package/dist/memory/hierarchical-memory-system.d.ts.map +1 -0
- package/dist/memory/hierarchical-memory-system.js +1 -0
- package/dist/memory/hierarchical-memory-system.js.map +1 -0
- package/dist/memory/index.js +1 -0
- package/dist/memory/memory-client.d.ts +11 -1
- package/dist/memory/memory-client.d.ts.map +1 -1
- package/dist/memory/memory-client.js +1 -0
- package/dist/memory/memory-client.js.map +1 -1
- package/dist/memory/memory-operations.d.ts +12 -3
- package/dist/memory/memory-operations.d.ts.map +1 -1
- package/dist/memory/memory-operations.js +1 -0
- package/dist/memory/memory-operations.js.map +1 -1
- package/dist/memory/memory-system.d.ts +41 -7
- package/dist/memory/memory-system.d.ts.map +1 -1
- package/dist/memory/memory-system.js +1 -0
- package/dist/memory/memory-system.js.map +1 -1
- package/dist/memory/servicenow-artifact-indexer.js +1 -0
- package/dist/memory/snow-flow-memory-patterns.d.ts +213 -0
- package/dist/memory/snow-flow-memory-patterns.d.ts.map +1 -0
- package/dist/memory/snow-flow-memory-patterns.js +1 -0
- package/dist/memory/snow-flow-memory-patterns.js.map +1 -0
- package/dist/memory/swarm-memory.js +1 -0
- package/dist/monitoring/enhanced-monitoring-system.d.ts +172 -0
- package/dist/monitoring/enhanced-monitoring-system.d.ts.map +1 -0
- package/dist/monitoring/enhanced-monitoring-system.js +2 -1
- package/dist/monitoring/enhanced-monitoring-system.js.map +1 -0
- package/dist/monitoring/performance-tracker.d.ts.map +1 -1
- package/dist/monitoring/performance-tracker.js +1 -0
- package/dist/optimization/cost-optimization-engine.d.ts +271 -0
- package/dist/optimization/cost-optimization-engine.d.ts.map +1 -0
- package/dist/optimization/cost-optimization-engine.js +3 -2
- package/dist/optimization/cost-optimization-engine.js.map +1 -0
- package/dist/optimization/index.d.ts +5 -0
- package/dist/optimization/index.d.ts.map +1 -0
- package/dist/optimization/index.js +1 -0
- package/dist/optimization/index.js.map +1 -0
- package/dist/queen/agent-factory.d.ts.map +1 -1
- package/dist/queen/agent-factory.js +18 -3
- package/dist/queen/agent-factory.js.map +1 -1
- package/dist/queen/index.js +1 -0
- package/dist/queen/mcp-execution-bridge.d.ts +4 -0
- package/dist/queen/mcp-execution-bridge.d.ts.map +1 -1
- package/dist/queen/mcp-execution-bridge.js +1 -0
- package/dist/queen/mcp-execution-bridge.js.map +1 -1
- package/dist/queen/neural-learning.d.ts.map +1 -1
- package/dist/queen/neural-learning.js +5 -0
- package/dist/queen/neural-learning.js.map +1 -1
- package/dist/queen/parallel-agent-engine.d.ts +1 -0
- package/dist/queen/parallel-agent-engine.d.ts.map +1 -1
- package/dist/queen/parallel-agent-engine.js +2 -1
- package/dist/queen/parallel-agent-engine.js.map +1 -1
- package/dist/queen/queen-memory-system.d.ts +164 -0
- package/dist/queen/queen-memory-system.d.ts.map +1 -0
- package/dist/queen/queen-memory-system.js +11 -10
- package/dist/queen/queen-memory-system.js.map +1 -0
- package/dist/queen/queen-memory.js +1 -0
- package/dist/queen/servicenow-queen.d.ts +3 -2
- package/dist/queen/servicenow-queen.d.ts.map +1 -1
- package/dist/queen/servicenow-queen.js +20 -19
- package/dist/queen/servicenow-queen.js.map +1 -1
- package/dist/queen/types.d.ts +11 -5
- package/dist/queen/types.d.ts.map +1 -1
- package/dist/queen/types.js +1 -0
- package/dist/rollback/smart-rollback-system.d.ts +350 -0
- package/dist/rollback/smart-rollback-system.d.ts.map +1 -0
- package/dist/rollback/smart-rollback-system.js +1 -0
- package/dist/rollback/smart-rollback-system.js.map +1 -0
- package/dist/snow-flow-system.d.ts +3 -3
- package/dist/snow-flow-system.d.ts.map +1 -1
- package/dist/snow-flow-system.js +4 -3
- package/dist/snow-flow-system.js.map +1 -1
- package/dist/sparc/sparc-help.d.ts +1 -2
- package/dist/sparc/sparc-help.d.ts.map +1 -1
- package/dist/sparc/sparc-help.js +2 -1
- package/dist/sparc/sparc-help.js.map +1 -1
- package/dist/sparc/team-sparc.d.ts +2 -2
- package/dist/sparc/team-sparc.d.ts.map +1 -1
- package/dist/sparc/team-sparc.js +4 -3
- package/dist/sparc/team-sparc.js.map +1 -1
- package/dist/strategies/global-scope-strategy.js +4 -3
- package/dist/strategies/global-scope-strategy.js.map +1 -1
- package/dist/testing/integration-test-suite.d.ts +303 -0
- package/dist/testing/integration-test-suite.d.ts.map +1 -0
- package/dist/testing/integration-test-suite.js +4 -3
- package/dist/testing/integration-test-suite.js.map +1 -0
- package/dist/types/index.d.ts +2 -3
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/servicenow.types.js +1 -0
- package/dist/types/snow-flow.types.d.ts +1 -1
- package/dist/types/snow-flow.types.d.ts.map +1 -1
- package/dist/types/snow-flow.types.js +1 -0
- package/dist/types/todo.types.js +1 -0
- package/dist/utils/action-type-cache.d.ts.map +1 -1
- package/dist/utils/action-type-cache.js +1 -0
- package/dist/utils/action-type-cache.js.map +1 -1
- package/dist/utils/agent-detector.d.ts +1 -1
- package/dist/utils/agent-detector.d.ts.map +1 -1
- package/dist/utils/agent-detector.js +11 -10
- package/dist/utils/agent-detector.js.map +1 -1
- package/dist/utils/artifact-tracker.js +1 -0
- package/dist/utils/dependency-detector.js +1 -0
- package/dist/utils/deployment-metadata-handler.d.ts +110 -0
- package/dist/utils/deployment-metadata-handler.d.ts.map +1 -0
- package/dist/utils/deployment-metadata-handler.js +1 -0
- package/dist/utils/deployment-metadata-handler.js.map +1 -0
- package/dist/utils/error-recovery.js +1 -0
- package/dist/utils/logger.js +1 -0
- package/dist/utils/mcp-auth-middleware.js +1 -0
- package/dist/utils/mcp-config-manager.d.ts.map +1 -1
- package/dist/utils/mcp-config-manager.js +1 -0
- package/dist/utils/mcp-config-manager.js.map +1 -1
- package/dist/utils/mcp-server-manager.d.ts.map +1 -1
- package/dist/utils/mcp-server-manager.js +1 -0
- package/dist/utils/mcp-server-manager.js.map +1 -1
- package/dist/utils/mcp-tool-registry.d.ts +69 -0
- package/dist/utils/mcp-tool-registry.d.ts.map +1 -0
- package/dist/utils/mcp-tool-registry.js +1 -0
- package/dist/utils/mcp-tool-registry.js.map +1 -0
- package/dist/utils/scope-utils.d.ts +2 -2
- package/dist/utils/scope-utils.d.ts.map +1 -1
- package/dist/utils/scope-utils.js +32 -31
- package/dist/utils/scope-utils.js.map +1 -1
- package/dist/utils/servicenow-client.d.ts +18 -1
- package/dist/utils/servicenow-client.d.ts.map +1 -1
- package/dist/utils/servicenow-client.js +1 -0
- package/dist/utils/servicenow-client.js.map +1 -1
- package/dist/utils/servicenow-id-generator.d.ts +107 -0
- package/dist/utils/servicenow-id-generator.d.ts.map +1 -0
- package/dist/utils/servicenow-id-generator.js +1 -0
- package/dist/utils/servicenow-id-generator.js.map +1 -0
- package/dist/utils/snow-oauth.d.ts +20 -0
- package/dist/utils/snow-oauth.d.ts.map +1 -1
- package/dist/utils/snow-oauth.js +1 -0
- package/dist/utils/snow-oauth.js.map +1 -1
- package/dist/utils/template-engine.js +1 -0
- package/dist/utils/theme-manager.js +1 -0
- package/dist/utils/unified-auth-store.d.ts +55 -0
- package/dist/utils/unified-auth-store.d.ts.map +1 -0
- package/dist/utils/unified-auth-store.js +1 -0
- package/dist/utils/unified-auth-store.js.map +1 -0
- package/dist/utils/update-set-importer.d.ts +72 -0
- package/dist/utils/update-set-importer.d.ts.map +1 -0
- package/dist/utils/update-set-importer.js +1 -0
- package/dist/utils/update-set-importer.js.map +1 -0
- package/dist/utils/update-set-xml-packager.d.ts +85 -0
- package/dist/utils/update-set-xml-packager.d.ts.map +1 -0
- package/dist/utils/update-set-xml-packager.js +1 -0
- package/dist/utils/update-set-xml-packager.js.map +1 -0
- package/dist/utils/widget-template-generator.d.ts +82 -0
- package/dist/utils/widget-template-generator.d.ts.map +1 -0
- package/dist/utils/widget-template-generator.js +1 -0
- package/dist/utils/widget-template-generator.js.map +1 -0
- package/dist/version.d.ts +28 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +29 -19
- package/dist/version.js.map +1 -1
- package/package.json +20 -2
- package/COMMIT_MESSAGE.txt +0 -31
- package/action-v2-implementation.js +0 -338
- package/create-snow-flow-env.sh +0 -32
- package/decode-action-values.js +0 -164
- package/npm-publish-summary.txt +0 -35
- package/snow-flow-claude-md-template.txt +0 -262
- package/test-config.js +0 -55
- package/test-flow-fix.js +0 -92
- package/test-parallel-agents.js +0 -177
- package/test-queen-workflow.js +0 -184
- package/test-real-monitoring.js +0 -184
|
@@ -381,7 +381,7 @@ class ServiceNowDeploymentMCP {
|
|
|
381
381
|
items: {
|
|
382
382
|
type: 'object',
|
|
383
383
|
properties: {
|
|
384
|
-
type: { type: 'string', enum: ['widget', '
|
|
384
|
+
type: { type: 'string', enum: ['widget', 'portal_page', 'script', 'business_rule', 'table', 'application'] },
|
|
385
385
|
sys_id: { type: 'string', description: 'Existing artifact sys_id (for updates)' },
|
|
386
386
|
config: { type: 'object', description: 'Artifact configuration' },
|
|
387
387
|
action: { type: 'string', enum: ['create', 'update', 'deploy'], default: 'deploy' },
|
|
@@ -406,7 +406,7 @@ class ServiceNowDeploymentMCP {
|
|
|
406
406
|
properties: {
|
|
407
407
|
type: {
|
|
408
408
|
type: 'string',
|
|
409
|
-
enum: ['widget', '
|
|
409
|
+
enum: ['widget', 'portal_page', 'application', 'script', 'business_rule', 'table'],
|
|
410
410
|
description: 'Type of artifact to deploy'
|
|
411
411
|
},
|
|
412
412
|
instruction: {
|
|
@@ -774,7 +774,7 @@ class ServiceNowDeploymentMCP {
|
|
|
774
774
|
catch (tableError) {
|
|
775
775
|
this.logger.warn('Table record creation failed, trying manual step guidance', tableError);
|
|
776
776
|
// Fallback strategy 2: Provide manual creation steps
|
|
777
|
-
// Enhanced error
|
|
777
|
+
// Enhanced error _analysis for OAuth permissions
|
|
778
778
|
const is403Error = (error) => {
|
|
779
779
|
return error?.response?.status === 403 ||
|
|
780
780
|
error?.message?.includes('403') ||
|
|
@@ -848,7 +848,7 @@ Your widget has been deployed and is ready for testing in Service Portal.`
|
|
|
848
848
|
}
|
|
849
849
|
catch (diagError) {
|
|
850
850
|
this.logger.warn('Could not run auto-diagnostics:', diagError);
|
|
851
|
-
diagnosticsResult = '❌ Auto-diagnostics failed. Run snow_auth_diagnostics manually for detailed
|
|
851
|
+
diagnosticsResult = '❌ Auto-diagnostics failed. Run snow_auth_diagnostics manually for detailed _analysis.';
|
|
852
852
|
}
|
|
853
853
|
troubleshootingSteps = `
|
|
854
854
|
🔧 **AUTO-DIAGNOSTICS RESULTS:**
|
|
@@ -1110,6 +1110,452 @@ Use \`snow_deployment_debug\` for more information about this session.`,
|
|
|
1110
1110
|
throw new Error(enhancedError);
|
|
1111
1111
|
}
|
|
1112
1112
|
}
|
|
1113
|
+
/**
|
|
1114
|
+
* Deploy a portal page with widget placement
|
|
1115
|
+
*/
|
|
1116
|
+
async deployPortalPage(args) {
|
|
1117
|
+
try {
|
|
1118
|
+
// Check authentication first
|
|
1119
|
+
const isAuth = await this.oauth.isAuthenticated();
|
|
1120
|
+
if (!isAuth) {
|
|
1121
|
+
return {
|
|
1122
|
+
content: [
|
|
1123
|
+
{
|
|
1124
|
+
type: 'text',
|
|
1125
|
+
text: '❌ Not authenticated with ServiceNow.\n\nPlease run: snow-flow auth login\n\nOr configure your .env file with ServiceNow OAuth credentials.',
|
|
1126
|
+
},
|
|
1127
|
+
],
|
|
1128
|
+
};
|
|
1129
|
+
}
|
|
1130
|
+
this.logger.info('Deploying portal page to ServiceNow', { name: args.page_id });
|
|
1131
|
+
// Ensure Update Set is active
|
|
1132
|
+
const { updateSetId, updateSetName } = await this.ensureUpdateSet('Portal Page', args.page_id);
|
|
1133
|
+
// Validate portal page structure
|
|
1134
|
+
if (!args.page_id || !args.title) {
|
|
1135
|
+
throw new Error('Portal page must have page_id and title');
|
|
1136
|
+
}
|
|
1137
|
+
// Find widget sys_id if widget name is provided
|
|
1138
|
+
let widgetSysId = args.widget_sys_id;
|
|
1139
|
+
if (!widgetSysId && args.widget_name) {
|
|
1140
|
+
this.logger.info('Looking up widget by name', { widgetName: args.widget_name });
|
|
1141
|
+
try {
|
|
1142
|
+
const widgetResult = await this.client.searchRecords('sp_widget', `name=${args.widget_name}`, 1);
|
|
1143
|
+
if (widgetResult.success && widgetResult.data?.length > 0) {
|
|
1144
|
+
widgetSysId = widgetResult.data[0].sys_id;
|
|
1145
|
+
this.logger.info('Found widget', { widgetName: args.widget_name, sys_id: widgetSysId });
|
|
1146
|
+
}
|
|
1147
|
+
else {
|
|
1148
|
+
this.logger.warn('Widget not found, will create page without widget', { widgetName: args.widget_name });
|
|
1149
|
+
}
|
|
1150
|
+
}
|
|
1151
|
+
catch (error) {
|
|
1152
|
+
this.logger.error('Failed to lookup widget', { widgetName: args.widget_name, error });
|
|
1153
|
+
}
|
|
1154
|
+
}
|
|
1155
|
+
// Determine portal sys_id
|
|
1156
|
+
let portalSysId = '';
|
|
1157
|
+
try {
|
|
1158
|
+
// Default to Employee Service Portal if available, otherwise standard Service Portal
|
|
1159
|
+
const portalQuery = args.portal === 'esc' ? 'url_suffix=esc' : 'url_suffix=sp';
|
|
1160
|
+
const portalResult = await this.client.searchRecords('sp_portal', portalQuery, 1);
|
|
1161
|
+
if (portalResult.success && portalResult.data?.length > 0) {
|
|
1162
|
+
portalSysId = portalResult.data[0].sys_id;
|
|
1163
|
+
this.logger.info('Found portal', { portal: args.portal, sys_id: portalSysId });
|
|
1164
|
+
}
|
|
1165
|
+
}
|
|
1166
|
+
catch (error) {
|
|
1167
|
+
this.logger.warn('Failed to lookup portal, using default', { portal: args.portal, error });
|
|
1168
|
+
}
|
|
1169
|
+
// Create portal page
|
|
1170
|
+
let pageResult;
|
|
1171
|
+
try {
|
|
1172
|
+
// Create the page record
|
|
1173
|
+
pageResult = await this.client.createRecord('sp_page', {
|
|
1174
|
+
id: args.page_id,
|
|
1175
|
+
title: args.title,
|
|
1176
|
+
short_description: args.description || `Portal page created by Snow-Flow`,
|
|
1177
|
+
css: args.page_css || '',
|
|
1178
|
+
sp_portal: portalSysId,
|
|
1179
|
+
public: true,
|
|
1180
|
+
draft: false,
|
|
1181
|
+
internal: false
|
|
1182
|
+
});
|
|
1183
|
+
if (!pageResult.success || !pageResult.data) {
|
|
1184
|
+
throw new Error(`Failed to create portal page: ${pageResult.error || 'Unknown error'}`);
|
|
1185
|
+
}
|
|
1186
|
+
this.logger.info('Portal page created successfully', {
|
|
1187
|
+
pageId: args.page_id,
|
|
1188
|
+
sys_id: pageResult.data.sys_id
|
|
1189
|
+
});
|
|
1190
|
+
}
|
|
1191
|
+
catch (pageError) {
|
|
1192
|
+
this.logger.error('Failed to create portal page', { error: pageError });
|
|
1193
|
+
// Provide manual fallback
|
|
1194
|
+
return this.generatePortalPageManualSteps(args, pageError, updateSetName, updateSetId);
|
|
1195
|
+
}
|
|
1196
|
+
const pageSysId = pageResult.data.sys_id;
|
|
1197
|
+
const credentials = await this.oauth.loadCredentials();
|
|
1198
|
+
// Create widget instances on the page if widget is provided
|
|
1199
|
+
const widgetInstances = [];
|
|
1200
|
+
if (widgetSysId && args.widgets && args.widgets.length > 0) {
|
|
1201
|
+
for (const widgetConfig of args.widgets) {
|
|
1202
|
+
try {
|
|
1203
|
+
// Create container
|
|
1204
|
+
const containerResult = await this.client.createRecord('sp_container', {
|
|
1205
|
+
sp_page: pageSysId,
|
|
1206
|
+
width: widgetConfig.width || 'container',
|
|
1207
|
+
title: widgetConfig.container_title || '',
|
|
1208
|
+
bootstrap_alt: false,
|
|
1209
|
+
class_name: widgetConfig.class_name || '',
|
|
1210
|
+
background_color: widgetConfig.background_color || '',
|
|
1211
|
+
background_image: widgetConfig.background_image || '',
|
|
1212
|
+
background_style: widgetConfig.background_style || 'default',
|
|
1213
|
+
subheader: false
|
|
1214
|
+
});
|
|
1215
|
+
if (containerResult.success && containerResult.data) {
|
|
1216
|
+
// Create row
|
|
1217
|
+
const rowResult = await this.client.createRecord('sp_row', {
|
|
1218
|
+
sp_container: containerResult.data.sys_id,
|
|
1219
|
+
class_name: widgetConfig.row_class || '',
|
|
1220
|
+
order: 1
|
|
1221
|
+
});
|
|
1222
|
+
if (rowResult.success && rowResult.data) {
|
|
1223
|
+
// Create column
|
|
1224
|
+
const columnResult = await this.client.createRecord('sp_column', {
|
|
1225
|
+
sp_row: rowResult.data.sys_id,
|
|
1226
|
+
size_xs: widgetConfig.size || 12,
|
|
1227
|
+
size_sm: widgetConfig.size || 12,
|
|
1228
|
+
size_md: widgetConfig.size || 12,
|
|
1229
|
+
size_lg: widgetConfig.size || 12,
|
|
1230
|
+
order: widgetConfig.column || 1
|
|
1231
|
+
});
|
|
1232
|
+
if (columnResult.success && columnResult.data) {
|
|
1233
|
+
// Create widget instance
|
|
1234
|
+
const instanceResult = await this.client.createRecord('sp_instance', {
|
|
1235
|
+
sp_column: columnResult.data.sys_id,
|
|
1236
|
+
sp_widget: widgetSysId,
|
|
1237
|
+
order: widgetConfig.order || 100,
|
|
1238
|
+
title: widgetConfig.title || '',
|
|
1239
|
+
options: JSON.stringify(widgetConfig.options || {}),
|
|
1240
|
+
class_name: widgetConfig.instance_class || '',
|
|
1241
|
+
color: widgetConfig.color || 'default',
|
|
1242
|
+
active: true,
|
|
1243
|
+
public: true
|
|
1244
|
+
});
|
|
1245
|
+
if (instanceResult.success && instanceResult.data) {
|
|
1246
|
+
widgetInstances.push({
|
|
1247
|
+
widget: args.widget_name || widgetSysId,
|
|
1248
|
+
sys_id: instanceResult.data.sys_id,
|
|
1249
|
+
container: containerResult.data.sys_id,
|
|
1250
|
+
row: rowResult.data.sys_id,
|
|
1251
|
+
column: columnResult.data.sys_id
|
|
1252
|
+
});
|
|
1253
|
+
this.logger.info('Widget instance created on page', {
|
|
1254
|
+
widget: args.widget_name,
|
|
1255
|
+
instance_id: instanceResult.data.sys_id
|
|
1256
|
+
});
|
|
1257
|
+
}
|
|
1258
|
+
}
|
|
1259
|
+
}
|
|
1260
|
+
}
|
|
1261
|
+
}
|
|
1262
|
+
catch (instanceError) {
|
|
1263
|
+
this.logger.error('Failed to create widget instance', {
|
|
1264
|
+
widget: widgetConfig.widget,
|
|
1265
|
+
error: instanceError
|
|
1266
|
+
});
|
|
1267
|
+
}
|
|
1268
|
+
}
|
|
1269
|
+
}
|
|
1270
|
+
// Track in Update Set
|
|
1271
|
+
if (pageResult.data) {
|
|
1272
|
+
await this.ensureUpdateSetTracking({
|
|
1273
|
+
sys_id: pageResult.data.sys_id,
|
|
1274
|
+
type: 'Portal Page',
|
|
1275
|
+
name: args.page_id,
|
|
1276
|
+
table: 'sp_page'
|
|
1277
|
+
});
|
|
1278
|
+
}
|
|
1279
|
+
// Build success message
|
|
1280
|
+
const pageUrl = `https://${credentials?.instance}/${args.portal || 'sp'}?id=${args.page_id}`;
|
|
1281
|
+
const designerUrl = `https://${credentials?.instance}/sp_config?id=page_designer&sys_id=${pageSysId}`;
|
|
1282
|
+
return {
|
|
1283
|
+
content: [
|
|
1284
|
+
{
|
|
1285
|
+
type: 'text',
|
|
1286
|
+
text: `✅ Portal page deployed successfully!
|
|
1287
|
+
|
|
1288
|
+
🎯 **Page Details:**
|
|
1289
|
+
- Page ID: ${args.page_id}
|
|
1290
|
+
- Title: ${args.title}
|
|
1291
|
+
- Sys ID: ${pageSysId}
|
|
1292
|
+
- Portal: ${args.portal === 'esc' ? 'Employee Service Center' : 'Service Portal'}
|
|
1293
|
+
- Layout: ${args.layout || 'single_column'}
|
|
1294
|
+
|
|
1295
|
+
${widgetInstances.length > 0 ? `📦 **Widget Instances Created:**
|
|
1296
|
+
${widgetInstances.map((instance, i) => `${i + 1}. Widget: ${instance.widget} (Instance: ${instance.sys_id})`).join('\n')}
|
|
1297
|
+
` : '📦 **No widgets added** - Page created empty'}
|
|
1298
|
+
|
|
1299
|
+
📦 **Update Set:**
|
|
1300
|
+
- Name: ${updateSetName}
|
|
1301
|
+
- ID: ${updateSetId}
|
|
1302
|
+
- Status: ✅ Tracked
|
|
1303
|
+
|
|
1304
|
+
🔗 **Direct Links:**
|
|
1305
|
+
- View Page: ${pageUrl}
|
|
1306
|
+
- Page Designer: ${designerUrl}
|
|
1307
|
+
- Service Portal Config: https://${credentials?.instance}/sp_config?id=designer
|
|
1308
|
+
|
|
1309
|
+
📝 **Next Steps:**
|
|
1310
|
+
1. ${widgetInstances.length === 0 ? 'Add widgets to the page using Page Designer' : 'Configure widget instance options if needed'}
|
|
1311
|
+
2. Adjust page layout and styling
|
|
1312
|
+
3. Set page permissions if needed
|
|
1313
|
+
4. Test the page in different portal themes
|
|
1314
|
+
5. Add the page to portal menus
|
|
1315
|
+
|
|
1316
|
+
💡 **Success!** Your portal page is ready for use. ${widgetInstances.length > 0 ? 'The widget has been automatically placed on the page.' : 'Use Page Designer to add widgets.'}`
|
|
1317
|
+
},
|
|
1318
|
+
],
|
|
1319
|
+
};
|
|
1320
|
+
}
|
|
1321
|
+
catch (error) {
|
|
1322
|
+
const enhancedError = `🚨 Portal Page Deployment Failed
|
|
1323
|
+
|
|
1324
|
+
📍 Error: ${error instanceof Error ? error.message : String(error)}
|
|
1325
|
+
|
|
1326
|
+
🔧 Troubleshooting Steps:
|
|
1327
|
+
1. Check authentication: snow_auth_diagnostics()
|
|
1328
|
+
2. Verify portal permissions (sp_admin or sp_portal_manager role)
|
|
1329
|
+
3. Check if the widget exists: snow_find_artifact
|
|
1330
|
+
4. Verify Update Set: snow_update_set_current()
|
|
1331
|
+
|
|
1332
|
+
💡 Alternative Approaches:
|
|
1333
|
+
• Deploy widget first: snow_deploy({ type: 'widget', ... })
|
|
1334
|
+
• Use manual creation in Page Designer
|
|
1335
|
+
• Check portal configuration
|
|
1336
|
+
|
|
1337
|
+
📚 Documentation: See PORTAL-PAGE-ENHANCEMENT.md for details`;
|
|
1338
|
+
throw new Error(enhancedError);
|
|
1339
|
+
}
|
|
1340
|
+
}
|
|
1341
|
+
/**
|
|
1342
|
+
* Generate manual steps for portal page creation
|
|
1343
|
+
*/
|
|
1344
|
+
generatePortalPageManualSteps(args, error, updateSetName, updateSetId) {
|
|
1345
|
+
const credentials = this.oauth.loadCredentials();
|
|
1346
|
+
const instance = credentials?.then(c => c?.instance) || 'your-instance';
|
|
1347
|
+
return {
|
|
1348
|
+
content: [{
|
|
1349
|
+
type: 'text',
|
|
1350
|
+
text: `⚠️ **Automatic Portal Page Deployment Failed - Manual Steps Generated**
|
|
1351
|
+
|
|
1352
|
+
🚨 **Error**: ${error instanceof Error ? error.message : String(error)}
|
|
1353
|
+
|
|
1354
|
+
📦 **Update Set Ready**: ${updateSetName} (${updateSetId})
|
|
1355
|
+
✅ Manual changes will be automatically tracked in this Update Set.
|
|
1356
|
+
|
|
1357
|
+
🔧 **Manual Portal Page Creation Steps:**
|
|
1358
|
+
|
|
1359
|
+
1. **Navigate to Service Portal Configuration**
|
|
1360
|
+
🔗 URL: https://${instance}/sp_config?id=designer
|
|
1361
|
+
|
|
1362
|
+
2. **Create New Page**
|
|
1363
|
+
- Click "Pages" in the left menu
|
|
1364
|
+
- Click "New" button
|
|
1365
|
+
- Fill in:
|
|
1366
|
+
- **Page ID**: ${args.page_id}
|
|
1367
|
+
- **Title**: ${args.title}
|
|
1368
|
+
- **Short Description**: ${args.description || 'Portal page with widget'}
|
|
1369
|
+
|
|
1370
|
+
3. **Configure Page Layout**
|
|
1371
|
+
- Click "Open in Designer" after creating the page
|
|
1372
|
+
- Select layout type: ${args.layout === 'multi_column' ? 'Multi-column' : args.layout === 'with_sidebar' ? 'With Sidebar' : 'Single Column'}
|
|
1373
|
+
|
|
1374
|
+
4. **Add Widget to Page** ${args.widget_name ? `(Widget: ${args.widget_name})` : ''}
|
|
1375
|
+
- In Page Designer, click "+" to add a widget
|
|
1376
|
+
- Search for: ${args.widget_name || 'your widget'}
|
|
1377
|
+
- Drag widget to desired location
|
|
1378
|
+
- Configure widget instance options if needed
|
|
1379
|
+
|
|
1380
|
+
5. **Add Custom CSS** (if provided)
|
|
1381
|
+
${args.page_css ? `\`\`\`css
|
|
1382
|
+
${args.page_css}
|
|
1383
|
+
\`\`\`` : ' - No custom CSS provided'}
|
|
1384
|
+
|
|
1385
|
+
6. **Configure Page Settings**
|
|
1386
|
+
- Set "Public" to true for public access
|
|
1387
|
+
- Configure roles if restricted access needed
|
|
1388
|
+
- Set portal: ${args.portal === 'esc' ? 'Employee Service Center' : 'Service Portal'}
|
|
1389
|
+
|
|
1390
|
+
7. **Save and Test**
|
|
1391
|
+
- Click "Save" in Page Designer
|
|
1392
|
+
- Test URL: https://${instance}/${args.portal || 'sp'}?id=${args.page_id}
|
|
1393
|
+
|
|
1394
|
+
8. **Add to Portal Menu** (optional)
|
|
1395
|
+
- Navigate to Service Portal > Menus
|
|
1396
|
+
- Add menu item pointing to your new page
|
|
1397
|
+
|
|
1398
|
+
💡 **Tips:**
|
|
1399
|
+
- Ensure your widget exists before adding to page
|
|
1400
|
+
- Use Preview mode to test before publishing
|
|
1401
|
+
- Check browser console for any client-side errors
|
|
1402
|
+
- Verify widget permissions match page permissions
|
|
1403
|
+
|
|
1404
|
+
📋 **Widget Configuration for Page:**
|
|
1405
|
+
${args.widgets && args.widgets.length > 0 ? args.widgets.map((w, i) => `
|
|
1406
|
+
Widget ${i + 1}:
|
|
1407
|
+
- Column: ${w.column || 1}
|
|
1408
|
+
- Size: ${w.size || 12} (of 12 columns)
|
|
1409
|
+
- Order: ${w.order || 100}`).join('\n') : ' - No specific widget configuration provided'}`
|
|
1410
|
+
}]
|
|
1411
|
+
};
|
|
1412
|
+
}
|
|
1413
|
+
/**
|
|
1414
|
+
* Generate CSS for portal page based on requirements
|
|
1415
|
+
*/
|
|
1416
|
+
generatePortalPageCSS(instruction) {
|
|
1417
|
+
const lower = instruction.toLowerCase();
|
|
1418
|
+
// Base portal page styles
|
|
1419
|
+
let css = `
|
|
1420
|
+
/* Portal Page Custom Styles */
|
|
1421
|
+
.page-container {
|
|
1422
|
+
padding: 20px 0;
|
|
1423
|
+
}
|
|
1424
|
+
|
|
1425
|
+
.page-header {
|
|
1426
|
+
margin-bottom: 30px;
|
|
1427
|
+
padding-bottom: 20px;
|
|
1428
|
+
border-bottom: 1px solid #e0e0e0;
|
|
1429
|
+
}
|
|
1430
|
+
|
|
1431
|
+
.page-title {
|
|
1432
|
+
font-size: 28px;
|
|
1433
|
+
font-weight: 300;
|
|
1434
|
+
color: #333;
|
|
1435
|
+
margin: 0;
|
|
1436
|
+
}
|
|
1437
|
+
`;
|
|
1438
|
+
// Dashboard-specific styles
|
|
1439
|
+
if (lower.includes('dashboard')) {
|
|
1440
|
+
css += `
|
|
1441
|
+
/* Dashboard Layout */
|
|
1442
|
+
.dashboard-container {
|
|
1443
|
+
display: flex;
|
|
1444
|
+
flex-wrap: wrap;
|
|
1445
|
+
gap: 20px;
|
|
1446
|
+
margin: -10px;
|
|
1447
|
+
}
|
|
1448
|
+
|
|
1449
|
+
.dashboard-widget {
|
|
1450
|
+
flex: 1 1 calc(50% - 20px);
|
|
1451
|
+
min-width: 300px;
|
|
1452
|
+
padding: 10px;
|
|
1453
|
+
}
|
|
1454
|
+
|
|
1455
|
+
@media (max-width: 768px) {
|
|
1456
|
+
.dashboard-widget {
|
|
1457
|
+
flex: 1 1 100%;
|
|
1458
|
+
}
|
|
1459
|
+
}
|
|
1460
|
+
|
|
1461
|
+
.metric-widget {
|
|
1462
|
+
background: #fff;
|
|
1463
|
+
border-radius: 8px;
|
|
1464
|
+
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
|
1465
|
+
padding: 20px;
|
|
1466
|
+
transition: transform 0.2s;
|
|
1467
|
+
}
|
|
1468
|
+
|
|
1469
|
+
.metric-widget:hover {
|
|
1470
|
+
transform: translateY(-2px);
|
|
1471
|
+
box-shadow: 0 4px 8px rgba(0,0,0,0.15);
|
|
1472
|
+
}
|
|
1473
|
+
`;
|
|
1474
|
+
}
|
|
1475
|
+
// Multi-column layout styles
|
|
1476
|
+
if (lower.includes('multi') || lower.includes('column')) {
|
|
1477
|
+
css += `
|
|
1478
|
+
/* Multi-Column Layout */
|
|
1479
|
+
.multi-column-container {
|
|
1480
|
+
display: grid;
|
|
1481
|
+
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
|
|
1482
|
+
gap: 20px;
|
|
1483
|
+
margin-top: 20px;
|
|
1484
|
+
}
|
|
1485
|
+
|
|
1486
|
+
.column-widget {
|
|
1487
|
+
background: #fff;
|
|
1488
|
+
padding: 15px;
|
|
1489
|
+
border-radius: 4px;
|
|
1490
|
+
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
|
|
1491
|
+
}
|
|
1492
|
+
`;
|
|
1493
|
+
}
|
|
1494
|
+
// Sidebar layout styles
|
|
1495
|
+
if (lower.includes('sidebar')) {
|
|
1496
|
+
css += `
|
|
1497
|
+
/* Sidebar Layout */
|
|
1498
|
+
.with-sidebar {
|
|
1499
|
+
display: flex;
|
|
1500
|
+
gap: 20px;
|
|
1501
|
+
margin-top: 20px;
|
|
1502
|
+
}
|
|
1503
|
+
|
|
1504
|
+
.main-content {
|
|
1505
|
+
flex: 1;
|
|
1506
|
+
min-width: 0;
|
|
1507
|
+
}
|
|
1508
|
+
|
|
1509
|
+
.sidebar {
|
|
1510
|
+
flex: 0 0 300px;
|
|
1511
|
+
background: #f8f9fa;
|
|
1512
|
+
padding: 20px;
|
|
1513
|
+
border-radius: 4px;
|
|
1514
|
+
}
|
|
1515
|
+
|
|
1516
|
+
@media (max-width: 768px) {
|
|
1517
|
+
.with-sidebar {
|
|
1518
|
+
flex-direction: column;
|
|
1519
|
+
}
|
|
1520
|
+
|
|
1521
|
+
.sidebar {
|
|
1522
|
+
flex: 1 1 auto;
|
|
1523
|
+
}
|
|
1524
|
+
}
|
|
1525
|
+
`;
|
|
1526
|
+
}
|
|
1527
|
+
// Responsive utilities
|
|
1528
|
+
css += `
|
|
1529
|
+
/* Responsive Utilities */
|
|
1530
|
+
@media (max-width: 576px) {
|
|
1531
|
+
.page-title {
|
|
1532
|
+
font-size: 24px;
|
|
1533
|
+
}
|
|
1534
|
+
|
|
1535
|
+
.page-container {
|
|
1536
|
+
padding: 10px;
|
|
1537
|
+
}
|
|
1538
|
+
}
|
|
1539
|
+
|
|
1540
|
+
/* Widget Container Overrides */
|
|
1541
|
+
.sp-widget {
|
|
1542
|
+
margin-bottom: 20px;
|
|
1543
|
+
}
|
|
1544
|
+
|
|
1545
|
+
.sp-widget:last-child {
|
|
1546
|
+
margin-bottom: 0;
|
|
1547
|
+
}
|
|
1548
|
+
|
|
1549
|
+
/* Custom widget spacing */
|
|
1550
|
+
.widget-wrapper {
|
|
1551
|
+
padding: 15px;
|
|
1552
|
+
background: #fff;
|
|
1553
|
+
border-radius: 4px;
|
|
1554
|
+
margin-bottom: 20px;
|
|
1555
|
+
}
|
|
1556
|
+
`;
|
|
1557
|
+
return css;
|
|
1558
|
+
}
|
|
1113
1559
|
async deployFlow(args) {
|
|
1114
1560
|
try {
|
|
1115
1561
|
// Check authentication first
|
|
@@ -1165,7 +1611,7 @@ Use \`snow_deployment_debug\` for more information about this session.`,
|
|
|
1165
1611
|
validationText.includes('Auto-converted "actions" to "activities"') ||
|
|
1166
1612
|
validationText.includes('Smart Auto-Corrections Applied')) {
|
|
1167
1613
|
// Re-parse the corrected definition from the validation process
|
|
1168
|
-
|
|
1614
|
+
const tempDef = typeof args.flow_definition === 'string' ? JSON.parse(args.flow_definition) : args.flow_definition;
|
|
1169
1615
|
if (tempDef.steps && !tempDef.activities) {
|
|
1170
1616
|
tempDef.activities = tempDef.steps;
|
|
1171
1617
|
delete tempDef.steps;
|
|
@@ -2597,8 +3043,8 @@ Run snow_deployment_debug for basic session info or check the logs for more deta
|
|
|
2597
3043
|
// Generate flow logic (connections between actions)
|
|
2598
3044
|
for (let i = 0; i < actionIds.length; i++) {
|
|
2599
3045
|
const logicId = this.generateGUID();
|
|
2600
|
-
|
|
2601
|
-
|
|
3046
|
+
const fromId = i === 0 ? triggerId : actionIds[i - 1];
|
|
3047
|
+
const toId = actionIds[i];
|
|
2602
3048
|
const logicXml = this.generateFlowLogicXML(logicId, flowId, fromId, toId, i, timestamp);
|
|
2603
3049
|
flowLogics.push({ id: logicId, xml: logicXml });
|
|
2604
3050
|
}
|
|
@@ -3144,7 +3590,7 @@ Use \`snow_widget_test\` to run automated tests with different scenarios.`,
|
|
|
3144
3590
|
testResults.push(result);
|
|
3145
3591
|
}
|
|
3146
3592
|
}
|
|
3147
|
-
// Code coverage
|
|
3593
|
+
// Code coverage _analysis if requested
|
|
3148
3594
|
let coverageReport = '';
|
|
3149
3595
|
if (args.coverage !== false) {
|
|
3150
3596
|
const coverage = this.analyzeCodeCoverage(widget);
|
|
@@ -4529,127 +4975,49 @@ Use individual deployment tools like \`snow_deploy_${args.type}\` with manual co
|
|
|
4529
4975
|
* Process natural language instruction into deployment configuration
|
|
4530
4976
|
*/
|
|
4531
4977
|
async processNaturalLanguageInstruction(type, instruction) {
|
|
4532
|
-
// For
|
|
4533
|
-
if (type === '
|
|
4534
|
-
// Extract flow name from instruction
|
|
4535
|
-
const flowName = this.extractNameFromInstruction(instruction);
|
|
4536
|
-
// Create a basic flow definition based on the instruction
|
|
4537
|
-
// This is a simplified version - in production, this would call the flow composer
|
|
4978
|
+
// For portal pages, process the instruction to extract requirements
|
|
4979
|
+
if (type === 'portal_page') {
|
|
4538
4980
|
const lowerInstruction = instruction.toLowerCase();
|
|
4539
|
-
//
|
|
4540
|
-
let
|
|
4541
|
-
let
|
|
4542
|
-
|
|
4543
|
-
|
|
4544
|
-
|
|
4545
|
-
|
|
4546
|
-
}
|
|
4547
|
-
|
|
4548
|
-
|
|
4549
|
-
|
|
4550
|
-
|
|
4551
|
-
|
|
4552
|
-
|
|
4553
|
-
|
|
4554
|
-
|
|
4555
|
-
|
|
4556
|
-
|
|
4557
|
-
|
|
4558
|
-
|
|
4559
|
-
|
|
4560
|
-
|
|
4561
|
-
|
|
4562
|
-
|
|
4563
|
-
|
|
4564
|
-
activities.push({
|
|
4565
|
-
id: `activity_${activityId++}`,
|
|
4566
|
-
name: 'Check Item Type',
|
|
4567
|
-
type: 'condition',
|
|
4568
|
-
condition: 'current.cat_item.name.toLowerCase().includes("monitor") || current.cat_item.name.toLowerCase().includes("display") || current.cat_item.name.toLowerCase().includes("screen") || current.cat_item.name.toLowerCase().includes("lcd")',
|
|
4569
|
-
outputs: {
|
|
4570
|
-
condition_met: true
|
|
4571
|
-
}
|
|
4572
|
-
});
|
|
4573
|
-
}
|
|
4574
|
-
// Add approval activity
|
|
4575
|
-
activities.push({
|
|
4576
|
-
id: `activity_${activityId++}`,
|
|
4577
|
-
name: 'Request Approval',
|
|
4578
|
-
type: 'approval',
|
|
4579
|
-
approval_type: 'user',
|
|
4580
|
-
approvers: lowerInstruction.includes('admin') ? 'admin' : 'assignment_group.manager',
|
|
4581
|
-
inputs: {
|
|
4582
|
-
record: '${trigger.current}',
|
|
4583
|
-
approvers: lowerInstruction.includes('admin') ? 'admin' : 'assignment_group.manager'
|
|
4584
|
-
},
|
|
4585
|
-
outputs: {
|
|
4586
|
-
approval_state: '${approval.state}',
|
|
4587
|
-
approval_comments: '${approval.comments}'
|
|
4588
|
-
}
|
|
4589
|
-
});
|
|
4590
|
-
// Add wait for approval if mentioned
|
|
4591
|
-
if (lowerInstruction.includes('wait for approval')) {
|
|
4592
|
-
activities.push({
|
|
4593
|
-
id: `activity_${activityId++}`,
|
|
4594
|
-
name: 'Wait for Approval',
|
|
4595
|
-
type: 'wait',
|
|
4596
|
-
wait_type: 'approval',
|
|
4597
|
-
inputs: {
|
|
4598
|
-
approval_record: '${activity_' + (activityId - 2) + '.approval_id}'
|
|
4599
|
-
}
|
|
4600
|
-
});
|
|
4601
|
-
}
|
|
4602
|
-
}
|
|
4603
|
-
// Add update status if mentioned
|
|
4604
|
-
if (lowerInstruction.includes('update') && lowerInstruction.includes('status')) {
|
|
4605
|
-
activities.push({
|
|
4606
|
-
id: `activity_${activityId++}`,
|
|
4607
|
-
name: 'Update Request Status',
|
|
4608
|
-
type: 'update_record',
|
|
4609
|
-
table: triggerTable || 'sc_request',
|
|
4610
|
-
inputs: {
|
|
4611
|
-
record: '${trigger.current}',
|
|
4612
|
-
fields: {
|
|
4613
|
-
state: '${activity_' + (activityId - 2) + '.approval_state === "approved" ? "approved" : "rejected"}'
|
|
4614
|
-
}
|
|
4615
|
-
}
|
|
4616
|
-
});
|
|
4617
|
-
}
|
|
4618
|
-
// Create flow definition
|
|
4619
|
-
const flowDefinition = {
|
|
4620
|
-
name: flowName,
|
|
4621
|
-
description: instruction,
|
|
4622
|
-
table: triggerTable,
|
|
4623
|
-
trigger: {
|
|
4624
|
-
type: triggerType,
|
|
4625
|
-
table: triggerTable,
|
|
4626
|
-
condition: ''
|
|
4627
|
-
},
|
|
4628
|
-
activities: activities.length > 0 ? activities : [{
|
|
4629
|
-
id: 'activity_1',
|
|
4630
|
-
name: 'Log Action',
|
|
4631
|
-
type: 'log',
|
|
4632
|
-
message: 'Flow executed for: ' + instruction,
|
|
4633
|
-
level: 'info'
|
|
4634
|
-
}],
|
|
4635
|
-
connections: []
|
|
4636
|
-
};
|
|
4637
|
-
// Generate connections between activities
|
|
4638
|
-
for (let i = 0; i < activities.length - 1; i++) {
|
|
4639
|
-
flowDefinition.connections.push({
|
|
4640
|
-
from: activities[i].id,
|
|
4641
|
-
to: activities[i + 1].id,
|
|
4642
|
-
type: 'always'
|
|
4643
|
-
});
|
|
4644
|
-
}
|
|
4981
|
+
// Extract widget reference from instruction
|
|
4982
|
+
let widgetName = '';
|
|
4983
|
+
let widgetSysId = '';
|
|
4984
|
+
// Look for widget references
|
|
4985
|
+
const widgetMatch = instruction.match(/widget\s+(?:called\s+)?['"]*([^'"]+)['"]*|([^\s]+)\s+widget/i);
|
|
4986
|
+
if (widgetMatch) {
|
|
4987
|
+
widgetName = widgetMatch[1] || widgetMatch[2];
|
|
4988
|
+
}
|
|
4989
|
+
// Extract page details
|
|
4990
|
+
const pageName = this.extractNameFromInstruction(instruction);
|
|
4991
|
+
const pageTitle = pageName.replace(/_/g, ' ').replace(/\b\w/g, l => l.toUpperCase());
|
|
4992
|
+
// Determine layout configuration
|
|
4993
|
+
let layout = 'single_column'; // default
|
|
4994
|
+
if (lowerInstruction.includes('dashboard') || lowerInstruction.includes('multi')) {
|
|
4995
|
+
layout = 'multi_column';
|
|
4996
|
+
}
|
|
4997
|
+
else if (lowerInstruction.includes('sidebar') || lowerInstruction.includes('side')) {
|
|
4998
|
+
layout = 'with_sidebar';
|
|
4999
|
+
}
|
|
5000
|
+
// Determine portal
|
|
5001
|
+
let portal = 'sp'; // default Service Portal
|
|
5002
|
+
if (lowerInstruction.includes('employee') || lowerInstruction.includes('esc')) {
|
|
5003
|
+
portal = 'esc'; // Employee Service Center
|
|
5004
|
+
}
|
|
5005
|
+
// Generate page configuration
|
|
4645
5006
|
return {
|
|
4646
|
-
|
|
4647
|
-
|
|
4648
|
-
|
|
4649
|
-
|
|
4650
|
-
|
|
4651
|
-
|
|
4652
|
-
|
|
5007
|
+
page_id: pageName,
|
|
5008
|
+
title: pageTitle,
|
|
5009
|
+
description: `Portal page for ${widgetName || 'widget'}`,
|
|
5010
|
+
widget_name: widgetName,
|
|
5011
|
+
widget_sys_id: widgetSysId,
|
|
5012
|
+
layout: layout,
|
|
5013
|
+
portal: portal,
|
|
5014
|
+
page_css: this.generatePortalPageCSS(instruction),
|
|
5015
|
+
widgets: [{
|
|
5016
|
+
widget: widgetName,
|
|
5017
|
+
column: 1,
|
|
5018
|
+
order: 100,
|
|
5019
|
+
size: layout === 'multi_column' ? 6 : 12
|
|
5020
|
+
}]
|
|
4653
5021
|
};
|
|
4654
5022
|
}
|
|
4655
5023
|
// For widgets, delegate to widget composer
|
|
@@ -4677,7 +5045,7 @@ Use individual deployment tools like \`snow_deploy_${args.type}\` with manual co
|
|
|
4677
5045
|
extractNameFromInstruction(instruction) {
|
|
4678
5046
|
// Simple name extraction - could be enhanced with NLP
|
|
4679
5047
|
const words = instruction.toLowerCase().split(/\s+/);
|
|
4680
|
-
|
|
5048
|
+
const name = words.filter(word => word.length > 2 &&
|
|
4681
5049
|
!['the', 'and', 'for', 'with', 'that', 'will', 'can', 'should'].includes(word)).slice(0, 3).join('_');
|
|
4682
5050
|
return name || 'auto_generated_artifact';
|
|
4683
5051
|
}
|
|
@@ -5404,8 +5772,8 @@ Use individual deployment tools like \`snow_deploy_${args.type}\` with manual co
|
|
|
5404
5772
|
switch (type) {
|
|
5405
5773
|
case 'widget':
|
|
5406
5774
|
return await this.deployWidget(scopedConfig);
|
|
5407
|
-
case '
|
|
5408
|
-
return await this.
|
|
5775
|
+
case 'portal_page':
|
|
5776
|
+
return await this.deployPortalPage(scopedConfig);
|
|
5409
5777
|
case 'application':
|
|
5410
5778
|
return await this.deployApplication(scopedConfig);
|
|
5411
5779
|
case 'xml_update_set':
|
|
@@ -5708,7 +6076,7 @@ Use individual deployment tools like \`snow_deploy_${args.type}\` with manual co
|
|
|
5708
6076
|
]);
|
|
5709
6077
|
let mainWidget = null;
|
|
5710
6078
|
let searchResults = null;
|
|
5711
|
-
|
|
6079
|
+
const verificationDetails = {
|
|
5712
6080
|
attempt,
|
|
5713
6081
|
mainWidgetCheck: 'pending',
|
|
5714
6082
|
widgetSearchCheck: 'pending',
|
|
@@ -6254,3 +6622,4 @@ server.start().catch((error) => {
|
|
|
6254
6622
|
console.error('Failed to start ServiceNow Deployment MCP:', error);
|
|
6255
6623
|
process.exit(1);
|
|
6256
6624
|
});
|
|
6625
|
+
//# sourceMappingURL=servicenow-deployment-mcp.js.map
|