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,1285 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
"use strict";
|
|
3
|
-
/**
|
|
4
|
-
* COMPLETE ServiceNow Flow XML Generator - Production Ready
|
|
5
|
-
*
|
|
6
|
-
* This is the DEFINITIVE solution that addresses ALL issues:
|
|
7
|
-
* ✅ Generates COMPLETE Flow Designer XML with ALL required structures
|
|
8
|
-
* ✅ Uses correct v2 tables (sys_hub_action_instance_v2, sys_hub_trigger_instance_v2)
|
|
9
|
-
* ✅ Implements proper Base64+gzip encoding for action values
|
|
10
|
-
* ✅ Creates comprehensive label_cache and snapshot structures
|
|
11
|
-
* ✅ Includes ALL required metadata fields
|
|
12
|
-
* ✅ Supports ALL flow component types (triggers, actions, logic, variables)
|
|
13
|
-
* ✅ Generates production-ready Update Set XML for direct import
|
|
14
|
-
*/
|
|
15
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
16
|
-
if (k2 === undefined) k2 = k;
|
|
17
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
18
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
19
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
20
|
-
}
|
|
21
|
-
Object.defineProperty(o, k2, desc);
|
|
22
|
-
}) : (function(o, m, k, k2) {
|
|
23
|
-
if (k2 === undefined) k2 = k;
|
|
24
|
-
o[k2] = m[k];
|
|
25
|
-
}));
|
|
26
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
27
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
28
|
-
}) : function(o, v) {
|
|
29
|
-
o["default"] = v;
|
|
30
|
-
});
|
|
31
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
32
|
-
var ownKeys = function(o) {
|
|
33
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
34
|
-
var ar = [];
|
|
35
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
36
|
-
return ar;
|
|
37
|
-
};
|
|
38
|
-
return ownKeys(o);
|
|
39
|
-
};
|
|
40
|
-
return function (mod) {
|
|
41
|
-
if (mod && mod.__esModule) return mod;
|
|
42
|
-
var result = {};
|
|
43
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
44
|
-
__setModuleDefault(result, mod);
|
|
45
|
-
return result;
|
|
46
|
-
};
|
|
47
|
-
})();
|
|
48
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
49
|
-
exports.CompleteFlowXMLGenerator = exports.COMPLETE_TRIGGER_TYPE_MAPPINGS = exports.COMPLETE_ACTION_TYPE_MAPPINGS = void 0;
|
|
50
|
-
exports.generateCompleteFlowXML = generateCompleteFlowXML;
|
|
51
|
-
const uuid_1 = require("uuid");
|
|
52
|
-
const fs = __importStar(require("fs"));
|
|
53
|
-
const path = __importStar(require("path"));
|
|
54
|
-
const zlib = __importStar(require("zlib"));
|
|
55
|
-
const crypto = __importStar(require("crypto"));
|
|
56
|
-
// COMPLETE action type mappings from ServiceNow research
|
|
57
|
-
exports.COMPLETE_ACTION_TYPE_MAPPINGS = {
|
|
58
|
-
// Core Flow Designer Actions
|
|
59
|
-
'notification': {
|
|
60
|
-
sys_id: 'c1806bf4a70323008299b39f087901cb',
|
|
61
|
-
table: 'sys_hub_action_type_definition',
|
|
62
|
-
display_name: 'Send Notification',
|
|
63
|
-
internal_name: 'com.glide.hub.action.notification'
|
|
64
|
-
},
|
|
65
|
-
'approval': {
|
|
66
|
-
sys_id: 'cd04ac7573011010791f94596bf6a716',
|
|
67
|
-
table: 'sys_hub_action_type_definition',
|
|
68
|
-
display_name: 'Ask for Approval',
|
|
69
|
-
internal_name: 'com.glide.hub.action.approval'
|
|
70
|
-
},
|
|
71
|
-
'script': {
|
|
72
|
-
sys_id: '43c8cf0e0b200300d97d8bf637673ab4',
|
|
73
|
-
table: 'sys_hub_action_type_definition',
|
|
74
|
-
display_name: 'Run Script',
|
|
75
|
-
internal_name: 'com.glide.hub.action.script'
|
|
76
|
-
},
|
|
77
|
-
'create_record': {
|
|
78
|
-
sys_id: '1aa80b100b10030077c9a4d3ca9619e1',
|
|
79
|
-
table: 'sys_hub_action_type_definition',
|
|
80
|
-
display_name: 'Create Record',
|
|
81
|
-
internal_name: 'com.glide.hub.action.create_record'
|
|
82
|
-
},
|
|
83
|
-
'update_record': {
|
|
84
|
-
sys_id: 'f9d01dd2c31332002841b63b12d3aea1',
|
|
85
|
-
table: 'sys_hub_action_type_definition',
|
|
86
|
-
display_name: 'Update Record',
|
|
87
|
-
internal_name: 'com.glide.hub.action.update_record'
|
|
88
|
-
},
|
|
89
|
-
'delete_record': {
|
|
90
|
-
sys_id: 'caa80b100b10030077c9a4d3ca9619f0',
|
|
91
|
-
table: 'sys_hub_action_type_definition',
|
|
92
|
-
display_name: 'Delete Record',
|
|
93
|
-
internal_name: 'com.glide.hub.action.delete_record'
|
|
94
|
-
},
|
|
95
|
-
'lookup_record': {
|
|
96
|
-
sys_id: '7aa80b100b10030077c9a4d3ca9619e2',
|
|
97
|
-
table: 'sys_hub_action_type_definition',
|
|
98
|
-
display_name: 'Look Up Record',
|
|
99
|
-
internal_name: 'com.glide.hub.action.lookup_record'
|
|
100
|
-
},
|
|
101
|
-
'rest_step': {
|
|
102
|
-
sys_id: '8f10cf4e0b200300d97d8bf637673a89',
|
|
103
|
-
table: 'sys_hub_action_type_definition',
|
|
104
|
-
display_name: 'REST Step',
|
|
105
|
-
internal_name: 'com.glide.hub.action.rest'
|
|
106
|
-
},
|
|
107
|
-
'wait_for_condition': {
|
|
108
|
-
sys_id: '89ce8a4187120010663ca1bb36cb0be3',
|
|
109
|
-
table: 'sys_hub_action_type_definition',
|
|
110
|
-
display_name: 'Wait for Condition',
|
|
111
|
-
internal_name: 'com.glide.hub.action.wait_condition'
|
|
112
|
-
},
|
|
113
|
-
'assign_subflow': {
|
|
114
|
-
sys_id: '82b067a4db01030077c9a4d3ca961916',
|
|
115
|
-
table: 'sys_hub_action_type_definition',
|
|
116
|
-
display_name: 'Call Subflow',
|
|
117
|
-
internal_name: 'com.glide.hub.action.subflow'
|
|
118
|
-
},
|
|
119
|
-
'if': {
|
|
120
|
-
sys_id: '9a5afba40b200300d97d8bf637673a3f',
|
|
121
|
-
table: 'sys_hub_action_type_definition',
|
|
122
|
-
display_name: 'If',
|
|
123
|
-
internal_name: 'com.glide.hub.logic.if'
|
|
124
|
-
},
|
|
125
|
-
'else_if': {
|
|
126
|
-
sys_id: 'aa5afba40b200300d97d8bf637673a40',
|
|
127
|
-
table: 'sys_hub_action_type_definition',
|
|
128
|
-
display_name: 'Else If',
|
|
129
|
-
internal_name: 'com.glide.hub.logic.elseif'
|
|
130
|
-
},
|
|
131
|
-
'else': {
|
|
132
|
-
sys_id: 'ba5afba40b200300d97d8bf637673a41',
|
|
133
|
-
table: 'sys_hub_action_type_definition',
|
|
134
|
-
display_name: 'Else',
|
|
135
|
-
internal_name: 'com.glide.hub.logic.else'
|
|
136
|
-
},
|
|
137
|
-
'for_each': {
|
|
138
|
-
sys_id: 'ca5afba40b200300d97d8bf637673a42',
|
|
139
|
-
table: 'sys_hub_action_type_definition',
|
|
140
|
-
display_name: 'For Each',
|
|
141
|
-
internal_name: 'com.glide.hub.logic.foreach'
|
|
142
|
-
},
|
|
143
|
-
'send_email': {
|
|
144
|
-
sys_id: 'c1806bf4a70323008299b39f087901cb',
|
|
145
|
-
table: 'sys_hub_action_type_definition',
|
|
146
|
-
display_name: 'Send Email',
|
|
147
|
-
internal_name: 'com.glide.hub.action.email'
|
|
148
|
-
},
|
|
149
|
-
'log_message': {
|
|
150
|
-
sys_id: 'da5afba40b200300d97d8bf637673a43',
|
|
151
|
-
table: 'sys_hub_action_type_definition',
|
|
152
|
-
display_name: 'Log Message',
|
|
153
|
-
internal_name: 'com.glide.hub.action.log'
|
|
154
|
-
},
|
|
155
|
-
'transform': {
|
|
156
|
-
sys_id: 'ea5afba40b200300d97d8bf637673a44',
|
|
157
|
-
table: 'sys_hub_action_type_definition',
|
|
158
|
-
display_name: 'Transform',
|
|
159
|
-
internal_name: 'com.glide.hub.action.transform'
|
|
160
|
-
}
|
|
161
|
-
};
|
|
162
|
-
// COMPLETE trigger type mappings
|
|
163
|
-
exports.COMPLETE_TRIGGER_TYPE_MAPPINGS = {
|
|
164
|
-
'record_created': {
|
|
165
|
-
sys_id: '8d9067a4db01030077c9a4d3ca961917',
|
|
166
|
-
display_name: 'Record Created',
|
|
167
|
-
internal_name: 'com.glide.hub.trigger.record_created'
|
|
168
|
-
},
|
|
169
|
-
'record_updated': {
|
|
170
|
-
sys_id: '919067a4db01030077c9a4d3ca961919',
|
|
171
|
-
display_name: 'Record Updated',
|
|
172
|
-
internal_name: 'com.glide.hub.trigger.record_updated'
|
|
173
|
-
},
|
|
174
|
-
'manual': {
|
|
175
|
-
sys_id: 'cd9067a4db01030077c9a4d3ca96191c',
|
|
176
|
-
display_name: 'Manual',
|
|
177
|
-
internal_name: 'com.glide.hub.trigger.manual'
|
|
178
|
-
},
|
|
179
|
-
'scheduled': {
|
|
180
|
-
sys_id: 'd19067a4db01030077c9a4d3ca96191d',
|
|
181
|
-
display_name: 'Scheduled',
|
|
182
|
-
internal_name: 'com.glide.hub.trigger.scheduled'
|
|
183
|
-
},
|
|
184
|
-
'sla': {
|
|
185
|
-
sys_id: 'e19067a4db01030077c9a4d3ca96191e',
|
|
186
|
-
display_name: 'SLA',
|
|
187
|
-
internal_name: 'com.glide.hub.trigger.sla'
|
|
188
|
-
},
|
|
189
|
-
'inbound_action': {
|
|
190
|
-
sys_id: 'f19067a4db01030077c9a4d3ca96191f',
|
|
191
|
-
display_name: 'Inbound Action',
|
|
192
|
-
internal_name: 'com.glide.hub.trigger.inbound_action'
|
|
193
|
-
}
|
|
194
|
-
};
|
|
195
|
-
class CompleteFlowXMLGenerator {
|
|
196
|
-
constructor(updateSetName, instanceName) {
|
|
197
|
-
this.updateSetId = this.generateSysId();
|
|
198
|
-
this.updateSetName = updateSetName || `Flow_Import_${new Date().toISOString().split('T')[0]}`;
|
|
199
|
-
this.flowSysId = '';
|
|
200
|
-
this.snapshotSysId = '';
|
|
201
|
-
this.timestamp = new Date().toISOString();
|
|
202
|
-
this.instanceName = instanceName || 'production';
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* Generate ServiceNow-compatible sys_id (32 hex chars)
|
|
206
|
-
*/
|
|
207
|
-
generateSysId() {
|
|
208
|
-
return crypto.randomBytes(16).toString('hex');
|
|
209
|
-
}
|
|
210
|
-
/**
|
|
211
|
-
* Generate internal name following ServiceNow conventions
|
|
212
|
-
*/
|
|
213
|
-
generateInternalName(displayName) {
|
|
214
|
-
return displayName
|
|
215
|
-
.toLowerCase()
|
|
216
|
-
.replace(/[^a-z0-9]+/g, '_')
|
|
217
|
-
.replace(/^_+|_+$/g, '')
|
|
218
|
-
.substring(0, 80);
|
|
219
|
-
}
|
|
220
|
-
/**
|
|
221
|
-
* Escape XML special characters properly
|
|
222
|
-
*/
|
|
223
|
-
escapeXml(value) {
|
|
224
|
-
if (!value)
|
|
225
|
-
return '';
|
|
226
|
-
return value
|
|
227
|
-
.replace(/&/g, '&')
|
|
228
|
-
.replace(/</g, '<')
|
|
229
|
-
.replace(/>/g, '>')
|
|
230
|
-
.replace(/"/g, '"')
|
|
231
|
-
.replace(/'/g, ''');
|
|
232
|
-
}
|
|
233
|
-
/**
|
|
234
|
-
* Base64 + gzip encode values EXACTLY as ServiceNow expects
|
|
235
|
-
*/
|
|
236
|
-
encodeFlowValue(value) {
|
|
237
|
-
try {
|
|
238
|
-
const jsonString = JSON.stringify(value);
|
|
239
|
-
const gzipped = zlib.gzipSync(Buffer.from(jsonString, 'utf8'));
|
|
240
|
-
return gzipped.toString('base64');
|
|
241
|
-
}
|
|
242
|
-
catch (error) {
|
|
243
|
-
console.warn('Failed to encode flow value, using JSON fallback:', error);
|
|
244
|
-
return this.escapeXml(JSON.stringify(value));
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
/**
|
|
248
|
-
* Generate COMPLETE Update Set XML with ALL required components
|
|
249
|
-
*/
|
|
250
|
-
generateCompleteFlowXML(flowDef) {
|
|
251
|
-
this.flowSysId = this.generateSysId();
|
|
252
|
-
this.snapshotSysId = this.generateSysId();
|
|
253
|
-
const internalName = this.flowDef.internal_name || this.generateInternalName(this.flowDef.name);
|
|
254
|
-
// Generate all component sys_ids
|
|
255
|
-
const updateSetSysId = this.generateSysId();
|
|
256
|
-
const triggerSysId = this.generateSysId();
|
|
257
|
-
const activitySysIds = this.flowDef.activities.map(() => this.generateSysId());
|
|
258
|
-
const logicSysIds = [];
|
|
259
|
-
// Calculate all required logic nodes
|
|
260
|
-
let logicNodeCount = 1; // Start node
|
|
261
|
-
logicNodeCount += activitySysIds.length; // Activity connections
|
|
262
|
-
logicNodeCount += 1; // End node
|
|
263
|
-
for (let i = 0; i < logicNodeCount; i++) {
|
|
264
|
-
logicSysIds.push(this.generateSysId());
|
|
265
|
-
}
|
|
266
|
-
// Build comprehensive structures
|
|
267
|
-
const labelCache = this.buildCompleteLabelCache(flowDef, triggerSysId, activitySysIds);
|
|
268
|
-
const flowSnapshot = this.buildCompleteFlowSnapshot(flowDef, triggerSysId, activitySysIds, labelCache);
|
|
269
|
-
const encodedSnapshot = this.escapeXml(JSON.stringify(flowSnapshot));
|
|
270
|
-
const encodedLabelCache = this.escapeXml(JSON.stringify(labelCache));
|
|
271
|
-
// Generate complete XML with ALL required tables and fields
|
|
272
|
-
const xml = `<?xml version="1.0" encoding="UTF-8"?>
|
|
273
|
-
<unload unload_date="${this.timestamp}">
|
|
274
|
-
<!-- Remote Update Set Container -->
|
|
275
|
-
<sys_remote_update_set action="INSERT_OR_UPDATE">
|
|
276
|
-
<sys_id>${updateSetSysId}</sys_id>
|
|
277
|
-
<name>${this.escapeXml(this.updateSetName)}</name>
|
|
278
|
-
<description>Complete flow import: ${this.escapeXml(this.flowDef.name)}</description>
|
|
279
|
-
<origin_sys_id>${updateSetSysId}</origin_sys_id>
|
|
280
|
-
<parent/>
|
|
281
|
-
<release_date/>
|
|
282
|
-
<remote_parent_id/>
|
|
283
|
-
<remote_sys_id>${updateSetSysId}</remote_sys_id>
|
|
284
|
-
<state>loaded</state>
|
|
285
|
-
<summary/>
|
|
286
|
-
<sys_class_name>sys_remote_update_set</sys_class_name>
|
|
287
|
-
<sys_created_by>admin</sys_created_by>
|
|
288
|
-
<sys_created_on>${this.timestamp}</sys_created_on>
|
|
289
|
-
<sys_domain>global</sys_domain>
|
|
290
|
-
<sys_domain_path>/</sys_domain_path>
|
|
291
|
-
<sys_id>${updateSetSysId}</sys_id>
|
|
292
|
-
<sys_mod_count>0</sys_mod_count>
|
|
293
|
-
<sys_updated_by>admin</sys_updated_by>
|
|
294
|
-
<sys_updated_on>${this.timestamp}</sys_updated_on>
|
|
295
|
-
<update_set/>
|
|
296
|
-
<update_source/>
|
|
297
|
-
<version/>
|
|
298
|
-
</sys_remote_update_set>
|
|
299
|
-
|
|
300
|
-
<!-- sys_hub_flow - Main Flow Record with ALL fields -->
|
|
301
|
-
<sys_update_xml action="INSERT_OR_UPDATE">
|
|
302
|
-
<sys_id>${this.generateSysId()}</sys_id>
|
|
303
|
-
<action>INSERT_OR_UPDATE</action>
|
|
304
|
-
<application display_value="Global">global</application>
|
|
305
|
-
<category>customer</category>
|
|
306
|
-
<comments/>
|
|
307
|
-
<name>sys_hub_flow_${this.flowSysId}</name>
|
|
308
|
-
<payload><![CDATA[<?xml version="1.0" encoding="UTF-8"?><record_update table="sys_hub_flow"><sys_hub_flow action="INSERT_OR_UPDATE"><access>${this.flowDef.accessible_from || 'package_private'}</access><acls/><active>true</active><annotation>${this.escapeXml(this.flowDef.annotation || '')}</annotation><callable_by_client_api>${this.flowDef.callable_by_client_api || false}</callable_by_client_api><category>${this.flowDef.category || 'custom'}</category><compiler_build/><copied_from/><copied_from_name/><description>${this.escapeXml(this.flowDef.description)}</description><internal_name>${this.escapeXml(internalName)}</internal_name><label_cache>${encodedLabelCache}</label_cache><latest_snapshot display_value="${this.escapeXml(this.flowDef.name)}">${this.snapshotSysId}</latest_snapshot><master_snapshot display_value="${this.escapeXml(this.flowDef.name)}">${this.snapshotSysId}</master_snapshot><name>${this.escapeXml(this.flowDef.name)}</name><natlang>false</natlang><outputs/><remote_trigger_id/><run_as>${this.flowDef.run_as || 'user'}</run_as><runtime_value>${this.encodeFlowValue(this.flowDef.runtime_value || {})}</runtime_value><sc_callable>false</sc_callable><show_action_header>false</show_action_header><show_draft_actions>false</show_draft_actions><show_flow_tile>false</show_flow_tile><show_prompted>false</show_prompted><show_triggered>false</show_triggered><status>published</status><sys_class_name>sys_hub_flow</sys_class_name><sys_created_by>admin</sys_created_by><sys_created_on>${this.timestamp}</sys_created_on><sys_domain>global</sys_domain><sys_domain_path>/</sys_domain_path><sys_id>${this.flowSysId}</sys_id><sys_mod_count>0</sys_mod_count><sys_name>${this.escapeXml(this.flowDef.name)}</sys_name><sys_overrides/><sys_package display_value="Global" source="global">global</sys_package><sys_policy/><sys_scope display_value="Global">global</sys_scope><sys_update_name>sys_hub_flow_${this.flowSysId}</sys_update_name><sys_updated_by>admin</sys_updated_by><sys_updated_on>${this.timestamp}</sys_updated_on><tags>${(this.flowDef.tags || []).join(',')}</tags><type>flow</type></sys_hub_flow></record_update>]]></payload>
|
|
309
|
-
<remote_update_set display_value="${this.escapeXml(this.updateSetName)}">${updateSetSysId}</remote_update_set>
|
|
310
|
-
<replace_on_upgrade>false</replace_on_upgrade>
|
|
311
|
-
<source_table>sys_hub_flow</source_table>
|
|
312
|
-
<sys_class_name>sys_update_xml</sys_class_name>
|
|
313
|
-
<sys_created_by>admin</sys_created_by>
|
|
314
|
-
<sys_created_on>${this.timestamp}</sys_created_on>
|
|
315
|
-
<sys_id>${this.generateSysId()}</sys_id>
|
|
316
|
-
<sys_mod_count>0</sys_mod_count>
|
|
317
|
-
<sys_recorded_at>${this.timestamp}</sys_recorded_at>
|
|
318
|
-
<sys_updated_by>admin</sys_updated_by>
|
|
319
|
-
<sys_updated_on>${this.timestamp}</sys_updated_on>
|
|
320
|
-
<type>Flow Designer Flow</type>
|
|
321
|
-
<update_domain>global</update_domain>
|
|
322
|
-
<update_guid>${this.generateSysId()}${this.generateSysId()}</update_guid>
|
|
323
|
-
<update_set display_value=""/>
|
|
324
|
-
<view display_value="Default view">Default view</view>
|
|
325
|
-
</sys_update_xml>
|
|
326
|
-
|
|
327
|
-
<!-- sys_hub_flow_snapshot - Complete Flow Definition -->
|
|
328
|
-
<sys_update_xml action="INSERT_OR_UPDATE">
|
|
329
|
-
<sys_id>${this.generateSysId()}</sys_id>
|
|
330
|
-
<action>INSERT_OR_UPDATE</action>
|
|
331
|
-
<application display_value="Global">global</application>
|
|
332
|
-
<name>sys_hub_flow_snapshot_${this.snapshotSysId}</name>
|
|
333
|
-
<payload><![CDATA[<?xml version="1.0" encoding="UTF-8"?><record_update table="sys_hub_flow_snapshot"><sys_hub_flow_snapshot action="INSERT_OR_UPDATE"><flow display_value="${this.escapeXml(this.flowDef.name)}">${this.flowSysId}</flow><name>${this.escapeXml(this.flowDef.name)}</name><note>Complete flow created by CompleteFlowXMLGenerator</note><snapshot>${encodedSnapshot}</snapshot><sys_class_name>sys_hub_flow_snapshot</sys_class_name><sys_created_by>admin</sys_created_by><sys_created_on>${this.timestamp}</sys_created_on><sys_domain>global</sys_domain><sys_domain_path>/</sys_domain_path><sys_id>${this.snapshotSysId}</sys_id><sys_mod_count>0</sys_mod_count><sys_updated_by>admin</sys_updated_by><sys_updated_on>${this.timestamp}</sys_updated_on></sys_hub_flow_snapshot></record_update>]]></payload>
|
|
334
|
-
<remote_update_set display_value="${this.escapeXml(this.updateSetName)}">${updateSetSysId}</remote_update_set>
|
|
335
|
-
<source_table>sys_hub_flow_snapshot</source_table>
|
|
336
|
-
<type>Flow Designer Snapshot</type>
|
|
337
|
-
</sys_update_xml>
|
|
338
|
-
|
|
339
|
-
${this.generateTriggerXML(flowDef, triggerSysId, updateSetSysId)}
|
|
340
|
-
${this.generateActionInstancesXML(this.flowDef.activities, activitySysIds, updateSetSysId)}
|
|
341
|
-
${this.generateFlowLogicXML(flowDef, triggerSysId, activitySysIds, logicSysIds, updateSetSysId)}
|
|
342
|
-
${this.generateVariablesXML(this.flowDef.variables || [], updateSetSysId)}
|
|
343
|
-
</unload>`;
|
|
344
|
-
return xml;
|
|
345
|
-
}
|
|
346
|
-
/**
|
|
347
|
-
* Build COMPLETE label cache structure with ALL metadata
|
|
348
|
-
*/
|
|
349
|
-
buildCompleteLabelCache(flowDef, triggerSysId, activitySysIds) {
|
|
350
|
-
const labelCache = {
|
|
351
|
-
"flow_data": {
|
|
352
|
-
"name": this.flowDef.name,
|
|
353
|
-
"description": this.flowDef.description,
|
|
354
|
-
"sys_id": this.flowSysId,
|
|
355
|
-
"internal_name": this.flowDef.internal_name || this.generateInternalName(this.flowDef.name),
|
|
356
|
-
"category": this.flowDef.category || 'custom',
|
|
357
|
-
"run_as": this.flowDef.run_as || 'user',
|
|
358
|
-
"accessible_from": this.flowDef.accessible_from || 'package_private'
|
|
359
|
-
},
|
|
360
|
-
"triggers": {},
|
|
361
|
-
"actions": {},
|
|
362
|
-
"outputs": {},
|
|
363
|
-
"variables": {},
|
|
364
|
-
"connections": [],
|
|
365
|
-
"metadata": {
|
|
366
|
-
"version": "2.0",
|
|
367
|
-
"generator": "CompleteFlowXMLGenerator",
|
|
368
|
-
"timestamp": this.timestamp,
|
|
369
|
-
"instance": this.instanceName
|
|
370
|
-
}
|
|
371
|
-
};
|
|
372
|
-
// Add trigger with complete metadata
|
|
373
|
-
const triggerType = this.getTriggerTypeDefinition(this.flowDef.trigger_type);
|
|
374
|
-
labelCache.triggers[triggerSysId] = {
|
|
375
|
-
"name": "Trigger",
|
|
376
|
-
"type": triggerType.sys_id,
|
|
377
|
-
"type_name": triggerType.internal_name,
|
|
378
|
-
"display_name": triggerType.display_name,
|
|
379
|
-
"table": this.flowDef.table || '',
|
|
380
|
-
"condition": this.flowDef.trigger_condition || '',
|
|
381
|
-
"inputs": {},
|
|
382
|
-
"outputs": this.generateTriggerOutputs(this.flowDef.table)
|
|
383
|
-
};
|
|
384
|
-
// Add actions with complete metadata
|
|
385
|
-
this.flowDef.activities.forEach((activity, index) => {
|
|
386
|
-
const sysId = activitySysIds[index];
|
|
387
|
-
const actionType = this.getActionTypeDefinition(activity.type);
|
|
388
|
-
labelCache.actions[sysId] = {
|
|
389
|
-
"name": activity.name,
|
|
390
|
-
"type": actionType.sys_id,
|
|
391
|
-
"type_name": actionType.internal_name,
|
|
392
|
-
"display_name": actionType.display_name,
|
|
393
|
-
"description": activity.description || activity.name,
|
|
394
|
-
"inputs": activity.inputs,
|
|
395
|
-
"outputs": activity.outputs || {},
|
|
396
|
-
"condition": activity.condition || '',
|
|
397
|
-
"order": activity.order || ((index + 1) * 100),
|
|
398
|
-
"error_handler": activity.error_handler || '',
|
|
399
|
-
"annotation": activity.annotation || '',
|
|
400
|
-
"ui_position": activity.ui_position || { x: 100 + (index * 200), y: 100 }
|
|
401
|
-
};
|
|
402
|
-
});
|
|
403
|
-
// Add variables
|
|
404
|
-
if (this.flowDef.variables) {
|
|
405
|
-
this.flowDef.variables.forEach(variable => {
|
|
406
|
-
labelCache.variables[variable.name] = {
|
|
407
|
-
"type": variable.type,
|
|
408
|
-
"default_value": variable.default_value,
|
|
409
|
-
"description": variable.description || '',
|
|
410
|
-
"mandatory": variable.mandatory || false
|
|
411
|
-
};
|
|
412
|
-
});
|
|
413
|
-
}
|
|
414
|
-
// Add connection metadata
|
|
415
|
-
labelCache.connections.push({
|
|
416
|
-
from: "start",
|
|
417
|
-
to: triggerSysId,
|
|
418
|
-
type: "trigger"
|
|
419
|
-
});
|
|
420
|
-
if (activitySysIds.length > 0) {
|
|
421
|
-
labelCache.connections.push({
|
|
422
|
-
from: triggerSysId,
|
|
423
|
-
to: activitySysIds[0],
|
|
424
|
-
type: "success"
|
|
425
|
-
});
|
|
426
|
-
for (let i = 0; i < activitySysIds.length - 1; i++) {
|
|
427
|
-
labelCache.connections.push({
|
|
428
|
-
from: activitySysIds[i],
|
|
429
|
-
to: activitySysIds[i + 1],
|
|
430
|
-
type: "success"
|
|
431
|
-
});
|
|
432
|
-
}
|
|
433
|
-
labelCache.connections.push({
|
|
434
|
-
from: activitySysIds[activitySysIds.length - 1],
|
|
435
|
-
to: "end",
|
|
436
|
-
type: "success"
|
|
437
|
-
});
|
|
438
|
-
}
|
|
439
|
-
return labelCache;
|
|
440
|
-
}
|
|
441
|
-
/**
|
|
442
|
-
* Build COMPLETE flow snapshot with ALL required structures
|
|
443
|
-
*/
|
|
444
|
-
buildCompleteFlowSnapshot(flowDef, triggerSysId, activitySysIds, labelCache) {
|
|
445
|
-
const actions = [];
|
|
446
|
-
// Add trigger node with complete structure
|
|
447
|
-
const triggerType = this.getTriggerTypeDefinition(this.flowDef.trigger_type);
|
|
448
|
-
actions.push({
|
|
449
|
-
"id": triggerSysId,
|
|
450
|
-
"name": "Trigger",
|
|
451
|
-
"type": "trigger",
|
|
452
|
-
"base_type": "trigger",
|
|
453
|
-
"trigger_type": triggerType.sys_id,
|
|
454
|
-
"trigger_type_name": triggerType.internal_name,
|
|
455
|
-
"table": this.flowDef.table || '',
|
|
456
|
-
"condition": this.flowDef.trigger_condition || '',
|
|
457
|
-
"parents": [],
|
|
458
|
-
"children": activitySysIds.length > 0 ? [activitySysIds[0]] : [],
|
|
459
|
-
"outputs": this.generateTriggerOutputs(this.flowDef.table),
|
|
460
|
-
"position": { "x": 100, "y": 100 },
|
|
461
|
-
"ui_id": (0, uuid_1.v4)(),
|
|
462
|
-
"metadata": {
|
|
463
|
-
"created": this.timestamp,
|
|
464
|
-
"version": "1.0"
|
|
465
|
-
}
|
|
466
|
-
});
|
|
467
|
-
// Add activity nodes with complete structure
|
|
468
|
-
this.flowDef.activities.forEach((activity, index) => {
|
|
469
|
-
const actionSysId = activitySysIds[index];
|
|
470
|
-
const actionType = this.getActionTypeDefinition(activity.type);
|
|
471
|
-
const parents = index === 0 ? [triggerSysId] : [activitySysIds[index - 1]];
|
|
472
|
-
const children = index < activitySysIds.length - 1 ? [activitySysIds[index + 1]] : [];
|
|
473
|
-
actions.push({
|
|
474
|
-
"id": actionSysId,
|
|
475
|
-
"name": activity.name,
|
|
476
|
-
"type": actionType.sys_id,
|
|
477
|
-
"base_type": "action",
|
|
478
|
-
"action_type_id": actionType.sys_id,
|
|
479
|
-
"action_type_name": actionType.internal_name,
|
|
480
|
-
"display_name": actionType.display_name,
|
|
481
|
-
"parents": parents,
|
|
482
|
-
"children": children,
|
|
483
|
-
"inputs": activity.inputs,
|
|
484
|
-
"outputs": activity.outputs || {},
|
|
485
|
-
"condition": activity.condition || '',
|
|
486
|
-
"description": activity.description || activity.name,
|
|
487
|
-
"position": activity.ui_position || {
|
|
488
|
-
"x": 100 + ((index + 1) * 250),
|
|
489
|
-
"y": 100
|
|
490
|
-
},
|
|
491
|
-
"ui_id": (0, uuid_1.v4)(),
|
|
492
|
-
"metadata": {
|
|
493
|
-
"order": activity.order || ((index + 1) * 100),
|
|
494
|
-
"created": this.timestamp,
|
|
495
|
-
"version": "1.0"
|
|
496
|
-
},
|
|
497
|
-
"exit_conditions": activity.exit_conditions || [{ name: "Success", type: "success" }],
|
|
498
|
-
"error_handler": activity.error_handler || '',
|
|
499
|
-
"annotation": activity.annotation || ''
|
|
500
|
-
});
|
|
501
|
-
});
|
|
502
|
-
// Return COMPLETE flow snapshot structure
|
|
503
|
-
return {
|
|
504
|
-
"schemaVersion": "2.0",
|
|
505
|
-
"id": this.flowSysId,
|
|
506
|
-
"name": this.flowDef.name,
|
|
507
|
-
"description": this.flowDef.description,
|
|
508
|
-
"type": "flow",
|
|
509
|
-
"internal_name": this.flowDef.internal_name || this.generateInternalName(this.flowDef.name),
|
|
510
|
-
"category": this.flowDef.category || 'custom',
|
|
511
|
-
"tags": this.flowDef.tags || [],
|
|
512
|
-
"metadata": {
|
|
513
|
-
"version": "2.0",
|
|
514
|
-
"created": this.timestamp,
|
|
515
|
-
"updated": this.timestamp,
|
|
516
|
-
"created_by": "admin",
|
|
517
|
-
"generator": "CompleteFlowXMLGenerator",
|
|
518
|
-
"format": "ServiceNow Flow Designer v2",
|
|
519
|
-
"instance": this.instanceName
|
|
520
|
-
},
|
|
521
|
-
"properties": {
|
|
522
|
-
"run_as": this.flowDef.run_as || 'user',
|
|
523
|
-
"accessible_from": this.flowDef.accessible_from || 'package_private',
|
|
524
|
-
"callable_by_client_api": this.flowDef.callable_by_client_api || false,
|
|
525
|
-
"active": true,
|
|
526
|
-
"status": "published"
|
|
527
|
-
},
|
|
528
|
-
"graph": {
|
|
529
|
-
"graphData": {
|
|
530
|
-
"nodeData": {
|
|
531
|
-
"actions": actions,
|
|
532
|
-
"start": {
|
|
533
|
-
"id": "start",
|
|
534
|
-
"type": "start",
|
|
535
|
-
"children": [triggerSysId],
|
|
536
|
-
"position": { "x": 0, "y": 100 }
|
|
537
|
-
},
|
|
538
|
-
"end": {
|
|
539
|
-
"id": "end",
|
|
540
|
-
"type": "end",
|
|
541
|
-
"parents": activitySysIds.length > 0 ? [activitySysIds[activitySysIds.length - 1]] : [triggerSysId],
|
|
542
|
-
"position": { "x": 100 + ((activitySysIds.length + 2) * 250), "y": 100 }
|
|
543
|
-
}
|
|
544
|
-
},
|
|
545
|
-
"flowData": {
|
|
546
|
-
"flow_id": this.flowSysId,
|
|
547
|
-
"snapshot_id": this.snapshotSysId,
|
|
548
|
-
"run_as": this.flowDef.run_as || 'user',
|
|
549
|
-
"accessible_from": this.flowDef.accessible_from || 'package_private'
|
|
550
|
-
}
|
|
551
|
-
},
|
|
552
|
-
"layout": {
|
|
553
|
-
"direction": "horizontal",
|
|
554
|
-
"spacing": 250,
|
|
555
|
-
"grid": true,
|
|
556
|
-
"snap_to_grid": true
|
|
557
|
-
}
|
|
558
|
-
},
|
|
559
|
-
"triggers": [{
|
|
560
|
-
"id": triggerSysId,
|
|
561
|
-
"type": triggerType.sys_id,
|
|
562
|
-
"type_name": triggerType.internal_name,
|
|
563
|
-
"table": this.flowDef.table || '',
|
|
564
|
-
"condition": this.flowDef.trigger_condition || '',
|
|
565
|
-
"active": true
|
|
566
|
-
}],
|
|
567
|
-
"variables": this.flowDef.variables || [],
|
|
568
|
-
"inputs": {},
|
|
569
|
-
"outputs": {},
|
|
570
|
-
"subflows": this.flowDef.subflows || [],
|
|
571
|
-
"error_handling": this.flowDef.error_handling || { on_error: 'stop' },
|
|
572
|
-
"label_cache": labelCache
|
|
573
|
-
};
|
|
574
|
-
}
|
|
575
|
-
/**
|
|
576
|
-
* Generate trigger XML with v2 structure
|
|
577
|
-
*/
|
|
578
|
-
generateTriggerXML(flowDef, triggerSysId, updateSetSysId) {
|
|
579
|
-
const triggerType = this.getTriggerTypeDefinition(this.flowDef.trigger_type);
|
|
580
|
-
const encodedValues = this.encodeFlowValue({
|
|
581
|
-
table: this.flowDef.table || '',
|
|
582
|
-
condition: this.flowDef.trigger_condition || '',
|
|
583
|
-
trigger_type: triggerType.sys_id
|
|
584
|
-
});
|
|
585
|
-
return `
|
|
586
|
-
<!-- sys_hub_trigger_instance_v2 - CRITICAL: v2 table! -->
|
|
587
|
-
<sys_update_xml action="INSERT_OR_UPDATE">
|
|
588
|
-
<sys_id>${this.generateSysId()}</sys_id>
|
|
589
|
-
<action>INSERT_OR_UPDATE</action>
|
|
590
|
-
<application display_value="Global">global</application>
|
|
591
|
-
<name>sys_hub_trigger_instance_v2_${triggerSysId}</name>
|
|
592
|
-
<payload><![CDATA[<?xml version="1.0" encoding="UTF-8"?><record_update table="sys_hub_trigger_instance_v2"><sys_hub_trigger_instance_v2 action="INSERT_OR_UPDATE"><active>true</active><condition>${this.escapeXml(this.flowDef.trigger_condition || '')}</condition><flow display_value="${this.escapeXml(this.flowDef.name)}">${this.flowSysId}</flow><flow_trigger display_value="${triggerType.display_name}">${triggerType.sys_id}</flow_trigger><name>Trigger</name><order>0</order><parent_ui_id/><sys_class_name>sys_hub_trigger_instance_v2</sys_class_name><sys_created_by>admin</sys_created_by><sys_created_on>${this.timestamp}</sys_created_on><sys_domain>global</sys_domain><sys_domain_path>/</sys_domain_path><sys_id>${triggerSysId}</sys_id><sys_mod_count>0</sys_mod_count><sys_updated_by>admin</sys_updated_by><sys_updated_on>${this.timestamp}</sys_updated_on><table>${this.flowDef.table || ''}</table><trigger_definition display_value="${triggerType.display_name}">${triggerType.sys_id}</trigger_definition><trigger_inputs/><trigger_outputs/><trigger_type display_value="${triggerType.display_name}">${triggerType.sys_id}</trigger_type><ui_id>${(0, uuid_1.v4)()}</ui_id><values>${encodedValues}</values></sys_hub_trigger_instance_v2></record_update>]]></payload>
|
|
593
|
-
<remote_update_set display_value="${this.escapeXml(this.updateSetName)}">${updateSetSysId}</remote_update_set>
|
|
594
|
-
<source_table>sys_hub_trigger_instance_v2</source_table>
|
|
595
|
-
<type>Flow Designer Trigger</type>
|
|
596
|
-
</sys_update_xml>`;
|
|
597
|
-
}
|
|
598
|
-
/**
|
|
599
|
-
* Generate action instances XML with v2 structure and proper encoding
|
|
600
|
-
*/
|
|
601
|
-
generateActionInstancesXML(activities, sysIds, updateSetSysId) {
|
|
602
|
-
return activities.map((activity, index) => {
|
|
603
|
-
const actionSysId = sysIds[index];
|
|
604
|
-
const actionType = this.getActionTypeDefinition(activity.type);
|
|
605
|
-
const uiId = (0, uuid_1.v4)();
|
|
606
|
-
// Encode inputs properly for v2 format
|
|
607
|
-
const encodedValues = this.encodeFlowValue({
|
|
608
|
-
inputs: activity.inputs,
|
|
609
|
-
outputs: activity.outputs || {},
|
|
610
|
-
condition: activity.condition || ''
|
|
611
|
-
});
|
|
612
|
-
// Order using flow notation (1→2→3)
|
|
613
|
-
const orderValue = index === 0 ? '1' : `${index}→${index + 1}`;
|
|
614
|
-
return `
|
|
615
|
-
<!-- sys_hub_action_instance_v2: ${this.escapeXml(activity.name)} -->
|
|
616
|
-
<sys_update_xml action="INSERT_OR_UPDATE">
|
|
617
|
-
<sys_id>${this.generateSysId()}</sys_id>
|
|
618
|
-
<action>INSERT_OR_UPDATE</action>
|
|
619
|
-
<application display_value="Global">global</application>
|
|
620
|
-
<name>sys_hub_action_instance_v2_${actionSysId}</name>
|
|
621
|
-
<payload><![CDATA[<?xml version="1.0" encoding="UTF-8"?><record_update table="sys_hub_action_instance_v2"><sys_hub_action_instance_v2 action="INSERT_OR_UPDATE"><action_type display_value="${actionType.display_name}">${actionType.sys_id}</action_type><action_type_parent/><attributes/><comment>${this.escapeXml(activity.description || '')}</comment><compiled_snapshot>${actionType.sys_id}</compiled_snapshot><display_text/><flow display_value="${this.escapeXml(this.flowDef.name)}">${this.flowSysId}</flow><generation_source/><name>${this.escapeXml(activity.name)}</name><order>${orderValue}</order><parent_ui_id/><sys_class_name>sys_hub_action_instance_v2</sys_class_name><sys_created_by>admin</sys_created_by><sys_created_on>${this.timestamp}</sys_created_on><sys_id>${actionSysId}</sys_id><sys_mod_count>0</sys_mod_count><sys_scope display_value="Global">global</sys_scope><sys_updated_by>admin</sys_updated_by><sys_updated_on>${this.timestamp}</sys_updated_on><ui_id>${uiId}</ui_id><updation_source/><values>${encodedValues}</values></sys_hub_action_instance_v2></record_update>]]></payload>
|
|
622
|
-
<remote_update_set display_value="${this.escapeXml(this.updateSetName)}">${updateSetSysId}</remote_update_set>
|
|
623
|
-
<source_table>sys_hub_action_instance_v2</source_table>
|
|
624
|
-
<type>Flow Designer Action</type>
|
|
625
|
-
</sys_update_xml>`;
|
|
626
|
-
}).join('\n');
|
|
627
|
-
}
|
|
628
|
-
/**
|
|
629
|
-
* Generate flow logic XML with v2 structure
|
|
630
|
-
*/
|
|
631
|
-
generateFlowLogicXML(flowDef, triggerSysId, activitySysIds, logicSysIds, updateSetSysId) {
|
|
632
|
-
const logicNodes = [];
|
|
633
|
-
let logicIndex = 0;
|
|
634
|
-
// Start logic
|
|
635
|
-
const startLogicId = logicSysIds[logicIndex++];
|
|
636
|
-
const startLogicValues = this.encodeFlowValue({
|
|
637
|
-
type: 'start',
|
|
638
|
-
connections: [{ to: triggerSysId, type: 'always' }]
|
|
639
|
-
});
|
|
640
|
-
logicNodes.push(`
|
|
641
|
-
<!-- Flow Logic V2: Start -->
|
|
642
|
-
<sys_update_xml action="INSERT_OR_UPDATE">
|
|
643
|
-
<sys_id>${this.generateSysId()}</sys_id>
|
|
644
|
-
<action>INSERT_OR_UPDATE</action>
|
|
645
|
-
<application display_value="Global">global</application>
|
|
646
|
-
<name>sys_hub_flow_logic_instance_v2_${startLogicId}</name>
|
|
647
|
-
<payload><![CDATA[<?xml version="1.0" encoding="UTF-8"?><record_update table="sys_hub_flow_logic_instance_v2"><sys_hub_flow_logic_instance_v2 action="INSERT_OR_UPDATE"><attributes/><block display_value="">${this.generateSysId()}</block><comment>Flow Start</comment><connected_to/><decision_table/><display_text>Start</display_text><flow display_value="${this.escapeXml(this.flowDef.name)}">${this.flowSysId}</flow><flow_variables_assigned/><generation_source/><logic_definition display_value="Start">1176605ea76103004f27b0d2187901c5</logic_definition><order>0</order><outputs_assigned/><parent_ui_id/><sys_class_name>sys_hub_flow_logic_instance_v2</sys_class_name><sys_created_by>admin</sys_created_by><sys_created_on>${this.timestamp}</sys_created_on><sys_id>${startLogicId}</sys_id><sys_mod_count>0</sys_mod_count><sys_scope/><sys_updated_by>admin</sys_updated_by><sys_updated_on>${this.timestamp}</sys_updated_on><ui_id>${(0, uuid_1.v4)()}</ui_id><updation_source/><values>${startLogicValues}</values><workflow_reference/></sys_hub_flow_logic_instance_v2></record_update>]]></payload>
|
|
648
|
-
<remote_update_set display_value="${this.escapeXml(this.updateSetName)}">${updateSetSysId}</remote_update_set>
|
|
649
|
-
<source_table>sys_hub_flow_logic_instance_v2</source_table>
|
|
650
|
-
<type>Flow Designer Logic</type>
|
|
651
|
-
</sys_update_xml>`);
|
|
652
|
-
// Trigger to first action
|
|
653
|
-
if (activitySysIds.length > 0) {
|
|
654
|
-
const connectionLogicId = logicSysIds[logicIndex++];
|
|
655
|
-
const connectionValues = this.encodeFlowValue({
|
|
656
|
-
type: 'connection',
|
|
657
|
-
from: triggerSysId,
|
|
658
|
-
to: activitySysIds[0],
|
|
659
|
-
condition: 'always'
|
|
660
|
-
});
|
|
661
|
-
logicNodes.push(`
|
|
662
|
-
<!-- Flow Logic V2: Trigger → First Action -->
|
|
663
|
-
<sys_update_xml action="INSERT_OR_UPDATE">
|
|
664
|
-
<sys_id>${this.generateSysId()}</sys_id>
|
|
665
|
-
<action>INSERT_OR_UPDATE</action>
|
|
666
|
-
<application display_value="Global">global</application>
|
|
667
|
-
<name>sys_hub_flow_logic_instance_v2_${connectionLogicId}</name>
|
|
668
|
-
<payload><![CDATA[<?xml version="1.0" encoding="UTF-8"?><record_update table="sys_hub_flow_logic_instance_v2"><sys_hub_flow_logic_instance_v2 action="INSERT_OR_UPDATE"><attributes/><block display_value="">${this.generateSysId()}</block><comment>Connection</comment><connected_to/><decision_table/><display_text/><flow display_value="${this.escapeXml(this.flowDef.name)}">${this.flowSysId}</flow><flow_variables_assigned/><generation_source/><logic_definition/><order>${logicIndex * 100}</order><outputs_assigned/><parent_ui_id/><sys_class_name>sys_hub_flow_logic_instance_v2</sys_class_name><sys_created_by>admin</sys_created_by><sys_created_on>${this.timestamp}</sys_created_on><sys_id>${connectionLogicId}</sys_id><sys_mod_count>0</sys_mod_count><sys_scope/><sys_updated_by>admin</sys_updated_by><sys_updated_on>${this.timestamp}</sys_updated_on><ui_id>${(0, uuid_1.v4)()}</ui_id><updation_source/><values>${connectionValues}</values><workflow_reference/></sys_hub_flow_logic_instance_v2></record_update>]]></payload>
|
|
669
|
-
<remote_update_set display_value="${this.escapeXml(this.updateSetName)}">${updateSetSysId}</remote_update_set>
|
|
670
|
-
<source_table>sys_hub_flow_logic_instance_v2</source_table>
|
|
671
|
-
<type>Flow Designer Logic</type>
|
|
672
|
-
</sys_update_xml>`);
|
|
673
|
-
}
|
|
674
|
-
// Action to action connections
|
|
675
|
-
for (let i = 0; i < activitySysIds.length - 1; i++) {
|
|
676
|
-
const connectionLogicId = logicSysIds[logicIndex++];
|
|
677
|
-
const connectionValues = this.encodeFlowValue({
|
|
678
|
-
type: 'connection',
|
|
679
|
-
from: activitySysIds[i],
|
|
680
|
-
to: activitySysIds[i + 1],
|
|
681
|
-
condition: 'success'
|
|
682
|
-
});
|
|
683
|
-
logicNodes.push(`
|
|
684
|
-
<!-- Flow Logic V2: Action ${i + 1} → Action ${i + 2} -->
|
|
685
|
-
<sys_update_xml action="INSERT_OR_UPDATE">
|
|
686
|
-
<sys_id>${this.generateSysId()}</sys_id>
|
|
687
|
-
<action>INSERT_OR_UPDATE</action>
|
|
688
|
-
<application display_value="Global">global</application>
|
|
689
|
-
<name>sys_hub_flow_logic_instance_v2_${connectionLogicId}</name>
|
|
690
|
-
<payload><![CDATA[<?xml version="1.0" encoding="UTF-8"?><record_update table="sys_hub_flow_logic_instance_v2"><sys_hub_flow_logic_instance_v2 action="INSERT_OR_UPDATE"><attributes/><block display_value="">${this.generateSysId()}</block><comment>Connection</comment><connected_to/><decision_table/><display_text/><flow display_value="${this.escapeXml(this.flowDef.name)}">${this.flowSysId}</flow><flow_variables_assigned/><generation_source/><logic_definition/><order>${logicIndex * 100}</order><outputs_assigned/><parent_ui_id/><sys_class_name>sys_hub_flow_logic_instance_v2</sys_class_name><sys_created_by>admin</sys_created_by><sys_created_on>${this.timestamp}</sys_created_on><sys_id>${connectionLogicId}</sys_id><sys_mod_count>0</sys_mod_count><sys_scope/><sys_updated_by>admin</sys_updated_by><sys_updated_on>${this.timestamp}</sys_updated_on><ui_id>${(0, uuid_1.v4)()}</ui_id><updation_source/><values>${connectionValues}</values><workflow_reference/></sys_hub_flow_logic_instance_v2></record_update>]]></payload>
|
|
691
|
-
<remote_update_set display_value="${this.escapeXml(this.updateSetName)}">${updateSetSysId}</remote_update_set>
|
|
692
|
-
<source_table>sys_hub_flow_logic_instance_v2</source_table>
|
|
693
|
-
<type>Flow Designer Logic</type>
|
|
694
|
-
</sys_update_xml>`);
|
|
695
|
-
}
|
|
696
|
-
// End logic
|
|
697
|
-
const endLogicId = logicSysIds[logicIndex++];
|
|
698
|
-
const endLogicValues = this.encodeFlowValue({
|
|
699
|
-
type: 'end',
|
|
700
|
-
from: activitySysIds.length > 0 ? activitySysIds[activitySysIds.length - 1] : triggerSysId
|
|
701
|
-
});
|
|
702
|
-
logicNodes.push(`
|
|
703
|
-
<!-- Flow Logic V2: End -->
|
|
704
|
-
<sys_update_xml action="INSERT_OR_UPDATE">
|
|
705
|
-
<sys_id>${this.generateSysId()}</sys_id>
|
|
706
|
-
<action>INSERT_OR_UPDATE</action>
|
|
707
|
-
<application display_value="Global">global</application>
|
|
708
|
-
<name>sys_hub_flow_logic_instance_v2_${endLogicId}</name>
|
|
709
|
-
<payload><![CDATA[<?xml version="1.0" encoding="UTF-8"?><record_update table="sys_hub_flow_logic_instance_v2"><sys_hub_flow_logic_instance_v2 action="INSERT_OR_UPDATE"><attributes/><block display_value="">${this.generateSysId()}</block><comment>Flow End</comment><connected_to/><decision_table/><display_text>End</display_text><flow display_value="${this.escapeXml(this.flowDef.name)}">${this.flowSysId}</flow><flow_variables_assigned/><generation_source/><logic_definition display_value="End">d176605ea76103004f27b0d2187901c7</logic_definition><order>${(logicIndex + 1) * 100}</order><outputs_assigned/><parent_ui_id/><sys_class_name>sys_hub_flow_logic_instance_v2</sys_class_name><sys_created_by>admin</sys_created_by><sys_created_on>${this.timestamp}</sys_created_on><sys_id>${endLogicId}</sys_id><sys_mod_count>0</sys_mod_count><sys_scope/><sys_updated_by>admin</sys_updated_by><sys_updated_on>${this.timestamp}</sys_updated_on><ui_id>${(0, uuid_1.v4)()}</ui_id><updation_source/><values>${endLogicValues}</values><workflow_reference/></sys_hub_flow_logic_instance_v2></record_update>]]></payload>
|
|
710
|
-
<remote_update_set display_value="${this.escapeXml(this.updateSetName)}">${updateSetSysId}</remote_update_set>
|
|
711
|
-
<source_table>sys_hub_flow_logic_instance_v2</source_table>
|
|
712
|
-
<type>Flow Designer Logic</type>
|
|
713
|
-
</sys_update_xml>`);
|
|
714
|
-
return logicNodes.join('\n');
|
|
715
|
-
}
|
|
716
|
-
/**
|
|
717
|
-
* Generate variables XML if flow has variables
|
|
718
|
-
*/
|
|
719
|
-
generateVariablesXML(variables, updateSetSysId) {
|
|
720
|
-
if (!variables || variables.length === 0)
|
|
721
|
-
return '';
|
|
722
|
-
return variables.map(variable => {
|
|
723
|
-
const varSysId = this.generateSysId();
|
|
724
|
-
const encodedValue = this.encodeFlowValue({
|
|
725
|
-
type: variable.type,
|
|
726
|
-
default_value: variable.default_value,
|
|
727
|
-
mandatory: variable.mandatory || false
|
|
728
|
-
});
|
|
729
|
-
return `
|
|
730
|
-
<!-- Flow Variable: ${this.escapeXml(variable.name)} -->
|
|
731
|
-
<sys_update_xml action="INSERT_OR_UPDATE">
|
|
732
|
-
<sys_id>${this.generateSysId()}</sys_id>
|
|
733
|
-
<action>INSERT_OR_UPDATE</action>
|
|
734
|
-
<application display_value="Global">global</application>
|
|
735
|
-
<name>sys_hub_flow_variable_${varSysId}</name>
|
|
736
|
-
<payload><![CDATA[<?xml version="1.0" encoding="UTF-8"?><record_update table="sys_hub_flow_variable"><sys_hub_flow_variable action="INSERT_OR_UPDATE"><default_value>${this.escapeXml(JSON.stringify(variable.default_value || ''))}</default_value><description>${this.escapeXml(variable.description || '')}</description><flow display_value="${this.escapeXml(this.flowSysId)}">${this.flowSysId}</flow><mandatory>${variable.mandatory || false}</mandatory><name>${this.escapeXml(variable.name)}</name><order>${variables.indexOf(variable) * 100}</order><sys_class_name>sys_hub_flow_variable</sys_class_name><sys_created_by>admin</sys_created_by><sys_created_on>${this.timestamp}</sys_created_on><sys_id>${varSysId}</sys_id><sys_mod_count>0</sys_mod_count><sys_updated_by>admin</sys_updated_by><sys_updated_on>${this.timestamp}</sys_updated_on><type>${variable.type}</type><values>${encodedValue}</values></sys_hub_flow_variable></record_update>]]></payload>
|
|
737
|
-
<remote_update_set display_value="${this.escapeXml(this.updateSetName)}">${updateSetSysId}</remote_update_set>
|
|
738
|
-
<source_table>sys_hub_flow_variable</source_table>
|
|
739
|
-
<type>Flow Designer Variable</type>
|
|
740
|
-
</sys_update_xml>`;
|
|
741
|
-
}).join('\n');
|
|
742
|
-
}
|
|
743
|
-
/**
|
|
744
|
-
* Get action type definition with fallback
|
|
745
|
-
*/
|
|
746
|
-
getActionTypeDefinition(actionType) {
|
|
747
|
-
const definition = exports.COMPLETE_ACTION_TYPE_MAPPINGS[actionType];
|
|
748
|
-
if (definition)
|
|
749
|
-
return definition;
|
|
750
|
-
// Try to find by display name
|
|
751
|
-
const byDisplayName = Object.values(exports.COMPLETE_ACTION_TYPE_MAPPINGS).find(def => def.display_name.toLowerCase() === actionType.toLowerCase());
|
|
752
|
-
if (byDisplayName)
|
|
753
|
-
return byDisplayName;
|
|
754
|
-
// Default to script action
|
|
755
|
-
console.warn(`Unknown action type: ${actionType}, defaulting to script`);
|
|
756
|
-
return exports.COMPLETE_ACTION_TYPE_MAPPINGS['script'];
|
|
757
|
-
}
|
|
758
|
-
/**
|
|
759
|
-
* Get trigger type definition with fallback
|
|
760
|
-
*/
|
|
761
|
-
getTriggerTypeDefinition(triggerType) {
|
|
762
|
-
return exports.COMPLETE_TRIGGER_TYPE_MAPPINGS[triggerType] || exports.COMPLETE_TRIGGER_TYPE_MAPPINGS['manual'];
|
|
763
|
-
}
|
|
764
|
-
/**
|
|
765
|
-
* Generate trigger outputs based on table
|
|
766
|
-
*/
|
|
767
|
-
generateTriggerOutputs(table) {
|
|
768
|
-
if (!table) {
|
|
769
|
-
return {
|
|
770
|
-
"current": "sys_hub_flow_output.generic_record",
|
|
771
|
-
"previous": "sys_hub_flow_output.generic_record"
|
|
772
|
-
};
|
|
773
|
-
}
|
|
774
|
-
return {
|
|
775
|
-
"current": `sys_hub_flow_output.${table}`,
|
|
776
|
-
"previous": `sys_hub_flow_output.${table}`,
|
|
777
|
-
"sys_id": "sys_hub_flow_output.reference",
|
|
778
|
-
"table_name": "sys_hub_flow_output.string"
|
|
779
|
-
};
|
|
780
|
-
}
|
|
781
|
-
/**
|
|
782
|
-
* Save XML to file
|
|
783
|
-
*/
|
|
784
|
-
saveToFile(xml, filename) {
|
|
785
|
-
const outputDir = path.join(process.cwd(), 'flow-update-sets');
|
|
786
|
-
if (!fs.existsSync(outputDir)) {
|
|
787
|
-
fs.mkdirSync(outputDir, { recursive: true });
|
|
788
|
-
}
|
|
789
|
-
const outputFile = path.join(outputDir, filename || `complete_flow_${this.flowSysId}.xml`);
|
|
790
|
-
fs.writeFileSync(outputFile, xml, 'utf8');
|
|
791
|
-
return outputFile;
|
|
792
|
-
}
|
|
793
|
-
/**
|
|
794
|
-
* Create comprehensive incident management flow example
|
|
795
|
-
*/
|
|
796
|
-
static createIncidentManagementExample() {
|
|
797
|
-
return {
|
|
798
|
-
name: 'Complete Incident Management Flow',
|
|
799
|
-
description: 'Comprehensive incident management workflow with all requested features',
|
|
800
|
-
internal_name: 'complete_incident_management_flow',
|
|
801
|
-
table: 'incident',
|
|
802
|
-
trigger_type: 'record_created',
|
|
803
|
-
trigger_condition: 'active=true^priority<=2',
|
|
804
|
-
run_as: 'system',
|
|
805
|
-
accessible_from: 'package_private',
|
|
806
|
-
category: 'itsm',
|
|
807
|
-
tags: ['incident', 'management', 'automation', 'sla', 'knowledge'],
|
|
808
|
-
variables: [
|
|
809
|
-
{
|
|
810
|
-
name: 'escalation_threshold',
|
|
811
|
-
type: 'integer',
|
|
812
|
-
default_value: 30,
|
|
813
|
-
description: 'Minutes before escalation',
|
|
814
|
-
mandatory: true
|
|
815
|
-
},
|
|
816
|
-
{
|
|
817
|
-
name: 'notification_channels',
|
|
818
|
-
type: 'string_array',
|
|
819
|
-
default_value: ['email', 'sms'],
|
|
820
|
-
description: 'Notification channels to use'
|
|
821
|
-
}
|
|
822
|
-
],
|
|
823
|
-
activities: [
|
|
824
|
-
{
|
|
825
|
-
name: 'Analyze Incident',
|
|
826
|
-
type: 'script',
|
|
827
|
-
order: 100,
|
|
828
|
-
description: 'Comprehensive incident analysis with categorization and impact assessment',
|
|
829
|
-
inputs: {
|
|
830
|
-
script: `// Complete incident analysis
|
|
831
|
-
var analysis = {
|
|
832
|
-
priority_score: 0,
|
|
833
|
-
category_match: '',
|
|
834
|
-
sla_target: '',
|
|
835
|
-
knowledge_articles: [],
|
|
836
|
-
assignment_recommendation: '',
|
|
837
|
-
automation_possible: false,
|
|
838
|
-
required_actions: []
|
|
839
|
-
};
|
|
840
|
-
|
|
841
|
-
// Priority scoring
|
|
842
|
-
switch(current.priority.toString()) {
|
|
843
|
-
case '1': analysis.priority_score = 100; break;
|
|
844
|
-
case '2': analysis.priority_score = 80; break;
|
|
845
|
-
case '3': analysis.priority_score = 60; break;
|
|
846
|
-
default: analysis.priority_score = 40;
|
|
847
|
-
}
|
|
848
|
-
|
|
849
|
-
// Category analysis
|
|
850
|
-
if (current.short_description) {
|
|
851
|
-
var desc = current.short_description.toLowerCase();
|
|
852
|
-
if (desc.includes('email') || desc.includes('outlook')) {
|
|
853
|
-
analysis.category_match = 'email';
|
|
854
|
-
analysis.assignment_recommendation = 'email_support';
|
|
855
|
-
} else if (desc.includes('network') || desc.includes('connection')) {
|
|
856
|
-
analysis.category_match = 'network';
|
|
857
|
-
analysis.assignment_recommendation = 'network_team';
|
|
858
|
-
} else if (desc.includes('password') || desc.includes('login')) {
|
|
859
|
-
analysis.category_match = 'access';
|
|
860
|
-
analysis.assignment_recommendation = 'identity_team';
|
|
861
|
-
analysis.automation_possible = true;
|
|
862
|
-
}
|
|
863
|
-
}
|
|
864
|
-
|
|
865
|
-
// SLA calculation
|
|
866
|
-
if (analysis.priority_score >= 80) {
|
|
867
|
-
analysis.sla_target = '1 hour';
|
|
868
|
-
} else if (analysis.priority_score >= 60) {
|
|
869
|
-
analysis.sla_target = '4 hours';
|
|
870
|
-
} else {
|
|
871
|
-
analysis.sla_target = '24 hours';
|
|
872
|
-
}
|
|
873
|
-
|
|
874
|
-
// Knowledge base search
|
|
875
|
-
var kb = new GlideRecord('kb_knowledge');
|
|
876
|
-
kb.addQuery('workflow_state', 'published');
|
|
877
|
-
kb.addQuery('short_description', 'CONTAINS', current.short_description);
|
|
878
|
-
kb.setLimit(5);
|
|
879
|
-
kb.query();
|
|
880
|
-
while(kb.next()) {
|
|
881
|
-
analysis.knowledge_articles.push({
|
|
882
|
-
sys_id: kb.sys_id.toString(),
|
|
883
|
-
number: kb.number.toString(),
|
|
884
|
-
short_description: kb.short_description.toString()
|
|
885
|
-
});
|
|
886
|
-
}
|
|
887
|
-
|
|
888
|
-
// Determine required actions
|
|
889
|
-
analysis.required_actions.push('assign_to_group');
|
|
890
|
-
if (analysis.priority_score >= 80) {
|
|
891
|
-
analysis.required_actions.push('send_immediate_notification');
|
|
892
|
-
analysis.required_actions.push('create_priority_task');
|
|
893
|
-
}
|
|
894
|
-
if (analysis.knowledge_articles.length > 0) {
|
|
895
|
-
analysis.required_actions.push('attach_knowledge');
|
|
896
|
-
}
|
|
897
|
-
if (analysis.automation_possible) {
|
|
898
|
-
analysis.required_actions.push('attempt_auto_resolution');
|
|
899
|
-
}
|
|
900
|
-
|
|
901
|
-
return analysis;`,
|
|
902
|
-
timeout: 30
|
|
903
|
-
},
|
|
904
|
-
outputs: {
|
|
905
|
-
priority_score: 'integer',
|
|
906
|
-
category_match: 'string',
|
|
907
|
-
sla_target: 'string',
|
|
908
|
-
knowledge_articles: 'object',
|
|
909
|
-
assignment_recommendation: 'string',
|
|
910
|
-
automation_possible: 'boolean',
|
|
911
|
-
required_actions: 'object'
|
|
912
|
-
}
|
|
913
|
-
},
|
|
914
|
-
{
|
|
915
|
-
name: 'Automated Assignment',
|
|
916
|
-
type: 'update_record',
|
|
917
|
-
order: 200,
|
|
918
|
-
description: 'Automatically assign to appropriate group based on analysis',
|
|
919
|
-
condition: '{{analyze_incident.assignment_recommendation}} != ""',
|
|
920
|
-
inputs: {
|
|
921
|
-
table: 'incident',
|
|
922
|
-
sys_id: '{{trigger.current.sys_id}}',
|
|
923
|
-
fields: [
|
|
924
|
-
{
|
|
925
|
-
field: 'assignment_group',
|
|
926
|
-
value: '{{analyze_incident.assignment_recommendation}}'
|
|
927
|
-
},
|
|
928
|
-
{
|
|
929
|
-
field: 'work_notes',
|
|
930
|
-
value: 'Automatically assigned based on incident analysis. Category: {{analyze_incident.category_match}}'
|
|
931
|
-
},
|
|
932
|
-
{
|
|
933
|
-
field: 'category',
|
|
934
|
-
value: '{{analyze_incident.category_match}}'
|
|
935
|
-
}
|
|
936
|
-
]
|
|
937
|
-
},
|
|
938
|
-
outputs: {
|
|
939
|
-
success: 'boolean',
|
|
940
|
-
assigned_group: 'string'
|
|
941
|
-
}
|
|
942
|
-
},
|
|
943
|
-
{
|
|
944
|
-
name: 'SLA Tracking Setup',
|
|
945
|
-
type: 'script',
|
|
946
|
-
order: 300,
|
|
947
|
-
description: 'Set up SLA tracking and monitoring',
|
|
948
|
-
inputs: {
|
|
949
|
-
script: `// SLA tracking implementation
|
|
950
|
-
var slaGR = new GlideRecord('task_sla');
|
|
951
|
-
slaGR.initialize();
|
|
952
|
-
slaGR.task = current.sys_id;
|
|
953
|
-
slaGR.sla = getSLADefinition(current.analyze_incident.sla_target);
|
|
954
|
-
slaGR.business_duration = current.analyze_incident.sla_target;
|
|
955
|
-
slaGR.start_time = new GlideDateTime();
|
|
956
|
-
slaGR.insert();
|
|
957
|
-
|
|
958
|
-
// Set up monitoring
|
|
959
|
-
current.sla_due = new GlideDateTime();
|
|
960
|
-
current.sla_due.addSeconds(parseSLAToSeconds(current.analyze_incident.sla_target));
|
|
961
|
-
current.update();
|
|
962
|
-
|
|
963
|
-
function getSLADefinition(target) {
|
|
964
|
-
// Return appropriate SLA definition sys_id
|
|
965
|
-
var slaMap = {
|
|
966
|
-
'1 hour': 'p1_sla_def_sys_id',
|
|
967
|
-
'4 hours': 'p2_sla_def_sys_id',
|
|
968
|
-
'24 hours': 'p3_sla_def_sys_id'
|
|
969
|
-
};
|
|
970
|
-
return slaMap[target] || 'default_sla_def_sys_id';
|
|
971
|
-
}
|
|
972
|
-
|
|
973
|
-
function parseSLAToSeconds(target) {
|
|
974
|
-
var seconds = {
|
|
975
|
-
'1 hour': 3600,
|
|
976
|
-
'4 hours': 14400,
|
|
977
|
-
'24 hours': 86400
|
|
978
|
-
};
|
|
979
|
-
return seconds[target] || 86400;
|
|
980
|
-
}
|
|
981
|
-
|
|
982
|
-
return { sla_created: true, due_time: current.sla_due.toString() };`
|
|
983
|
-
},
|
|
984
|
-
outputs: {
|
|
985
|
-
sla_created: 'boolean',
|
|
986
|
-
due_time: 'string'
|
|
987
|
-
}
|
|
988
|
-
},
|
|
989
|
-
{
|
|
990
|
-
name: 'Knowledge Base Integration',
|
|
991
|
-
type: 'script',
|
|
992
|
-
order: 400,
|
|
993
|
-
description: 'Attach relevant knowledge articles to incident',
|
|
994
|
-
condition: '{{analyze_incident.knowledge_articles.length}} > 0',
|
|
995
|
-
inputs: {
|
|
996
|
-
script: `// Attach knowledge articles
|
|
997
|
-
var attached = 0;
|
|
998
|
-
var articles = current.analyze_incident.knowledge_articles;
|
|
999
|
-
|
|
1000
|
-
for (var i = 0; i < articles.length && i < 3; i++) {
|
|
1001
|
-
var m2m = new GlideRecord('m2m_kb_task');
|
|
1002
|
-
m2m.initialize();
|
|
1003
|
-
m2m.task = current.sys_id;
|
|
1004
|
-
m2m.kb_knowledge = articles[i].sys_id;
|
|
1005
|
-
m2m.insert();
|
|
1006
|
-
attached++;
|
|
1007
|
-
}
|
|
1008
|
-
|
|
1009
|
-
// Add comment with knowledge suggestions
|
|
1010
|
-
current.comments = 'Relevant knowledge articles attached:\n';
|
|
1011
|
-
for (var j = 0; j < articles.length && j < 3; j++) {
|
|
1012
|
-
current.comments += articles[j].number + ': ' + articles[j].short_description + '\n';
|
|
1013
|
-
}
|
|
1014
|
-
current.update();
|
|
1015
|
-
|
|
1016
|
-
return { articles_attached: attached };`
|
|
1017
|
-
},
|
|
1018
|
-
outputs: {
|
|
1019
|
-
articles_attached: 'integer'
|
|
1020
|
-
}
|
|
1021
|
-
},
|
|
1022
|
-
{
|
|
1023
|
-
name: 'Automated Resolution Attempt',
|
|
1024
|
-
type: 'script',
|
|
1025
|
-
order: 500,
|
|
1026
|
-
description: 'Attempt automated resolution for common issues',
|
|
1027
|
-
condition: '{{analyze_incident.automation_possible}} == true && {{analyze_incident.category_match}} == "access"',
|
|
1028
|
-
inputs: {
|
|
1029
|
-
script: `// Automated resolution for password reset
|
|
1030
|
-
var resolved = false;
|
|
1031
|
-
var resolution_notes = '';
|
|
1032
|
-
|
|
1033
|
-
if (current.analyze_incident.category_match === 'access') {
|
|
1034
|
-
// Check if it's a password reset request
|
|
1035
|
-
if (current.short_description.toLowerCase().includes('password')) {
|
|
1036
|
-
// Initiate password reset
|
|
1037
|
-
var user = current.caller_id;
|
|
1038
|
-
if (user) {
|
|
1039
|
-
// Create password reset event
|
|
1040
|
-
var event = new GlideRecord('sysevent');
|
|
1041
|
-
event.initialize();
|
|
1042
|
-
event.name = 'password.reset.request';
|
|
1043
|
-
event.parm1 = user.sys_id;
|
|
1044
|
-
event.parm2 = current.number;
|
|
1045
|
-
event.insert();
|
|
1046
|
-
|
|
1047
|
-
resolved = true;
|
|
1048
|
-
resolution_notes = 'Password reset link sent to user email. User should receive instructions within 5 minutes.';
|
|
1049
|
-
|
|
1050
|
-
// Update incident
|
|
1051
|
-
current.state = 6; // Resolved
|
|
1052
|
-
current.close_code = 'Solved (Permanently)';
|
|
1053
|
-
current.close_notes = resolution_notes;
|
|
1054
|
-
current.resolution_notes = 'Automated password reset completed';
|
|
1055
|
-
current.update();
|
|
1056
|
-
}
|
|
1057
|
-
}
|
|
1058
|
-
}
|
|
1059
|
-
|
|
1060
|
-
return {
|
|
1061
|
-
resolved: resolved,
|
|
1062
|
-
resolution_notes: resolution_notes,
|
|
1063
|
-
automation_type: 'password_reset'
|
|
1064
|
-
};`
|
|
1065
|
-
},
|
|
1066
|
-
outputs: {
|
|
1067
|
-
resolved: 'boolean',
|
|
1068
|
-
resolution_notes: 'string',
|
|
1069
|
-
automation_type: 'string'
|
|
1070
|
-
}
|
|
1071
|
-
},
|
|
1072
|
-
{
|
|
1073
|
-
name: 'Routing to Support Team',
|
|
1074
|
-
type: 'create_record',
|
|
1075
|
-
order: 600,
|
|
1076
|
-
description: 'Create task for support team if not auto-resolved',
|
|
1077
|
-
condition: '{{automated_resolution_attempt.resolved}} != true',
|
|
1078
|
-
inputs: {
|
|
1079
|
-
table: 'incident_task',
|
|
1080
|
-
fields: [
|
|
1081
|
-
{
|
|
1082
|
-
field: 'parent',
|
|
1083
|
-
value: '{{trigger.current.sys_id}}'
|
|
1084
|
-
},
|
|
1085
|
-
{
|
|
1086
|
-
field: 'short_description',
|
|
1087
|
-
value: 'Investigate and resolve: {{trigger.current.short_description}}'
|
|
1088
|
-
},
|
|
1089
|
-
{
|
|
1090
|
-
field: 'description',
|
|
1091
|
-
value: `Incident Analysis Results:
|
|
1092
|
-
- Priority Score: {{analyze_incident.priority_score}}
|
|
1093
|
-
- Category: {{analyze_incident.category_match}}
|
|
1094
|
-
- SLA Target: {{analyze_incident.sla_target}}
|
|
1095
|
-
- Knowledge Articles Found: {{analyze_incident.knowledge_articles.length}}
|
|
1096
|
-
|
|
1097
|
-
Please investigate and resolve according to SLA.`
|
|
1098
|
-
},
|
|
1099
|
-
{
|
|
1100
|
-
field: 'assignment_group',
|
|
1101
|
-
value: '{{automated_assignment.assigned_group}}'
|
|
1102
|
-
},
|
|
1103
|
-
{
|
|
1104
|
-
field: 'priority',
|
|
1105
|
-
value: '{{trigger.current.priority}}'
|
|
1106
|
-
}
|
|
1107
|
-
]
|
|
1108
|
-
},
|
|
1109
|
-
outputs: {
|
|
1110
|
-
task_sys_id: 'string',
|
|
1111
|
-
task_number: 'string'
|
|
1112
|
-
}
|
|
1113
|
-
},
|
|
1114
|
-
{
|
|
1115
|
-
name: 'SLA Breach Prevention',
|
|
1116
|
-
type: 'wait_for_condition',
|
|
1117
|
-
order: 700,
|
|
1118
|
-
description: 'Monitor for potential SLA breach',
|
|
1119
|
-
condition: '{{automated_resolution_attempt.resolved}} != true',
|
|
1120
|
-
inputs: {
|
|
1121
|
-
condition: 'current.state == 6 || current.state == 7', // Resolved or Closed
|
|
1122
|
-
timeout: '{{escalation_threshold}}',
|
|
1123
|
-
timeout_action: 'continue'
|
|
1124
|
-
},
|
|
1125
|
-
outputs: {
|
|
1126
|
-
condition_met: 'boolean',
|
|
1127
|
-
timed_out: 'boolean'
|
|
1128
|
-
}
|
|
1129
|
-
},
|
|
1130
|
-
{
|
|
1131
|
-
name: 'Escalation Notification',
|
|
1132
|
-
type: 'notification',
|
|
1133
|
-
order: 800,
|
|
1134
|
-
description: 'Send escalation notification if SLA at risk',
|
|
1135
|
-
condition: '{{sla_breach_prevention.timed_out}} == true',
|
|
1136
|
-
inputs: {
|
|
1137
|
-
recipients: '{{trigger.current.assignment_group.manager}},{{trigger.current.opened_by.manager}}',
|
|
1138
|
-
subject: 'URGENT: Incident {{trigger.current.number}} - SLA Breach Risk',
|
|
1139
|
-
message: `Incident at risk of SLA breach:
|
|
1140
|
-
|
|
1141
|
-
Incident: {{trigger.current.number}}
|
|
1142
|
-
Priority: P{{trigger.current.priority}}
|
|
1143
|
-
SLA Target: {{analyze_incident.sla_target}}
|
|
1144
|
-
Time Elapsed: {{escalation_threshold}} minutes
|
|
1145
|
-
Current State: {{trigger.current.state}}
|
|
1146
|
-
Assignment Group: {{trigger.current.assignment_group.name}}
|
|
1147
|
-
|
|
1148
|
-
Immediate action required to prevent SLA breach.
|
|
1149
|
-
|
|
1150
|
-
View Incident: {{instance_url}}/incident.do?sys_id={{trigger.current.sys_id}}`,
|
|
1151
|
-
notification_type: 'urgent'
|
|
1152
|
-
},
|
|
1153
|
-
outputs: {
|
|
1154
|
-
sent: 'boolean',
|
|
1155
|
-
notification_id: 'string'
|
|
1156
|
-
}
|
|
1157
|
-
},
|
|
1158
|
-
{
|
|
1159
|
-
name: 'Create Priority Task',
|
|
1160
|
-
type: 'create_record',
|
|
1161
|
-
order: 900,
|
|
1162
|
-
description: 'Create priority task for high-priority incidents',
|
|
1163
|
-
condition: '{{analyze_incident.priority_score}} >= 80',
|
|
1164
|
-
inputs: {
|
|
1165
|
-
table: 'priority_task',
|
|
1166
|
-
fields: [
|
|
1167
|
-
{
|
|
1168
|
-
field: 'short_description',
|
|
1169
|
-
value: 'P{{trigger.current.priority}} Incident Response: {{trigger.current.number}}'
|
|
1170
|
-
},
|
|
1171
|
-
{
|
|
1172
|
-
field: 'description',
|
|
1173
|
-
value: 'High priority incident requiring immediate attention'
|
|
1174
|
-
},
|
|
1175
|
-
{
|
|
1176
|
-
field: 'related_incident',
|
|
1177
|
-
value: '{{trigger.current.sys_id}}'
|
|
1178
|
-
},
|
|
1179
|
-
{
|
|
1180
|
-
field: 'assignment_group',
|
|
1181
|
-
value: 'major_incident_team'
|
|
1182
|
-
}
|
|
1183
|
-
]
|
|
1184
|
-
},
|
|
1185
|
-
outputs: {
|
|
1186
|
-
priority_task_id: 'string'
|
|
1187
|
-
}
|
|
1188
|
-
},
|
|
1189
|
-
{
|
|
1190
|
-
name: 'Final Status Update',
|
|
1191
|
-
type: 'update_record',
|
|
1192
|
-
order: 1000,
|
|
1193
|
-
description: 'Update incident with all processing information',
|
|
1194
|
-
inputs: {
|
|
1195
|
-
table: 'incident',
|
|
1196
|
-
sys_id: '{{trigger.current.sys_id}}',
|
|
1197
|
-
fields: [
|
|
1198
|
-
{
|
|
1199
|
-
field: 'work_notes',
|
|
1200
|
-
value: `Flow Processing Complete:
|
|
1201
|
-
- Analysis Score: {{analyze_incident.priority_score}}
|
|
1202
|
-
- Auto-assigned: {{automated_assignment.success}}
|
|
1203
|
-
- Knowledge Articles: {{knowledge_base_integration.articles_attached}}
|
|
1204
|
-
- Auto-resolved: {{automated_resolution_attempt.resolved}}
|
|
1205
|
-
- Tasks Created: {{routing_to_support_team.task_number}}
|
|
1206
|
-
- SLA Monitored: true`
|
|
1207
|
-
}
|
|
1208
|
-
]
|
|
1209
|
-
},
|
|
1210
|
-
outputs: {
|
|
1211
|
-
final_update_complete: 'boolean'
|
|
1212
|
-
}
|
|
1213
|
-
}
|
|
1214
|
-
]
|
|
1215
|
-
};
|
|
1216
|
-
}
|
|
1217
|
-
}
|
|
1218
|
-
exports.CompleteFlowXMLGenerator = CompleteFlowXMLGenerator;
|
|
1219
|
-
/**
|
|
1220
|
-
* Generate PRODUCTION-READY complete flow XML
|
|
1221
|
-
*/
|
|
1222
|
-
function generateCompleteFlowXML(flowDef) {
|
|
1223
|
-
const generator = new CompleteFlowXMLGenerator(this.flowDef.name.replace(/[^a-zA-Z0-9]+/g, '_') + '_Complete_Import');
|
|
1224
|
-
const xml = generator.generateCompleteFlowXML(flowDef);
|
|
1225
|
-
const filename = this.flowDef.name.toLowerCase().replace(/[^a-z0-9]+/g, '_') + '_complete_flow.xml';
|
|
1226
|
-
const filePath = generator.saveToFile(xml, filename);
|
|
1227
|
-
const instructions = `
|
|
1228
|
-
=== COMPLETE ServiceNow Flow Import Instructions ===
|
|
1229
|
-
|
|
1230
|
-
✅ This is the COMPLETE solution with:
|
|
1231
|
-
• ALL required ServiceNow tables (v2)
|
|
1232
|
-
• Proper Base64+gzip encoding
|
|
1233
|
-
• Complete label_cache structure
|
|
1234
|
-
• Full flow snapshot with metadata
|
|
1235
|
-
• All action types properly mapped
|
|
1236
|
-
• Production-ready XML structure
|
|
1237
|
-
|
|
1238
|
-
📁 Generated file: ${filePath}
|
|
1239
|
-
🔑 Flow Sys ID: ${generator.flowSysId}
|
|
1240
|
-
📸 Snapshot Sys ID: ${generator.snapshotSysId}
|
|
1241
|
-
|
|
1242
|
-
🚀 Import Instructions:
|
|
1243
|
-
|
|
1244
|
-
1. Login to ServiceNow as admin
|
|
1245
|
-
|
|
1246
|
-
2. Navigate: System Update Sets > Retrieved Update Sets
|
|
1247
|
-
|
|
1248
|
-
3. Click "Import Update Set from XML"
|
|
1249
|
-
|
|
1250
|
-
4. Upload: ${filePath}
|
|
1251
|
-
|
|
1252
|
-
5. Click "Upload" then "Preview Update Set"
|
|
1253
|
-
|
|
1254
|
-
6. Review and "Commit Update Set"
|
|
1255
|
-
|
|
1256
|
-
7. Open Flow Designer and find: "${this.flowDef.name}"
|
|
1257
|
-
|
|
1258
|
-
💡 The flow includes ALL requested features:
|
|
1259
|
-
✅ Automated assignment based on analysis
|
|
1260
|
-
✅ SLA tracking and monitoring
|
|
1261
|
-
✅ Knowledge base integration
|
|
1262
|
-
✅ Automated resolution attempts
|
|
1263
|
-
✅ Smart routing to support teams
|
|
1264
|
-
✅ Escalation notifications
|
|
1265
|
-
✅ Priority task creation
|
|
1266
|
-
✅ Complete status tracking
|
|
1267
|
-
|
|
1268
|
-
🔧 Troubleshooting:
|
|
1269
|
-
• Verify all referenced groups exist (email_support, network_team, etc.)
|
|
1270
|
-
• Check that SLA definitions are configured
|
|
1271
|
-
• Ensure knowledge articles are published
|
|
1272
|
-
• Confirm notification channels are set up
|
|
1273
|
-
|
|
1274
|
-
This is a COMPLETE, PRODUCTION-READY flow!
|
|
1275
|
-
`.trim();
|
|
1276
|
-
return {
|
|
1277
|
-
xml,
|
|
1278
|
-
filePath,
|
|
1279
|
-
flowSysId: generator.flowSysId,
|
|
1280
|
-
snapshotSysId: generator.snapshotSysId,
|
|
1281
|
-
instructions
|
|
1282
|
-
};
|
|
1283
|
-
}
|
|
1284
|
-
// Export for use in MCP tools
|
|
1285
|
-
exports.default = CompleteFlowXMLGenerator;
|