snow-flow 3.0.9 → 3.0.13
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/claude-flow.bat +0 -0
- package/claude-flow.ps1 +0 -0
- package/dist/mcp/intelligent-reporting-mcp.d.ts +7 -0
- package/dist/mcp/intelligent-reporting-mcp.js +379 -0
- package/dist/mcp/servicenow-automation-mcp.js +0 -0
- package/dist/mcp/servicenow-deployment-mcp.js +0 -0
- package/dist/mcp/servicenow-integration-mcp.js +0 -0
- package/dist/mcp/servicenow-mcp-server.js +0 -0
- package/dist/mcp/servicenow-operations-mcp.js +0 -0
- package/dist/mcp/servicenow-platform-development-mcp.js +0 -0
- package/dist/mcp/servicenow-progressive-indexer.js +0 -0
- package/dist/mcp/servicenow-reporting-analytics-mcp.js +280 -29
- package/dist/mcp/servicenow-security-compliance-mcp.js +0 -0
- package/dist/mcp/servicenow-update-set-mcp.js +0 -0
- package/dist/mcp/start-all-mcp-servers.js +0 -0
- package/dist/mcp/start-servicenow-mcp.js +0 -0
- package/dist/services/widget-deployment-service.d.ts +2 -1
- package/dist/services/widget-deployment-service.js +17 -16
- package/dist/utils/anti-mock-data-validator.d.ts +66 -0
- package/dist/utils/anti-mock-data-validator.js +316 -0
- package/dist/utils/servicenow-eventual-consistency.d.ts +120 -0
- package/dist/utils/servicenow-eventual-consistency.js +220 -0
- package/memory/agents/README.md +1 -1
- package/memory/claude-flow-data.json +1 -1
- package/memory/sessions/README.md +1 -1
- package/package.json +4 -3
- package/.mcp.json +0 -22
- package/claude-flow.config.json +0 -20
- package/dist/agents/app-creator.agent.d.ts +0 -55
- package/dist/agents/app-creator.agent.js +0 -1292
- package/dist/agents/base/base-snow-agent.d.ts +0 -75
- package/dist/agents/base/base-snow-agent.js +0 -169
- package/dist/agents/base-snow-agent.d.ts +0 -63
- package/dist/agents/base-snow-agent.js +0 -296
- package/dist/agents/coordinator.d.ts +0 -200
- package/dist/agents/coordinator.js +0 -777
- package/dist/agents/flow-builder-agent.d.ts +0 -18
- package/dist/agents/flow-builder-agent.js +0 -197
- package/dist/agents/queen-403-handler.d.ts +0 -47
- package/dist/agents/queen-403-handler.js +0 -175
- package/dist/agents/queen-agent-example.d.ts +0 -23
- package/dist/agents/queen-agent-example.js +0 -240
- package/dist/agents/queen-agent.test.d.ts +0 -6
- package/dist/agents/script-generator.agent.d.ts +0 -32
- package/dist/agents/script-generator.agent.js +0 -772
- package/dist/agents/script-writer-agent.d.ts +0 -22
- package/dist/agents/script-writer-agent.js +0 -695
- package/dist/agents/security-agent.d.ts +0 -23
- package/dist/agents/security-agent.js +0 -619
- package/dist/agents/specialists/automation-specialist.agent.d.ts +0 -44
- package/dist/agents/specialists/automation-specialist.agent.js +0 -204
- package/dist/agents/specialists/data-specialist.agent.d.ts +0 -165
- package/dist/agents/specialists/data-specialist.agent.js +0 -484
- package/dist/agents/specialists/integration-specialist.agent.d.ts +0 -227
- package/dist/agents/specialists/integration-specialist.agent.js +0 -725
- package/dist/agents/specialists/reporting-specialist.agent.d.ts +0 -54
- package/dist/agents/specialists/reporting-specialist.agent.js +0 -193
- package/dist/agents/specialists/security-specialist.agent.d.ts +0 -85
- package/dist/agents/specialists/security-specialist.agent.js +0 -309
- package/dist/agents/teams/adaptive/adaptive-coordinator.agent.d.ts +0 -111
- package/dist/agents/teams/adaptive/adaptive-coordinator.agent.js +0 -383
- package/dist/agents/teams/base-team.d.ts +0 -72
- package/dist/agents/teams/base-team.js +0 -253
- package/dist/agents/teams/team-types.d.ts +0 -265
- package/dist/agents/teams/team-types.js +0 -3
- package/dist/agents/teams/widget/widget-architect.agent.d.ts +0 -61
- package/dist/agents/teams/widget/widget-architect.agent.js +0 -436
- package/dist/agents/teams/widget/widget-backend.agent.d.ts +0 -74
- package/dist/agents/teams/widget/widget-backend.agent.js +0 -1531
- package/dist/agents/teams/widget/widget-frontend.agent.d.ts +0 -67
- package/dist/agents/teams/widget/widget-frontend.agent.js +0 -1014
- package/dist/agents/teams/widget/widget-platform.agent.d.ts +0 -90
- package/dist/agents/teams/widget/widget-platform.agent.js +0 -1190
- package/dist/agents/teams/widget/widget-uiux.agent.d.ts +0 -107
- package/dist/agents/teams/widget/widget-uiux.agent.js +0 -1033
- package/dist/agents/test-agent.d.ts +0 -26
- package/dist/agents/test-agent.js +0 -734
- package/dist/agents/test-agents.d.ts +0 -7
- package/dist/agents/test-agents.js +0 -64
- package/dist/agents/ui-builder.agent.d.ts +0 -50
- package/dist/agents/ui-builder.agent.js +0 -1539
- package/dist/agents/widget-builder.agent.d.ts +0 -32
- package/dist/agents/widget-builder.agent.js +0 -439
- package/dist/agents/widget-creator-agent.d.ts +0 -18
- package/dist/agents/widget-creator-agent.js +0 -498
- package/dist/agents/workflow-designer.agent.d.ts +0 -31
- package/dist/agents/workflow-designer.agent.js +0 -583
- package/dist/api/error-handling.d.ts +0 -325
- package/dist/api/error-handling.js +0 -1488
- package/dist/api/flow-designer-api.d.ts +0 -167
- package/dist/api/flow-designer-api.js +0 -554
- package/dist/api/natural-language-mapper.d.ts +0 -124
- package/dist/api/natural-language-mapper.js +0 -501
- package/dist/api/performance-optimizer.d.ts +0 -240
- package/dist/api/performance-optimizer.js +0 -706
- package/dist/api/transaction-manager.d.ts +0 -189
- package/dist/api/transaction-manager.js +0 -576
- package/dist/assembly/team-assembler.d.ts +0 -140
- package/dist/assembly/team-assembler.js +0 -502
- package/dist/benchmark-performance.d.ts +0 -41
- package/dist/benchmark-performance.js +0 -230
- package/dist/cli/snow-flow-cli-integration.d.ts +0 -30
- package/dist/cli/snow-flow-cli-integration.js +0 -396
- package/dist/coordination/coordination-engine.d.ts +0 -41
- package/dist/coordination/coordination-engine.js +0 -324
- package/dist/coordination/coordination.test.d.ts +0 -6
- package/dist/coordination/example.d.ts +0 -31
- package/dist/coordination/example.js +0 -394
- package/dist/coordination/execution-patterns.d.ts +0 -43
- package/dist/coordination/execution-patterns.js +0 -507
- package/dist/coordination/factory.d.ts +0 -94
- package/dist/coordination/factory.js +0 -433
- package/dist/coordination/index.d.ts +0 -71
- package/dist/coordination/index.js +0 -135
- package/dist/coordination/progress-monitor.d.ts +0 -71
- package/dist/coordination/progress-monitor.js +0 -505
- package/dist/coordination/quality-gates.d.ts +0 -124
- package/dist/coordination/quality-gates.js +0 -577
- package/dist/coordination/shared-memory.d.ts +0 -39
- package/dist/coordination/shared-memory.js +0 -289
- package/dist/coordination/task-dependencies.d.ts +0 -50
- package/dist/coordination/task-dependencies.js +0 -407
- package/dist/coordination/team-coordinator.d.ts +0 -59
- package/dist/coordination/team-coordinator.js +0 -550
- package/dist/coordination/types.d.ts +0 -152
- package/dist/coordination/types.js +0 -3
- package/dist/mcp/mcp-wrapper.d.ts +0 -8
- package/dist/mcp/mcp-wrapper.js +0 -77
- package/dist/mcp/servicenow-flow-composer-enhanced.js +0 -396
- package/dist/mcp/servicenow-flow-composer-mcp.d.ts +0 -7
- package/dist/mcp/servicenow-flow-composer-mcp.js +0 -3103
- package/dist/mcp/servicenow-graph-memory-mcp.d.ts +0 -7
- package/dist/mcp/servicenow-intelligent-mcp.d.ts +0 -143
- package/dist/mcp/servicenow-intelligent-mcp.js +0 -4156
- package/dist/mcp/servicenow-xml-flow-mcp.d.ts +0 -53
- package/dist/mcp/servicenow-xml-flow-mcp.js +0 -1704
- package/dist/mcp/singleton-check.js +0 -31
- package/dist/mcp/test-simple-mcp.d.ts +0 -6
- package/dist/mcp/test-simple-mcp.js +0 -63
- package/dist/memory/hierarchical-memory-system.d.ts +0 -90
- package/dist/memory/hierarchical-memory-system.js +0 -400
- package/dist/memory/index.d.ts +0 -9
- package/dist/memory/index.js +0 -20
- package/dist/memory/mcp-integration-example.d.ts +0 -6
- package/dist/memory/mcp-integration-example.js +0 -281
- package/dist/memory/memory-client.d.ts +0 -199
- package/dist/memory/memory-client.js +0 -364
- package/dist/memory/memory-manager.d.ts +0 -29
- package/dist/memory/memory-manager.js +0 -280
- package/dist/memory/memory-operations.d.ts +0 -179
- package/dist/memory/memory-operations.js +0 -691
- package/dist/memory/memory-system.d.ts +0 -153
- package/dist/memory/memory-system.js +0 -651
- package/dist/memory/memory-test.d.ts +0 -6
- package/dist/memory/memory-test.js +0 -161
- package/dist/memory/snow-flow-memory-patterns.d.ts +0 -213
- package/dist/memory/snow-flow-memory-patterns.js +0 -200
- package/dist/memory/snow-memory.d.ts +0 -54
- package/dist/memory/snow-memory.js +0 -301
- package/dist/memory/swarm-memory.d.ts +0 -135
- package/dist/memory/swarm-memory.js +0 -378
- package/dist/optimization/flow-performance-optimizer.js +0 -723
- package/dist/orchestration/discovery/service-discovery.d.ts +0 -81
- package/dist/orchestration/discovery/service-discovery.js +0 -808
- package/dist/orchestration/distributed-orchestrator.d.ts +0 -131
- package/dist/orchestration/distributed-orchestrator.js +0 -712
- package/dist/orchestration/distribution/task-distribution-engine.d.ts +0 -53
- package/dist/orchestration/distribution/task-distribution-engine.js +0 -586
- package/dist/orchestration/flow-update-orchestrator.js +0 -648
- package/dist/orchestration/interfaces/distributed-orchestration.interface.d.ts +0 -606
- package/dist/orchestration/interfaces/distributed-orchestration.interface.js +0 -65
- package/dist/orchestration/protocols/mcpx-protocol.d.ts +0 -71
- package/dist/orchestration/protocols/mcpx-protocol.js +0 -668
- package/dist/orchestration/state/distributed-state-manager.d.ts +0 -89
- package/dist/orchestration/state/distributed-state-manager.js +0 -716
- package/dist/orchestrator/flow-composer.d.ts +0 -105
- package/dist/orchestrator/flow-composer.js +0 -404
- package/dist/orchestrator/flow-pattern-templates.d.ts +0 -260
- package/dist/orchestrator/flow-pattern-templates.js +0 -908
- package/dist/orchestrator/flow-subflow-decision-engine.d.ts +0 -202
- package/dist/orchestrator/flow-subflow-decision-engine.js +0 -769
- package/dist/orchestrator/flow-validation-engine.d.ts +0 -169
- package/dist/orchestrator/flow-validation-engine.js +0 -913
- package/dist/orchestrator/snow-orchestrator.d.ts +0 -49
- package/dist/orchestrator/snow-orchestrator.js +0 -235
- package/dist/orchestrator/subflow-creation-handler.d.ts +0 -230
- package/dist/orchestrator/subflow-creation-handler.js +0 -791
- package/dist/patterns/adaptive-patterns.d.ts +0 -140
- package/dist/patterns/adaptive-patterns.js +0 -549
- package/dist/queen/advanced-integration-test.d.ts +0 -48
- package/dist/queen/advanced-integration-test.js +0 -473
- package/dist/queen/integration-example.d.ts +0 -82
- package/dist/queen/integration-example.js +0 -219
- package/dist/queen/integration-test.d.ts +0 -72
- package/dist/queen/integration-test.js +0 -563
- package/dist/queen/mock-mcp-client.d.ts +0 -71
- package/dist/queen/mock-mcp-client.js +0 -317
- package/dist/queen/run-integration-tests.d.ts +0 -9
- package/dist/queen/run-integration-tests.js +0 -27
- package/dist/sparc/coordinators/adaptive-coordinator.d.ts +0 -54
- package/dist/sparc/coordinators/adaptive-coordinator.js +0 -367
- package/dist/sparc/coordinators/team-coordinator.d.ts +0 -66
- package/dist/sparc/coordinators/team-coordinator.js +0 -402
- package/dist/sparc/modes/team-modes.d.ts +0 -33
- package/dist/sparc/modes/team-modes.js +0 -399
- package/dist/sparc/teams/application-team.d.ts +0 -73
- package/dist/sparc/teams/application-team.js +0 -463
- package/dist/sparc/teams/flow-team.d.ts +0 -67
- package/dist/sparc/teams/flow-team.js +0 -373
- package/dist/sparc/teams/widget-team.d.ts +0 -61
- package/dist/sparc/teams/widget-team.js +0 -280
- package/dist/specialists/app-specialists.d.ts +0 -93
- package/dist/specialists/app-specialists.js +0 -1639
- package/dist/specialists/base-specialist.d.ts +0 -19
- package/dist/specialists/base-specialist.js +0 -54
- package/dist/specialists/flow-specialists.d.ts +0 -113
- package/dist/specialists/flow-specialists.js +0 -1787
- package/dist/specialists/individual-specialists.d.ts +0 -67
- package/dist/specialists/individual-specialists.js +0 -632
- package/dist/specialists/widget-specialists.d.ts +0 -70
- package/dist/specialists/widget-specialists.js +0 -1264
- package/dist/src/utils/agent-detector.js +0 -655
- package/dist/teams/adaptive-team.d.ts +0 -81
- package/dist/teams/adaptive-team.js +0 -1153
- package/dist/teams/application-team.d.ts +0 -30
- package/dist/teams/application-team.js +0 -547
- package/dist/teams/base-team.d.ts +0 -55
- package/dist/teams/base-team.js +0 -243
- package/dist/teams/flow-team.d.ts +0 -28
- package/dist/teams/flow-team.js +0 -525
- package/dist/teams/widget-team.d.ts +0 -26
- package/dist/teams/widget-team.js +0 -459
- package/dist/templates/flow-template-system.js +0 -625
- package/dist/test-fetch-incidents.d.ts +0 -2
- package/dist/test-fetch-incidents.js +0 -84
- package/dist/test-incident-access.d.ts +0 -2
- package/dist/test-incident-access.js +0 -72
- package/dist/test-iphone-flow.js +0 -189
- package/dist/test-limit-problem.d.ts +0 -2
- package/dist/test-limit-problem.js +0 -60
- package/dist/test-ml-batch-fix.d.ts +0 -2
- package/dist/test-ml-batch-fix.js +0 -104
- package/dist/test-ml-batch.d.ts +0 -2
- package/dist/test-ml-batch.js +0 -87
- package/dist/test-ml-query.d.ts +0 -2
- package/dist/test-ml-query.js +0 -100
- package/dist/test-ml-training-fix.d.ts +0 -12
- package/dist/test-ml-training-fix.js +0 -113
- package/dist/test-ml-training.d.ts +0 -2
- package/dist/test-ml-training.js +0 -32
- package/dist/test-operations-query.d.ts +0 -2
- package/dist/test-operations-query.js +0 -84
- package/dist/test-performance-query.d.ts +0 -2
- package/dist/test-performance-query.js +0 -52
- package/dist/test-singleton-protection.d.ts +0 -8
- package/dist/test-singleton-protection.js +0 -110
- package/dist/test-smart-limits.d.ts +0 -13
- package/dist/test-smart-limits.js +0 -100
- package/dist/test-snow-query-incidents.d.ts +0 -2
- package/dist/test-snow-query-incidents.js +0 -66
- package/dist/test-universal-query.d.ts +0 -2
- package/dist/test-universal-query.js +0 -106
- package/dist/testing/flow-testing-automation.js +0 -641
- package/dist/utils/complete-flow-xml-generator.js +0 -1285
- package/dist/utils/file-storage-fallback.d.ts +0 -62
- package/dist/utils/file-storage-fallback.js +0 -289
- package/dist/utils/flow-api-discovery.d.ts +0 -151
- package/dist/utils/flow-api-discovery.js +0 -439
- package/dist/utils/flow-examples.js +0 -720
- package/dist/utils/flow-structure-builder.js +0 -677
- package/dist/utils/flow-xml-generator.d.ts +0 -41
- package/dist/utils/flow-xml-generator.js +0 -258
- package/dist/utils/improved-flow-xml-generator.js +0 -820
- package/dist/utils/mcp-process-manager.backup.d.ts +0 -58
- package/dist/utils/mcp-process-manager.backup.js +0 -220
- package/dist/utils/mcp-singleton-enforcer.d.ts +0 -36
- package/dist/utils/mcp-singleton-enforcer.js +0 -201
- package/dist/utils/mcp-timeout-fix.d.ts +0 -53
- package/dist/utils/mcp-timeout-fix.js +0 -221
- package/dist/utils/migrate-claude-flow.d.ts +0 -22
- package/dist/utils/migrate-claude-flow.js +0 -120
- package/dist/utils/scope-utils.d.ts +0 -72
- package/dist/utils/scope-utils.js +0 -386
- package/dist/utils/snow-oauth-old.d.ts +0 -65
- package/dist/utils/snow-oauth-old.js +0 -345
- package/dist/utils/xml-first-flow-generator.js +0 -513
- package/memory/servicenow_artifacts/000d9224c895221055906c7518aa2d3d.json +0 -30
- package/memory/servicenow_artifacts/0196b66173303010e46b4a2214f6a7a2.json +0 -36
- package/memory/servicenow_artifacts/125e5d1d837e2a102a7ea130ceaad397.json +0 -30
- package/memory/servicenow_artifacts/7637c1f2b7112210a5e5911cde11a972.json +0 -30
- package/memory/servicenow_artifacts/default_documentation_tables_1754056582292.json +0 -55
- package/memory/servicenow_artifacts/default_documentation_tables_1754057477189.json +0 -55
- package/memory/update-set-sessions/01f82af583faea102a7ea130ceaad3d4.json +0 -9
- package/memory/update-set-sessions/27718fb983faea102a7ea130ceaad34b.json +0 -9
- package/memory/update-set-sessions/412e9bf6833e22502a7ea130ceaad30a.json +0 -8
- package/memory/update-set-sessions/66fc5a79837aea102a7ea130ceaad3ab.json +0 -9
- package/memory/update-set-sessions/71a30ff5837eea102a7ea130ceaad37f.json +0 -9
- package/memory/update-set-sessions/74fba27983faea102a7ea130ceaad3bd.json +0 -9
- package/memory/update-set-sessions/a0b147b5837eea102a7ea130ceaad344.json +0 -58
- package/memory/update-set-sessions/b13f5eb983baea102a7ea130ceaad33e.json +0 -9
- package/reports/swarm-auto-centralized-1752649029776.json +0 -13
- package/src/memory/README.md +0 -240
|
@@ -1,439 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* ServiceNow Flow Designer API Discovery Service
|
|
4
|
-
* Provides dynamic discovery of action types, trigger types, and flow metadata
|
|
5
|
-
*/
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.FlowAPIDiscovery = void 0;
|
|
8
|
-
const logger_js_1 = require("./logger.js");
|
|
9
|
-
class FlowAPIDiscovery {
|
|
10
|
-
constructor(client) {
|
|
11
|
-
this.actionTypeCache = new Map();
|
|
12
|
-
this.triggerTypeCache = new Map();
|
|
13
|
-
this.cacheExpiry = 24 * 60 * 60 * 1000; // 24 hours
|
|
14
|
-
this.lastCacheUpdate = 0;
|
|
15
|
-
this.logger = new logger_js_1.Logger('FlowAPIDiscovery');
|
|
16
|
-
this.client = client;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Discover action types based on natural language intent
|
|
20
|
-
*/
|
|
21
|
-
async discoverActionTypes(intent, limit = 10) {
|
|
22
|
-
await this.ensureCache();
|
|
23
|
-
const lowerIntent = intent.toLowerCase();
|
|
24
|
-
const exactMatches = [];
|
|
25
|
-
const partialMatches = [];
|
|
26
|
-
const semanticMatches = [];
|
|
27
|
-
// Define semantic mappings for common intents
|
|
28
|
-
const semanticMappings = this.getSemanticMappings();
|
|
29
|
-
for (const [_, actionType] of this.actionTypeCache) {
|
|
30
|
-
const actionName = actionType.name.toLowerCase();
|
|
31
|
-
const actionLabel = actionType.label.toLowerCase();
|
|
32
|
-
const actionDesc = actionType.description?.toLowerCase() || '';
|
|
33
|
-
// Exact match
|
|
34
|
-
if (actionName === lowerIntent || actionLabel === lowerIntent) {
|
|
35
|
-
exactMatches.push(actionType);
|
|
36
|
-
continue;
|
|
37
|
-
}
|
|
38
|
-
// Partial match
|
|
39
|
-
if (actionName.includes(lowerIntent) || actionLabel.includes(lowerIntent) ||
|
|
40
|
-
actionDesc.includes(lowerIntent)) {
|
|
41
|
-
partialMatches.push(actionType);
|
|
42
|
-
continue;
|
|
43
|
-
}
|
|
44
|
-
// Semantic match
|
|
45
|
-
const semanticKeywords = semanticMappings[lowerIntent] || [];
|
|
46
|
-
for (const keyword of semanticKeywords) {
|
|
47
|
-
if (actionName.includes(keyword) || actionLabel.includes(keyword) ||
|
|
48
|
-
actionDesc.includes(keyword)) {
|
|
49
|
-
semanticMatches.push(actionType);
|
|
50
|
-
break;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
// Calculate confidence score
|
|
55
|
-
const totalMatches = exactMatches.length + partialMatches.length + semanticMatches.length;
|
|
56
|
-
const confidenceScore = this.calculateConfidenceScore(exactMatches, partialMatches, semanticMatches);
|
|
57
|
-
return {
|
|
58
|
-
exact_matches: exactMatches.slice(0, limit),
|
|
59
|
-
partial_matches: partialMatches.slice(0, limit),
|
|
60
|
-
semantic_matches: semanticMatches.slice(0, limit),
|
|
61
|
-
confidence_score: confidenceScore
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Discover trigger types based on table and operation
|
|
66
|
-
*/
|
|
67
|
-
async discoverTriggerTypes(table, operation) {
|
|
68
|
-
await this.ensureCache();
|
|
69
|
-
const results = [];
|
|
70
|
-
const lowerOperation = operation.toLowerCase();
|
|
71
|
-
// Map common operations to trigger types
|
|
72
|
-
const operationMappings = {
|
|
73
|
-
'create': ['Created', 'Inserted'],
|
|
74
|
-
'update': ['Updated', 'Modified'],
|
|
75
|
-
'delete': ['Deleted', 'Removed'],
|
|
76
|
-
'created_or_updated': ['Created or Updated'],
|
|
77
|
-
'schedule': ['Scheduled'],
|
|
78
|
-
'manual': ['Manual']
|
|
79
|
-
};
|
|
80
|
-
const searchTerms = operationMappings[lowerOperation] || [operation];
|
|
81
|
-
for (const [_, triggerType] of this.triggerTypeCache) {
|
|
82
|
-
// Check if trigger supports the table
|
|
83
|
-
if (triggerType.supported_tables.length > 0 &&
|
|
84
|
-
!triggerType.supported_tables.includes(table)) {
|
|
85
|
-
continue;
|
|
86
|
-
}
|
|
87
|
-
// Check if trigger matches the operation
|
|
88
|
-
for (const term of searchTerms) {
|
|
89
|
-
if (triggerType.name.toLowerCase().includes(term.toLowerCase()) ||
|
|
90
|
-
triggerType.label.toLowerCase().includes(term.toLowerCase())) {
|
|
91
|
-
results.push(triggerType);
|
|
92
|
-
break;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
return results.slice(0, 10);
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Get detailed action type information including inputs/outputs
|
|
100
|
-
*/
|
|
101
|
-
async getActionTypeDetails(actionTypeId) {
|
|
102
|
-
await this.ensureCache();
|
|
103
|
-
const actionType = this.actionTypeCache.get(actionTypeId);
|
|
104
|
-
if (!actionType) {
|
|
105
|
-
return null;
|
|
106
|
-
}
|
|
107
|
-
// If inputs/outputs are not cached, fetch them
|
|
108
|
-
if (actionType.inputs.length === 0 && actionType.outputs.length === 0) {
|
|
109
|
-
await this.fetchActionTypeInputsOutputs(actionType);
|
|
110
|
-
}
|
|
111
|
-
return actionType;
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Get all available action categories
|
|
115
|
-
*/
|
|
116
|
-
async getActionCategories() {
|
|
117
|
-
await this.ensureCache();
|
|
118
|
-
const categories = new Set();
|
|
119
|
-
for (const [_, actionType] of this.actionTypeCache) {
|
|
120
|
-
if (actionType.category) {
|
|
121
|
-
categories.add(actionType.category);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
return Array.from(categories).sort();
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* Search for actions by category
|
|
128
|
-
*/
|
|
129
|
-
async getActionsByCategory(category, limit = 20) {
|
|
130
|
-
await this.ensureCache();
|
|
131
|
-
const results = [];
|
|
132
|
-
for (const [_, actionType] of this.actionTypeCache) {
|
|
133
|
-
if (actionType.category === category) {
|
|
134
|
-
results.push(actionType);
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
return results.slice(0, limit);
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* Validate action input configuration
|
|
141
|
-
*/
|
|
142
|
-
async validateActionInputs(actionTypeId, inputs) {
|
|
143
|
-
const actionType = await this.getActionTypeDetails(actionTypeId);
|
|
144
|
-
if (!actionType) {
|
|
145
|
-
return { valid: false, errors: ['Action type not found'], warnings: [] };
|
|
146
|
-
}
|
|
147
|
-
const errors = [];
|
|
148
|
-
const warnings = [];
|
|
149
|
-
// Check required inputs
|
|
150
|
-
for (const requiredInput of actionType.inputs.filter(i => i.required)) {
|
|
151
|
-
if (!inputs[requiredInput.name]) {
|
|
152
|
-
errors.push(`Required input '${requiredInput.name}' is missing`);
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
// Check input types and validation
|
|
156
|
-
for (const [inputName, inputValue] of Object.entries(inputs)) {
|
|
157
|
-
const inputDef = actionType.inputs.find(i => i.name === inputName);
|
|
158
|
-
if (!inputDef) {
|
|
159
|
-
warnings.push(`Input '${inputName}' is not defined for this action type`);
|
|
160
|
-
continue;
|
|
161
|
-
}
|
|
162
|
-
// Basic type validation
|
|
163
|
-
if (inputDef.type === 'boolean' && typeof inputValue !== 'boolean') {
|
|
164
|
-
errors.push(`Input '${inputName}' must be a boolean`);
|
|
165
|
-
}
|
|
166
|
-
else if (inputDef.type === 'number' && typeof inputValue !== 'number') {
|
|
167
|
-
errors.push(`Input '${inputName}' must be a number`);
|
|
168
|
-
}
|
|
169
|
-
// Custom validation if available
|
|
170
|
-
if (inputDef.validation) {
|
|
171
|
-
try {
|
|
172
|
-
const validationRegex = new RegExp(inputDef.validation);
|
|
173
|
-
if (!validationRegex.test(String(inputValue))) {
|
|
174
|
-
errors.push(`Input '${inputName}' does not match validation pattern`);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
catch (e) {
|
|
178
|
-
// Ignore regex errors
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
return {
|
|
183
|
-
valid: errors.length === 0,
|
|
184
|
-
errors,
|
|
185
|
-
warnings
|
|
186
|
-
};
|
|
187
|
-
}
|
|
188
|
-
/**
|
|
189
|
-
* Suggest action types based on flow context
|
|
190
|
-
*/
|
|
191
|
-
async suggestActionTypes(flowContext) {
|
|
192
|
-
await this.ensureCache();
|
|
193
|
-
const suggestions = [];
|
|
194
|
-
const contextKeywords = this.extractContextKeywords(flowContext);
|
|
195
|
-
// Score actions based on context relevance
|
|
196
|
-
const actionScores = new Map();
|
|
197
|
-
for (const [_, actionType] of this.actionTypeCache) {
|
|
198
|
-
let score = 0;
|
|
199
|
-
// Score based on category relevance
|
|
200
|
-
if (actionType.category) {
|
|
201
|
-
score += this.scoreCategory(actionType.category, flowContext);
|
|
202
|
-
}
|
|
203
|
-
// Score based on description relevance
|
|
204
|
-
if (actionType.description) {
|
|
205
|
-
score += this.scoreDescription(actionType.description, contextKeywords);
|
|
206
|
-
}
|
|
207
|
-
// Score based on input/output compatibility
|
|
208
|
-
score += this.scoreCompatibility(actionType, flowContext);
|
|
209
|
-
if (score > 0) {
|
|
210
|
-
actionScores.set(actionType.sys_id, score);
|
|
211
|
-
suggestions.push(actionType);
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
// Sort by score and return top results
|
|
215
|
-
suggestions.sort((a, b) => {
|
|
216
|
-
const scoreA = actionScores.get(a.sys_id) || 0;
|
|
217
|
-
const scoreB = actionScores.get(b.sys_id) || 0;
|
|
218
|
-
return scoreB - scoreA;
|
|
219
|
-
});
|
|
220
|
-
return suggestions.slice(0, 10);
|
|
221
|
-
}
|
|
222
|
-
/**
|
|
223
|
-
* Ensure cache is up to date
|
|
224
|
-
*/
|
|
225
|
-
async ensureCache() {
|
|
226
|
-
const now = Date.now();
|
|
227
|
-
if (now - this.lastCacheUpdate > this.cacheExpiry) {
|
|
228
|
-
await this.refreshCache();
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
/**
|
|
232
|
-
* Refresh cache from ServiceNow
|
|
233
|
-
*/
|
|
234
|
-
async refreshCache() {
|
|
235
|
-
this.logger.info('Refreshing Flow API discovery cache...');
|
|
236
|
-
try {
|
|
237
|
-
// Fetch action types
|
|
238
|
-
await this.fetchActionTypes();
|
|
239
|
-
// Fetch trigger types
|
|
240
|
-
await this.fetchTriggerTypes();
|
|
241
|
-
this.lastCacheUpdate = Date.now();
|
|
242
|
-
this.logger.info('Cache refreshed successfully');
|
|
243
|
-
}
|
|
244
|
-
catch (error) {
|
|
245
|
-
this.logger.error('Failed to refresh cache:', error);
|
|
246
|
-
throw error;
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
/**
|
|
250
|
-
* Fetch action types from ServiceNow
|
|
251
|
-
*/
|
|
252
|
-
async fetchActionTypes() {
|
|
253
|
-
const response = await this.client.getRecords('sys_hub_action_type_base', {
|
|
254
|
-
sysparm_limit: 1000,
|
|
255
|
-
sysparm_fields: 'sys_id,name,label,description,category,active,script_template,execution_mode,supports_async',
|
|
256
|
-
sysparm_query: 'active=true'
|
|
257
|
-
});
|
|
258
|
-
if (response.success && response.data) {
|
|
259
|
-
this.actionTypeCache.clear();
|
|
260
|
-
for (const actionTypeData of response.data) {
|
|
261
|
-
const actionType = {
|
|
262
|
-
sys_id: actionTypeData.sys_id,
|
|
263
|
-
name: actionTypeData.name,
|
|
264
|
-
label: actionTypeData.label || actionTypeData.name,
|
|
265
|
-
description: actionTypeData.description,
|
|
266
|
-
category: actionTypeData.category || 'uncategorized',
|
|
267
|
-
script_template: actionTypeData.script_template,
|
|
268
|
-
execution_mode: actionTypeData.execution_mode,
|
|
269
|
-
supports_async: actionTypeData.supports_async === 'true',
|
|
270
|
-
inputs: [],
|
|
271
|
-
outputs: []
|
|
272
|
-
};
|
|
273
|
-
this.actionTypeCache.set(actionType.sys_id, actionType);
|
|
274
|
-
}
|
|
275
|
-
this.logger.info(`Cached ${response.data.length} action types`);
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
/**
|
|
279
|
-
* Fetch trigger types from ServiceNow
|
|
280
|
-
*/
|
|
281
|
-
async fetchTriggerTypes() {
|
|
282
|
-
const response = await this.client.getRecords('sys_hub_trigger_type', {
|
|
283
|
-
sysparm_limit: 100,
|
|
284
|
-
sysparm_fields: 'sys_id,name,label,description,supports_conditions,supported_tables'
|
|
285
|
-
});
|
|
286
|
-
if (response.success && response.data) {
|
|
287
|
-
this.triggerTypeCache.clear();
|
|
288
|
-
for (const triggerTypeData of response.data) {
|
|
289
|
-
const triggerType = {
|
|
290
|
-
sys_id: triggerTypeData.sys_id,
|
|
291
|
-
name: triggerTypeData.name,
|
|
292
|
-
label: triggerTypeData.label || triggerTypeData.name,
|
|
293
|
-
description: triggerTypeData.description,
|
|
294
|
-
supports_conditions: triggerTypeData.supports_conditions === 'true',
|
|
295
|
-
supported_tables: triggerTypeData.supported_tables ?
|
|
296
|
-
triggerTypeData.supported_tables.split(',').map((t) => t.trim()) : [],
|
|
297
|
-
inputs: [],
|
|
298
|
-
outputs: []
|
|
299
|
-
};
|
|
300
|
-
this.triggerTypeCache.set(triggerType.sys_id, triggerType);
|
|
301
|
-
}
|
|
302
|
-
this.logger.info(`Cached ${response.data.length} trigger types`);
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
/**
|
|
306
|
-
* Fetch inputs and outputs for an action type
|
|
307
|
-
*/
|
|
308
|
-
async fetchActionTypeInputsOutputs(actionType) {
|
|
309
|
-
// Fetch inputs
|
|
310
|
-
const inputsResponse = await this.client.getRecords('sys_hub_action_input', {
|
|
311
|
-
sysparm_query: `action_type=${actionType.sys_id}`,
|
|
312
|
-
sysparm_fields: 'sys_id,name,label,type,required,default_value,description,validation'
|
|
313
|
-
});
|
|
314
|
-
if (inputsResponse.success && inputsResponse.data) {
|
|
315
|
-
actionType.inputs = inputsResponse.data.map((input) => ({
|
|
316
|
-
sys_id: input.sys_id,
|
|
317
|
-
name: input.name,
|
|
318
|
-
label: input.label || input.name,
|
|
319
|
-
type: input.type || 'string',
|
|
320
|
-
required: input.required === 'true',
|
|
321
|
-
default_value: input.default_value,
|
|
322
|
-
description: input.description,
|
|
323
|
-
validation: input.validation
|
|
324
|
-
}));
|
|
325
|
-
}
|
|
326
|
-
// Fetch outputs
|
|
327
|
-
const outputsResponse = await this.client.getRecords('sys_hub_action_output', {
|
|
328
|
-
sysparm_query: `action_type=${actionType.sys_id}`,
|
|
329
|
-
sysparm_fields: 'sys_id,name,label,type,description,sample_value'
|
|
330
|
-
});
|
|
331
|
-
if (outputsResponse.success && outputsResponse.data) {
|
|
332
|
-
actionType.outputs = outputsResponse.data.map((output) => ({
|
|
333
|
-
sys_id: output.sys_id,
|
|
334
|
-
name: output.name,
|
|
335
|
-
label: output.label || output.name,
|
|
336
|
-
type: output.type || 'string',
|
|
337
|
-
description: output.description,
|
|
338
|
-
sample_value: output.sample_value
|
|
339
|
-
}));
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
/**
|
|
343
|
-
* Get semantic mappings for common intents
|
|
344
|
-
*/
|
|
345
|
-
getSemanticMappings() {
|
|
346
|
-
return {
|
|
347
|
-
'email': ['send', 'notification', 'message', 'mail'],
|
|
348
|
-
'notify': ['notification', 'send', 'email', 'alert'],
|
|
349
|
-
'create': ['insert', 'add', 'new', 'record'],
|
|
350
|
-
'update': ['modify', 'change', 'edit', 'set'],
|
|
351
|
-
'delete': ['remove', 'destroy', 'erase'],
|
|
352
|
-
'approval': ['approve', 'review', 'authorization'],
|
|
353
|
-
'wait': ['delay', 'pause', 'timer', 'sleep'],
|
|
354
|
-
'script': ['execute', 'run', 'custom', 'code'],
|
|
355
|
-
'log': ['write', 'record', 'track', 'audit'],
|
|
356
|
-
'condition': ['if', 'check', 'validate', 'test'],
|
|
357
|
-
'loop': ['iterate', 'repeat', 'foreach'],
|
|
358
|
-
'transform': ['convert', 'map', 'parse', 'format']
|
|
359
|
-
};
|
|
360
|
-
}
|
|
361
|
-
/**
|
|
362
|
-
* Calculate confidence score for search results
|
|
363
|
-
*/
|
|
364
|
-
calculateConfidenceScore(exactMatches, partialMatches, semanticMatches) {
|
|
365
|
-
const exactWeight = 1.0;
|
|
366
|
-
const partialWeight = 0.7;
|
|
367
|
-
const semanticWeight = 0.4;
|
|
368
|
-
const totalScore = (exactMatches.length * exactWeight) +
|
|
369
|
-
(partialMatches.length * partialWeight) +
|
|
370
|
-
(semanticMatches.length * semanticWeight);
|
|
371
|
-
const totalPossible = exactMatches.length + partialMatches.length + semanticMatches.length;
|
|
372
|
-
return totalPossible > 0 ? totalScore / totalPossible : 0;
|
|
373
|
-
}
|
|
374
|
-
/**
|
|
375
|
-
* Extract context keywords from flow context
|
|
376
|
-
*/
|
|
377
|
-
extractContextKeywords(flowContext) {
|
|
378
|
-
const keywords = [];
|
|
379
|
-
// Extract from previous actions
|
|
380
|
-
for (const action of flowContext.previousActions) {
|
|
381
|
-
keywords.push(...action.toLowerCase().split(/\s+/));
|
|
382
|
-
}
|
|
383
|
-
// Extract from target table
|
|
384
|
-
keywords.push(...flowContext.targetTable.toLowerCase().split('_'));
|
|
385
|
-
// Extract from flow purpose
|
|
386
|
-
keywords.push(...flowContext.flowPurpose.toLowerCase().split(/\s+/));
|
|
387
|
-
return [...new Set(keywords)]; // Remove duplicates
|
|
388
|
-
}
|
|
389
|
-
/**
|
|
390
|
-
* Score category relevance
|
|
391
|
-
*/
|
|
392
|
-
scoreCategory(category, flowContext) {
|
|
393
|
-
const categoryKeywords = category.toLowerCase().split(/\s+/);
|
|
394
|
-
const contextKeywords = this.extractContextKeywords(flowContext);
|
|
395
|
-
let score = 0;
|
|
396
|
-
for (const keyword of categoryKeywords) {
|
|
397
|
-
if (contextKeywords.includes(keyword)) {
|
|
398
|
-
score += 0.3;
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
return score;
|
|
402
|
-
}
|
|
403
|
-
/**
|
|
404
|
-
* Score description relevance
|
|
405
|
-
*/
|
|
406
|
-
scoreDescription(description, contextKeywords) {
|
|
407
|
-
const descriptionKeywords = description.toLowerCase().split(/\s+/);
|
|
408
|
-
let score = 0;
|
|
409
|
-
for (const keyword of contextKeywords) {
|
|
410
|
-
if (descriptionKeywords.includes(keyword)) {
|
|
411
|
-
score += 0.2;
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
return score;
|
|
415
|
-
}
|
|
416
|
-
/**
|
|
417
|
-
* Score compatibility with flow context
|
|
418
|
-
*/
|
|
419
|
-
scoreCompatibility(actionType, flowContext) {
|
|
420
|
-
let score = 0;
|
|
421
|
-
// Check if action type works with the target table
|
|
422
|
-
const tableInputs = actionType.inputs.filter(i => i.name.toLowerCase().includes('table') ||
|
|
423
|
-
i.name.toLowerCase().includes('record'));
|
|
424
|
-
if (tableInputs.length > 0) {
|
|
425
|
-
score += 0.1;
|
|
426
|
-
}
|
|
427
|
-
// Check if action type fits the flow purpose
|
|
428
|
-
if (actionType.description) {
|
|
429
|
-
const purposeKeywords = flowContext.flowPurpose.toLowerCase().split(/\s+/);
|
|
430
|
-
for (const keyword of purposeKeywords) {
|
|
431
|
-
if (actionType.description.toLowerCase().includes(keyword)) {
|
|
432
|
-
score += 0.1;
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
return score;
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
exports.FlowAPIDiscovery = FlowAPIDiscovery;
|