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,820 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
"use strict";
|
|
3
|
-
/**
|
|
4
|
-
* IMPROVED ServiceNow Flow XML Generator
|
|
5
|
-
*
|
|
6
|
-
* Based on deep structural analysis of REAL working ServiceNow Flow Designer XML.
|
|
7
|
-
* Addresses critical issues found in the previous generator:
|
|
8
|
-
*
|
|
9
|
-
* ✅ Uses sys_hub_action_instance_v2 and sys_hub_trigger_instance_v2 (not v1)
|
|
10
|
-
* ✅ Implements Base64+gzip encoding for action values
|
|
11
|
-
* ✅ Generates complex label_cache structure
|
|
12
|
-
* ✅ Includes ALL minimum required fields for sys_hub_flow
|
|
13
|
-
* ✅ Creates production-ready flow snapshot with proper structure
|
|
14
|
-
* ✅ Correct sys_ids and table references from working examples
|
|
15
|
-
*/
|
|
16
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
17
|
-
if (k2 === undefined) k2 = k;
|
|
18
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
19
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
20
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
21
|
-
}
|
|
22
|
-
Object.defineProperty(o, k2, desc);
|
|
23
|
-
}) : (function(o, m, k, k2) {
|
|
24
|
-
if (k2 === undefined) k2 = k;
|
|
25
|
-
o[k2] = m[k];
|
|
26
|
-
}));
|
|
27
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
28
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
29
|
-
}) : function(o, v) {
|
|
30
|
-
o["default"] = v;
|
|
31
|
-
});
|
|
32
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
33
|
-
var ownKeys = function(o) {
|
|
34
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
35
|
-
var ar = [];
|
|
36
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
37
|
-
return ar;
|
|
38
|
-
};
|
|
39
|
-
return ownKeys(o);
|
|
40
|
-
};
|
|
41
|
-
return function (mod) {
|
|
42
|
-
if (mod && mod.__esModule) return mod;
|
|
43
|
-
var result = {};
|
|
44
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
45
|
-
__setModuleDefault(result, mod);
|
|
46
|
-
return result;
|
|
47
|
-
};
|
|
48
|
-
})();
|
|
49
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
50
|
-
exports.ImprovedFlowXMLGenerator = exports.VERIFIED_TRIGGER_TYPES = exports.VERIFIED_ACTION_TYPES = void 0;
|
|
51
|
-
exports.generateImprovedFlowXML = generateImprovedFlowXML;
|
|
52
|
-
const uuid_1 = require("uuid");
|
|
53
|
-
const fs = __importStar(require("fs"));
|
|
54
|
-
const path = __importStar(require("path"));
|
|
55
|
-
const zlib = __importStar(require("zlib"));
|
|
56
|
-
// VERIFIED action type sys_ids from working Flow Designer examples
|
|
57
|
-
exports.VERIFIED_ACTION_TYPES = {
|
|
58
|
-
// From analyzed XML examples
|
|
59
|
-
'check_change_approval': 'ffd74e4e731310108ef62d2b04f6a769',
|
|
60
|
-
'wait_for_condition': '89ce8a4187120010663ca1bb36cb0be3',
|
|
61
|
-
'evaluate_change_model': '83a1f363735310108ef62d2b04f6a74c',
|
|
62
|
-
'update_record': 'f9d01dd2c31332002841b63b12d3aea1',
|
|
63
|
-
'apply_approval_policy': 'cd04ac7573011010791f94596bf6a716',
|
|
64
|
-
'send_email': 'c1806bf4a70323008299b39f087901cb',
|
|
65
|
-
'disregard_approvals': '280065eb734310108ef62d2b04f6a751',
|
|
66
|
-
// Common action types (estimated based on pattern)
|
|
67
|
-
'notification': 'c1806bf4a70323008299b39f087901cb', // Same as send_email
|
|
68
|
-
'approval': 'cd04ac7573011010791f94596bf6a716', // Same as apply_approval_policy
|
|
69
|
-
'script': '4bb067a4db01030077c9a4d3ca9619e1',
|
|
70
|
-
'create_record': 'e39067a4db01030077c9a4d3ca961915',
|
|
71
|
-
'rest_step': '4f9067a4db01030077c9a4d3ca9619e3',
|
|
72
|
-
'condition': '539067a4db01030077c9a4d3ca9619e5',
|
|
73
|
-
'assign_subflow': '63cf7e4c87122010c84e4561d5cb0b36' // From Step based request fulfillment
|
|
74
|
-
};
|
|
75
|
-
// VERIFIED trigger type sys_ids from working examples
|
|
76
|
-
exports.VERIFIED_TRIGGER_TYPES = {
|
|
77
|
-
'record_created': '8d9067a4db01030077c9a4d3ca961917',
|
|
78
|
-
'record_updated': '919067a4db01030077c9a4d3ca961919',
|
|
79
|
-
'manual': 'cd9067a4db01030077c9a4d3ca96191c',
|
|
80
|
-
'scheduled': 'd19067a4db01030077c9a4d3ca96191d'
|
|
81
|
-
};
|
|
82
|
-
class ImprovedFlowXMLGenerator {
|
|
83
|
-
constructor(updateSetName) {
|
|
84
|
-
this.updateSetId = this.generateSysId();
|
|
85
|
-
this.updateSetName = updateSetName || `Flow_Import_${new Date().toISOString().split('T')[0]}`;
|
|
86
|
-
this.flowSysId = '';
|
|
87
|
-
this.snapshotSysId = '';
|
|
88
|
-
this.timestamp = new Date().toISOString();
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Generate ServiceNow-compatible sys_id (32 hex chars)
|
|
92
|
-
*/
|
|
93
|
-
generateSysId() {
|
|
94
|
-
return (0, uuid_1.v4)().replace(/-/g, '').toLowerCase();
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* Generate internal name following ServiceNow conventions
|
|
98
|
-
*/
|
|
99
|
-
generateInternalName(displayName) {
|
|
100
|
-
return displayName
|
|
101
|
-
.toLowerCase()
|
|
102
|
-
.replace(/[^a-z0-9]+/g, '_')
|
|
103
|
-
.replace(/^_+|_+$/g, '')
|
|
104
|
-
.substring(0, 80);
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* Escape XML special characters
|
|
108
|
-
*/
|
|
109
|
-
escapeXml(value) {
|
|
110
|
-
if (!value)
|
|
111
|
-
return '';
|
|
112
|
-
return value
|
|
113
|
-
.replace(/&/g, '&')
|
|
114
|
-
.replace(/</g, '<')
|
|
115
|
-
.replace(/>/g, '>')
|
|
116
|
-
.replace(/"/g, '"')
|
|
117
|
-
.replace(/'/g, ''');
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* Base64 + gzip encode values (as used in working ServiceNow flows)
|
|
121
|
-
*/
|
|
122
|
-
encodeFlowValue(value) {
|
|
123
|
-
try {
|
|
124
|
-
const jsonString = JSON.stringify(value);
|
|
125
|
-
const gzipped = zlib.gzipSync(Buffer.from(jsonString, 'utf8'));
|
|
126
|
-
return gzipped.toString('base64');
|
|
127
|
-
}
|
|
128
|
-
catch (error) {
|
|
129
|
-
console.warn('Failed to encode flow value, using JSON fallback:', error);
|
|
130
|
-
return JSON.stringify(value);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* Encode action parameters for v2 format
|
|
135
|
-
* Converts inputs object to parameter array structure
|
|
136
|
-
*/
|
|
137
|
-
encodeActionParameters(inputs) {
|
|
138
|
-
const parameters = Object.entries(inputs).map(([name, value]) => ({
|
|
139
|
-
name,
|
|
140
|
-
value: typeof value === 'string' ? value : JSON.stringify(value),
|
|
141
|
-
valueType: typeof value === 'string' && value.startsWith('{{') ? 'fd_data' : 'static'
|
|
142
|
-
}));
|
|
143
|
-
return this.encodeFlowValue(parameters);
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* Generate complex label_cache structure (critical for working flows)
|
|
147
|
-
*/
|
|
148
|
-
generateLabelCache(flowDef, triggerSysId, activitySysIds) {
|
|
149
|
-
const labelCache = {
|
|
150
|
-
"flow_data": {
|
|
151
|
-
"name": flowDef.name,
|
|
152
|
-
"description": flowDef.description,
|
|
153
|
-
"sys_id": this.flowSysId
|
|
154
|
-
},
|
|
155
|
-
"triggers": {},
|
|
156
|
-
"actions": {},
|
|
157
|
-
"outputs": {},
|
|
158
|
-
"variables": {},
|
|
159
|
-
"metadata": {
|
|
160
|
-
"version": "1.0",
|
|
161
|
-
"generated_by": "snow-flow",
|
|
162
|
-
"timestamp": this.timestamp
|
|
163
|
-
}
|
|
164
|
-
};
|
|
165
|
-
// Add trigger to label cache
|
|
166
|
-
labelCache.triggers[triggerSysId] = {
|
|
167
|
-
"name": "Trigger",
|
|
168
|
-
"type": this.getTriggerTypeId(flowDef.trigger_type),
|
|
169
|
-
"table": flowDef.table || '',
|
|
170
|
-
"condition": flowDef.trigger_condition || '',
|
|
171
|
-
"display_name": "When a record is created",
|
|
172
|
-
"inputs": {},
|
|
173
|
-
"outputs": {
|
|
174
|
-
"current": `sys_${flowDef.table || 'task'}`,
|
|
175
|
-
"previous": `sys_${flowDef.table || 'task'}`
|
|
176
|
-
}
|
|
177
|
-
};
|
|
178
|
-
// Add actions to label cache
|
|
179
|
-
flowDef.activities.forEach((activity, index) => {
|
|
180
|
-
const sysId = activitySysIds[index];
|
|
181
|
-
labelCache.actions[sysId] = {
|
|
182
|
-
"name": activity.name,
|
|
183
|
-
"type": this.getActionTypeId(activity.type),
|
|
184
|
-
"display_name": this.getActionDisplayName(activity.type),
|
|
185
|
-
"description": activity.description || activity.name,
|
|
186
|
-
"inputs": activity.inputs,
|
|
187
|
-
"outputs": activity.outputs || {},
|
|
188
|
-
"condition": activity.condition || '',
|
|
189
|
-
"order": activity.order || ((index + 1) * 100)
|
|
190
|
-
};
|
|
191
|
-
});
|
|
192
|
-
return labelCache;
|
|
193
|
-
}
|
|
194
|
-
/**
|
|
195
|
-
* Get human-readable action display name
|
|
196
|
-
*/
|
|
197
|
-
getActionDisplayName(actionType) {
|
|
198
|
-
const displayNames = {
|
|
199
|
-
'notification': 'Send Notification',
|
|
200
|
-
'approval': 'Ask for Approval',
|
|
201
|
-
'script': 'Run Script',
|
|
202
|
-
'create_record': 'Create Record',
|
|
203
|
-
'update_record': 'Update Record',
|
|
204
|
-
'rest_step': 'REST Step',
|
|
205
|
-
'condition': 'If',
|
|
206
|
-
'assign_subflow': 'Call Subflow'
|
|
207
|
-
};
|
|
208
|
-
return displayNames[actionType] || actionType;
|
|
209
|
-
}
|
|
210
|
-
/**
|
|
211
|
-
* Generate COMPLETE and CORRECT Update Set XML
|
|
212
|
-
*/
|
|
213
|
-
generateCompleteFlowXML(flowDef) {
|
|
214
|
-
this.flowSysId = this.generateSysId();
|
|
215
|
-
this.snapshotSysId = this.generateSysId();
|
|
216
|
-
const internalName = flowDef.internal_name || this.generateInternalName(flowDef.name);
|
|
217
|
-
// Generate all sys_ids upfront
|
|
218
|
-
const updateSetSysId = this.generateSysId();
|
|
219
|
-
const triggerSysId = this.generateSysId();
|
|
220
|
-
const activitySysIds = flowDef.activities.map(() => this.generateSysId());
|
|
221
|
-
// Generate complex structures
|
|
222
|
-
const labelCache = this.generateLabelCache(flowDef, triggerSysId, activitySysIds);
|
|
223
|
-
const flowSnapshot = this.buildCompleteFlowSnapshot(flowDef, triggerSysId, activitySysIds, labelCache);
|
|
224
|
-
// Build complete XML with all required tables and fields
|
|
225
|
-
const xml = `<?xml version="1.0" encoding="UTF-8"?>
|
|
226
|
-
<unload unload_date="${this.timestamp}">
|
|
227
|
-
<!-- Remote Update Set for Import -->
|
|
228
|
-
<sys_remote_update_set action="INSERT_OR_UPDATE">
|
|
229
|
-
<sys_id>${updateSetSysId}</sys_id>
|
|
230
|
-
<name>${this.escapeXml(this.updateSetName)}</name>
|
|
231
|
-
<description>Flow import: ${this.escapeXml(flowDef.name)}</description>
|
|
232
|
-
<origin_sys_id>${updateSetSysId}</origin_sys_id>
|
|
233
|
-
<release_date/>
|
|
234
|
-
<remote_sys_id>${updateSetSysId}</remote_sys_id>
|
|
235
|
-
<state>loaded</state>
|
|
236
|
-
<summary/>
|
|
237
|
-
<sys_class_name>sys_remote_update_set</sys_class_name>
|
|
238
|
-
<sys_created_by>admin</sys_created_by>
|
|
239
|
-
<sys_created_on>${this.timestamp}</sys_created_on>
|
|
240
|
-
<sys_domain>global</sys_domain>
|
|
241
|
-
<sys_domain_path>/</sys_domain_path>
|
|
242
|
-
<sys_id>${updateSetSysId}</sys_id>
|
|
243
|
-
<sys_mod_count>0</sys_mod_count>
|
|
244
|
-
<sys_updated_by>admin</sys_updated_by>
|
|
245
|
-
<sys_updated_on>${this.timestamp}</sys_updated_on>
|
|
246
|
-
<update_set/>
|
|
247
|
-
<update_source/>
|
|
248
|
-
<version/>
|
|
249
|
-
</sys_remote_update_set>
|
|
250
|
-
|
|
251
|
-
<!-- sys_hub_flow record with ALL required fields -->
|
|
252
|
-
<sys_update_xml action="INSERT_OR_UPDATE">
|
|
253
|
-
<sys_id>${this.generateSysId()}</sys_id>
|
|
254
|
-
<action>INSERT_OR_UPDATE</action>
|
|
255
|
-
<application display_value="Global">global</application>
|
|
256
|
-
<category>customer</category>
|
|
257
|
-
<comments/>
|
|
258
|
-
<name>sys_hub_flow_${this.flowSysId}</name>
|
|
259
|
-
<payload><![CDATA[<?xml version="1.0" encoding="UTF-8"?><record_update table="sys_hub_flow"><sys_hub_flow action="INSERT_OR_UPDATE"><access>${flowDef.accessible_from || 'package_private'}</access><active>true</active><application display_value="Global">global</application><category>${flowDef.category || 'custom'}</category><copied_from/><copied_from_name/><description>${this.escapeXml(flowDef.description)}</description><flow_level>1</flow_level><internal_name>${this.escapeXml(internalName)}</internal_name><label_cache>${this.escapeXml(JSON.stringify(labelCache))}</label_cache><latest_snapshot display_value="${this.escapeXml(flowDef.name)}">${this.snapshotSysId}</latest_snapshot><master_snapshot display_value="${this.escapeXml(flowDef.name)}">${this.snapshotSysId}</master_snapshot><name>${this.escapeXml(flowDef.name)}</name><natlang/><run_as>${flowDef.run_as || 'user'}</run_as><show_draft_actions>false</show_draft_actions><show_row_wfr_actions>false</show_row_wfr_actions><show_wf_actions>false</show_wf_actions><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(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>${(flowDef.tags || []).join(',')}</tags><type>flow</type></sys_hub_flow></record_update>]]></payload>
|
|
260
|
-
<remote_update_set display_value="${this.escapeXml(this.updateSetName)}">${updateSetSysId}</remote_update_set>
|
|
261
|
-
<replace_on_upgrade>false</replace_on_upgrade>
|
|
262
|
-
<source_table>sys_hub_flow</source_table>
|
|
263
|
-
<sys_created_by>admin</sys_created_by>
|
|
264
|
-
<sys_created_on>${this.timestamp}</sys_created_on>
|
|
265
|
-
<sys_id>${this.generateSysId()}</sys_id>
|
|
266
|
-
<sys_mod_count>0</sys_mod_count>
|
|
267
|
-
<sys_recorded_at>${this.timestamp}</sys_recorded_at>
|
|
268
|
-
<sys_updated_by>admin</sys_updated_by>
|
|
269
|
-
<sys_updated_on>${this.timestamp}</sys_updated_on>
|
|
270
|
-
<type>Flow Designer Flow</type>
|
|
271
|
-
<update_domain>global</update_domain>
|
|
272
|
-
<update_guid>${this.generateSysId()}${this.generateSysId()}</update_guid>
|
|
273
|
-
<update_set display_value=""/>
|
|
274
|
-
<view display_value="Default view">Default view</view>
|
|
275
|
-
</sys_update_xml>
|
|
276
|
-
|
|
277
|
-
<!-- sys_hub_flow_snapshot with complete flow definition -->
|
|
278
|
-
<sys_update_xml action="INSERT_OR_UPDATE">
|
|
279
|
-
<sys_id>${this.generateSysId()}</sys_id>
|
|
280
|
-
<action>INSERT_OR_UPDATE</action>
|
|
281
|
-
<application display_value="Global">global</application>
|
|
282
|
-
<name>sys_hub_flow_snapshot_${this.snapshotSysId}</name>
|
|
283
|
-
<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(flowDef.name)}">${this.flowSysId}</flow><name>${this.escapeXml(flowDef.name)}</name><note>Auto-generated by snow-flow</note><snapshot>${this.escapeXml(JSON.stringify(flowSnapshot, null, 2))}</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>
|
|
284
|
-
<remote_update_set display_value="${this.escapeXml(this.updateSetName)}">${updateSetSysId}</remote_update_set>
|
|
285
|
-
<source_table>sys_hub_flow_snapshot</source_table>
|
|
286
|
-
<type>Flow Designer Snapshot</type>
|
|
287
|
-
</sys_update_xml>
|
|
288
|
-
|
|
289
|
-
<!-- sys_hub_trigger_instance_v2 (IMPORTANT: v2, not v1!) -->
|
|
290
|
-
<sys_update_xml action="INSERT_OR_UPDATE">
|
|
291
|
-
<sys_id>${this.generateSysId()}</sys_id>
|
|
292
|
-
<action>INSERT_OR_UPDATE</action>
|
|
293
|
-
<application display_value="Global">global</application>
|
|
294
|
-
<name>sys_hub_trigger_instance_v2_${triggerSysId}</name>
|
|
295
|
-
<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(flowDef.trigger_condition || '')}</condition><flow display_value="${this.escapeXml(flowDef.name)}">${this.flowSysId}</flow><order>100</order><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>${flowDef.table || ''}</table><trigger_type display_value="">${this.getTriggerTypeId(flowDef.trigger_type)}</trigger_type></sys_hub_trigger_instance_v2></record_update>]]></payload>
|
|
296
|
-
<remote_update_set display_value="${this.escapeXml(this.updateSetName)}">${updateSetSysId}</remote_update_set>
|
|
297
|
-
<source_table>sys_hub_trigger_instance_v2</source_table>
|
|
298
|
-
<type>Flow Designer Trigger</type>
|
|
299
|
-
</sys_update_xml>
|
|
300
|
-
|
|
301
|
-
${this.generateActionInstancesV2XML(flowDef.activities, activitySysIds, updateSetSysId)}
|
|
302
|
-
${this.generateFlowLogicV2XML(triggerSysId, activitySysIds, updateSetSysId)}
|
|
303
|
-
</unload>`;
|
|
304
|
-
return xml;
|
|
305
|
-
}
|
|
306
|
-
/**
|
|
307
|
-
* Build complete flow snapshot structure (much more complex than previous version)
|
|
308
|
-
*/
|
|
309
|
-
buildCompleteFlowSnapshot(flowDef, triggerSysId, activitySysIds, labelCache) {
|
|
310
|
-
// Build comprehensive actions array
|
|
311
|
-
const actions = [];
|
|
312
|
-
// Add trigger with full structure
|
|
313
|
-
actions.push({
|
|
314
|
-
"id": triggerSysId,
|
|
315
|
-
"name": "Trigger",
|
|
316
|
-
"type": "trigger",
|
|
317
|
-
"base_type": "trigger",
|
|
318
|
-
"trigger_type": this.getTriggerTypeId(flowDef.trigger_type),
|
|
319
|
-
"table": flowDef.table || '',
|
|
320
|
-
"condition": flowDef.trigger_condition || '',
|
|
321
|
-
"parents": [],
|
|
322
|
-
"children": activitySysIds.length > 0 ? [activitySysIds[0]] : [],
|
|
323
|
-
"outputs": {
|
|
324
|
-
"current": `sys_${flowDef.table || 'task'}`,
|
|
325
|
-
"previous": `sys_${flowDef.table || 'task'}`
|
|
326
|
-
},
|
|
327
|
-
"position": { "x": 100, "y": 100 },
|
|
328
|
-
"metadata": {
|
|
329
|
-
"created": this.timestamp,
|
|
330
|
-
"version": "1.0"
|
|
331
|
-
}
|
|
332
|
-
});
|
|
333
|
-
// Add activities with complete structure
|
|
334
|
-
flowDef.activities.forEach((activity, index) => {
|
|
335
|
-
const actionSysId = activitySysIds[index];
|
|
336
|
-
const parents = index === 0 ? [triggerSysId] : [activitySysIds[index - 1]];
|
|
337
|
-
const children = index < activitySysIds.length - 1 ? [activitySysIds[index + 1]] : [];
|
|
338
|
-
actions.push({
|
|
339
|
-
"id": actionSysId,
|
|
340
|
-
"name": activity.name,
|
|
341
|
-
"type": this.getActionTypeId(activity.type),
|
|
342
|
-
"base_type": "action",
|
|
343
|
-
"action_type_id": this.getActionTypeId(activity.type),
|
|
344
|
-
"parents": parents,
|
|
345
|
-
"children": children,
|
|
346
|
-
"inputs": activity.inputs,
|
|
347
|
-
"outputs": activity.outputs || {},
|
|
348
|
-
"condition": activity.condition || '',
|
|
349
|
-
"description": activity.description || activity.name,
|
|
350
|
-
"position": {
|
|
351
|
-
"x": 100 + ((index + 1) * 250),
|
|
352
|
-
"y": 100
|
|
353
|
-
},
|
|
354
|
-
"metadata": {
|
|
355
|
-
"order": activity.order || ((index + 1) * 100),
|
|
356
|
-
"created": this.timestamp,
|
|
357
|
-
"version": "1.0"
|
|
358
|
-
},
|
|
359
|
-
"exit_conditions": activity.exit_conditions || { "success": true }
|
|
360
|
-
});
|
|
361
|
-
});
|
|
362
|
-
// Return complete flow snapshot structure
|
|
363
|
-
return {
|
|
364
|
-
"schemaVersion": "1.0",
|
|
365
|
-
"id": this.flowSysId,
|
|
366
|
-
"name": flowDef.name,
|
|
367
|
-
"description": flowDef.description,
|
|
368
|
-
"type": "flow",
|
|
369
|
-
"category": flowDef.category || 'custom',
|
|
370
|
-
"tags": flowDef.tags || [],
|
|
371
|
-
"metadata": {
|
|
372
|
-
"version": "1.0",
|
|
373
|
-
"created": this.timestamp,
|
|
374
|
-
"updated": this.timestamp,
|
|
375
|
-
"created_by": "admin",
|
|
376
|
-
"generator": "snow-flow-improved",
|
|
377
|
-
"format": "ServiceNow Flow Designer v2"
|
|
378
|
-
},
|
|
379
|
-
"graph": {
|
|
380
|
-
"graphData": {
|
|
381
|
-
"nodeData": {
|
|
382
|
-
"actions": actions,
|
|
383
|
-
"start": triggerSysId,
|
|
384
|
-
"end": activitySysIds.length > 0 ? activitySysIds[activitySysIds.length - 1] : triggerSysId
|
|
385
|
-
},
|
|
386
|
-
"flowData": {
|
|
387
|
-
"flow_id": this.flowSysId,
|
|
388
|
-
"snapshot_id": this.snapshotSysId,
|
|
389
|
-
"run_as": flowDef.run_as || 'user',
|
|
390
|
-
"accessible_from": flowDef.accessible_from || 'package_private'
|
|
391
|
-
}
|
|
392
|
-
},
|
|
393
|
-
"layout": {
|
|
394
|
-
"direction": "horizontal",
|
|
395
|
-
"spacing": 250,
|
|
396
|
-
"grid": true
|
|
397
|
-
}
|
|
398
|
-
},
|
|
399
|
-
"triggers": [{
|
|
400
|
-
"id": triggerSysId,
|
|
401
|
-
"type": this.getTriggerTypeId(flowDef.trigger_type),
|
|
402
|
-
"table": flowDef.table || '',
|
|
403
|
-
"condition": flowDef.trigger_condition || '',
|
|
404
|
-
"active": true
|
|
405
|
-
}],
|
|
406
|
-
"variables": {},
|
|
407
|
-
"inputs": {},
|
|
408
|
-
"outputs": {},
|
|
409
|
-
"label_cache": labelCache
|
|
410
|
-
};
|
|
411
|
-
}
|
|
412
|
-
/**
|
|
413
|
-
* Generate sys_hub_action_instance_v2 XML (CRITICAL: v2, not v1!)
|
|
414
|
-
*/
|
|
415
|
-
generateActionInstancesV2XML(activities, sysIds, updateSetSysId) {
|
|
416
|
-
return activities.map((activity, index) => {
|
|
417
|
-
const actionSysId = sysIds[index];
|
|
418
|
-
const uiId = (0, uuid_1.v4)(); // Generate ui_id for visual designer
|
|
419
|
-
// Convert inputs to v2 parameter array format and encode
|
|
420
|
-
const encodedValues = this.encodeActionParameters(activity.inputs);
|
|
421
|
-
// Use arrow notation for order (e.g., "2➛3")
|
|
422
|
-
const orderValue = index === 0 ? '1' : `${index}➛${index + 1}`;
|
|
423
|
-
return `
|
|
424
|
-
<!-- sys_hub_action_instance_v2: ${this.escapeXml(activity.name)} -->
|
|
425
|
-
<sys_update_xml action="INSERT_OR_UPDATE">
|
|
426
|
-
<sys_id>${this.generateSysId()}</sys_id>
|
|
427
|
-
<action>INSERT_OR_UPDATE</action>
|
|
428
|
-
<application display_value="Global">global</application>
|
|
429
|
-
<name>sys_hub_action_instance_v2_${actionSysId}</name>
|
|
430
|
-
<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="${this.getActionDisplayName(activity.type)}">${this.getActionTypeId(activity.type)}</action_type><action_type_parent/><attributes/><comment>${this.escapeXml(activity.description || '')}</comment><compiled_snapshot>${this.getActionTypeId(activity.type)}</compiled_snapshot><display_text/><flow display_value="${this.escapeXml(activity.name)}">${this.flowSysId}</flow><generation_source/><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>
|
|
431
|
-
<remote_update_set display_value="${this.escapeXml(this.updateSetName)}">${updateSetSysId}</remote_update_set>
|
|
432
|
-
<source_table>sys_hub_action_instance_v2</source_table>
|
|
433
|
-
<type>Flow Designer Action</type>
|
|
434
|
-
</sys_update_xml>`;
|
|
435
|
-
}).join('\n');
|
|
436
|
-
}
|
|
437
|
-
/**
|
|
438
|
-
* Generate sys_hub_flow_logic_instance_v2 XML for connections
|
|
439
|
-
*/
|
|
440
|
-
generateFlowLogicV2XML(triggerSysId, activitySysIds, updateSetSysId) {
|
|
441
|
-
const connections = [];
|
|
442
|
-
const endSysId = this.generateSysId();
|
|
443
|
-
// Trigger -> First Activity
|
|
444
|
-
if (activitySysIds.length > 0) {
|
|
445
|
-
connections.push(`
|
|
446
|
-
<!-- Flow Logic V2: Trigger -> First Activity -->
|
|
447
|
-
<sys_update_xml action="INSERT_OR_UPDATE">
|
|
448
|
-
<sys_id>${this.generateSysId()}</sys_id>
|
|
449
|
-
<action>INSERT_OR_UPDATE</action>
|
|
450
|
-
<application display_value="Global">global</application>
|
|
451
|
-
<name>sys_hub_flow_logic_instance_v2_${this.generateSysId()}</name>
|
|
452
|
-
<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/><connected_to/><decision_table/><display_text/><flow display_value="">${this.flowSysId}</flow><flow_variables_assigned/><generation_source/><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>${this.generateSysId()}</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>H4sIAAAAAAAA/6tWyi8tKSgtKQ7JdywuzkzPU7KKjtVRyswDiUHYZYlFmYlJOalQbkpqcmZxZn5eCEjME0ldSmVeYm5mMrJQeX5RdlpOfjlCrBYAD1ouqHEAAAA=</values><workflow_reference/></sys_hub_flow_logic_instance_v2></record_update>]]></payload>
|
|
453
|
-
<remote_update_set display_value="${this.escapeXml(this.updateSetName)}">${updateSetSysId}</remote_update_set>
|
|
454
|
-
<source_table>sys_hub_flow_logic_instance_v2</source_table>
|
|
455
|
-
<type>Flow Designer Logic</type>
|
|
456
|
-
</sys_update_xml>`);
|
|
457
|
-
}
|
|
458
|
-
// Add End logic node
|
|
459
|
-
connections.push(`
|
|
460
|
-
<!-- Flow Logic V2: End -->
|
|
461
|
-
<sys_update_xml action="INSERT_OR_UPDATE">
|
|
462
|
-
<sys_id>${this.generateSysId()}</sys_id>
|
|
463
|
-
<action>INSERT_OR_UPDATE</action>
|
|
464
|
-
<application display_value="Global">global</application>
|
|
465
|
-
<name>sys_hub_flow_logic_instance_v2_${endSysId}</name>
|
|
466
|
-
<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/><connected_to/><decision_table/><display_text/><flow display_value="">${this.flowSysId}</flow><flow_variables_assigned/><generation_source/><logic_definition display_value="End">d176605ea76103004f27b0d2187901c7</logic_definition><order>${(activitySysIds.length + 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>${endSysId}</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>H4sIAAAAAAAA/6tWyi8tKSgtKQ7JdywuzkzPU7KKjtVRyswDiUHYZYlFmYlJOalQbkpqcmZxZn5eCEjME0ldSmVeYm5mMrJQeX5RdlpOfjlCrBYAD1ouqHEAAAA=</values><workflow_reference/></sys_hub_flow_logic_instance_v2></record_update>]]></payload>
|
|
467
|
-
<remote_update_set display_value="${this.escapeXml(this.updateSetName)}">${updateSetSysId}</remote_update_set>
|
|
468
|
-
<source_table>sys_hub_flow_logic_instance_v2</source_table>
|
|
469
|
-
<type>Flow Designer Logic</type>
|
|
470
|
-
</sys_update_xml>`);
|
|
471
|
-
return connections.join('\n');
|
|
472
|
-
}
|
|
473
|
-
/**
|
|
474
|
-
* Generate sys_hub_flow_logic XML for connections (deprecated, kept for compatibility)
|
|
475
|
-
*/
|
|
476
|
-
generateFlowLogicXML(triggerSysId, activitySysIds, updateSetSysId) {
|
|
477
|
-
const connections = [];
|
|
478
|
-
// Trigger -> First Activity
|
|
479
|
-
if (activitySysIds.length > 0) {
|
|
480
|
-
connections.push(`
|
|
481
|
-
<!-- Flow Logic: Trigger -> First Activity -->
|
|
482
|
-
<sys_update_xml action="INSERT_OR_UPDATE">
|
|
483
|
-
<sys_id>${this.generateSysId()}</sys_id>
|
|
484
|
-
<action>INSERT_OR_UPDATE</action>
|
|
485
|
-
<application display_value="Global">global</application>
|
|
486
|
-
<name>sys_hub_flow_logic_${this.generateSysId()}</name>
|
|
487
|
-
<payload><![CDATA[<?xml version="1.0" encoding="UTF-8"?><record_update table="sys_hub_flow_logic"><sys_hub_flow_logic action="INSERT_OR_UPDATE"><connection_type>success</connection_type><flow display_value="">${this.flowSysId}</flow><from_element>${triggerSysId}</from_element><from_element_type>trigger</from_element_type><order>100</order><sys_class_name>sys_hub_flow_logic</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.generateSysId()}</sys_id><sys_mod_count>0</sys_mod_count><sys_updated_by>admin</sys_updated_by><sys_updated_on>${this.timestamp}</sys_updated_on><to_element>${activitySysIds[0]}</to_element><to_element_type>action</to_element_type></sys_hub_flow_logic></record_update>]]></payload>
|
|
488
|
-
<remote_update_set display_value="${this.escapeXml(this.updateSetName)}">${updateSetSysId}</remote_update_set>
|
|
489
|
-
<source_table>sys_hub_flow_logic</source_table>
|
|
490
|
-
<type>Flow Designer Logic</type>
|
|
491
|
-
</sys_update_xml>`);
|
|
492
|
-
}
|
|
493
|
-
// Activity -> Activity connections
|
|
494
|
-
for (let i = 0; i < activitySysIds.length - 1; i++) {
|
|
495
|
-
connections.push(`
|
|
496
|
-
<!-- Flow Logic: Activity ${i + 1} -> Activity ${i + 2} -->
|
|
497
|
-
<sys_update_xml action="INSERT_OR_UPDATE">
|
|
498
|
-
<sys_id>${this.generateSysId()}</sys_id>
|
|
499
|
-
<action>INSERT_OR_UPDATE</action>
|
|
500
|
-
<application display_value="Global">global</application>
|
|
501
|
-
<name>sys_hub_flow_logic_${this.generateSysId()}</name>
|
|
502
|
-
<payload><![CDATA[<?xml version="1.0" encoding="UTF-8"?><record_update table="sys_hub_flow_logic"><sys_hub_flow_logic action="INSERT_OR_UPDATE"><connection_type>success</connection_type><flow display_value="">${this.flowSysId}</flow><from_element>${activitySysIds[i]}</from_element><from_element_type>action</from_element_type><order>${200 + (i * 100)}</order><sys_class_name>sys_hub_flow_logic</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.generateSysId()}</sys_id><sys_mod_count>0</sys_mod_count><sys_updated_by>admin</sys_updated_by><sys_updated_on>${this.timestamp}</sys_updated_on><to_element>${activitySysIds[i + 1]}</to_element><to_element_type>action</to_element_type></sys_hub_flow_logic></record_update>]]></payload>
|
|
503
|
-
<remote_update_set display_value="${this.escapeXml(this.updateSetName)}">${updateSetSysId}</remote_update_set>
|
|
504
|
-
<source_table>sys_hub_flow_logic</source_table>
|
|
505
|
-
<type>Flow Designer Logic</type>
|
|
506
|
-
</sys_update_xml>`);
|
|
507
|
-
}
|
|
508
|
-
return connections.join('\n');
|
|
509
|
-
}
|
|
510
|
-
/**
|
|
511
|
-
* Get verified trigger type ID
|
|
512
|
-
*/
|
|
513
|
-
getTriggerTypeId(triggerType) {
|
|
514
|
-
return exports.VERIFIED_TRIGGER_TYPES[triggerType] || exports.VERIFIED_TRIGGER_TYPES['manual'];
|
|
515
|
-
}
|
|
516
|
-
/**
|
|
517
|
-
* Get verified action type ID
|
|
518
|
-
*/
|
|
519
|
-
getActionTypeId(actionType) {
|
|
520
|
-
return exports.VERIFIED_ACTION_TYPES[actionType] || exports.VERIFIED_ACTION_TYPES['script'];
|
|
521
|
-
}
|
|
522
|
-
/**
|
|
523
|
-
* Save XML to file with proper directory structure
|
|
524
|
-
*/
|
|
525
|
-
saveToFile(xml, filename) {
|
|
526
|
-
const outputDir = path.join(process.cwd(), 'flow-update-sets');
|
|
527
|
-
if (!fs.existsSync(outputDir)) {
|
|
528
|
-
fs.mkdirSync(outputDir, { recursive: true });
|
|
529
|
-
}
|
|
530
|
-
const outputFile = path.join(outputDir, filename || `improved_flow_${this.flowSysId}.xml`);
|
|
531
|
-
fs.writeFileSync(outputFile, xml, 'utf8');
|
|
532
|
-
return outputFile;
|
|
533
|
-
}
|
|
534
|
-
/**
|
|
535
|
-
* Create a comprehensive real-world example
|
|
536
|
-
*/
|
|
537
|
-
static createComprehensiveExample() {
|
|
538
|
-
return {
|
|
539
|
-
name: 'Advanced Equipment Request Workflow',
|
|
540
|
-
description: 'Complete equipment request workflow with approval, fulfillment, and notifications',
|
|
541
|
-
internal_name: 'advanced_equipment_request_workflow',
|
|
542
|
-
table: 'sc_request',
|
|
543
|
-
trigger_type: 'record_created',
|
|
544
|
-
trigger_condition: 'category=hardware^active=true^state=1',
|
|
545
|
-
run_as: 'user',
|
|
546
|
-
accessible_from: 'package_private',
|
|
547
|
-
category: 'workflow',
|
|
548
|
-
tags: ['equipment', 'approval', 'fulfillment', 'automation'],
|
|
549
|
-
activities: [
|
|
550
|
-
{
|
|
551
|
-
name: 'Validate Request Details',
|
|
552
|
-
type: 'script',
|
|
553
|
-
description: 'Validate and enrich request information',
|
|
554
|
-
inputs: {
|
|
555
|
-
script: `// Comprehensive request validation
|
|
556
|
-
var validation = {
|
|
557
|
-
valid: true,
|
|
558
|
-
errors: [],
|
|
559
|
-
warnings: [],
|
|
560
|
-
enrichment: {}
|
|
561
|
-
};
|
|
562
|
-
|
|
563
|
-
// Check required fields
|
|
564
|
-
if (!current.requested_for) {
|
|
565
|
-
validation.valid = false;
|
|
566
|
-
validation.errors.push('Requested for user is required');
|
|
567
|
-
}
|
|
568
|
-
|
|
569
|
-
// Validate business justification for high-value items
|
|
570
|
-
if (current.price && parseFloat(current.price) > 500) {
|
|
571
|
-
if (!current.business_justification || current.business_justification.length < 10) {
|
|
572
|
-
validation.valid = false;
|
|
573
|
-
validation.errors.push('Business justification required for items over $500');
|
|
574
|
-
}
|
|
575
|
-
}
|
|
576
|
-
|
|
577
|
-
// Enrich with additional data
|
|
578
|
-
if (current.requested_for) {
|
|
579
|
-
var userGR = new GlideRecord('sys_user');
|
|
580
|
-
if (userGR.get(current.requested_for)) {
|
|
581
|
-
validation.enrichment.user_department = userGR.department.getDisplayValue();
|
|
582
|
-
validation.enrichment.user_manager = userGR.manager.sys_id;
|
|
583
|
-
validation.enrichment.user_location = userGR.location.getDisplayValue();
|
|
584
|
-
}
|
|
585
|
-
}
|
|
586
|
-
|
|
587
|
-
// Determine approval requirements
|
|
588
|
-
validation.enrichment.requires_approval = false;
|
|
589
|
-
validation.enrichment.approval_level = 'none';
|
|
590
|
-
|
|
591
|
-
if (current.price) {
|
|
592
|
-
var price = parseFloat(current.price);
|
|
593
|
-
if (price > 1000) {
|
|
594
|
-
validation.enrichment.requires_approval = true;
|
|
595
|
-
validation.enrichment.approval_level = 'manager';
|
|
596
|
-
}
|
|
597
|
-
if (price > 5000) {
|
|
598
|
-
validation.enrichment.approval_level = 'director';
|
|
599
|
-
}
|
|
600
|
-
}
|
|
601
|
-
|
|
602
|
-
return validation;`,
|
|
603
|
-
timeout: 30
|
|
604
|
-
},
|
|
605
|
-
outputs: {
|
|
606
|
-
validation_result: 'object',
|
|
607
|
-
requires_approval: 'boolean',
|
|
608
|
-
approval_level: 'string',
|
|
609
|
-
user_department: 'string',
|
|
610
|
-
user_manager: 'string'
|
|
611
|
-
}
|
|
612
|
-
},
|
|
613
|
-
{
|
|
614
|
-
name: 'Manager Approval Required',
|
|
615
|
-
type: 'condition',
|
|
616
|
-
description: 'Check if manager approval is needed',
|
|
617
|
-
condition: '{{validate_request_details.requires_approval}} == true',
|
|
618
|
-
inputs: {
|
|
619
|
-
condition: '{{validate_request_details.requires_approval}} == true'
|
|
620
|
-
},
|
|
621
|
-
outputs: {
|
|
622
|
-
result: 'boolean'
|
|
623
|
-
}
|
|
624
|
-
},
|
|
625
|
-
{
|
|
626
|
-
name: 'Request Manager Approval',
|
|
627
|
-
type: 'approval',
|
|
628
|
-
description: 'Send approval request to user manager',
|
|
629
|
-
condition: '{{manager_approval_required.result}} == true',
|
|
630
|
-
inputs: {
|
|
631
|
-
table: 'sc_request',
|
|
632
|
-
record: '{{trigger.current.sys_id}}',
|
|
633
|
-
approver: '{{validate_request_details.user_manager}}',
|
|
634
|
-
approval_field: 'approval',
|
|
635
|
-
journal_field: 'work_notes',
|
|
636
|
-
message: `Equipment Request Approval Required
|
|
637
|
-
|
|
638
|
-
Request: {{trigger.current.number}}
|
|
639
|
-
User: {{trigger.current.requested_for.name}}
|
|
640
|
-
Department: {{validate_request_details.user_department}}
|
|
641
|
-
Item: {{trigger.current.cat_item.name}}
|
|
642
|
-
Price: \${{trigger.current.price}}
|
|
643
|
-
Justification: {{trigger.current.business_justification}}
|
|
644
|
-
|
|
645
|
-
Please review and approve or reject this request.`,
|
|
646
|
-
due_date: '72',
|
|
647
|
-
reminder: '24'
|
|
648
|
-
},
|
|
649
|
-
outputs: {
|
|
650
|
-
state: 'string',
|
|
651
|
-
approver_sys_id: 'string',
|
|
652
|
-
comments: 'string',
|
|
653
|
-
approved_date: 'string'
|
|
654
|
-
}
|
|
655
|
-
},
|
|
656
|
-
{
|
|
657
|
-
name: 'Check Approval Status',
|
|
658
|
-
type: 'condition',
|
|
659
|
-
description: 'Determine next steps based on approval',
|
|
660
|
-
condition: '{{request_manager_approval.state}} == "approved" || {{manager_approval_required.result}} == false',
|
|
661
|
-
inputs: {
|
|
662
|
-
condition: '{{request_manager_approval.state}} == "approved" || {{manager_approval_required.result}} == false'
|
|
663
|
-
},
|
|
664
|
-
outputs: {
|
|
665
|
-
proceed_to_fulfillment: 'boolean'
|
|
666
|
-
}
|
|
667
|
-
},
|
|
668
|
-
{
|
|
669
|
-
name: 'Create Fulfillment Task',
|
|
670
|
-
type: 'create_record',
|
|
671
|
-
description: 'Create detailed fulfillment task for IT team',
|
|
672
|
-
condition: '{{check_approval_status.proceed_to_fulfillment}} == true',
|
|
673
|
-
inputs: {
|
|
674
|
-
table: 'sc_task',
|
|
675
|
-
fields: [
|
|
676
|
-
{
|
|
677
|
-
field: 'short_description',
|
|
678
|
-
value: 'Fulfill Equipment Request: {{trigger.current.cat_item.name}} for {{trigger.current.requested_for.name}}'
|
|
679
|
-
},
|
|
680
|
-
{
|
|
681
|
-
field: 'description',
|
|
682
|
-
value: `Equipment Fulfillment Details:
|
|
683
|
-
|
|
684
|
-
Request Number: {{trigger.current.number}}
|
|
685
|
-
Requested For: {{trigger.current.requested_for.name}}
|
|
686
|
-
Department: {{validate_request_details.user_department}}
|
|
687
|
-
Location: {{validate_request_details.user_location}}
|
|
688
|
-
Item: {{trigger.current.cat_item.name}}
|
|
689
|
-
Specifications: {{trigger.current.cat_item.description}}
|
|
690
|
-
Price: \${{trigger.current.price}}
|
|
691
|
-
Approval Status: {{request_manager_approval.state}}
|
|
692
|
-
Approved By: {{request_manager_approval.approver_sys_id}}
|
|
693
|
-
Approval Comments: {{request_manager_approval.comments}}
|
|
694
|
-
|
|
695
|
-
Special Instructions:
|
|
696
|
-
- Verify user location before shipping
|
|
697
|
-
- Include all standard software packages
|
|
698
|
-
- Schedule setup appointment if required`
|
|
699
|
-
},
|
|
700
|
-
{ field: 'assignment_group', value: 'hardware_fulfillment' },
|
|
701
|
-
{ field: 'priority', value: '{{trigger.current.priority}}' },
|
|
702
|
-
{ field: 'request', value: '{{trigger.current.sys_id}}' },
|
|
703
|
-
{ field: 'requested_for', value: '{{trigger.current.requested_for}}' },
|
|
704
|
-
{ field: 'due_date', value: '+5 business days' },
|
|
705
|
-
{ field: 'work_notes', value: 'Auto-created from approved equipment request' }
|
|
706
|
-
]
|
|
707
|
-
},
|
|
708
|
-
outputs: {
|
|
709
|
-
task_sys_id: 'string',
|
|
710
|
-
task_number: 'string',
|
|
711
|
-
assigned_to: 'string'
|
|
712
|
-
}
|
|
713
|
-
},
|
|
714
|
-
{
|
|
715
|
-
name: 'Update Request Status',
|
|
716
|
-
type: 'update_record',
|
|
717
|
-
description: 'Update original request with fulfillment details',
|
|
718
|
-
condition: '{{create_fulfillment_task.task_sys_id}} != ""',
|
|
719
|
-
inputs: {
|
|
720
|
-
table: 'sc_request',
|
|
721
|
-
sys_id: '{{trigger.current.sys_id}}',
|
|
722
|
-
fields: [
|
|
723
|
-
{ field: 'state', value: '3' }, // Work in Progress
|
|
724
|
-
{ field: 'stage', value: 'fulfillment' },
|
|
725
|
-
{
|
|
726
|
-
field: 'work_notes',
|
|
727
|
-
value: 'Fulfillment task created: {{create_fulfillment_task.task_number}}. Request approved and assigned to hardware fulfillment team.'
|
|
728
|
-
}
|
|
729
|
-
]
|
|
730
|
-
},
|
|
731
|
-
outputs: {
|
|
732
|
-
updated: 'boolean',
|
|
733
|
-
new_state: 'string'
|
|
734
|
-
}
|
|
735
|
-
},
|
|
736
|
-
{
|
|
737
|
-
name: 'Send Approval Notification',
|
|
738
|
-
type: 'notification',
|
|
739
|
-
description: 'Notify requester of approval and next steps',
|
|
740
|
-
condition: '{{check_approval_status.proceed_to_fulfillment}} == true',
|
|
741
|
-
inputs: {
|
|
742
|
-
recipients: '{{trigger.current.requested_for}}',
|
|
743
|
-
cc: '{{trigger.current.opened_by}}',
|
|
744
|
-
subject: 'Equipment Request Approved - {{trigger.current.number}}',
|
|
745
|
-
message: `Good news! Your equipment request has been approved.
|
|
746
|
-
|
|
747
|
-
Request Details:
|
|
748
|
-
- Request Number: {{trigger.current.number}}
|
|
749
|
-
- Item: {{trigger.current.cat_item.name}}
|
|
750
|
-
- Status: Approved and in fulfillment
|
|
751
|
-
- Fulfillment Task: {{create_fulfillment_task.task_number}}
|
|
752
|
-
|
|
753
|
-
Next Steps:
|
|
754
|
-
The hardware fulfillment team will process your request within 5 business days. You will receive updates as your request progresses.
|
|
755
|
-
|
|
756
|
-
If you have any questions, please contact the IT Service Desk.
|
|
757
|
-
|
|
758
|
-
Thank you!
|
|
759
|
-
IT Service Management Team`,
|
|
760
|
-
notification_type: 'email'
|
|
761
|
-
},
|
|
762
|
-
outputs: {
|
|
763
|
-
sent: 'boolean',
|
|
764
|
-
notification_id: 'string'
|
|
765
|
-
}
|
|
766
|
-
}
|
|
767
|
-
]
|
|
768
|
-
};
|
|
769
|
-
}
|
|
770
|
-
}
|
|
771
|
-
exports.ImprovedFlowXMLGenerator = ImprovedFlowXMLGenerator;
|
|
772
|
-
/**
|
|
773
|
-
* Generate PRODUCTION-READY improved flow XML
|
|
774
|
-
*/
|
|
775
|
-
function generateImprovedFlowXML(flowDef) {
|
|
776
|
-
const generator = new ImprovedFlowXMLGenerator(flowDef.name.replace(/[^a-zA-Z0-9]+/g, '_') + '_Import_v2');
|
|
777
|
-
const xml = generator.generateCompleteFlowXML(flowDef);
|
|
778
|
-
const filename = flowDef.name.toLowerCase().replace(/[^a-z0-9]+/g, '_') + '_improved_flow.xml';
|
|
779
|
-
const filePath = generator.saveToFile(xml, filename);
|
|
780
|
-
const instructions = `
|
|
781
|
-
=== IMPROVED ServiceNow Flow Import Instructions ===
|
|
782
|
-
|
|
783
|
-
✅ This XML uses the IMPROVED generator with:
|
|
784
|
-
• sys_hub_action_instance_v2 and sys_hub_trigger_instance_v2 (correct table versions)
|
|
785
|
-
• Base64+gzip encoded action values (production format)
|
|
786
|
-
• Complete label_cache structure (critical for Flow Designer)
|
|
787
|
-
• ALL minimum required fields for sys_hub_flow
|
|
788
|
-
• Comprehensive flow snapshot with proper metadata
|
|
789
|
-
|
|
790
|
-
📁 Generated file: ${filePath}
|
|
791
|
-
|
|
792
|
-
🚀 Import Instructions:
|
|
793
|
-
|
|
794
|
-
1. Login to ServiceNow as admin user
|
|
795
|
-
|
|
796
|
-
2. Navigate: System Update Sets > Retrieved Update Sets
|
|
797
|
-
|
|
798
|
-
3. Click "Import Update Set from XML" (bottom of list)
|
|
799
|
-
|
|
800
|
-
4. Upload file: ${filePath}
|
|
801
|
-
|
|
802
|
-
5. Open imported Update Set → Preview → Commit
|
|
803
|
-
|
|
804
|
-
6. Verify in Flow Designer:
|
|
805
|
-
- All > Flow Designer > Designer
|
|
806
|
-
- Flow "${flowDef.name}" should be fully functional
|
|
807
|
-
|
|
808
|
-
🔍 What's Fixed in This Version:
|
|
809
|
-
✅ Correct table versions (v2 instead of v1)
|
|
810
|
-
✅ Proper action value encoding (Base64+gzip)
|
|
811
|
-
✅ Complete label_cache (critical for UI)
|
|
812
|
-
✅ All required sys_hub_flow fields
|
|
813
|
-
✅ Production-ready flow snapshot structure
|
|
814
|
-
✅ Verified action/trigger type sys_ids
|
|
815
|
-
|
|
816
|
-
This should resolve the "too small to work" issue!
|
|
817
|
-
`.trim();
|
|
818
|
-
return { xml, filePath, instructions };
|
|
819
|
-
}
|
|
820
|
-
exports.default = ImprovedFlowXMLGenerator;
|