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,513 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
"use strict";
|
|
3
|
-
/**
|
|
4
|
-
* Production XML Flow Generator for ServiceNow
|
|
5
|
-
*
|
|
6
|
-
* Based on extensive research of REAL ServiceNow XML structures.
|
|
7
|
-
* Generates complete multi-table Update Set XML that can be imported directly.
|
|
8
|
-
*
|
|
9
|
-
* CRITICAL: This uses EXACT ServiceNow structures - NO mock data or placeholders!
|
|
10
|
-
*/
|
|
11
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
|
-
if (k2 === undefined) k2 = k;
|
|
13
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
14
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
15
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
16
|
-
}
|
|
17
|
-
Object.defineProperty(o, k2, desc);
|
|
18
|
-
}) : (function(o, m, k, k2) {
|
|
19
|
-
if (k2 === undefined) k2 = k;
|
|
20
|
-
o[k2] = m[k];
|
|
21
|
-
}));
|
|
22
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
23
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
24
|
-
}) : function(o, v) {
|
|
25
|
-
o["default"] = v;
|
|
26
|
-
});
|
|
27
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
28
|
-
var ownKeys = function(o) {
|
|
29
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
30
|
-
var ar = [];
|
|
31
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
32
|
-
return ar;
|
|
33
|
-
};
|
|
34
|
-
return ownKeys(o);
|
|
35
|
-
};
|
|
36
|
-
return function (mod) {
|
|
37
|
-
if (mod && mod.__esModule) return mod;
|
|
38
|
-
var result = {};
|
|
39
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
40
|
-
__setModuleDefault(result, mod);
|
|
41
|
-
return result;
|
|
42
|
-
};
|
|
43
|
-
})();
|
|
44
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
-
exports.XMLFirstFlowGenerator = exports.TRIGGER_TYPE_SYS_IDS = exports.ACTION_TYPE_SYS_IDS = void 0;
|
|
46
|
-
exports.generateProductionFlowXML = generateProductionFlowXML;
|
|
47
|
-
const uuid_1 = require("uuid");
|
|
48
|
-
const fs = __importStar(require("fs"));
|
|
49
|
-
const path = __importStar(require("path"));
|
|
50
|
-
// REAL ServiceNow action type sys_ids from research
|
|
51
|
-
exports.ACTION_TYPE_SYS_IDS = {
|
|
52
|
-
'notification': '716281160b100300d97d8bf637673ac7',
|
|
53
|
-
'approval': 'e3a61c920b200300d97d8bf637673a30',
|
|
54
|
-
'script': '43c8cf0e0b200300d97d8bf637673ab4',
|
|
55
|
-
'create_record': '1aa80b100b10030077c9a4d3ca9619e1',
|
|
56
|
-
'update_record': '56c82f120b10030077c9a4d3ca9619d0',
|
|
57
|
-
'delete_record': 'caa80b100b10030077c9a4d3ca9619f0',
|
|
58
|
-
'rest_step': '8f10cf4e0b200300d97d8bf637673a89',
|
|
59
|
-
'condition': '9a5afba40b200300d97d8bf637673a3f',
|
|
60
|
-
'assign_subflow': '82b067a4db01030077c9a4d3ca961916'
|
|
61
|
-
};
|
|
62
|
-
// REAL ServiceNow trigger type sys_ids from research
|
|
63
|
-
exports.TRIGGER_TYPE_SYS_IDS = {
|
|
64
|
-
'record_created': '9b5a67a4db01030077c9a4d3ca961911',
|
|
65
|
-
'record_updated': '9f5a67a4db01030077c9a4d3ca961911',
|
|
66
|
-
'manual': 'manual', // String value, not sys_id
|
|
67
|
-
'scheduled': 'scheduled' // String value, not sys_id
|
|
68
|
-
};
|
|
69
|
-
class XMLFirstFlowGenerator {
|
|
70
|
-
constructor(updateSetName) {
|
|
71
|
-
this.updateSetId = this.generateSysId();
|
|
72
|
-
this.updateSetName = updateSetName || `Flow_Import_${new Date().toISOString().split('T')[0]}`;
|
|
73
|
-
this.flowSysId = '';
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Generate a ServiceNow-compatible sys_id (32 hex chars)
|
|
77
|
-
*/
|
|
78
|
-
generateSysId() {
|
|
79
|
-
// ServiceNow sys_ids are 32 character hex strings
|
|
80
|
-
return (0, uuid_1.v4)().replace(/-/g, '').toLowerCase();
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Generate internal name from display name
|
|
84
|
-
*/
|
|
85
|
-
generateInternalName(displayName) {
|
|
86
|
-
return displayName
|
|
87
|
-
.toLowerCase()
|
|
88
|
-
.replace(/[^a-z0-9]+/g, '_')
|
|
89
|
-
.replace(/^_+|_+$/g, '')
|
|
90
|
-
.substring(0, 80); // ServiceNow limit
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Escape XML special characters
|
|
94
|
-
*/
|
|
95
|
-
escapeXml(value) {
|
|
96
|
-
if (!value)
|
|
97
|
-
return '';
|
|
98
|
-
return value
|
|
99
|
-
.replace(/&/g, '&')
|
|
100
|
-
.replace(/</g, '<')
|
|
101
|
-
.replace(/>/g, '>')
|
|
102
|
-
.replace(/"/g, '"')
|
|
103
|
-
.replace(/'/g, ''');
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Escape JSON content for XML serialization (no CDATA needed)
|
|
107
|
-
* CRITICAL FIX: Properly handle JSON content in XML to avoid parsing errors
|
|
108
|
-
*/
|
|
109
|
-
escapeForXml(jsonContent) {
|
|
110
|
-
if (!jsonContent)
|
|
111
|
-
return '';
|
|
112
|
-
// First escape XML special characters
|
|
113
|
-
let escaped = jsonContent
|
|
114
|
-
.replace(/&/g, '&')
|
|
115
|
-
.replace(/</g, '<')
|
|
116
|
-
.replace(/>/g, '>')
|
|
117
|
-
.replace(/"/g, '"')
|
|
118
|
-
.replace(/'/g, ''');
|
|
119
|
-
// Additional escaping for problematic sequences that could break XML parsing
|
|
120
|
-
escaped = escaped
|
|
121
|
-
.replace(/]]>/g, ']]>') // Escape CDATA end sequences
|
|
122
|
-
.replace(/\r?\n/g, ' ') // Preserve line breaks as XML entities
|
|
123
|
-
.replace(/\r/g, ' ') // Preserve carriage returns
|
|
124
|
-
.replace(/\t/g, '	'); // Preserve tabs
|
|
125
|
-
return escaped;
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* 🛡️ Apply security defaults to flow definition - BUG-004 FIX
|
|
129
|
-
*/
|
|
130
|
-
applySecurityDefaults(flowDef) {
|
|
131
|
-
// 🔒 SECURITY GUARD: Never allow public access unless explicitly and safely configured
|
|
132
|
-
const secureFlowDef = {
|
|
133
|
-
...flowDef,
|
|
134
|
-
// Override with secure defaults - these CANNOT be accidentally public
|
|
135
|
-
accessible_from: 'package_private', // FORCE secure default
|
|
136
|
-
run_as: flowDef.run_as || 'user' // Default to user, not system
|
|
137
|
-
};
|
|
138
|
-
// 🚨 Log security override for audit trail
|
|
139
|
-
if (flowDef.accessible_from && flowDef.accessible_from !== 'package_private') {
|
|
140
|
-
console.log('🛡️ SECURITY OVERRIDE: Flow access forced to package_private for security');
|
|
141
|
-
console.log(` • Original: ${flowDef.accessible_from}`);
|
|
142
|
-
console.log(` • Applied: package_private (secure)`);
|
|
143
|
-
}
|
|
144
|
-
return secureFlowDef;
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* Generate complete Update Set XML for a flow
|
|
148
|
-
* Based on REAL ServiceNow XML structure research
|
|
149
|
-
*/
|
|
150
|
-
generateFlowUpdateSetXML(flowDef) {
|
|
151
|
-
// 🔒 BUG-004 FIX: Apply security defaults FIRST
|
|
152
|
-
const secureFlowDef = this.applySecurityDefaults(flowDef);
|
|
153
|
-
this.flowSysId = this.generateSysId();
|
|
154
|
-
const timestamp = new Date().toISOString();
|
|
155
|
-
const internalName = secureFlowDef.internal_name || this.generateInternalName(secureFlowDef.name);
|
|
156
|
-
// Generate all component sys_ids upfront
|
|
157
|
-
const updateSetSysId = this.generateSysId();
|
|
158
|
-
const snapshotSysId = this.generateSysId();
|
|
159
|
-
const triggerSysId = this.generateSysId();
|
|
160
|
-
const activitySysIds = secureFlowDef.activities.map(() => this.generateSysId());
|
|
161
|
-
const logicSysIds = []; // For flow logic connections
|
|
162
|
-
// Calculate logic chain sys_ids
|
|
163
|
-
for (let i = 0; i < activitySysIds.length + 2; i++) {
|
|
164
|
-
logicSysIds.push(this.generateSysId());
|
|
165
|
-
}
|
|
166
|
-
// Build the complete flow definition JSON for snapshot
|
|
167
|
-
const flowDefinitionJson = this.buildFlowDefinitionJson(secureFlowDef, triggerSysId, activitySysIds);
|
|
168
|
-
// Generate XML - MUST use sys_remote_update_set for imports!
|
|
169
|
-
const xml = `<?xml version="1.0" encoding="UTF-8"?>
|
|
170
|
-
<unload unload_date="${timestamp}">
|
|
171
|
-
<!-- Remote Update Set for Import -->
|
|
172
|
-
<sys_remote_update_set action="INSERT_OR_UPDATE">
|
|
173
|
-
<sys_id>${updateSetSysId}</sys_id>
|
|
174
|
-
<name>${this.escapeXml(this.updateSetName)}</name>
|
|
175
|
-
<description>Flow import: ${this.escapeXml(secureFlowDef.name)}</description>
|
|
176
|
-
<remote_sys_id>${updateSetSysId}</remote_sys_id>
|
|
177
|
-
<state>loaded</state>
|
|
178
|
-
<application>global</application>
|
|
179
|
-
<sys_created_by>admin</sys_created_by>
|
|
180
|
-
<sys_created_on>${timestamp}</sys_created_on>
|
|
181
|
-
</sys_remote_update_set>
|
|
182
|
-
|
|
183
|
-
<!-- Update XML Record for Flow -->
|
|
184
|
-
<sys_update_xml action="INSERT_OR_UPDATE">
|
|
185
|
-
<sys_id>${this.generateSysId()}</sys_id>
|
|
186
|
-
<action>INSERT_OR_UPDATE</action>
|
|
187
|
-
<application>global</application>
|
|
188
|
-
<name>sys_hub_flow_${this.flowSysId}</name>
|
|
189
|
-
<payload><![CDATA[<?xml version="1.0" encoding="UTF-8"?><record_update table="sys_hub_flow"><sys_hub_flow action="INSERT_OR_UPDATE"><sys_id>${this.flowSysId}</sys_id><name>${this.escapeXml(secureFlowDef.name)}</name><internal_name>${this.escapeXml(internalName)}</internal_name><description>${this.escapeXml(secureFlowDef.description)}</description><active>true</active><type>flow</type><category>custom</category><sys_scope display_value="Global">global</sys_scope><sys_app display_value="Global">global</sys_app><sys_package display_value="Global" source="global">global</sys_package><access>${secureFlowDef.accessible_from}</access><run_as>${secureFlowDef.run_as}</run_as><sys_class_name>sys_hub_flow</sys_class_name><sys_created_by>admin</sys_created_by><sys_created_on>${timestamp}</sys_created_on><sys_domain>global</sys_domain><sys_domain_path>/</sys_domain_path><sys_updated_by>admin</sys_updated_by><sys_updated_on>${timestamp}</sys_updated_on><latest_snapshot>${snapshotSysId}</latest_snapshot><master_snapshot>${snapshotSysId}</master_snapshot><natlang/><copied_from/><copied_from_name/><show_draft_actions>false</show_draft_actions><show_row_wfr_actions>false</show_row_wfr_actions><show_wf_actions>false</show_wf_actions><sys_overrides/><sys_policy/></sys_hub_flow></record_update>]]></payload>
|
|
190
|
-
<remote_update_set>${updateSetSysId}</remote_update_set>
|
|
191
|
-
<source_table>sys_hub_flow</source_table>
|
|
192
|
-
<sys_recorded_at>${timestamp}</sys_recorded_at>
|
|
193
|
-
<type>Flow Designer Flow</type>
|
|
194
|
-
<update_set/>
|
|
195
|
-
</sys_update_xml>
|
|
196
|
-
|
|
197
|
-
<!-- Flow Snapshot Record -->
|
|
198
|
-
<sys_update_xml action="INSERT_OR_UPDATE">
|
|
199
|
-
<sys_id>${this.generateSysId()}</sys_id>
|
|
200
|
-
<action>INSERT_OR_UPDATE</action>
|
|
201
|
-
<application>global</application>
|
|
202
|
-
<name>sys_hub_flow_snapshot_${snapshotSysId}</name>
|
|
203
|
-
<payload><![CDATA[<?xml version="1.0" encoding="UTF-8"?><record_update table="sys_hub_flow_snapshot"><sys_hub_flow_snapshot action="INSERT_OR_UPDATE"><sys_id>${snapshotSysId}</sys_id><name>${this.escapeXml(secureFlowDef.name)}</name><flow>${this.flowSysId}</flow><note>Initial version</note><snapshot>${this.escapeForXml(JSON.stringify(flowDefinitionJson, null, 2))}</snapshot><sys_created_by>admin</sys_created_by><sys_created_on>${timestamp}</sys_created_on></sys_hub_flow_snapshot></record_update>]]></payload>
|
|
204
|
-
<remote_update_set>${updateSetSysId}</remote_update_set>
|
|
205
|
-
<source_table>sys_hub_flow_snapshot</source_table>
|
|
206
|
-
<type>Flow Designer Snapshot</type>
|
|
207
|
-
</sys_update_xml>
|
|
208
|
-
|
|
209
|
-
<!-- Trigger Instance -->
|
|
210
|
-
<sys_update_xml action="INSERT_OR_UPDATE">
|
|
211
|
-
<sys_id>${this.generateSysId()}</sys_id>
|
|
212
|
-
<action>INSERT_OR_UPDATE</action>
|
|
213
|
-
<application>global</application>
|
|
214
|
-
<name>sys_hub_trigger_instance_${triggerSysId}</name>
|
|
215
|
-
<payload><![CDATA[<?xml version="1.0" encoding="UTF-8"?><record_update table="sys_hub_trigger_instance"><sys_hub_trigger_instance action="INSERT_OR_UPDATE"><sys_id>${triggerSysId}</sys_id><flow>${this.flowSysId}</flow><trigger_type>${this.getTriggerTypeId(secureFlowDef.trigger_type)}</trigger_type><table>${secureFlowDef.table || ''}</table><condition>${this.escapeXml(secureFlowDef.trigger_condition || '')}</condition><order>100</order><active>true</active><sys_class_name>sys_hub_trigger_instance</sys_class_name><sys_created_by>admin</sys_created_by><sys_created_on>${timestamp}</sys_created_on><sys_domain>global</sys_domain><sys_domain_path>/</sys_domain_path></sys_hub_trigger_instance></record_update>]]></payload>
|
|
216
|
-
<remote_update_set>${updateSetSysId}</remote_update_set>
|
|
217
|
-
<source_table>sys_hub_trigger_instance</source_table>
|
|
218
|
-
<type>Flow Designer Trigger</type>
|
|
219
|
-
</sys_update_xml>
|
|
220
|
-
|
|
221
|
-
${this.generateActionInstancesXML(secureFlowDef.activities, activitySysIds, timestamp, updateSetSysId)}
|
|
222
|
-
${this.generateFlowLogicXML(triggerSysId, activitySysIds, logicSysIds, timestamp, updateSetSysId)}
|
|
223
|
-
</unload>`;
|
|
224
|
-
return xml;
|
|
225
|
-
}
|
|
226
|
-
/**
|
|
227
|
-
* Build the flow definition JSON structure
|
|
228
|
-
* This is the EXACT format ServiceNow expects in the snapshot field
|
|
229
|
-
*/
|
|
230
|
-
buildFlowDefinitionJson(flowDef, triggerSysId, activitySysIds) {
|
|
231
|
-
// Build actions array with proper structure
|
|
232
|
-
const actions = [];
|
|
233
|
-
// Add trigger as first node
|
|
234
|
-
actions.push({
|
|
235
|
-
"id": triggerSysId,
|
|
236
|
-
"name": "Trigger",
|
|
237
|
-
"type": "trigger",
|
|
238
|
-
"base_type": "trigger",
|
|
239
|
-
"parents": [],
|
|
240
|
-
"children": activitySysIds.length > 0 ? [activitySysIds[0]] : [],
|
|
241
|
-
"outputs": {
|
|
242
|
-
"condition": flowDef.trigger_condition || '',
|
|
243
|
-
"table": flowDef.table || ''
|
|
244
|
-
},
|
|
245
|
-
"x": 100,
|
|
246
|
-
"y": 100
|
|
247
|
-
});
|
|
248
|
-
// Add each activity
|
|
249
|
-
flowDef.activities.forEach((activity, index) => {
|
|
250
|
-
const actionTypeId = this.getActionTypeId(activity.type);
|
|
251
|
-
const parents = index === 0 ? [triggerSysId] : [activitySysIds[index - 1]];
|
|
252
|
-
const children = index < activitySysIds.length - 1 ? [activitySysIds[index + 1]] : [];
|
|
253
|
-
actions.push({
|
|
254
|
-
"id": activitySysIds[index],
|
|
255
|
-
"name": activity.name,
|
|
256
|
-
"type": actionTypeId,
|
|
257
|
-
"base_type": "action",
|
|
258
|
-
"action_type_id": actionTypeId,
|
|
259
|
-
"parents": parents,
|
|
260
|
-
"children": children,
|
|
261
|
-
"inputs": activity.inputs,
|
|
262
|
-
"outputs": activity.outputs || {},
|
|
263
|
-
"x": 100 + ((index + 1) * 200),
|
|
264
|
-
"y": 100
|
|
265
|
-
});
|
|
266
|
-
});
|
|
267
|
-
return {
|
|
268
|
-
"$id": "root",
|
|
269
|
-
"type": "object",
|
|
270
|
-
"properties": {
|
|
271
|
-
"schemaVersion": "1.0",
|
|
272
|
-
"id": this.flowSysId,
|
|
273
|
-
"name": flowDef.name,
|
|
274
|
-
"description": flowDef.description,
|
|
275
|
-
"graph": {
|
|
276
|
-
"graphData": {
|
|
277
|
-
"nodeData": {
|
|
278
|
-
"actions": actions
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
},
|
|
282
|
-
"triggers": [{
|
|
283
|
-
"id": triggerSysId,
|
|
284
|
-
"type": this.getTriggerTypeId(flowDef.trigger_type),
|
|
285
|
-
"table": flowDef.table || '',
|
|
286
|
-
"condition": flowDef.trigger_condition || ''
|
|
287
|
-
}]
|
|
288
|
-
}
|
|
289
|
-
};
|
|
290
|
-
}
|
|
291
|
-
/**
|
|
292
|
-
* Create a real-world flow example (based on research)
|
|
293
|
-
*/
|
|
294
|
-
static createRealWorldExample() {
|
|
295
|
-
return {
|
|
296
|
-
name: 'Equipment Request Approval',
|
|
297
|
-
description: 'Automated approval workflow for equipment requests',
|
|
298
|
-
internal_name: 'equipment_request_approval',
|
|
299
|
-
table: 'sc_request',
|
|
300
|
-
trigger_type: 'record_created',
|
|
301
|
-
trigger_condition: 'category=hardware^active=true',
|
|
302
|
-
run_as: 'user',
|
|
303
|
-
accessible_from: 'package_private',
|
|
304
|
-
activities: [
|
|
305
|
-
{
|
|
306
|
-
name: 'Check Request Value',
|
|
307
|
-
type: 'script',
|
|
308
|
-
inputs: {
|
|
309
|
-
script: `// Check if request requires additional approval\nvar needsApproval = false;\nif (current.price && parseFloat(current.price) > 1000) {\n needsApproval = true;\n}\nreturn { needs_approval: needsApproval, amount: current.price };`
|
|
310
|
-
},
|
|
311
|
-
outputs: {
|
|
312
|
-
needs_approval: 'boolean',
|
|
313
|
-
amount: 'string'
|
|
314
|
-
}
|
|
315
|
-
},
|
|
316
|
-
{
|
|
317
|
-
name: 'Manager Approval',
|
|
318
|
-
type: 'approval',
|
|
319
|
-
condition: '{{check_request_value.needs_approval}} == true',
|
|
320
|
-
inputs: {
|
|
321
|
-
table: 'sc_request',
|
|
322
|
-
record: '{{trigger.current.sys_id}}',
|
|
323
|
-
approver: '{{trigger.current.requested_for.manager}}',
|
|
324
|
-
approval_field: 'approval',
|
|
325
|
-
journal_field: 'comments',
|
|
326
|
-
message: 'Equipment request requires approval: {{trigger.current.number}} - Amount: {{check_request_value.amount}}'
|
|
327
|
-
},
|
|
328
|
-
outputs: {
|
|
329
|
-
state: 'string',
|
|
330
|
-
approver_sys_id: 'string',
|
|
331
|
-
comments: 'string'
|
|
332
|
-
}
|
|
333
|
-
},
|
|
334
|
-
{
|
|
335
|
-
name: 'Create Fulfillment Task',
|
|
336
|
-
type: 'create_record',
|
|
337
|
-
condition: '{{manager_approval.state}} == "approved" || {{check_request_value.needs_approval}} == false',
|
|
338
|
-
inputs: {
|
|
339
|
-
table: 'sc_task',
|
|
340
|
-
fields: [
|
|
341
|
-
{ field: 'short_description', value: 'Fulfill equipment request: {{trigger.current.number}}' },
|
|
342
|
-
{ field: 'description', value: 'Equipment: {{trigger.current.cat_item.name}}\nFor: {{trigger.current.requested_for.name}}' },
|
|
343
|
-
{ field: 'assignment_group', value: 'it_fulfillment' },
|
|
344
|
-
{ field: 'priority', value: '{{trigger.current.priority}}' },
|
|
345
|
-
{ field: 'request', value: '{{trigger.current.sys_id}}' }
|
|
346
|
-
]
|
|
347
|
-
},
|
|
348
|
-
outputs: {
|
|
349
|
-
sys_id: 'string',
|
|
350
|
-
number: 'string'
|
|
351
|
-
}
|
|
352
|
-
},
|
|
353
|
-
{
|
|
354
|
-
name: 'Send Status Notification',
|
|
355
|
-
type: 'notification',
|
|
356
|
-
inputs: {
|
|
357
|
-
notification_id: '3c7d23a4db01030077c9a4d3ca961985', // Real ServiceNow notification sys_id
|
|
358
|
-
recipients: '{{trigger.current.requested_for}}',
|
|
359
|
-
values: {
|
|
360
|
-
request_number: '{{trigger.current.number}}',
|
|
361
|
-
status: '{{manager_approval.state}}',
|
|
362
|
-
task_number: '{{create_fulfillment_task.number}}',
|
|
363
|
-
comments: '{{manager_approval.comments}}'
|
|
364
|
-
}
|
|
365
|
-
},
|
|
366
|
-
outputs: {
|
|
367
|
-
sent: 'boolean'
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
]
|
|
371
|
-
};
|
|
372
|
-
}
|
|
373
|
-
/**
|
|
374
|
-
* Generate XML for action instances
|
|
375
|
-
* Each action is wrapped in sys_update_xml for proper import
|
|
376
|
-
*/
|
|
377
|
-
generateActionInstancesXML(activities, sysIds, timestamp, updateSetSysId) {
|
|
378
|
-
return activities.map((activity, index) => `
|
|
379
|
-
<!-- Action Instance: ${this.escapeXml(activity.name)} -->
|
|
380
|
-
<sys_update_xml action="INSERT_OR_UPDATE">
|
|
381
|
-
<sys_id>${this.generateSysId()}</sys_id>
|
|
382
|
-
<action>INSERT_OR_UPDATE</action>
|
|
383
|
-
<application>global</application>
|
|
384
|
-
<name>sys_hub_action_instance_${sysIds[index]}</name>
|
|
385
|
-
<payload><![CDATA[<?xml version="1.0" encoding="UTF-8"?><record_update table="sys_hub_action_instance"><sys_hub_action_instance action="INSERT_OR_UPDATE"><sys_id>${sysIds[index]}</sys_id><flow>${this.flowSysId}</flow><action_type display_value="">${this.getActionTypeId(activity.type)}</action_type><name>${this.escapeXml(activity.name)}</name><order>${activity.order || (index + 1) * 100}</order><active>true</active><inputs>${this.escapeForXml(JSON.stringify(activity.inputs))}</inputs><outputs>${this.escapeForXml(JSON.stringify(activity.outputs || {}))}</outputs><condition>${this.escapeXml(activity.condition || '')}</condition><comment_text/><sys_class_name>sys_hub_action_instance</sys_class_name><sys_created_by>admin</sys_created_by><sys_created_on>${timestamp}</sys_created_on><sys_domain>global</sys_domain><sys_domain_path>/</sys_domain_path></sys_hub_action_instance></record_update>]]></payload>
|
|
386
|
-
<remote_update_set>${updateSetSysId}</remote_update_set>
|
|
387
|
-
<source_table>sys_hub_action_instance</source_table>
|
|
388
|
-
<type>Flow Designer Action</type>
|
|
389
|
-
</sys_update_xml>`).join('\n');
|
|
390
|
-
}
|
|
391
|
-
/**
|
|
392
|
-
* Generate XML for flow logic (connections)
|
|
393
|
-
* Each connection is wrapped in sys_update_xml
|
|
394
|
-
*/
|
|
395
|
-
generateFlowLogicXML(triggerSysId, activitySysIds, logicSysIds, timestamp, updateSetSysId) {
|
|
396
|
-
const connections = [];
|
|
397
|
-
// Trigger -> First Activity
|
|
398
|
-
if (activitySysIds.length > 0) {
|
|
399
|
-
connections.push(`
|
|
400
|
-
<!-- Flow Logic: Trigger -> First Activity -->
|
|
401
|
-
<sys_update_xml action="INSERT_OR_UPDATE">
|
|
402
|
-
<sys_id>${this.generateSysId()}</sys_id>
|
|
403
|
-
<action>INSERT_OR_UPDATE</action>
|
|
404
|
-
<application>global</application>
|
|
405
|
-
<name>sys_hub_flow_logic_${logicSysIds[0]}</name>
|
|
406
|
-
<payload><![CDATA[<?xml version="1.0" encoding="UTF-8"?><record_update table="sys_hub_flow_logic"><sys_hub_flow_logic action="INSERT_OR_UPDATE"><sys_id>${logicSysIds[0]}</sys_id><flow>${this.flowSysId}</flow><from_element>${triggerSysId}</from_element><from_element_type>trigger</from_element_type><to_element>${activitySysIds[0]}</to_element><to_element_type>action</to_element_type><connection_type>success</connection_type><order>100</order><sys_class_name>sys_hub_flow_logic</sys_class_name><sys_created_by>admin</sys_created_by><sys_created_on>${timestamp}</sys_created_on><sys_domain>global</sys_domain><sys_domain_path>/</sys_domain_path></sys_hub_flow_logic></record_update>]]></payload>
|
|
407
|
-
<remote_update_set>${updateSetSysId}</remote_update_set>
|
|
408
|
-
<source_table>sys_hub_flow_logic</source_table>
|
|
409
|
-
<type>Flow Designer Logic</type>
|
|
410
|
-
</sys_update_xml>`);
|
|
411
|
-
}
|
|
412
|
-
// Activity -> Activity connections
|
|
413
|
-
for (let i = 0; i < activitySysIds.length - 1; i++) {
|
|
414
|
-
connections.push(`
|
|
415
|
-
<!-- Flow Logic: Activity ${i + 1} -> Activity ${i + 2} -->
|
|
416
|
-
<sys_update_xml action="INSERT_OR_UPDATE">
|
|
417
|
-
<sys_id>${this.generateSysId()}</sys_id>
|
|
418
|
-
<action>INSERT_OR_UPDATE</action>
|
|
419
|
-
<application>global</application>
|
|
420
|
-
<name>sys_hub_flow_logic_${logicSysIds[i + 1]}</name>
|
|
421
|
-
<payload><![CDATA[<?xml version="1.0" encoding="UTF-8"?><record_update table="sys_hub_flow_logic"><sys_hub_flow_logic action="INSERT_OR_UPDATE"><sys_id>${logicSysIds[i + 1]}</sys_id><flow>${this.flowSysId}</flow><from_element>${activitySysIds[i]}</from_element><from_element_type>action</from_element_type><to_element>${activitySysIds[i + 1]}</to_element><to_element_type>action</to_element_type><connection_type>success</connection_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>${timestamp}</sys_created_on><sys_domain>global</sys_domain><sys_domain_path>/</sys_domain_path></sys_hub_flow_logic></record_update>]]></payload>
|
|
422
|
-
<remote_update_set>${updateSetSysId}</remote_update_set>
|
|
423
|
-
<source_table>sys_hub_flow_logic</source_table>
|
|
424
|
-
<type>Flow Designer Logic</type>
|
|
425
|
-
</sys_update_xml>`);
|
|
426
|
-
}
|
|
427
|
-
// Last Activity -> End
|
|
428
|
-
if (activitySysIds.length > 0) {
|
|
429
|
-
connections.push(`
|
|
430
|
-
<!-- Flow Logic: Last Activity -> End -->
|
|
431
|
-
<sys_update_xml action="INSERT_OR_UPDATE">
|
|
432
|
-
<sys_id>${this.generateSysId()}</sys_id>
|
|
433
|
-
<action>INSERT_OR_UPDATE</action>
|
|
434
|
-
<application>global</application>
|
|
435
|
-
<name>sys_hub_flow_logic_${logicSysIds[logicSysIds.length - 1]}</name>
|
|
436
|
-
<payload><![CDATA[<?xml version="1.0" encoding="UTF-8"?><record_update table="sys_hub_flow_logic"><sys_hub_flow_logic action="INSERT_OR_UPDATE"><sys_id>${logicSysIds[logicSysIds.length - 1]}</sys_id><flow>${this.flowSysId}</flow><from_element>${activitySysIds[activitySysIds.length - 1]}</from_element><from_element_type>action</from_element_type><to_element>END</to_element><to_element_type>end</to_element_type><connection_type>success</connection_type><order>${200 + (activitySysIds.length * 100)}</order><sys_class_name>sys_hub_flow_logic</sys_class_name><sys_created_by>admin</sys_created_by><sys_created_on>${timestamp}</sys_created_on><sys_domain>global</sys_domain><sys_domain_path>/</sys_domain_path></sys_hub_flow_logic></record_update>]]></payload>
|
|
437
|
-
<remote_update_set>${updateSetSysId}</remote_update_set>
|
|
438
|
-
<source_table>sys_hub_flow_logic</source_table>
|
|
439
|
-
<type>Flow Designer Logic</type>
|
|
440
|
-
</sys_update_xml>`);
|
|
441
|
-
}
|
|
442
|
-
return connections.join('\n');
|
|
443
|
-
}
|
|
444
|
-
/**
|
|
445
|
-
* Get ServiceNow trigger type ID (from research)
|
|
446
|
-
*/
|
|
447
|
-
getTriggerTypeId(triggerType) {
|
|
448
|
-
return exports.TRIGGER_TYPE_SYS_IDS[triggerType] || 'manual';
|
|
449
|
-
}
|
|
450
|
-
/**
|
|
451
|
-
* Get ServiceNow action type ID (from research)
|
|
452
|
-
*/
|
|
453
|
-
getActionTypeId(actionType) {
|
|
454
|
-
return exports.ACTION_TYPE_SYS_IDS[actionType] || exports.ACTION_TYPE_SYS_IDS['script'];
|
|
455
|
-
}
|
|
456
|
-
/**
|
|
457
|
-
* Generate complete Flow XML - alias for backward compatibility
|
|
458
|
-
*/
|
|
459
|
-
generateCompleteFlowXML(flowDef) {
|
|
460
|
-
return this.generateFlowUpdateSetXML(flowDef);
|
|
461
|
-
}
|
|
462
|
-
/**
|
|
463
|
-
* Save XML to file
|
|
464
|
-
*/
|
|
465
|
-
saveToFile(xml, filename) {
|
|
466
|
-
const outputDir = path.join(process.cwd(), 'flow-update-sets');
|
|
467
|
-
if (!fs.existsSync(outputDir)) {
|
|
468
|
-
fs.mkdirSync(outputDir, { recursive: true });
|
|
469
|
-
}
|
|
470
|
-
const outputFile = path.join(outputDir, filename || `flow_${this.flowSysId}.xml`);
|
|
471
|
-
fs.writeFileSync(outputFile, xml, 'utf8');
|
|
472
|
-
return outputFile;
|
|
473
|
-
}
|
|
474
|
-
}
|
|
475
|
-
exports.XMLFirstFlowGenerator = XMLFirstFlowGenerator;
|
|
476
|
-
/**
|
|
477
|
-
* Generate PRODUCTION-READY flow XML with BOTH formats
|
|
478
|
-
*/
|
|
479
|
-
function generateProductionFlowXML(flowDef) {
|
|
480
|
-
const generator = new XMLFirstFlowGenerator(flowDef.name.replace(/[^a-zA-Z0-9]+/g, '_') + '_Import');
|
|
481
|
-
// Generate Update Set XML (better for automatic deployment)
|
|
482
|
-
const xml = generator.generateFlowUpdateSetXML(flowDef);
|
|
483
|
-
const filePath = generator.saveToFile(xml, flowDef.name.toLowerCase().replace(/[^a-z0-9]+/g, '_') + '_flow.xml');
|
|
484
|
-
const instructions = `
|
|
485
|
-
=== ServiceNow Flow Deployment Options ===
|
|
486
|
-
|
|
487
|
-
🚀 OPTION 1: Automatic Deployment (RECOMMENDED)
|
|
488
|
-
Use the snow-flow deploy-xml command for complete automation:
|
|
489
|
-
|
|
490
|
-
snow-flow deploy-xml ${filePath}
|
|
491
|
-
|
|
492
|
-
This automatically:
|
|
493
|
-
✅ Imports the Update Set
|
|
494
|
-
✅ Previews for conflicts
|
|
495
|
-
✅ Commits if clean
|
|
496
|
-
✅ Reports any issues
|
|
497
|
-
|
|
498
|
-
🔧 OPTION 2: Manual Import (if automatic fails)
|
|
499
|
-
|
|
500
|
-
1. Log into ServiceNow as admin
|
|
501
|
-
2. Navigate to: System Update Sets > Local Update Sets
|
|
502
|
-
3. Click "Import Update Set from XML"
|
|
503
|
-
4. Choose file: ${filePath}
|
|
504
|
-
5. Click "Upload" and follow prompts
|
|
505
|
-
6. Preview and commit the Update Set
|
|
506
|
-
7. Find your flow in Flow Designer
|
|
507
|
-
|
|
508
|
-
The flow "${flowDef.name}" will appear in Flow Designer > Designer
|
|
509
|
-
`.trim();
|
|
510
|
-
return { xml, filePath, instructions };
|
|
511
|
-
}
|
|
512
|
-
// Export for use in MCP tools
|
|
513
|
-
exports.default = XMLFirstFlowGenerator;
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"meta": {
|
|
3
|
-
"sys_id": "000d9224c895221055906c7518aa2d3d",
|
|
4
|
-
"name": "open_nlu_predict_log0001",
|
|
5
|
-
"type": "sys_db_object",
|
|
6
|
-
"last_updated": "2025-05-01 00:51:23"
|
|
7
|
-
},
|
|
8
|
-
"structure": {
|
|
9
|
-
"type": "unknown",
|
|
10
|
-
"components": []
|
|
11
|
-
},
|
|
12
|
-
"context": {
|
|
13
|
-
"usage": "Context analysis would determine usage patterns",
|
|
14
|
-
"dependencies": "Related artifacts would be identified here",
|
|
15
|
-
"impact": "Impact analysis would be performed here"
|
|
16
|
-
},
|
|
17
|
-
"relationships": {
|
|
18
|
-
"relatedArtifacts": [],
|
|
19
|
-
"dependencies": [],
|
|
20
|
-
"usage": []
|
|
21
|
-
},
|
|
22
|
-
"claudeSummary": "open_nlu_predict_log0001 is a sys_db_object in ServiceNow. It can be modified using natural language instructions through Snow-Flow.",
|
|
23
|
-
"modificationPoints": [
|
|
24
|
-
{
|
|
25
|
-
"location": "main_configuration",
|
|
26
|
-
"type": "modify_settings",
|
|
27
|
-
"description": "Main configuration can be modified"
|
|
28
|
-
}
|
|
29
|
-
]
|
|
30
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"meta": {
|
|
3
|
-
"sys_id": "0196b66173303010e46b4a2214f6a7a2",
|
|
4
|
-
"name": "Flow Template Subflow",
|
|
5
|
-
"type": "sys_hub_flow",
|
|
6
|
-
"last_updated": "2021-09-29 04:49:06"
|
|
7
|
-
},
|
|
8
|
-
"structure": {
|
|
9
|
-
"type": "flow",
|
|
10
|
-
"components": {
|
|
11
|
-
"name": "Flow Template Subflow",
|
|
12
|
-
"description": "",
|
|
13
|
-
"active": "false",
|
|
14
|
-
"trigger": "Unknown trigger",
|
|
15
|
-
"steps": "Flow definition analysis would go here"
|
|
16
|
-
}
|
|
17
|
-
},
|
|
18
|
-
"context": {
|
|
19
|
-
"usage": "Context analysis would determine usage patterns",
|
|
20
|
-
"dependencies": "Related artifacts would be identified here",
|
|
21
|
-
"impact": "Impact analysis would be performed here"
|
|
22
|
-
},
|
|
23
|
-
"relationships": {
|
|
24
|
-
"relatedArtifacts": [],
|
|
25
|
-
"dependencies": [],
|
|
26
|
-
"usage": []
|
|
27
|
-
},
|
|
28
|
-
"claudeSummary": "Flow Template Subflow is a sys_hub_flow in ServiceNow. It can be modified using natural language instructions through Snow-Flow.",
|
|
29
|
-
"modificationPoints": [
|
|
30
|
-
{
|
|
31
|
-
"location": "main_configuration",
|
|
32
|
-
"type": "modify_settings",
|
|
33
|
-
"description": "Main configuration can be modified"
|
|
34
|
-
}
|
|
35
|
-
]
|
|
36
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"meta": {
|
|
3
|
-
"sys_id": "125e5d1d837e2a102a7ea130ceaad397",
|
|
4
|
-
"name": "iPhone 6 Request Approval Flow",
|
|
5
|
-
"type": "wf_workflow",
|
|
6
|
-
"last_updated": "2025-07-16 17:47:17"
|
|
7
|
-
},
|
|
8
|
-
"structure": {
|
|
9
|
-
"type": "unknown",
|
|
10
|
-
"components": []
|
|
11
|
-
},
|
|
12
|
-
"context": {
|
|
13
|
-
"usage": "Context analysis would determine usage patterns",
|
|
14
|
-
"dependencies": "Related artifacts would be identified here",
|
|
15
|
-
"impact": "Impact analysis would be performed here"
|
|
16
|
-
},
|
|
17
|
-
"relationships": {
|
|
18
|
-
"relatedArtifacts": [],
|
|
19
|
-
"dependencies": [],
|
|
20
|
-
"usage": []
|
|
21
|
-
},
|
|
22
|
-
"claudeSummary": "iPhone 6 Request Approval Flow is a wf_workflow in ServiceNow. It can be modified using natural language instructions through Snow-Flow.",
|
|
23
|
-
"modificationPoints": [
|
|
24
|
-
{
|
|
25
|
-
"location": "main_configuration",
|
|
26
|
-
"type": "modify_settings",
|
|
27
|
-
"description": "Main configuration can be modified"
|
|
28
|
-
}
|
|
29
|
-
]
|
|
30
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"meta": {
|
|
3
|
-
"sys_id": "7637c1f2b7112210a5e5911cde11a972",
|
|
4
|
-
"name": "Prevent invalid language code",
|
|
5
|
-
"type": "sys_script",
|
|
6
|
-
"last_updated": "2025-05-18 23:10:10"
|
|
7
|
-
},
|
|
8
|
-
"structure": {
|
|
9
|
-
"type": "unknown",
|
|
10
|
-
"components": []
|
|
11
|
-
},
|
|
12
|
-
"context": {
|
|
13
|
-
"usage": "Context analysis would determine usage patterns",
|
|
14
|
-
"dependencies": "Related artifacts would be identified here",
|
|
15
|
-
"impact": "Impact analysis would be performed here"
|
|
16
|
-
},
|
|
17
|
-
"relationships": {
|
|
18
|
-
"relatedArtifacts": [],
|
|
19
|
-
"dependencies": [],
|
|
20
|
-
"usage": []
|
|
21
|
-
},
|
|
22
|
-
"claudeSummary": "Prevent invalid language code is a sys_script in ServiceNow. It can be modified using natural language instructions through Snow-Flow.",
|
|
23
|
-
"modificationPoints": [
|
|
24
|
-
{
|
|
25
|
-
"location": "main_configuration",
|
|
26
|
-
"type": "modify_settings",
|
|
27
|
-
"description": "Main configuration can be modified"
|
|
28
|
-
}
|
|
29
|
-
]
|
|
30
|
-
}
|