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.
Files changed (302) hide show
  1. package/claude-flow.bat +0 -0
  2. package/claude-flow.ps1 +0 -0
  3. package/dist/mcp/intelligent-reporting-mcp.d.ts +7 -0
  4. package/dist/mcp/intelligent-reporting-mcp.js +379 -0
  5. package/dist/mcp/servicenow-automation-mcp.js +0 -0
  6. package/dist/mcp/servicenow-deployment-mcp.js +0 -0
  7. package/dist/mcp/servicenow-integration-mcp.js +0 -0
  8. package/dist/mcp/servicenow-mcp-server.js +0 -0
  9. package/dist/mcp/servicenow-operations-mcp.js +0 -0
  10. package/dist/mcp/servicenow-platform-development-mcp.js +0 -0
  11. package/dist/mcp/servicenow-progressive-indexer.js +0 -0
  12. package/dist/mcp/servicenow-reporting-analytics-mcp.js +280 -29
  13. package/dist/mcp/servicenow-security-compliance-mcp.js +0 -0
  14. package/dist/mcp/servicenow-update-set-mcp.js +0 -0
  15. package/dist/mcp/start-all-mcp-servers.js +0 -0
  16. package/dist/mcp/start-servicenow-mcp.js +0 -0
  17. package/dist/services/widget-deployment-service.d.ts +2 -1
  18. package/dist/services/widget-deployment-service.js +17 -16
  19. package/dist/utils/anti-mock-data-validator.d.ts +66 -0
  20. package/dist/utils/anti-mock-data-validator.js +316 -0
  21. package/dist/utils/servicenow-eventual-consistency.d.ts +120 -0
  22. package/dist/utils/servicenow-eventual-consistency.js +220 -0
  23. package/memory/agents/README.md +1 -1
  24. package/memory/claude-flow-data.json +1 -1
  25. package/memory/sessions/README.md +1 -1
  26. package/package.json +4 -3
  27. package/.mcp.json +0 -22
  28. package/claude-flow.config.json +0 -20
  29. package/dist/agents/app-creator.agent.d.ts +0 -55
  30. package/dist/agents/app-creator.agent.js +0 -1292
  31. package/dist/agents/base/base-snow-agent.d.ts +0 -75
  32. package/dist/agents/base/base-snow-agent.js +0 -169
  33. package/dist/agents/base-snow-agent.d.ts +0 -63
  34. package/dist/agents/base-snow-agent.js +0 -296
  35. package/dist/agents/coordinator.d.ts +0 -200
  36. package/dist/agents/coordinator.js +0 -777
  37. package/dist/agents/flow-builder-agent.d.ts +0 -18
  38. package/dist/agents/flow-builder-agent.js +0 -197
  39. package/dist/agents/queen-403-handler.d.ts +0 -47
  40. package/dist/agents/queen-403-handler.js +0 -175
  41. package/dist/agents/queen-agent-example.d.ts +0 -23
  42. package/dist/agents/queen-agent-example.js +0 -240
  43. package/dist/agents/queen-agent.test.d.ts +0 -6
  44. package/dist/agents/script-generator.agent.d.ts +0 -32
  45. package/dist/agents/script-generator.agent.js +0 -772
  46. package/dist/agents/script-writer-agent.d.ts +0 -22
  47. package/dist/agents/script-writer-agent.js +0 -695
  48. package/dist/agents/security-agent.d.ts +0 -23
  49. package/dist/agents/security-agent.js +0 -619
  50. package/dist/agents/specialists/automation-specialist.agent.d.ts +0 -44
  51. package/dist/agents/specialists/automation-specialist.agent.js +0 -204
  52. package/dist/agents/specialists/data-specialist.agent.d.ts +0 -165
  53. package/dist/agents/specialists/data-specialist.agent.js +0 -484
  54. package/dist/agents/specialists/integration-specialist.agent.d.ts +0 -227
  55. package/dist/agents/specialists/integration-specialist.agent.js +0 -725
  56. package/dist/agents/specialists/reporting-specialist.agent.d.ts +0 -54
  57. package/dist/agents/specialists/reporting-specialist.agent.js +0 -193
  58. package/dist/agents/specialists/security-specialist.agent.d.ts +0 -85
  59. package/dist/agents/specialists/security-specialist.agent.js +0 -309
  60. package/dist/agents/teams/adaptive/adaptive-coordinator.agent.d.ts +0 -111
  61. package/dist/agents/teams/adaptive/adaptive-coordinator.agent.js +0 -383
  62. package/dist/agents/teams/base-team.d.ts +0 -72
  63. package/dist/agents/teams/base-team.js +0 -253
  64. package/dist/agents/teams/team-types.d.ts +0 -265
  65. package/dist/agents/teams/team-types.js +0 -3
  66. package/dist/agents/teams/widget/widget-architect.agent.d.ts +0 -61
  67. package/dist/agents/teams/widget/widget-architect.agent.js +0 -436
  68. package/dist/agents/teams/widget/widget-backend.agent.d.ts +0 -74
  69. package/dist/agents/teams/widget/widget-backend.agent.js +0 -1531
  70. package/dist/agents/teams/widget/widget-frontend.agent.d.ts +0 -67
  71. package/dist/agents/teams/widget/widget-frontend.agent.js +0 -1014
  72. package/dist/agents/teams/widget/widget-platform.agent.d.ts +0 -90
  73. package/dist/agents/teams/widget/widget-platform.agent.js +0 -1190
  74. package/dist/agents/teams/widget/widget-uiux.agent.d.ts +0 -107
  75. package/dist/agents/teams/widget/widget-uiux.agent.js +0 -1033
  76. package/dist/agents/test-agent.d.ts +0 -26
  77. package/dist/agents/test-agent.js +0 -734
  78. package/dist/agents/test-agents.d.ts +0 -7
  79. package/dist/agents/test-agents.js +0 -64
  80. package/dist/agents/ui-builder.agent.d.ts +0 -50
  81. package/dist/agents/ui-builder.agent.js +0 -1539
  82. package/dist/agents/widget-builder.agent.d.ts +0 -32
  83. package/dist/agents/widget-builder.agent.js +0 -439
  84. package/dist/agents/widget-creator-agent.d.ts +0 -18
  85. package/dist/agents/widget-creator-agent.js +0 -498
  86. package/dist/agents/workflow-designer.agent.d.ts +0 -31
  87. package/dist/agents/workflow-designer.agent.js +0 -583
  88. package/dist/api/error-handling.d.ts +0 -325
  89. package/dist/api/error-handling.js +0 -1488
  90. package/dist/api/flow-designer-api.d.ts +0 -167
  91. package/dist/api/flow-designer-api.js +0 -554
  92. package/dist/api/natural-language-mapper.d.ts +0 -124
  93. package/dist/api/natural-language-mapper.js +0 -501
  94. package/dist/api/performance-optimizer.d.ts +0 -240
  95. package/dist/api/performance-optimizer.js +0 -706
  96. package/dist/api/transaction-manager.d.ts +0 -189
  97. package/dist/api/transaction-manager.js +0 -576
  98. package/dist/assembly/team-assembler.d.ts +0 -140
  99. package/dist/assembly/team-assembler.js +0 -502
  100. package/dist/benchmark-performance.d.ts +0 -41
  101. package/dist/benchmark-performance.js +0 -230
  102. package/dist/cli/snow-flow-cli-integration.d.ts +0 -30
  103. package/dist/cli/snow-flow-cli-integration.js +0 -396
  104. package/dist/coordination/coordination-engine.d.ts +0 -41
  105. package/dist/coordination/coordination-engine.js +0 -324
  106. package/dist/coordination/coordination.test.d.ts +0 -6
  107. package/dist/coordination/example.d.ts +0 -31
  108. package/dist/coordination/example.js +0 -394
  109. package/dist/coordination/execution-patterns.d.ts +0 -43
  110. package/dist/coordination/execution-patterns.js +0 -507
  111. package/dist/coordination/factory.d.ts +0 -94
  112. package/dist/coordination/factory.js +0 -433
  113. package/dist/coordination/index.d.ts +0 -71
  114. package/dist/coordination/index.js +0 -135
  115. package/dist/coordination/progress-monitor.d.ts +0 -71
  116. package/dist/coordination/progress-monitor.js +0 -505
  117. package/dist/coordination/quality-gates.d.ts +0 -124
  118. package/dist/coordination/quality-gates.js +0 -577
  119. package/dist/coordination/shared-memory.d.ts +0 -39
  120. package/dist/coordination/shared-memory.js +0 -289
  121. package/dist/coordination/task-dependencies.d.ts +0 -50
  122. package/dist/coordination/task-dependencies.js +0 -407
  123. package/dist/coordination/team-coordinator.d.ts +0 -59
  124. package/dist/coordination/team-coordinator.js +0 -550
  125. package/dist/coordination/types.d.ts +0 -152
  126. package/dist/coordination/types.js +0 -3
  127. package/dist/mcp/mcp-wrapper.d.ts +0 -8
  128. package/dist/mcp/mcp-wrapper.js +0 -77
  129. package/dist/mcp/servicenow-flow-composer-enhanced.js +0 -396
  130. package/dist/mcp/servicenow-flow-composer-mcp.d.ts +0 -7
  131. package/dist/mcp/servicenow-flow-composer-mcp.js +0 -3103
  132. package/dist/mcp/servicenow-graph-memory-mcp.d.ts +0 -7
  133. package/dist/mcp/servicenow-intelligent-mcp.d.ts +0 -143
  134. package/dist/mcp/servicenow-intelligent-mcp.js +0 -4156
  135. package/dist/mcp/servicenow-xml-flow-mcp.d.ts +0 -53
  136. package/dist/mcp/servicenow-xml-flow-mcp.js +0 -1704
  137. package/dist/mcp/singleton-check.js +0 -31
  138. package/dist/mcp/test-simple-mcp.d.ts +0 -6
  139. package/dist/mcp/test-simple-mcp.js +0 -63
  140. package/dist/memory/hierarchical-memory-system.d.ts +0 -90
  141. package/dist/memory/hierarchical-memory-system.js +0 -400
  142. package/dist/memory/index.d.ts +0 -9
  143. package/dist/memory/index.js +0 -20
  144. package/dist/memory/mcp-integration-example.d.ts +0 -6
  145. package/dist/memory/mcp-integration-example.js +0 -281
  146. package/dist/memory/memory-client.d.ts +0 -199
  147. package/dist/memory/memory-client.js +0 -364
  148. package/dist/memory/memory-manager.d.ts +0 -29
  149. package/dist/memory/memory-manager.js +0 -280
  150. package/dist/memory/memory-operations.d.ts +0 -179
  151. package/dist/memory/memory-operations.js +0 -691
  152. package/dist/memory/memory-system.d.ts +0 -153
  153. package/dist/memory/memory-system.js +0 -651
  154. package/dist/memory/memory-test.d.ts +0 -6
  155. package/dist/memory/memory-test.js +0 -161
  156. package/dist/memory/snow-flow-memory-patterns.d.ts +0 -213
  157. package/dist/memory/snow-flow-memory-patterns.js +0 -200
  158. package/dist/memory/snow-memory.d.ts +0 -54
  159. package/dist/memory/snow-memory.js +0 -301
  160. package/dist/memory/swarm-memory.d.ts +0 -135
  161. package/dist/memory/swarm-memory.js +0 -378
  162. package/dist/optimization/flow-performance-optimizer.js +0 -723
  163. package/dist/orchestration/discovery/service-discovery.d.ts +0 -81
  164. package/dist/orchestration/discovery/service-discovery.js +0 -808
  165. package/dist/orchestration/distributed-orchestrator.d.ts +0 -131
  166. package/dist/orchestration/distributed-orchestrator.js +0 -712
  167. package/dist/orchestration/distribution/task-distribution-engine.d.ts +0 -53
  168. package/dist/orchestration/distribution/task-distribution-engine.js +0 -586
  169. package/dist/orchestration/flow-update-orchestrator.js +0 -648
  170. package/dist/orchestration/interfaces/distributed-orchestration.interface.d.ts +0 -606
  171. package/dist/orchestration/interfaces/distributed-orchestration.interface.js +0 -65
  172. package/dist/orchestration/protocols/mcpx-protocol.d.ts +0 -71
  173. package/dist/orchestration/protocols/mcpx-protocol.js +0 -668
  174. package/dist/orchestration/state/distributed-state-manager.d.ts +0 -89
  175. package/dist/orchestration/state/distributed-state-manager.js +0 -716
  176. package/dist/orchestrator/flow-composer.d.ts +0 -105
  177. package/dist/orchestrator/flow-composer.js +0 -404
  178. package/dist/orchestrator/flow-pattern-templates.d.ts +0 -260
  179. package/dist/orchestrator/flow-pattern-templates.js +0 -908
  180. package/dist/orchestrator/flow-subflow-decision-engine.d.ts +0 -202
  181. package/dist/orchestrator/flow-subflow-decision-engine.js +0 -769
  182. package/dist/orchestrator/flow-validation-engine.d.ts +0 -169
  183. package/dist/orchestrator/flow-validation-engine.js +0 -913
  184. package/dist/orchestrator/snow-orchestrator.d.ts +0 -49
  185. package/dist/orchestrator/snow-orchestrator.js +0 -235
  186. package/dist/orchestrator/subflow-creation-handler.d.ts +0 -230
  187. package/dist/orchestrator/subflow-creation-handler.js +0 -791
  188. package/dist/patterns/adaptive-patterns.d.ts +0 -140
  189. package/dist/patterns/adaptive-patterns.js +0 -549
  190. package/dist/queen/advanced-integration-test.d.ts +0 -48
  191. package/dist/queen/advanced-integration-test.js +0 -473
  192. package/dist/queen/integration-example.d.ts +0 -82
  193. package/dist/queen/integration-example.js +0 -219
  194. package/dist/queen/integration-test.d.ts +0 -72
  195. package/dist/queen/integration-test.js +0 -563
  196. package/dist/queen/mock-mcp-client.d.ts +0 -71
  197. package/dist/queen/mock-mcp-client.js +0 -317
  198. package/dist/queen/run-integration-tests.d.ts +0 -9
  199. package/dist/queen/run-integration-tests.js +0 -27
  200. package/dist/sparc/coordinators/adaptive-coordinator.d.ts +0 -54
  201. package/dist/sparc/coordinators/adaptive-coordinator.js +0 -367
  202. package/dist/sparc/coordinators/team-coordinator.d.ts +0 -66
  203. package/dist/sparc/coordinators/team-coordinator.js +0 -402
  204. package/dist/sparc/modes/team-modes.d.ts +0 -33
  205. package/dist/sparc/modes/team-modes.js +0 -399
  206. package/dist/sparc/teams/application-team.d.ts +0 -73
  207. package/dist/sparc/teams/application-team.js +0 -463
  208. package/dist/sparc/teams/flow-team.d.ts +0 -67
  209. package/dist/sparc/teams/flow-team.js +0 -373
  210. package/dist/sparc/teams/widget-team.d.ts +0 -61
  211. package/dist/sparc/teams/widget-team.js +0 -280
  212. package/dist/specialists/app-specialists.d.ts +0 -93
  213. package/dist/specialists/app-specialists.js +0 -1639
  214. package/dist/specialists/base-specialist.d.ts +0 -19
  215. package/dist/specialists/base-specialist.js +0 -54
  216. package/dist/specialists/flow-specialists.d.ts +0 -113
  217. package/dist/specialists/flow-specialists.js +0 -1787
  218. package/dist/specialists/individual-specialists.d.ts +0 -67
  219. package/dist/specialists/individual-specialists.js +0 -632
  220. package/dist/specialists/widget-specialists.d.ts +0 -70
  221. package/dist/specialists/widget-specialists.js +0 -1264
  222. package/dist/src/utils/agent-detector.js +0 -655
  223. package/dist/teams/adaptive-team.d.ts +0 -81
  224. package/dist/teams/adaptive-team.js +0 -1153
  225. package/dist/teams/application-team.d.ts +0 -30
  226. package/dist/teams/application-team.js +0 -547
  227. package/dist/teams/base-team.d.ts +0 -55
  228. package/dist/teams/base-team.js +0 -243
  229. package/dist/teams/flow-team.d.ts +0 -28
  230. package/dist/teams/flow-team.js +0 -525
  231. package/dist/teams/widget-team.d.ts +0 -26
  232. package/dist/teams/widget-team.js +0 -459
  233. package/dist/templates/flow-template-system.js +0 -625
  234. package/dist/test-fetch-incidents.d.ts +0 -2
  235. package/dist/test-fetch-incidents.js +0 -84
  236. package/dist/test-incident-access.d.ts +0 -2
  237. package/dist/test-incident-access.js +0 -72
  238. package/dist/test-iphone-flow.js +0 -189
  239. package/dist/test-limit-problem.d.ts +0 -2
  240. package/dist/test-limit-problem.js +0 -60
  241. package/dist/test-ml-batch-fix.d.ts +0 -2
  242. package/dist/test-ml-batch-fix.js +0 -104
  243. package/dist/test-ml-batch.d.ts +0 -2
  244. package/dist/test-ml-batch.js +0 -87
  245. package/dist/test-ml-query.d.ts +0 -2
  246. package/dist/test-ml-query.js +0 -100
  247. package/dist/test-ml-training-fix.d.ts +0 -12
  248. package/dist/test-ml-training-fix.js +0 -113
  249. package/dist/test-ml-training.d.ts +0 -2
  250. package/dist/test-ml-training.js +0 -32
  251. package/dist/test-operations-query.d.ts +0 -2
  252. package/dist/test-operations-query.js +0 -84
  253. package/dist/test-performance-query.d.ts +0 -2
  254. package/dist/test-performance-query.js +0 -52
  255. package/dist/test-singleton-protection.d.ts +0 -8
  256. package/dist/test-singleton-protection.js +0 -110
  257. package/dist/test-smart-limits.d.ts +0 -13
  258. package/dist/test-smart-limits.js +0 -100
  259. package/dist/test-snow-query-incidents.d.ts +0 -2
  260. package/dist/test-snow-query-incidents.js +0 -66
  261. package/dist/test-universal-query.d.ts +0 -2
  262. package/dist/test-universal-query.js +0 -106
  263. package/dist/testing/flow-testing-automation.js +0 -641
  264. package/dist/utils/complete-flow-xml-generator.js +0 -1285
  265. package/dist/utils/file-storage-fallback.d.ts +0 -62
  266. package/dist/utils/file-storage-fallback.js +0 -289
  267. package/dist/utils/flow-api-discovery.d.ts +0 -151
  268. package/dist/utils/flow-api-discovery.js +0 -439
  269. package/dist/utils/flow-examples.js +0 -720
  270. package/dist/utils/flow-structure-builder.js +0 -677
  271. package/dist/utils/flow-xml-generator.d.ts +0 -41
  272. package/dist/utils/flow-xml-generator.js +0 -258
  273. package/dist/utils/improved-flow-xml-generator.js +0 -820
  274. package/dist/utils/mcp-process-manager.backup.d.ts +0 -58
  275. package/dist/utils/mcp-process-manager.backup.js +0 -220
  276. package/dist/utils/mcp-singleton-enforcer.d.ts +0 -36
  277. package/dist/utils/mcp-singleton-enforcer.js +0 -201
  278. package/dist/utils/mcp-timeout-fix.d.ts +0 -53
  279. package/dist/utils/mcp-timeout-fix.js +0 -221
  280. package/dist/utils/migrate-claude-flow.d.ts +0 -22
  281. package/dist/utils/migrate-claude-flow.js +0 -120
  282. package/dist/utils/scope-utils.d.ts +0 -72
  283. package/dist/utils/scope-utils.js +0 -386
  284. package/dist/utils/snow-oauth-old.d.ts +0 -65
  285. package/dist/utils/snow-oauth-old.js +0 -345
  286. package/dist/utils/xml-first-flow-generator.js +0 -513
  287. package/memory/servicenow_artifacts/000d9224c895221055906c7518aa2d3d.json +0 -30
  288. package/memory/servicenow_artifacts/0196b66173303010e46b4a2214f6a7a2.json +0 -36
  289. package/memory/servicenow_artifacts/125e5d1d837e2a102a7ea130ceaad397.json +0 -30
  290. package/memory/servicenow_artifacts/7637c1f2b7112210a5e5911cde11a972.json +0 -30
  291. package/memory/servicenow_artifacts/default_documentation_tables_1754056582292.json +0 -55
  292. package/memory/servicenow_artifacts/default_documentation_tables_1754057477189.json +0 -55
  293. package/memory/update-set-sessions/01f82af583faea102a7ea130ceaad3d4.json +0 -9
  294. package/memory/update-set-sessions/27718fb983faea102a7ea130ceaad34b.json +0 -9
  295. package/memory/update-set-sessions/412e9bf6833e22502a7ea130ceaad30a.json +0 -8
  296. package/memory/update-set-sessions/66fc5a79837aea102a7ea130ceaad3ab.json +0 -9
  297. package/memory/update-set-sessions/71a30ff5837eea102a7ea130ceaad37f.json +0 -9
  298. package/memory/update-set-sessions/74fba27983faea102a7ea130ceaad3bd.json +0 -9
  299. package/memory/update-set-sessions/a0b147b5837eea102a7ea130ceaad344.json +0 -58
  300. package/memory/update-set-sessions/b13f5eb983baea102a7ea130ceaad33e.json +0 -9
  301. package/reports/swarm-auto-centralized-1752649029776.json +0 -13
  302. 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, '&amp;')
114
- .replace(/</g, '&lt;')
115
- .replace(/>/g, '&gt;')
116
- .replace(/"/g, '&quot;')
117
- .replace(/'/g, '&apos;');
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;