snow-flow 2.0.2 → 2.0.4
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/mcp-config.json → .mcp.json} +13 -12
- package/.releaserc.json +47 -0
- package/README.md +48 -1
- package/package.json +1 -1
- package/.claude/claude-settings.json +0 -15
- package/.claude/commands/analysis/README.md +0 -9
- package/.claude/commands/automation/README.md +0 -9
- package/.claude/commands/github/README.md +0 -11
- package/.claude/commands/helpers/standard-checkpoint-hooks.sh +0 -179
- package/.claude/commands/hooks/README.md +0 -11
- package/.claude/commands/monitoring/README.md +0 -9
- package/.claude/commands/optimization/README.md +0 -9
- package/.claude/commands/training/README.md +0 -9
- package/.claude/commands/workflows/README.md +0 -9
- package/.claude/config.json +0 -36
- package/.claude/helpers/github-setup.sh +0 -28
- package/.claude/helpers/quick-start.sh +0 -19
- package/.claude/helpers/setup-mcp.sh +0 -18
- package/.claude/settings.json +0 -114
- package/.claude/settings.local.json +0 -33
- package/.claude-flow/metrics/agent-metrics.json +0 -1
- package/.claude-flow/metrics/performance.json +0 -9
- package/.claude-flow/metrics/system-metrics.json +0 -15986
- package/.claude-flow/metrics/task-metrics.json +0 -10
- package/.roo/README.md +0 -402
- package/.roo/mcp-list.txt +0 -257
- package/.roo/mcp.json +0 -32
- package/.roo/workflows/basic-tdd.json +0 -32
- package/.roomodes +0 -201
- package/CLAUDE.md +0 -393
- package/bin/snow-flow.js +0 -3
- package/dist/cli.js.bak +0 -2052
- package/dist/config/snow-flow-config.d.ts +0 -1492
- package/dist/config/snow-flow-config.js +0 -938
- package/scripts/create-env.js +0 -91
- package/scripts/postinstall.js +0 -30
- package/scripts/register-mcp-servers.js +0 -210
- package/scripts/reset-mcp-servers.js +0 -246
- package/scripts/setup-mcp.js +0 -106
- package/scripts/update-version.js +0 -31
- package/src/agents/README.md +0 -192
- package/src/agents/base-agent.ts +0 -251
- package/src/agents/coordinator.ts +0 -971
- package/src/agents/index.ts +0 -18
- package/src/agents/queen-403-handler.ts +0 -230
- package/src/agents/queen-agent.ts +0 -1399
- package/src/agents/script-writer-agent.ts +0 -769
- package/src/agents/security-agent.ts +0 -726
- package/src/agents/widget-creator-agent.ts +0 -568
- package/src/api/error-handling.ts +0 -1758
- package/src/api/natural-language-mapper.ts +0 -630
- package/src/api/performance-optimizer.ts +0 -891
- package/src/api/transaction-manager.ts +0 -754
- package/src/cli/deploy-artifact.ts +0 -304
- package/src/cli/snow-flow-cli-integration.ts +0 -434
- package/src/cli.ts +0 -4455
- package/src/cli.ts.bak +0 -5616
- package/src/compliance/advanced-compliance-system.ts +0 -1268
- package/src/compliance/index.ts +0 -19
- package/src/config/snow-flow-config.ts +0 -1019
- package/src/documentation/index.ts +0 -16
- package/src/documentation/self-documenting-system.ts +0 -1421
- package/src/dynamic-version.ts +0 -44
- package/src/healing/index.ts +0 -20
- package/src/healing/self-healing-system.ts +0 -1435
- package/src/health/README.md +0 -161
- package/src/health/system-health.ts +0 -995
- package/src/index.ts +0 -60
- package/src/intelligence/acl-analyzer.ts +0 -377
- package/src/intelligence/auto-resolution-engine.ts +0 -643
- package/src/intelligence/gap-analysis-engine.ts +0 -488
- package/src/intelligence/manual-instructions-generator.ts +0 -744
- package/src/intelligence/mcp-coverage-analyzer.ts +0 -708
- package/src/intelligence/multi-pass-requirements-analyzer.ts +0 -603
- package/src/intelligence/performance-recommendations-engine.ts +0 -1223
- package/src/intelligence/requirements-analyzer.ts +0 -1148
- package/src/intelligence/task-analyzer.ts +0 -628
- package/src/managers/scope-manager.ts +0 -555
- package/src/mcp/advanced/servicenow-advanced-features-mcp.ts +0 -16110
- package/src/mcp/base-mcp-server.ts +0 -660
- package/src/mcp/http-transport-wrapper.ts +0 -426
- package/src/mcp/service-discovery-client.ts +0 -312
- package/src/mcp/servicenow-automation-mcp-refactored.ts +0 -678
- package/src/mcp/servicenow-automation-mcp.ts +0 -838
- package/src/mcp/servicenow-deployment-mcp-refactored.ts +0 -1292
- package/src/mcp/servicenow-deployment-mcp.ts +0 -7244
- package/src/mcp/servicenow-graph-memory-mcp-refactored.ts +0 -721
- package/src/mcp/servicenow-graph-memory-mcp.ts +0 -832
- package/src/mcp/servicenow-integration-mcp-refactored.ts +0 -655
- package/src/mcp/servicenow-integration-mcp.ts +0 -819
- package/src/mcp/servicenow-intelligent-mcp-refactored.ts +0 -977
- package/src/mcp/servicenow-intelligent-mcp.ts +0 -4638
- package/src/mcp/servicenow-mcp-server.ts +0 -728
- package/src/mcp/servicenow-memory-mcp.ts +0 -474
- package/src/mcp/servicenow-operations-mcp-refactored.ts +0 -1995
- package/src/mcp/servicenow-operations-mcp.ts +0 -3384
- package/src/mcp/servicenow-platform-development-mcp-refactored.ts +0 -611
- package/src/mcp/servicenow-platform-development-mcp.ts +0 -970
- package/src/mcp/servicenow-progressive-indexer.ts +0 -370
- package/src/mcp/servicenow-reporting-analytics-mcp-refactored.ts +0 -695
- package/src/mcp/servicenow-reporting-analytics-mcp.ts +0 -1123
- package/src/mcp/servicenow-security-compliance-mcp-refactored.ts +0 -642
- package/src/mcp/servicenow-security-compliance-mcp.ts +0 -1157
- package/src/mcp/servicenow-update-set-mcp-refactored.ts +0 -751
- package/src/mcp/servicenow-update-set-mcp.ts +0 -811
- package/src/mcp/shared/agent-context-provider.ts +0 -365
- package/src/mcp/shared/base-mcp-server.ts +0 -2463
- package/src/mcp/shared/mcp-memory-manager.ts +0 -540
- package/src/mcp/shared/mcp-resource-manager.ts +0 -367
- package/src/mcp/snow-flow-mcp.ts +0 -911
- package/src/mcp/start-all-mcp-servers.ts +0 -102
- package/src/mcp/start-servicenow-mcp.ts +0 -67
- package/src/monitoring/enhanced-monitoring-system.ts +0 -1345
- package/src/monitoring/performance-tracker.ts +0 -777
- package/src/optimization/cost-optimization-engine.ts +0 -1125
- package/src/optimization/index.ts +0 -10
- package/src/queen/README.md +0 -403
- package/src/queen/agent-factory.ts +0 -574
- package/src/queen/index.ts +0 -94
- package/src/queen/mcp-execution-bridge.ts +0 -681
- package/src/queen/neural-learning.ts +0 -319
- package/src/queen/parallel-agent-engine.ts +0 -848
- package/src/queen/queen-memory-system.ts +0 -490
- package/src/queen/queen-memory.ts +0 -456
- package/src/queen/servicenow-queen.ts +0 -1029
- package/src/queen/types.ts +0 -87
- package/src/rollback/smart-rollback-system.ts +0 -866
- package/src/schemas/deployment.schema.json +0 -58
- package/src/schemas/flow.schema.json +0 -79
- package/src/schemas/widget.schema.json +0 -72
- package/src/snow-flow-system.ts +0 -541
- package/src/sparc/sparc-help.ts +0 -49
- package/src/sparc/team-sparc.ts +0 -88
- package/src/strategies/global-scope-strategy.ts +0 -736
- package/src/templates/base/application.template.json +0 -45
- package/src/templates/base/business_rule.template.json +0 -33
- package/src/templates/base/script_include.template.json +0 -18
- package/src/templates/base/table.template.json +0 -64
- package/src/templates/base/widget.template.json +0 -25
- package/src/templates/patterns/composite.incident-management.template.json +0 -140
- package/src/templates/patterns/widget.dashboard.template.json +0 -238
- package/src/templates/patterns/widget.datatable.template.json +0 -292
- package/src/testing/integration-test-suite.ts +0 -1276
- package/src/types/index.ts +0 -183
- package/src/types/neo4j-driver.d.ts +0 -23
- package/src/types/servicenow.types.ts +0 -307
- package/src/types/snow-flow.types.ts +0 -186
- package/src/types/todo.types.ts +0 -70
- package/src/utils/action-type-cache.ts +0 -286
- package/src/utils/agent-detector.ts +0 -573
- package/src/utils/artifact-tracker.ts +0 -379
- package/src/utils/dependency-detector.ts +0 -233
- package/src/utils/deployment-metadata-handler.ts +0 -518
- package/src/utils/error-recovery.ts +0 -680
- package/src/utils/logger.ts +0 -60
- package/src/utils/mcp-auth-middleware.ts +0 -262
- package/src/utils/mcp-config-manager.ts +0 -270
- package/src/utils/mcp-server-manager.ts +0 -446
- package/src/utils/mcp-tool-registry.ts +0 -298
- package/src/utils/migrate-snow-flow.ts +0 -98
- package/src/utils/oauth-html-templates.ts +0 -188
- package/src/utils/scope-utils.ts +0 -443
- package/src/utils/servicenow-client.ts +0 -3321
- package/src/utils/servicenow-id-generator.ts +0 -181
- package/src/utils/snow-memory-manager.ts +0 -605
- package/src/utils/snow-oauth.ts +0 -797
- package/src/utils/template-engine.ts +0 -463
- package/src/utils/theme-manager.ts +0 -295
- package/src/utils/unified-auth-store.ts +0 -222
- package/src/utils/update-set-importer.ts +0 -422
- package/src/utils/update-set-xml-packager.ts +0 -371
- package/src/utils/widget-template-generator.ts +0 -1744
- package/src/version.ts +0 -1950
|
@@ -1,518 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Deployment Metadata Handler
|
|
4
|
-
*
|
|
5
|
-
* Solves Issue #3: Metadata Response Failures
|
|
6
|
-
* Ensures all deployments return proper sys_id and API endpoints
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { ServiceNowClient } from './servicenow-client.js';
|
|
10
|
-
import { ServiceNowOAuth } from './snow-oauth.js';
|
|
11
|
-
import { Logger } from './logger.js';
|
|
12
|
-
|
|
13
|
-
export interface DeploymentMetadata {
|
|
14
|
-
sys_id: string;
|
|
15
|
-
name: string;
|
|
16
|
-
type: string;
|
|
17
|
-
table: string;
|
|
18
|
-
api_endpoint: string;
|
|
19
|
-
ui_url: string;
|
|
20
|
-
created_on?: string;
|
|
21
|
-
created_by?: string;
|
|
22
|
-
update_set_id?: string;
|
|
23
|
-
verification_status?: 'verified' | 'unverified' | 'failed';
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export interface DeploymentResult {
|
|
27
|
-
success: boolean;
|
|
28
|
-
metadata?: DeploymentMetadata;
|
|
29
|
-
error?: string;
|
|
30
|
-
verification?: {
|
|
31
|
-
exists: boolean;
|
|
32
|
-
accessible: boolean;
|
|
33
|
-
functional: boolean;
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export class DeploymentMetadataHandler {
|
|
38
|
-
private client: ServiceNowClient;
|
|
39
|
-
private oauth: ServiceNowOAuth;
|
|
40
|
-
private logger: Logger;
|
|
41
|
-
private metadataCache: Map<string, DeploymentMetadata> = new Map();
|
|
42
|
-
|
|
43
|
-
constructor() {
|
|
44
|
-
this.client = new ServiceNowClient();
|
|
45
|
-
this.oauth = new ServiceNowOAuth();
|
|
46
|
-
this.logger = new Logger('DeploymentMetadataHandler');
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Extract metadata from deployment response
|
|
51
|
-
*/
|
|
52
|
-
async extractMetadata(
|
|
53
|
-
deploymentType: string,
|
|
54
|
-
deploymentResponse: any,
|
|
55
|
-
additionalInfo?: any
|
|
56
|
-
): Promise<DeploymentResult> {
|
|
57
|
-
try {
|
|
58
|
-
let metadata: DeploymentMetadata | null = null;
|
|
59
|
-
|
|
60
|
-
switch (deploymentType) {
|
|
61
|
-
case 'flow':
|
|
62
|
-
metadata = await this.extractFlowMetadata(deploymentResponse, additionalInfo);
|
|
63
|
-
break;
|
|
64
|
-
case 'widget':
|
|
65
|
-
metadata = await this.extractWidgetMetadata(deploymentResponse, additionalInfo);
|
|
66
|
-
break;
|
|
67
|
-
case 'script':
|
|
68
|
-
metadata = await this.extractScriptMetadata(deploymentResponse, additionalInfo);
|
|
69
|
-
break;
|
|
70
|
-
case 'business_rule':
|
|
71
|
-
metadata = await this.extractBusinessRuleMetadata(deploymentResponse, additionalInfo);
|
|
72
|
-
break;
|
|
73
|
-
default:
|
|
74
|
-
metadata = await this.extractGenericMetadata(deploymentType, deploymentResponse, additionalInfo);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
if (!metadata) {
|
|
78
|
-
throw new Error('Failed to extract metadata from deployment response');
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// Verify the deployment
|
|
82
|
-
const verification = await this.verifyDeployment(metadata);
|
|
83
|
-
metadata.verification_status = verification.exists && verification.accessible ? 'verified' : 'failed';
|
|
84
|
-
|
|
85
|
-
// Cache the metadata
|
|
86
|
-
this.metadataCache.set(metadata.sys_id, metadata);
|
|
87
|
-
|
|
88
|
-
return {
|
|
89
|
-
success: true,
|
|
90
|
-
metadata,
|
|
91
|
-
verification
|
|
92
|
-
};
|
|
93
|
-
|
|
94
|
-
} catch (error) {
|
|
95
|
-
this.logger.error('Metadata extraction failed:', error);
|
|
96
|
-
return {
|
|
97
|
-
success: false,
|
|
98
|
-
error: error instanceof Error ? error.message : String(error)
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* Extract flow metadata
|
|
105
|
-
*/
|
|
106
|
-
private async extractFlowMetadata(response: any, additionalInfo?: any): Promise<DeploymentMetadata | null> {
|
|
107
|
-
let sysId: string | null = null;
|
|
108
|
-
let name: string = '';
|
|
109
|
-
|
|
110
|
-
// Try multiple paths to find sys_id
|
|
111
|
-
sysId = response?.sys_id ||
|
|
112
|
-
response?.result?.sys_id ||
|
|
113
|
-
response?.flow?.sys_id ||
|
|
114
|
-
additionalInfo?.flowSysId ||
|
|
115
|
-
additionalInfo?.sys_id;
|
|
116
|
-
|
|
117
|
-
// If still no sys_id, try to find it from update set
|
|
118
|
-
if (!sysId && additionalInfo?.update_set_id) {
|
|
119
|
-
sysId = await this.findFlowFromUpdateSet(additionalInfo.update_set_id);
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// If still no sys_id, search by name
|
|
123
|
-
if (!sysId && (response?.name || additionalInfo?.name)) {
|
|
124
|
-
name = response?.name || additionalInfo?.name;
|
|
125
|
-
sysId = await this.findFlowByName(name);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
if (!sysId) {
|
|
129
|
-
this.logger.warn('Could not find flow sys_id in response');
|
|
130
|
-
return null;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
// Get additional details
|
|
134
|
-
const flowDetails = await this.getFlowDetails(sysId);
|
|
135
|
-
const credentials = await this.oauth.getCredentials();
|
|
136
|
-
|
|
137
|
-
return {
|
|
138
|
-
sys_id: sysId,
|
|
139
|
-
name: flowDetails?.name || name || 'Unknown Flow',
|
|
140
|
-
type: 'flow',
|
|
141
|
-
table: 'sys_hub_flow',
|
|
142
|
-
api_endpoint: `https://${credentials?.instance}/api/now/table/sys_hub_flow/${sysId}`,
|
|
143
|
-
ui_url: `https://${credentials?.instance}/flow-designer/${sysId}`,
|
|
144
|
-
created_on: flowDetails?.sys_created_on,
|
|
145
|
-
created_by: flowDetails?.sys_created_by,
|
|
146
|
-
update_set_id: additionalInfo?.update_set_id
|
|
147
|
-
};
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Extract widget metadata
|
|
152
|
-
*/
|
|
153
|
-
private async extractWidgetMetadata(response: any, additionalInfo?: any): Promise<DeploymentMetadata | null> {
|
|
154
|
-
let sysId: string | null = null;
|
|
155
|
-
let name: string = '';
|
|
156
|
-
|
|
157
|
-
// Try multiple paths to find sys_id
|
|
158
|
-
sysId = response?.sys_id ||
|
|
159
|
-
response?.result?.sys_id ||
|
|
160
|
-
response?.widget?.sys_id ||
|
|
161
|
-
additionalInfo?.widgetSysId ||
|
|
162
|
-
additionalInfo?.sys_id;
|
|
163
|
-
|
|
164
|
-
// Search by name if needed
|
|
165
|
-
if (!sysId && (response?.name || additionalInfo?.name)) {
|
|
166
|
-
name = response?.name || additionalInfo?.name;
|
|
167
|
-
sysId = await this.findWidgetByName(name);
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
if (!sysId) {
|
|
171
|
-
this.logger.warn('Could not find widget sys_id in response');
|
|
172
|
-
return null;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
const credentials = await this.oauth.getCredentials();
|
|
176
|
-
|
|
177
|
-
return {
|
|
178
|
-
sys_id: sysId,
|
|
179
|
-
name: name || response?.title || 'Unknown Widget',
|
|
180
|
-
type: 'widget',
|
|
181
|
-
table: 'sp_widget',
|
|
182
|
-
api_endpoint: `https://${credentials?.instance}/api/now/table/sp_widget/${sysId}`,
|
|
183
|
-
ui_url: `https://${credentials?.instance}/sp_config?id=widget_editor&sys_id=${sysId}`,
|
|
184
|
-
update_set_id: additionalInfo?.update_set_id
|
|
185
|
-
};
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
/**
|
|
189
|
-
* Extract script include metadata
|
|
190
|
-
*/
|
|
191
|
-
private async extractScriptMetadata(response: any, additionalInfo?: any): Promise<DeploymentMetadata | null> {
|
|
192
|
-
let sysId: string | null = null;
|
|
193
|
-
|
|
194
|
-
sysId = response?.sys_id ||
|
|
195
|
-
response?.result?.sys_id ||
|
|
196
|
-
additionalInfo?.sys_id;
|
|
197
|
-
|
|
198
|
-
if (!sysId && response?.name) {
|
|
199
|
-
sysId = await this.findScriptIncludeByName(response.name);
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
if (!sysId) return null;
|
|
203
|
-
|
|
204
|
-
const credentials = await this.oauth.getCredentials();
|
|
205
|
-
|
|
206
|
-
return {
|
|
207
|
-
sys_id: sysId,
|
|
208
|
-
name: response?.name || 'Unknown Script',
|
|
209
|
-
type: 'script_include',
|
|
210
|
-
table: 'sys_script_include',
|
|
211
|
-
api_endpoint: `https://${credentials?.instance}/api/now/table/sys_script_include/${sysId}`,
|
|
212
|
-
ui_url: `https://${credentials?.instance}/sys_script_include.do?sys_id=${sysId}`
|
|
213
|
-
};
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
/**
|
|
217
|
-
* Extract business rule metadata
|
|
218
|
-
*/
|
|
219
|
-
private async extractBusinessRuleMetadata(response: any, additionalInfo?: any): Promise<DeploymentMetadata | null> {
|
|
220
|
-
let sysId: string | null = null;
|
|
221
|
-
|
|
222
|
-
sysId = response?.sys_id ||
|
|
223
|
-
response?.result?.sys_id ||
|
|
224
|
-
additionalInfo?.sys_id;
|
|
225
|
-
|
|
226
|
-
if (!sysId && response?.name) {
|
|
227
|
-
sysId = await this.findBusinessRuleByName(response.name, response?.table);
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
if (!sysId) return null;
|
|
231
|
-
|
|
232
|
-
const credentials = await this.oauth.getCredentials();
|
|
233
|
-
|
|
234
|
-
return {
|
|
235
|
-
sys_id: sysId,
|
|
236
|
-
name: response?.name || 'Unknown Business Rule',
|
|
237
|
-
type: 'business_rule',
|
|
238
|
-
table: 'sys_script',
|
|
239
|
-
api_endpoint: `https://${credentials?.instance}/api/now/table/sys_script/${sysId}`,
|
|
240
|
-
ui_url: `https://${credentials?.instance}/sys_script.do?sys_id=${sysId}`
|
|
241
|
-
};
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
/**
|
|
245
|
-
* Extract generic metadata
|
|
246
|
-
*/
|
|
247
|
-
private async extractGenericMetadata(
|
|
248
|
-
type: string,
|
|
249
|
-
response: any,
|
|
250
|
-
additionalInfo?: any
|
|
251
|
-
): Promise<DeploymentMetadata | null> {
|
|
252
|
-
const sysId = response?.sys_id || response?.result?.sys_id || additionalInfo?.sys_id;
|
|
253
|
-
|
|
254
|
-
if (!sysId) return null;
|
|
255
|
-
|
|
256
|
-
const credentials = await this.oauth.getCredentials();
|
|
257
|
-
const table = additionalInfo?.table || this.getTableForType(type);
|
|
258
|
-
|
|
259
|
-
return {
|
|
260
|
-
sys_id: sysId,
|
|
261
|
-
name: response?.name || additionalInfo?.name || `Unknown ${type}`,
|
|
262
|
-
type,
|
|
263
|
-
table,
|
|
264
|
-
api_endpoint: `https://${credentials?.instance}/api/now/table/${table}/${sysId}`,
|
|
265
|
-
ui_url: `https://${credentials?.instance}/${table}.do?sys_id=${sysId}`
|
|
266
|
-
};
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
/**
|
|
270
|
-
* Find flow from update set
|
|
271
|
-
*/
|
|
272
|
-
private async findFlowFromUpdateSet(updateSetId: string): Promise<string | null> {
|
|
273
|
-
try {
|
|
274
|
-
const response = await this.client.makeRequest({
|
|
275
|
-
method: 'GET',
|
|
276
|
-
url: '/api/now/table/sys_update_xml',
|
|
277
|
-
params: {
|
|
278
|
-
sysparm_query: `update_set=${updateSetId}^name^STARTSWITHsys_hub_flow_`,
|
|
279
|
-
sysparm_limit: 1,
|
|
280
|
-
sysparm_fields: 'name'
|
|
281
|
-
}
|
|
282
|
-
});
|
|
283
|
-
|
|
284
|
-
if (response.result && response.result.length > 0) {
|
|
285
|
-
return response.result[0].name.replace('sys_hub_flow_', '');
|
|
286
|
-
}
|
|
287
|
-
} catch (error) {
|
|
288
|
-
this.logger.warn('Error finding flow from update set:', error);
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
return null;
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
/**
|
|
295
|
-
* Find flow by name
|
|
296
|
-
*/
|
|
297
|
-
private async findFlowByName(name: string): Promise<string | null> {
|
|
298
|
-
try {
|
|
299
|
-
const response = await this.client.makeRequest({
|
|
300
|
-
method: 'GET',
|
|
301
|
-
url: '/api/now/table/sys_hub_flow',
|
|
302
|
-
params: {
|
|
303
|
-
sysparm_query: `name=${name}^ORinternal_name=${name}`,
|
|
304
|
-
sysparm_limit: 1,
|
|
305
|
-
sysparm_fields: 'sys_id'
|
|
306
|
-
}
|
|
307
|
-
});
|
|
308
|
-
|
|
309
|
-
if (response.result && response.result.length > 0) {
|
|
310
|
-
return response.result[0].sys_id;
|
|
311
|
-
}
|
|
312
|
-
} catch (error) {
|
|
313
|
-
this.logger.warn('Error finding flow by name:', error);
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
return null;
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
/**
|
|
320
|
-
* Find widget by name
|
|
321
|
-
*/
|
|
322
|
-
private async findWidgetByName(name: string): Promise<string | null> {
|
|
323
|
-
try {
|
|
324
|
-
const response = await this.client.makeRequest({
|
|
325
|
-
method: 'GET',
|
|
326
|
-
url: '/api/now/table/sp_widget',
|
|
327
|
-
params: {
|
|
328
|
-
sysparm_query: `name=${name}^ORid=${name}`,
|
|
329
|
-
sysparm_limit: 1,
|
|
330
|
-
sysparm_fields: 'sys_id'
|
|
331
|
-
}
|
|
332
|
-
});
|
|
333
|
-
|
|
334
|
-
if (response.result && response.result.length > 0) {
|
|
335
|
-
return response.result[0].sys_id;
|
|
336
|
-
}
|
|
337
|
-
} catch (error) {
|
|
338
|
-
this.logger.warn('Error finding widget by name:', error);
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
return null;
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
/**
|
|
345
|
-
* Find script include by name
|
|
346
|
-
*/
|
|
347
|
-
private async findScriptIncludeByName(name: string): Promise<string | null> {
|
|
348
|
-
try {
|
|
349
|
-
const response = await this.client.makeRequest({
|
|
350
|
-
method: 'GET',
|
|
351
|
-
url: '/api/now/table/sys_script_include',
|
|
352
|
-
params: {
|
|
353
|
-
sysparm_query: `name=${name}^ORapi_name=${name}`,
|
|
354
|
-
sysparm_limit: 1,
|
|
355
|
-
sysparm_fields: 'sys_id'
|
|
356
|
-
}
|
|
357
|
-
});
|
|
358
|
-
|
|
359
|
-
if (response.result && response.result.length > 0) {
|
|
360
|
-
return response.result[0].sys_id;
|
|
361
|
-
}
|
|
362
|
-
} catch (error) {
|
|
363
|
-
this.logger.warn('Error finding script include by name:', error);
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
return null;
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
/**
|
|
370
|
-
* Find business rule by name
|
|
371
|
-
*/
|
|
372
|
-
private async findBusinessRuleByName(name: string, table?: string): Promise<string | null> {
|
|
373
|
-
try {
|
|
374
|
-
let query = `name=${name}`;
|
|
375
|
-
if (table) {
|
|
376
|
-
query += `^collection=${table}`;
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
const response = await this.client.makeRequest({
|
|
380
|
-
method: 'GET',
|
|
381
|
-
url: '/api/now/table/sys_script',
|
|
382
|
-
params: {
|
|
383
|
-
sysparm_query: query,
|
|
384
|
-
sysparm_limit: 1,
|
|
385
|
-
sysparm_fields: 'sys_id'
|
|
386
|
-
}
|
|
387
|
-
});
|
|
388
|
-
|
|
389
|
-
if (response.result && response.result.length > 0) {
|
|
390
|
-
return response.result[0].sys_id;
|
|
391
|
-
}
|
|
392
|
-
} catch (error) {
|
|
393
|
-
this.logger.warn('Error finding business rule by name:', error);
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
return null;
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
/**
|
|
400
|
-
* Get flow details
|
|
401
|
-
*/
|
|
402
|
-
private async getFlowDetails(sysId: string): Promise<any> {
|
|
403
|
-
try {
|
|
404
|
-
const response = await this.client.makeRequest({
|
|
405
|
-
method: 'GET',
|
|
406
|
-
url: `/api/now/table/sys_hub_flow/${sysId}`,
|
|
407
|
-
params: {
|
|
408
|
-
sysparm_fields: 'name,sys_created_on,sys_created_by,internal_name'
|
|
409
|
-
}
|
|
410
|
-
});
|
|
411
|
-
|
|
412
|
-
return response.result;
|
|
413
|
-
} catch (error) {
|
|
414
|
-
this.logger.warn('Error getting flow details:', error);
|
|
415
|
-
return null;
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
/**
|
|
420
|
-
* Verify deployment exists and is accessible
|
|
421
|
-
*/
|
|
422
|
-
private async verifyDeployment(metadata: DeploymentMetadata): Promise<{
|
|
423
|
-
exists: boolean;
|
|
424
|
-
accessible: boolean;
|
|
425
|
-
functional: boolean;
|
|
426
|
-
}> {
|
|
427
|
-
const verification = {
|
|
428
|
-
exists: false,
|
|
429
|
-
accessible: false,
|
|
430
|
-
functional: false
|
|
431
|
-
};
|
|
432
|
-
|
|
433
|
-
try {
|
|
434
|
-
// Check if record exists
|
|
435
|
-
const response = await this.client.makeRequest({
|
|
436
|
-
method: 'GET',
|
|
437
|
-
url: `/api/now/table/${metadata.table}/${metadata.sys_id}`,
|
|
438
|
-
params: {
|
|
439
|
-
sysparm_fields: 'sys_id,name'
|
|
440
|
-
}
|
|
441
|
-
});
|
|
442
|
-
|
|
443
|
-
verification.exists = !!response.result;
|
|
444
|
-
verification.accessible = response.success;
|
|
445
|
-
|
|
446
|
-
// For flows, check if it's active
|
|
447
|
-
if (metadata.type === 'flow' && response.result) {
|
|
448
|
-
verification.functional = response.result.active === 'true' || response.result.active === true;
|
|
449
|
-
} else {
|
|
450
|
-
verification.functional = verification.exists;
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
} catch (error) {
|
|
454
|
-
this.logger.warn('Verification failed:', error);
|
|
455
|
-
}
|
|
456
|
-
|
|
457
|
-
return verification;
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
/**
|
|
461
|
-
* Get table name for deployment type
|
|
462
|
-
*/
|
|
463
|
-
private getTableForType(type: string): string {
|
|
464
|
-
const tableMap: Record<string, string> = {
|
|
465
|
-
'flow': 'sys_hub_flow',
|
|
466
|
-
'widget': 'sp_widget',
|
|
467
|
-
'script_include': 'sys_script_include',
|
|
468
|
-
'business_rule': 'sys_script',
|
|
469
|
-
'ui_script': 'sys_ui_script',
|
|
470
|
-
'client_script': 'sys_script_client',
|
|
471
|
-
'table': 'sys_db_object',
|
|
472
|
-
'application': 'sys_app'
|
|
473
|
-
};
|
|
474
|
-
|
|
475
|
-
return tableMap[type] || 'sys_metadata';
|
|
476
|
-
}
|
|
477
|
-
|
|
478
|
-
/**
|
|
479
|
-
* Get cached metadata
|
|
480
|
-
*/
|
|
481
|
-
getCachedMetadata(sysId: string): DeploymentMetadata | null {
|
|
482
|
-
return this.metadataCache.get(sysId) || null;
|
|
483
|
-
}
|
|
484
|
-
|
|
485
|
-
/**
|
|
486
|
-
* Clear metadata cache
|
|
487
|
-
*/
|
|
488
|
-
clearCache(): void {
|
|
489
|
-
this.metadataCache.clear();
|
|
490
|
-
}
|
|
491
|
-
}
|
|
492
|
-
|
|
493
|
-
// Singleton instance
|
|
494
|
-
let handlerInstance: DeploymentMetadataHandler | null = null;
|
|
495
|
-
|
|
496
|
-
/**
|
|
497
|
-
* Get or create handler instance
|
|
498
|
-
*/
|
|
499
|
-
export function getMetadataHandler(): DeploymentMetadataHandler {
|
|
500
|
-
if (!handlerInstance) {
|
|
501
|
-
handlerInstance = new DeploymentMetadataHandler();
|
|
502
|
-
}
|
|
503
|
-
return handlerInstance;
|
|
504
|
-
}
|
|
505
|
-
|
|
506
|
-
/**
|
|
507
|
-
* Helper to ensure deployment returns metadata
|
|
508
|
-
*/
|
|
509
|
-
export async function ensureDeploymentMetadata(
|
|
510
|
-
deploymentType: string,
|
|
511
|
-
deploymentResponse: any,
|
|
512
|
-
additionalInfo?: any
|
|
513
|
-
): Promise<DeploymentResult> {
|
|
514
|
-
const handler = getMetadataHandler();
|
|
515
|
-
return handler.extractMetadata(deploymentType, deploymentResponse, additionalInfo);
|
|
516
|
-
}
|
|
517
|
-
|
|
518
|
-
export default DeploymentMetadataHandler;
|