snow-flow 1.3.0 → 1.3.2
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/queen/queen-memory.db +0 -0
- package/.env.example +249 -14
- package/CLAUDE.md +185 -24
- package/README.md +55 -5
- package/dist/api/error-handling.js +898 -4
- package/dist/api/performance-optimizer.js +3 -2
- package/dist/cli.js +590 -200
- package/dist/config/snow-flow-config.js +320 -8
- package/dist/health/system-health.js +288 -21
- package/dist/mcp/base-mcp-server.js +2 -0
- package/dist/mcp/http-transport-wrapper.js +65 -4
- package/dist/mcp/servicenow-automation-mcp-refactored.js +90 -9
- package/dist/mcp/servicenow-deployment-mcp-refactored.js +151 -2
- package/dist/mcp/servicenow-deployment-mcp.js +828 -15
- package/dist/mcp/servicenow-integration-mcp-refactored.js +100 -9
- package/dist/mcp/servicenow-intelligent-mcp.js +198 -7
- package/dist/mcp/servicenow-memory-mcp.js +2 -1
- package/dist/mcp/servicenow-operations-mcp-refactored.js +3 -2
- package/dist/mcp/servicenow-xml-flow-mcp.js +671 -0
- package/dist/mcp/shared/base-mcp-server.js +1356 -8
- package/dist/mcp/shared/mcp-resource-manager.js +304 -0
- package/dist/queen/parallel-agent-engine.js +26 -8
- package/dist/queen/servicenow-queen.js +47 -44
- package/dist/sparc/sparc-help.js +37 -26
- package/dist/sparc/team-sparc.js +60 -16
- package/dist/utils/action-type-cache.js +2 -1
- package/dist/utils/mcp-config-manager.js +7 -3
- package/dist/utils/mcp-server-manager.js +7 -3
- package/dist/utils/servicenow-client.js +134 -107
- package/dist/utils/servicenow-id-generator.js +171 -0
- package/dist/utils/snow-oauth.js +13 -8
- package/dist/utils/widget-template-generator.js +1690 -0
- package/dist/utils/xml-first-flow-generator.js +473 -0
- package/dist/version.js +7 -1
- package/flow-update-sets/flow_build_automated_approval_flow_with_notifications_flow.xml +203 -0
- package/flow-update-sets/flow_create_approval_flow_for_equipment_requests_flow.xml +206 -0
- package/flow-update-sets/flow_create_equipment_approval_flow_with_manager_approv_flow.xml +254 -0
- package/flow-update-sets/iphone_15_pro_approval_flow.xml +203 -0
- package/flow-update-sets/test_iphone_approval_flow_flow.xml +303 -0
- package/package.json +2 -1
- package/test-config.js +55 -0
- package/test-real-monitoring.js +184 -0
|
@@ -450,15 +450,106 @@ class ServiceNowIntegrationMCP extends base_mcp_server_js_1.BaseMCPServer {
|
|
|
450
450
|
async handleSnowTestIntegration(args) {
|
|
451
451
|
const startTime = Date.now();
|
|
452
452
|
try {
|
|
453
|
-
|
|
454
|
-
//
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
453
|
+
const { endpointName, testData } = args;
|
|
454
|
+
// First, try to find the REST message endpoint
|
|
455
|
+
let endpoint = null;
|
|
456
|
+
let endpointType = 'unknown';
|
|
457
|
+
try {
|
|
458
|
+
const restMessageResponse = await this.client.get(`/api/now/table/sys_rest_message?sysparm_query=name=${encodeURIComponent(endpointName)}`);
|
|
459
|
+
if (restMessageResponse.result && restMessageResponse.result.length > 0) {
|
|
460
|
+
endpoint = restMessageResponse.result[0];
|
|
461
|
+
endpointType = 'rest_message';
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
catch (error) {
|
|
465
|
+
this.logger.debug('REST message not found, trying other types', { endpointName });
|
|
466
|
+
}
|
|
467
|
+
// If not found as REST message, try web service
|
|
468
|
+
if (!endpoint) {
|
|
469
|
+
try {
|
|
470
|
+
const webServiceResponse = await this.client.get(`/api/now/table/sys_web_service?sysparm_query=name=${encodeURIComponent(endpointName)}`);
|
|
471
|
+
if (webServiceResponse.result && webServiceResponse.result.length > 0) {
|
|
472
|
+
endpoint = webServiceResponse.result[0];
|
|
473
|
+
endpointType = 'web_service';
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
catch (error) {
|
|
477
|
+
this.logger.debug('Web service not found', { endpointName });
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
if (!endpoint) {
|
|
481
|
+
return {
|
|
482
|
+
success: false,
|
|
483
|
+
error: `Integration endpoint '${endpointName}' not found. Searched REST messages and web services.`,
|
|
484
|
+
executionTime: Date.now() - startTime
|
|
485
|
+
};
|
|
486
|
+
}
|
|
487
|
+
// Perform actual test based on endpoint type
|
|
488
|
+
const testStartTime = Date.now();
|
|
489
|
+
let testResult;
|
|
490
|
+
if (endpointType === 'rest_message') {
|
|
491
|
+
// Test REST message endpoint
|
|
492
|
+
try {
|
|
493
|
+
// Get REST message methods
|
|
494
|
+
const methodsResponse = await this.client.get(`/api/now/table/sys_rest_message_fn?sysparm_query=rest_message=${endpoint.sys_id}`);
|
|
495
|
+
const methods = methodsResponse.result || [];
|
|
496
|
+
if (methods.length === 0) {
|
|
497
|
+
testResult = {
|
|
498
|
+
endpoint: endpointName,
|
|
499
|
+
status: 'error',
|
|
500
|
+
response_time: Date.now() - testStartTime,
|
|
501
|
+
error: 'No REST methods found for this endpoint',
|
|
502
|
+
endpoint_type: endpointType,
|
|
503
|
+
endpoint_id: endpoint.sys_id
|
|
504
|
+
};
|
|
505
|
+
}
|
|
506
|
+
else {
|
|
507
|
+
// Test the first available method (or a GET method if available)
|
|
508
|
+
const testMethod = methods.find((m) => m.http_method === 'GET') || methods[0];
|
|
509
|
+
testResult = {
|
|
510
|
+
endpoint: endpointName,
|
|
511
|
+
status: 'validated',
|
|
512
|
+
response_time: Date.now() - testStartTime,
|
|
513
|
+
endpoint_type: endpointType,
|
|
514
|
+
endpoint_id: endpoint.sys_id,
|
|
515
|
+
available_methods: methods.map((m) => ({
|
|
516
|
+
name: m.name,
|
|
517
|
+
http_method: m.http_method,
|
|
518
|
+
endpoint: m.endpoint
|
|
519
|
+
})),
|
|
520
|
+
test_method: testMethod.name,
|
|
521
|
+
message: `REST endpoint validated successfully. Found ${methods.length} method(s).`
|
|
522
|
+
};
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
catch (error) {
|
|
526
|
+
testResult = {
|
|
527
|
+
endpoint: endpointName,
|
|
528
|
+
status: 'error',
|
|
529
|
+
response_time: Date.now() - testStartTime,
|
|
530
|
+
endpoint_type: endpointType,
|
|
531
|
+
endpoint_id: endpoint.sys_id,
|
|
532
|
+
error: error instanceof Error ? error.message : 'Failed to test REST message',
|
|
533
|
+
message: 'REST endpoint test failed'
|
|
534
|
+
};
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
else if (endpointType === 'web_service') {
|
|
538
|
+
// Test web service endpoint
|
|
539
|
+
testResult = {
|
|
540
|
+
endpoint: endpointName,
|
|
541
|
+
status: 'validated',
|
|
542
|
+
response_time: Date.now() - testStartTime,
|
|
543
|
+
endpoint_type: endpointType,
|
|
544
|
+
endpoint_id: endpoint.sys_id,
|
|
545
|
+
wsdl_url: endpoint.wsdl,
|
|
546
|
+
message: 'Web service endpoint validated successfully'
|
|
547
|
+
};
|
|
548
|
+
}
|
|
549
|
+
// Include test data if provided
|
|
550
|
+
if (testData) {
|
|
551
|
+
testResult.test_data_provided = testData;
|
|
552
|
+
}
|
|
462
553
|
return {
|
|
463
554
|
success: true,
|
|
464
555
|
result: testResult,
|
|
@@ -13,6 +13,7 @@ const servicenow_client_js_1 = require("../utils/servicenow-client.js");
|
|
|
13
13
|
const mcp_auth_middleware_js_1 = require("../utils/mcp-auth-middleware.js");
|
|
14
14
|
const mcp_config_manager_js_1 = require("../utils/mcp-config-manager.js");
|
|
15
15
|
const logger_js_1 = require("../utils/logger.js");
|
|
16
|
+
const widget_template_generator_js_1 = require("../utils/widget-template-generator.js");
|
|
16
17
|
const fs_1 = require("fs");
|
|
17
18
|
const path_1 = require("path");
|
|
18
19
|
class ServiceNowIntelligentMCP {
|
|
@@ -1544,8 +1545,174 @@ class ServiceNowIntelligentMCP {
|
|
|
1544
1545
|
};
|
|
1545
1546
|
}
|
|
1546
1547
|
async deployArtifact(artifact) {
|
|
1547
|
-
|
|
1548
|
-
|
|
1548
|
+
this.logger.info('Deploying modified artifact to ServiceNow', {
|
|
1549
|
+
type: artifact.type,
|
|
1550
|
+
sys_id: artifact.sys_id,
|
|
1551
|
+
name: artifact.name
|
|
1552
|
+
});
|
|
1553
|
+
try {
|
|
1554
|
+
// Determine the table name based on artifact type
|
|
1555
|
+
let tableName;
|
|
1556
|
+
let updateData = {};
|
|
1557
|
+
switch (artifact.type) {
|
|
1558
|
+
case 'widget':
|
|
1559
|
+
tableName = 'sp_widget';
|
|
1560
|
+
updateData = {
|
|
1561
|
+
name: artifact.name,
|
|
1562
|
+
title: artifact.title,
|
|
1563
|
+
description: artifact.description,
|
|
1564
|
+
template: artifact.template,
|
|
1565
|
+
css: artifact.css,
|
|
1566
|
+
client_script: artifact.client_script,
|
|
1567
|
+
server_script: artifact.server_script,
|
|
1568
|
+
option_schema: artifact.option_schema
|
|
1569
|
+
};
|
|
1570
|
+
break;
|
|
1571
|
+
case 'flow':
|
|
1572
|
+
tableName = 'sys_hub_flow';
|
|
1573
|
+
updateData = {
|
|
1574
|
+
name: artifact.name,
|
|
1575
|
+
description: artifact.description,
|
|
1576
|
+
active: artifact.active,
|
|
1577
|
+
trigger_conditions: artifact.trigger_conditions,
|
|
1578
|
+
flow_definition: typeof artifact.flow_definition === 'string'
|
|
1579
|
+
? artifact.flow_definition
|
|
1580
|
+
: JSON.stringify(artifact.flow_definition)
|
|
1581
|
+
};
|
|
1582
|
+
break;
|
|
1583
|
+
case 'subflow':
|
|
1584
|
+
tableName = 'sys_hub_subflow';
|
|
1585
|
+
updateData = {
|
|
1586
|
+
name: artifact.name,
|
|
1587
|
+
description: artifact.description,
|
|
1588
|
+
inputs: typeof artifact.inputs === 'string'
|
|
1589
|
+
? artifact.inputs
|
|
1590
|
+
: JSON.stringify(artifact.inputs || []),
|
|
1591
|
+
outputs: typeof artifact.outputs === 'string'
|
|
1592
|
+
? artifact.outputs
|
|
1593
|
+
: JSON.stringify(artifact.outputs || [])
|
|
1594
|
+
};
|
|
1595
|
+
break;
|
|
1596
|
+
case 'business_rule':
|
|
1597
|
+
tableName = 'sys_script';
|
|
1598
|
+
updateData = {
|
|
1599
|
+
name: artifact.name,
|
|
1600
|
+
description: artifact.description,
|
|
1601
|
+
script: artifact.script,
|
|
1602
|
+
condition: artifact.condition,
|
|
1603
|
+
when: artifact.when,
|
|
1604
|
+
active: artifact.active
|
|
1605
|
+
};
|
|
1606
|
+
break;
|
|
1607
|
+
case 'script_include':
|
|
1608
|
+
tableName = 'sys_script_include';
|
|
1609
|
+
updateData = {
|
|
1610
|
+
name: artifact.name,
|
|
1611
|
+
description: artifact.description,
|
|
1612
|
+
script: artifact.script,
|
|
1613
|
+
api_name: artifact.api_name,
|
|
1614
|
+
active: artifact.active
|
|
1615
|
+
};
|
|
1616
|
+
break;
|
|
1617
|
+
case 'client_script':
|
|
1618
|
+
tableName = 'sys_script_client';
|
|
1619
|
+
updateData = {
|
|
1620
|
+
name: artifact.name,
|
|
1621
|
+
description: artifact.description,
|
|
1622
|
+
script: artifact.script,
|
|
1623
|
+
table: artifact.table,
|
|
1624
|
+
type: artifact.script_type,
|
|
1625
|
+
condition: artifact.condition,
|
|
1626
|
+
active: artifact.active
|
|
1627
|
+
};
|
|
1628
|
+
break;
|
|
1629
|
+
case 'ui_policy':
|
|
1630
|
+
tableName = 'sys_ui_policy';
|
|
1631
|
+
updateData = {
|
|
1632
|
+
short_description: artifact.name,
|
|
1633
|
+
description: artifact.description,
|
|
1634
|
+
conditions: artifact.condition,
|
|
1635
|
+
on_load: artifact.on_load,
|
|
1636
|
+
reverse_if_false: artifact.reverse_if_false,
|
|
1637
|
+
active: artifact.active
|
|
1638
|
+
};
|
|
1639
|
+
break;
|
|
1640
|
+
case 'application':
|
|
1641
|
+
tableName = 'sys_app';
|
|
1642
|
+
updateData = {
|
|
1643
|
+
name: artifact.name,
|
|
1644
|
+
short_description: artifact.short_description,
|
|
1645
|
+
description: artifact.description,
|
|
1646
|
+
version: artifact.version,
|
|
1647
|
+
active: artifact.active
|
|
1648
|
+
};
|
|
1649
|
+
break;
|
|
1650
|
+
default:
|
|
1651
|
+
// Use the artifact's table property if available, or try to infer from type
|
|
1652
|
+
tableName = artifact.table || artifact.type;
|
|
1653
|
+
updateData = { ...artifact };
|
|
1654
|
+
delete updateData.sys_id;
|
|
1655
|
+
delete updateData.type;
|
|
1656
|
+
delete updateData.table;
|
|
1657
|
+
delete updateData.modified;
|
|
1658
|
+
delete updateData.modification_applied;
|
|
1659
|
+
break;
|
|
1660
|
+
}
|
|
1661
|
+
// Remove undefined/null values to avoid overwriting with empty data
|
|
1662
|
+
Object.keys(updateData).forEach(key => {
|
|
1663
|
+
if (updateData[key] === undefined || updateData[key] === null) {
|
|
1664
|
+
delete updateData[key];
|
|
1665
|
+
}
|
|
1666
|
+
});
|
|
1667
|
+
// Update the artifact in ServiceNow using the sys_id
|
|
1668
|
+
const result = await this.client.put(`/api/now/table/${tableName}/${artifact.sys_id}`, updateData);
|
|
1669
|
+
if (result.result) {
|
|
1670
|
+
this.logger.info('Artifact successfully deployed to ServiceNow', {
|
|
1671
|
+
type: artifact.type,
|
|
1672
|
+
sys_id: artifact.sys_id,
|
|
1673
|
+
name: artifact.name,
|
|
1674
|
+
table: tableName
|
|
1675
|
+
});
|
|
1676
|
+
// Get instance info for URL generation
|
|
1677
|
+
const instanceInfo = await this.client.getInstanceInfo();
|
|
1678
|
+
const baseUrl = instanceInfo.result?.instance_url ||
|
|
1679
|
+
`https://${process.env.SNOW_INSTANCE?.replace(/\/$/, '') || 'instance'}.service-now.com`;
|
|
1680
|
+
return {
|
|
1681
|
+
success: true,
|
|
1682
|
+
message: 'Artifact deployed successfully',
|
|
1683
|
+
data: {
|
|
1684
|
+
sys_id: artifact.sys_id,
|
|
1685
|
+
name: artifact.name,
|
|
1686
|
+
type: artifact.type,
|
|
1687
|
+
table: tableName,
|
|
1688
|
+
url: `${baseUrl}/nav_to.do?uri=${tableName}.do?sys_id=${artifact.sys_id}`,
|
|
1689
|
+
last_updated: new Date().toISOString()
|
|
1690
|
+
}
|
|
1691
|
+
};
|
|
1692
|
+
}
|
|
1693
|
+
else {
|
|
1694
|
+
throw new Error('No result returned from ServiceNow API');
|
|
1695
|
+
}
|
|
1696
|
+
}
|
|
1697
|
+
catch (error) {
|
|
1698
|
+
this.logger.error('Failed to deploy artifact to ServiceNow', {
|
|
1699
|
+
type: artifact.type,
|
|
1700
|
+
sys_id: artifact.sys_id,
|
|
1701
|
+
name: artifact.name,
|
|
1702
|
+
error: error instanceof Error ? error.message : String(error)
|
|
1703
|
+
});
|
|
1704
|
+
return {
|
|
1705
|
+
success: false,
|
|
1706
|
+
message: `Failed to deploy artifact: ${error instanceof Error ? error.message : String(error)}`,
|
|
1707
|
+
error: error instanceof Error ? error.message : String(error),
|
|
1708
|
+
data: {
|
|
1709
|
+
sys_id: artifact.sys_id,
|
|
1710
|
+
name: artifact.name,
|
|
1711
|
+
type: artifact.type,
|
|
1712
|
+
deployment_attempt: new Date().toISOString()
|
|
1713
|
+
}
|
|
1714
|
+
};
|
|
1715
|
+
}
|
|
1549
1716
|
}
|
|
1550
1717
|
async updateMemoryIndex(artifact, modification) {
|
|
1551
1718
|
// Update the memory index with the changes
|
|
@@ -3408,10 +3575,20 @@ class ServiceNowIntelligentMCP {
|
|
|
3408
3575
|
simplifiedArtifact.config.name += '_simplified';
|
|
3409
3576
|
}
|
|
3410
3577
|
else if (artifact.type === 'widget') {
|
|
3411
|
-
//
|
|
3412
|
-
|
|
3413
|
-
|
|
3414
|
-
|
|
3578
|
+
// Generate simplified but functional widget template
|
|
3579
|
+
const widgetInstruction = artifact.config.description || artifact.config.name || 'simplified widget';
|
|
3580
|
+
const generatedWidget = widget_template_generator_js_1.widgetTemplateGenerator.generateWidget({
|
|
3581
|
+
title: artifact.config.title || artifact.config.name,
|
|
3582
|
+
instruction: widgetInstruction,
|
|
3583
|
+
type: 'info', // Use info type for simplified widgets
|
|
3584
|
+
theme: 'minimal',
|
|
3585
|
+
responsive: true
|
|
3586
|
+
});
|
|
3587
|
+
simplifiedArtifact.config.template = generatedWidget.template;
|
|
3588
|
+
simplifiedArtifact.config.css = generatedWidget.css;
|
|
3589
|
+
simplifiedArtifact.config.client_script = generatedWidget.clientScript;
|
|
3590
|
+
simplifiedArtifact.config.server_script = generatedWidget.serverScript;
|
|
3591
|
+
simplifiedArtifact.config.option_schema = generatedWidget.optionSchema;
|
|
3415
3592
|
simplifiedArtifact.config.name += '_simplified';
|
|
3416
3593
|
}
|
|
3417
3594
|
result = await this.attemptArtifactDeployment(simplifiedArtifact);
|
|
@@ -3466,7 +3643,21 @@ try {
|
|
|
3466
3643
|
cleanedConfig.category = 'custom';
|
|
3467
3644
|
}
|
|
3468
3645
|
else if (artifact.type === 'widget') {
|
|
3469
|
-
|
|
3646
|
+
// Generate minimal but functional widget template
|
|
3647
|
+
const widgetInstruction = artifact.config.description || artifact.config.name || 'minimal widget';
|
|
3648
|
+
const generatedWidget = widget_template_generator_js_1.widgetTemplateGenerator.generateWidget({
|
|
3649
|
+
title: artifact.config.title || artifact.config.name,
|
|
3650
|
+
instruction: widgetInstruction,
|
|
3651
|
+
type: 'info', // Use info type for minimal widgets
|
|
3652
|
+
theme: 'minimal',
|
|
3653
|
+
responsive: true
|
|
3654
|
+
});
|
|
3655
|
+
cleanedConfig.template = generatedWidget.template;
|
|
3656
|
+
cleanedConfig.css = generatedWidget.css;
|
|
3657
|
+
cleanedConfig.client_script = generatedWidget.clientScript;
|
|
3658
|
+
cleanedConfig.server_script = generatedWidget.serverScript;
|
|
3659
|
+
cleanedConfig.option_schema = generatedWidget.optionSchema;
|
|
3660
|
+
cleanedConfig.title = artifact.config.title || artifact.config.name;
|
|
3470
3661
|
}
|
|
3471
3662
|
minimalArtifact.config = cleanedConfig;
|
|
3472
3663
|
minimalArtifact.config.name += '_minimal';
|
|
@@ -43,6 +43,7 @@ const base_mcp_server_1 = require("./base-mcp-server");
|
|
|
43
43
|
const memory_system_1 = require("../memory/memory-system");
|
|
44
44
|
const path = __importStar(require("path"));
|
|
45
45
|
const fs = __importStar(require("fs"));
|
|
46
|
+
const os = __importStar(require("os"));
|
|
46
47
|
class ServiceNowMemoryMCP extends base_mcp_server_1.BaseMCPServer {
|
|
47
48
|
constructor() {
|
|
48
49
|
const config = {
|
|
@@ -54,7 +55,7 @@ class ServiceNowMemoryMCP extends base_mcp_server_1.BaseMCPServer {
|
|
|
54
55
|
super(config);
|
|
55
56
|
this.config = config;
|
|
56
57
|
// Initialize memory path
|
|
57
|
-
this.memoryPath = process.env.MEMORY_PATH || path.join(process.
|
|
58
|
+
this.memoryPath = process.env.MEMORY_PATH || path.join(process.env.SNOW_FLOW_HOME || path.join(os.homedir(), '.snow-flow'), 'memory');
|
|
58
59
|
// Ensure memory directory exists
|
|
59
60
|
if (!fs.existsSync(this.memoryPath)) {
|
|
60
61
|
fs.mkdirSync(this.memoryPath, { recursive: true });
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
exports.ServiceNowOperationsMCP = void 0;
|
|
18
18
|
const base_mcp_server_js_1 = require("./base-mcp-server.js");
|
|
19
|
+
const servicenow_id_generator_js_1 = require("../utils/servicenow-id-generator.js");
|
|
19
20
|
// Operational table mappings for ServiceNow
|
|
20
21
|
const operationalTableMapping = {
|
|
21
22
|
// ITIL Core Processes
|
|
@@ -1174,12 +1175,12 @@ class ServiceNowOperationsMCP extends base_mcp_server_js_1.BaseMCPServer {
|
|
|
1174
1175
|
flow: flowResponse.result.name,
|
|
1175
1176
|
link_type,
|
|
1176
1177
|
link_created: true,
|
|
1177
|
-
sys_id:
|
|
1178
|
+
sys_id: (0, servicenow_id_generator_js_1.generateMockSysId)('catalog_flow_link')
|
|
1178
1179
|
};
|
|
1179
1180
|
if (test_link) {
|
|
1180
1181
|
// Simulate creating a test request
|
|
1181
1182
|
result.test_request = {
|
|
1182
|
-
number:
|
|
1183
|
+
number: (0, servicenow_id_generator_js_1.generateRequestNumber)(),
|
|
1183
1184
|
state: 'pending',
|
|
1184
1185
|
flow_triggered: true
|
|
1185
1186
|
};
|