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.
Files changed (173) hide show
  1. package/{.claude/mcp-config.json → .mcp.json} +13 -12
  2. package/.releaserc.json +47 -0
  3. package/README.md +48 -1
  4. package/package.json +1 -1
  5. package/.claude/claude-settings.json +0 -15
  6. package/.claude/commands/analysis/README.md +0 -9
  7. package/.claude/commands/automation/README.md +0 -9
  8. package/.claude/commands/github/README.md +0 -11
  9. package/.claude/commands/helpers/standard-checkpoint-hooks.sh +0 -179
  10. package/.claude/commands/hooks/README.md +0 -11
  11. package/.claude/commands/monitoring/README.md +0 -9
  12. package/.claude/commands/optimization/README.md +0 -9
  13. package/.claude/commands/training/README.md +0 -9
  14. package/.claude/commands/workflows/README.md +0 -9
  15. package/.claude/config.json +0 -36
  16. package/.claude/helpers/github-setup.sh +0 -28
  17. package/.claude/helpers/quick-start.sh +0 -19
  18. package/.claude/helpers/setup-mcp.sh +0 -18
  19. package/.claude/settings.json +0 -114
  20. package/.claude/settings.local.json +0 -33
  21. package/.claude-flow/metrics/agent-metrics.json +0 -1
  22. package/.claude-flow/metrics/performance.json +0 -9
  23. package/.claude-flow/metrics/system-metrics.json +0 -15986
  24. package/.claude-flow/metrics/task-metrics.json +0 -10
  25. package/.roo/README.md +0 -402
  26. package/.roo/mcp-list.txt +0 -257
  27. package/.roo/mcp.json +0 -32
  28. package/.roo/workflows/basic-tdd.json +0 -32
  29. package/.roomodes +0 -201
  30. package/CLAUDE.md +0 -393
  31. package/bin/snow-flow.js +0 -3
  32. package/dist/cli.js.bak +0 -2052
  33. package/dist/config/snow-flow-config.d.ts +0 -1492
  34. package/dist/config/snow-flow-config.js +0 -938
  35. package/scripts/create-env.js +0 -91
  36. package/scripts/postinstall.js +0 -30
  37. package/scripts/register-mcp-servers.js +0 -210
  38. package/scripts/reset-mcp-servers.js +0 -246
  39. package/scripts/setup-mcp.js +0 -106
  40. package/scripts/update-version.js +0 -31
  41. package/src/agents/README.md +0 -192
  42. package/src/agents/base-agent.ts +0 -251
  43. package/src/agents/coordinator.ts +0 -971
  44. package/src/agents/index.ts +0 -18
  45. package/src/agents/queen-403-handler.ts +0 -230
  46. package/src/agents/queen-agent.ts +0 -1399
  47. package/src/agents/script-writer-agent.ts +0 -769
  48. package/src/agents/security-agent.ts +0 -726
  49. package/src/agents/widget-creator-agent.ts +0 -568
  50. package/src/api/error-handling.ts +0 -1758
  51. package/src/api/natural-language-mapper.ts +0 -630
  52. package/src/api/performance-optimizer.ts +0 -891
  53. package/src/api/transaction-manager.ts +0 -754
  54. package/src/cli/deploy-artifact.ts +0 -304
  55. package/src/cli/snow-flow-cli-integration.ts +0 -434
  56. package/src/cli.ts +0 -4455
  57. package/src/cli.ts.bak +0 -5616
  58. package/src/compliance/advanced-compliance-system.ts +0 -1268
  59. package/src/compliance/index.ts +0 -19
  60. package/src/config/snow-flow-config.ts +0 -1019
  61. package/src/documentation/index.ts +0 -16
  62. package/src/documentation/self-documenting-system.ts +0 -1421
  63. package/src/dynamic-version.ts +0 -44
  64. package/src/healing/index.ts +0 -20
  65. package/src/healing/self-healing-system.ts +0 -1435
  66. package/src/health/README.md +0 -161
  67. package/src/health/system-health.ts +0 -995
  68. package/src/index.ts +0 -60
  69. package/src/intelligence/acl-analyzer.ts +0 -377
  70. package/src/intelligence/auto-resolution-engine.ts +0 -643
  71. package/src/intelligence/gap-analysis-engine.ts +0 -488
  72. package/src/intelligence/manual-instructions-generator.ts +0 -744
  73. package/src/intelligence/mcp-coverage-analyzer.ts +0 -708
  74. package/src/intelligence/multi-pass-requirements-analyzer.ts +0 -603
  75. package/src/intelligence/performance-recommendations-engine.ts +0 -1223
  76. package/src/intelligence/requirements-analyzer.ts +0 -1148
  77. package/src/intelligence/task-analyzer.ts +0 -628
  78. package/src/managers/scope-manager.ts +0 -555
  79. package/src/mcp/advanced/servicenow-advanced-features-mcp.ts +0 -16110
  80. package/src/mcp/base-mcp-server.ts +0 -660
  81. package/src/mcp/http-transport-wrapper.ts +0 -426
  82. package/src/mcp/service-discovery-client.ts +0 -312
  83. package/src/mcp/servicenow-automation-mcp-refactored.ts +0 -678
  84. package/src/mcp/servicenow-automation-mcp.ts +0 -838
  85. package/src/mcp/servicenow-deployment-mcp-refactored.ts +0 -1292
  86. package/src/mcp/servicenow-deployment-mcp.ts +0 -7244
  87. package/src/mcp/servicenow-graph-memory-mcp-refactored.ts +0 -721
  88. package/src/mcp/servicenow-graph-memory-mcp.ts +0 -832
  89. package/src/mcp/servicenow-integration-mcp-refactored.ts +0 -655
  90. package/src/mcp/servicenow-integration-mcp.ts +0 -819
  91. package/src/mcp/servicenow-intelligent-mcp-refactored.ts +0 -977
  92. package/src/mcp/servicenow-intelligent-mcp.ts +0 -4638
  93. package/src/mcp/servicenow-mcp-server.ts +0 -728
  94. package/src/mcp/servicenow-memory-mcp.ts +0 -474
  95. package/src/mcp/servicenow-operations-mcp-refactored.ts +0 -1995
  96. package/src/mcp/servicenow-operations-mcp.ts +0 -3384
  97. package/src/mcp/servicenow-platform-development-mcp-refactored.ts +0 -611
  98. package/src/mcp/servicenow-platform-development-mcp.ts +0 -970
  99. package/src/mcp/servicenow-progressive-indexer.ts +0 -370
  100. package/src/mcp/servicenow-reporting-analytics-mcp-refactored.ts +0 -695
  101. package/src/mcp/servicenow-reporting-analytics-mcp.ts +0 -1123
  102. package/src/mcp/servicenow-security-compliance-mcp-refactored.ts +0 -642
  103. package/src/mcp/servicenow-security-compliance-mcp.ts +0 -1157
  104. package/src/mcp/servicenow-update-set-mcp-refactored.ts +0 -751
  105. package/src/mcp/servicenow-update-set-mcp.ts +0 -811
  106. package/src/mcp/shared/agent-context-provider.ts +0 -365
  107. package/src/mcp/shared/base-mcp-server.ts +0 -2463
  108. package/src/mcp/shared/mcp-memory-manager.ts +0 -540
  109. package/src/mcp/shared/mcp-resource-manager.ts +0 -367
  110. package/src/mcp/snow-flow-mcp.ts +0 -911
  111. package/src/mcp/start-all-mcp-servers.ts +0 -102
  112. package/src/mcp/start-servicenow-mcp.ts +0 -67
  113. package/src/monitoring/enhanced-monitoring-system.ts +0 -1345
  114. package/src/monitoring/performance-tracker.ts +0 -777
  115. package/src/optimization/cost-optimization-engine.ts +0 -1125
  116. package/src/optimization/index.ts +0 -10
  117. package/src/queen/README.md +0 -403
  118. package/src/queen/agent-factory.ts +0 -574
  119. package/src/queen/index.ts +0 -94
  120. package/src/queen/mcp-execution-bridge.ts +0 -681
  121. package/src/queen/neural-learning.ts +0 -319
  122. package/src/queen/parallel-agent-engine.ts +0 -848
  123. package/src/queen/queen-memory-system.ts +0 -490
  124. package/src/queen/queen-memory.ts +0 -456
  125. package/src/queen/servicenow-queen.ts +0 -1029
  126. package/src/queen/types.ts +0 -87
  127. package/src/rollback/smart-rollback-system.ts +0 -866
  128. package/src/schemas/deployment.schema.json +0 -58
  129. package/src/schemas/flow.schema.json +0 -79
  130. package/src/schemas/widget.schema.json +0 -72
  131. package/src/snow-flow-system.ts +0 -541
  132. package/src/sparc/sparc-help.ts +0 -49
  133. package/src/sparc/team-sparc.ts +0 -88
  134. package/src/strategies/global-scope-strategy.ts +0 -736
  135. package/src/templates/base/application.template.json +0 -45
  136. package/src/templates/base/business_rule.template.json +0 -33
  137. package/src/templates/base/script_include.template.json +0 -18
  138. package/src/templates/base/table.template.json +0 -64
  139. package/src/templates/base/widget.template.json +0 -25
  140. package/src/templates/patterns/composite.incident-management.template.json +0 -140
  141. package/src/templates/patterns/widget.dashboard.template.json +0 -238
  142. package/src/templates/patterns/widget.datatable.template.json +0 -292
  143. package/src/testing/integration-test-suite.ts +0 -1276
  144. package/src/types/index.ts +0 -183
  145. package/src/types/neo4j-driver.d.ts +0 -23
  146. package/src/types/servicenow.types.ts +0 -307
  147. package/src/types/snow-flow.types.ts +0 -186
  148. package/src/types/todo.types.ts +0 -70
  149. package/src/utils/action-type-cache.ts +0 -286
  150. package/src/utils/agent-detector.ts +0 -573
  151. package/src/utils/artifact-tracker.ts +0 -379
  152. package/src/utils/dependency-detector.ts +0 -233
  153. package/src/utils/deployment-metadata-handler.ts +0 -518
  154. package/src/utils/error-recovery.ts +0 -680
  155. package/src/utils/logger.ts +0 -60
  156. package/src/utils/mcp-auth-middleware.ts +0 -262
  157. package/src/utils/mcp-config-manager.ts +0 -270
  158. package/src/utils/mcp-server-manager.ts +0 -446
  159. package/src/utils/mcp-tool-registry.ts +0 -298
  160. package/src/utils/migrate-snow-flow.ts +0 -98
  161. package/src/utils/oauth-html-templates.ts +0 -188
  162. package/src/utils/scope-utils.ts +0 -443
  163. package/src/utils/servicenow-client.ts +0 -3321
  164. package/src/utils/servicenow-id-generator.ts +0 -181
  165. package/src/utils/snow-memory-manager.ts +0 -605
  166. package/src/utils/snow-oauth.ts +0 -797
  167. package/src/utils/template-engine.ts +0 -463
  168. package/src/utils/theme-manager.ts +0 -295
  169. package/src/utils/unified-auth-store.ts +0 -222
  170. package/src/utils/update-set-importer.ts +0 -422
  171. package/src/utils/update-set-xml-packager.ts +0 -371
  172. package/src/utils/widget-template-generator.ts +0 -1744
  173. package/src/version.ts +0 -1950
@@ -1,568 +0,0 @@
1
- /**
2
- * Widget Creator Agent
3
- * Specializes in creating ServiceNow Service Portal widgets
4
- */
5
-
6
- import { BaseAgent, AgentConfig, AgentResult } from './base-agent';
7
- import { ServiceNowArtifact } from '../queen/types';
8
-
9
- export class WidgetCreatorAgent extends BaseAgent {
10
- constructor(config?: Partial<AgentConfig>) {
11
- super({
12
- type: 'widget-creator',
13
- capabilities: [
14
- 'HTML template creation',
15
- 'CSS styling and responsive design',
16
- 'Client-side JavaScript',
17
- 'Server-side data processing',
18
- 'Chart.js integration',
19
- 'ServiceNow widget deployment',
20
- 'Angular.js directives',
21
- 'Bootstrap styling',
22
- 'Data visualization'
23
- ],
24
- mcpTools: [
25
- 'snow_deploy',
26
- 'snow_preview_widget',
27
- 'snow_widget_test',
28
- 'snow_catalog_item_search',
29
- 'snow_find_artifact'
30
- ],
31
- ...config
32
- });
33
- }
34
-
35
- async execute(instruction: string, context?: Record<string, any>): Promise<AgentResult> {
36
- try {
37
- this.setStatus('working');
38
- await this.reportProgress('Starting widget creation', 0);
39
-
40
- // Analyze widget requirements from instruction
41
- const requirements = await this.analyzeWidgetRequirements(instruction);
42
- await this.reportProgress('Analyzed requirements', 20);
43
-
44
- // Check for existing similar widgets
45
- const existingWidgets = await this.checkExistingWidgets(requirements);
46
- if (existingWidgets.length > 0) {
47
- await this.reportProgress('Found existing widgets to reference', 30);
48
- }
49
-
50
- // Create widget components
51
- const template = await this.createHTMLTemplate(requirements);
52
- await this.reportProgress('Created HTML template', 40);
53
-
54
- const css = await this.createCSS(requirements);
55
- await this.reportProgress('Created CSS styling', 50);
56
-
57
- const clientScript = await this.createClientScript(requirements);
58
- await this.reportProgress('Created client script', 60);
59
-
60
- const serverScript = await this.createServerScript(requirements);
61
- await this.reportProgress('Created server script', 70);
62
-
63
- // Generate demo data if needed
64
- const demoData = requirements.needsDemoData ?
65
- await this.generateDemoData(requirements) : null;
66
- await this.reportProgress('Generated demo data', 80);
67
-
68
- // Create widget configuration
69
- const widgetConfig = {
70
- name: requirements.name,
71
- title: requirements.title || requirements.name,
72
- template,
73
- css,
74
- client_script: clientScript,
75
- server_script: serverScript,
76
- demo_data: demoData,
77
- description: requirements.description,
78
- category: requirements.category || 'custom'
79
- };
80
-
81
- // Create widget artifact
82
- const artifact: ServiceNowArtifact = {
83
- type: 'widget',
84
- name: requirements.name,
85
- config: widgetConfig,
86
- dependencies: requirements.dependencies || []
87
- };
88
-
89
- // Store artifact for other agents
90
- await this.storeArtifact(artifact);
91
- await this.reportProgress('Widget artifact created and stored', 90);
92
-
93
- // Prepare deployment instructions
94
- const deploymentInstructions = this.prepareDeploymentInstructions(widgetConfig);
95
-
96
- await this.reportProgress('Widget creation completed', 100);
97
- this.setStatus('completed');
98
-
99
- await this.logActivity('widget_creation', true, {
100
- widgetName: requirements.name,
101
- features: requirements.features
102
- });
103
-
104
- return {
105
- success: true,
106
- artifacts: [artifact],
107
- message: `Widget "${requirements.title}" created successfully`,
108
- metadata: {
109
- deploymentInstructions,
110
- features: requirements.features,
111
- dependencies: requirements.dependencies
112
- }
113
- };
114
-
115
- } catch (error) {
116
- this.setStatus('failed');
117
- await this.logActivity('widget_creation', false, { error: error.message });
118
-
119
- return {
120
- success: false,
121
- error: error as Error,
122
- message: `Failed to create widget: ${error.message}`
123
- };
124
- }
125
- }
126
-
127
- private async analyzeWidgetRequirements(instruction: string): Promise<any> {
128
- const requirements = {
129
- name: '',
130
- title: '',
131
- description: instruction,
132
- features: [] as string[],
133
- dataSource: '',
134
- needsChart: false,
135
- needsTable: false,
136
- needsForm: false,
137
- needsDemoData: true,
138
- isResponsive: true,
139
- dependencies: [] as string[],
140
- category: 'custom'
141
- };
142
-
143
- // Extract widget name
144
- const nameMatch = instruction.match(/(?:create|build|make)\s+(?:a\s+)?([a-zA-Z0-9_\s]+)\s*(?:widget|component)/i);
145
- if (nameMatch) {
146
- requirements.name = nameMatch[1].trim().toLowerCase().replace(/\s+/g, '_');
147
- requirements.title = nameMatch[1].trim();
148
- }
149
-
150
- // Feature detection
151
- if (/chart|graph|visualization|analytics/i.test(instruction)) {
152
- requirements.needsChart = true;
153
- requirements.features.push('data-visualization');
154
- requirements.dependencies.push('Chart.js');
155
- }
156
-
157
- if (/table|list|grid|records/i.test(instruction)) {
158
- requirements.needsTable = true;
159
- requirements.features.push('data-table');
160
- }
161
-
162
- if (/form|input|submit|create/i.test(instruction)) {
163
- requirements.needsForm = true;
164
- requirements.features.push('form-input');
165
- }
166
-
167
- if (/incident/i.test(instruction)) {
168
- requirements.dataSource = 'incident';
169
- requirements.category = 'itsm';
170
- } else if (/request|catalog/i.test(instruction)) {
171
- requirements.dataSource = 'sc_request';
172
- requirements.category = 'service-catalog';
173
- } else if (/task/i.test(instruction)) {
174
- requirements.dataSource = 'task';
175
- requirements.category = 'task-management';
176
- }
177
-
178
- if (/real[\s-]?time|live|refresh/i.test(instruction)) {
179
- requirements.features.push('real-time-updates');
180
- }
181
-
182
- if (/mobile|responsive/i.test(instruction)) {
183
- requirements.features.push('mobile-optimized');
184
- }
185
-
186
- return requirements;
187
- }
188
-
189
- private async checkExistingWidgets(requirements: any): Promise<any[]> {
190
- // This would use snow_find_artifact to check for existing widgets
191
- // For now, return empty array as we're implementing the agent structure
192
- return [];
193
- }
194
-
195
- private async createHTMLTemplate(requirements: any): Promise<string> {
196
- let template = '<div class="widget-container">\n';
197
-
198
- // Add header
199
- template += ` <div class="widget-header">\n`;
200
- template += ` <h3>${requirements.title || 'Widget'}</h3>\n`;
201
- template += ` </div>\n`;
202
-
203
- template += ' <div class="widget-body">\n';
204
-
205
- // Add chart container if needed
206
- if (requirements.needsChart) {
207
- template += ' <div class="chart-container">\n';
208
- template += ' <canvas id="widgetChart" width="400" height="200"></canvas>\n';
209
- template += ' </div>\n';
210
- }
211
-
212
- // Add table if needed
213
- if (requirements.needsTable) {
214
- template += ' <div class="table-container">\n';
215
- template += ' <table class="table table-striped">\n';
216
- template += ' <thead>\n';
217
- template += ' <tr>\n';
218
- template += ' <th ng-repeat="col in data.columns">{{col.label}}</th>\n';
219
- template += ' </tr>\n';
220
- template += ' </thead>\n';
221
- template += ' <tbody>\n';
222
- template += ' <tr ng-repeat="row in data.rows">\n';
223
- template += ' <td ng-repeat="col in data.columns">{{row[col.field]}}</td>\n';
224
- template += ' </tr>\n';
225
- template += ' </tbody>\n';
226
- template += ' </table>\n';
227
- template += ' </div>\n';
228
- }
229
-
230
- // Add form if needed
231
- if (requirements.needsForm) {
232
- template += ' <form class="widget-form" ng-submit="submitForm()">\n';
233
- template += ' <div class="form-group">\n';
234
- template += ' <input type="text" class="form-control" ng-model="formData.input" placeholder="Enter value">\n';
235
- template += ' </div>\n';
236
- template += ' <button type="submit" class="btn btn-primary">Submit</button>\n';
237
- template += ' </form>\n';
238
- }
239
-
240
- template += ' </div>\n';
241
- template += '</div>';
242
-
243
- return template;
244
- }
245
-
246
- private async createCSS(requirements: any): Promise<string> {
247
- let css = `/* ${requirements.title} Widget Styles */\n\n`;
248
-
249
- css += '.widget-container {\n';
250
- css += ' padding: 15px;\n';
251
- css += ' background-color: #fff;\n';
252
- css += ' border-radius: 4px;\n';
253
- css += ' box-shadow: 0 1px 3px rgba(0,0,0,0.12);\n';
254
- css += '}\n\n';
255
-
256
- css += '.widget-header {\n';
257
- css += ' margin-bottom: 20px;\n';
258
- css += ' padding-bottom: 10px;\n';
259
- css += ' border-bottom: 1px solid #e7e7e7;\n';
260
- css += '}\n\n';
261
-
262
- css += '.widget-header h3 {\n';
263
- css += ' margin: 0;\n';
264
- css += ' color: #333;\n';
265
- css += ' font-size: 18px;\n';
266
- css += ' font-weight: 600;\n';
267
- css += '}\n\n';
268
-
269
- if (requirements.needsChart) {
270
- css += '.chart-container {\n';
271
- css += ' position: relative;\n';
272
- css += ' height: 300px;\n';
273
- css += ' margin-bottom: 20px;\n';
274
- css += '}\n\n';
275
- }
276
-
277
- if (requirements.needsTable) {
278
- css += '.table-container {\n';
279
- css += ' overflow-x: auto;\n';
280
- css += ' margin-bottom: 20px;\n';
281
- css += '}\n\n';
282
-
283
- css += '.table {\n';
284
- css += ' width: 100%;\n';
285
- css += ' margin-bottom: 0;\n';
286
- css += '}\n\n';
287
- }
288
-
289
- if (requirements.isResponsive) {
290
- css += '/* Responsive styles */\n';
291
- css += '@media (max-width: 768px) {\n';
292
- css += ' .widget-container {\n';
293
- css += ' padding: 10px;\n';
294
- css += ' }\n';
295
- css += ' \n';
296
- css += ' .widget-header h3 {\n';
297
- css += ' font-size: 16px;\n';
298
- css += ' }\n';
299
- css += '}\n';
300
- }
301
-
302
- return css;
303
- }
304
-
305
- private async createClientScript(requirements: any): Promise<string> {
306
- let script = 'function WidgetController($scope, $http, $timeout) {\n';
307
- script += ' var c = this;\n\n';
308
-
309
- // Initialize data
310
- script += ' // Initialize widget data\n';
311
- script += ' c.data = c.data || {};\n';
312
- script += ' $scope.data = c.data;\n\n';
313
-
314
- if (requirements.needsChart) {
315
- script += ' // Chart initialization\n';
316
- script += ' $timeout(function() {\n';
317
- script += ' if (c.data.chartData) {\n';
318
- script += ' initializeChart(c.data.chartData);\n';
319
- script += ' }\n';
320
- script += ' }, 100);\n\n';
321
-
322
- script += ' function initializeChart(chartData) {\n';
323
- script += ' var ctx = document.getElementById("widgetChart").getContext("2d");\n';
324
- script += ' new Chart(ctx, {\n';
325
- script += ' type: chartData.type || "bar",\n';
326
- script += ' data: chartData,\n';
327
- script += ' options: {\n';
328
- script += ' responsive: true,\n';
329
- script += ' maintainAspectRatio: false\n';
330
- script += ' }\n';
331
- script += ' });\n';
332
- script += ' }\n\n';
333
- }
334
-
335
- if (requirements.needsForm) {
336
- script += ' // Form submission\n';
337
- script += ' $scope.formData = {};\n';
338
- script += ' $scope.submitForm = function() {\n';
339
- script += ' c.server.get({\n';
340
- script += ' action: "submit",\n';
341
- script += ' data: $scope.formData\n';
342
- script += ' }).then(function(response) {\n';
343
- script += ' // Handle response\n';
344
- script += ' if (response.data.success) {\n';
345
- script += ' $scope.formData = {};\n';
346
- script += ' // Refresh data if needed\n';
347
- script += ' }\n';
348
- script += ' });\n';
349
- script += ' };\n\n';
350
- }
351
-
352
- if (requirements.features.includes('real-time-updates')) {
353
- script += ' // Real-time updates\n';
354
- script += ' var refreshInterval = $timeout(function refresh() {\n';
355
- script += ' c.server.get({ action: "refresh" }).then(function(response) {\n';
356
- script += ' c.data = response.data;\n';
357
- script += ' $scope.data = c.data;\n';
358
- script += ' refreshInterval = $timeout(refresh, 30000); // Refresh every 30 seconds\n';
359
- script += ' });\n';
360
- script += ' }, 30000);\n\n';
361
-
362
- script += ' $scope.$on("$destroy", function() {\n';
363
- script += ' if (refreshInterval) {\n';
364
- script += ' $timeout.cancel(refreshInterval);\n';
365
- script += ' }\n';
366
- script += ' });\n';
367
- }
368
-
369
- script += '}';
370
-
371
- return script;
372
- }
373
-
374
- private async createServerScript(requirements: any): Promise<string> {
375
- let script = '(function() {\n';
376
- script += ' /* Server Script for ' + requirements.title + ' */\n\n';
377
-
378
- script += ' try {\n';
379
-
380
- // Handle different actions
381
- script += ' var action = input.action || "load";\n';
382
- script += ' gs.log("Widget action: " + action, "' + requirements.name + '");\n\n';
383
-
384
- script += ' if (action === "load") {\n';
385
- script += ' loadWidgetData();\n';
386
- script += ' } else if (action === "refresh") {\n';
387
- script += ' loadWidgetData();\n';
388
- script += ' } else if (action === "submit") {\n';
389
- script += ' handleFormSubmission();\n';
390
- script += ' }\n\n';
391
-
392
- // Load data function
393
- script += ' function loadWidgetData() {\n';
394
- script += ' try {\n';
395
- script += ' data.title = "' + requirements.title + '";\n';
396
- script += ' gs.log("Loading widget data for: " + data.title, "' + requirements.name + '");\n';
397
-
398
- if (requirements.dataSource) {
399
- script += ' \n // Query ' + requirements.dataSource + ' table\n';
400
- script += ' var gr = new GlideRecord("' + requirements.dataSource + '");\n';
401
- script += ' gr.addQuery("active", "true"); // ✅ FIXED: Use string instead of boolean\n';
402
- script += ' gr.orderByDesc("sys_created_on");\n';
403
- script += ' gr.setLimit(10);\n';
404
- script += ' gr.query();\n';
405
- script += ' \n var recordCount = gr.getRowCount();\n';
406
- script += ' gs.log("Found " + recordCount + " active records", "' + requirements.name + '");\n\n';
407
-
408
- if (requirements.needsTable) {
409
- script += ' // Prepare table data\n';
410
- script += ' data.columns = [\n';
411
- script += ' { field: "number", label: "Number" },\n';
412
- script += ' { field: "short_description", label: "Description" },\n';
413
- script += ' { field: "state", label: "State" },\n';
414
- script += ' { field: "caller", label: "Caller" }\n';
415
- script += ' ];\n';
416
- script += ' data.rows = [];\n\n';
417
-
418
- script += ' while (gr.next()) {\n';
419
- script += ' var row = {\n';
420
- script += ' sys_id: gr.getUniqueValue(),\n';
421
- script += ' number: gr.getValue("number") || "",\n';
422
- script += ' short_description: gr.getValue("short_description") || "",\n';
423
- script += ' state: gr.getDisplayValue("state") || "Unknown",\n';
424
- script += ' caller: ""\n';
425
- script += ' };\n\n';
426
-
427
- script += ' // ✅ FIXED: Safe caller info lookup with proper null checks\n';
428
- script += ' if (gr.caller_id && !gr.caller_id.nil()) {\n';
429
- script += ' try {\n';
430
- script += ' var callerGr = new GlideRecord("sys_user");\n';
431
- script += ' if (callerGr.get(gr.caller_id.toString())) {\n';
432
- script += ' // ✅ FIXED: Name field with fallback\n';
433
- script += ' var callerName = callerGr.getDisplayValue("name");\n';
434
- script += ' if (!callerName) {\n';
435
- script += ' var firstName = callerGr.getValue("first_name") || "";\n';
436
- script += ' var lastName = callerGr.getValue("last_name") || "";\n';
437
- script += ' callerName = (firstName + " " + lastName).trim() || "Unknown User";\n';
438
- script += ' }\n';
439
- script += ' row.caller = callerName;\n';
440
- script += ' } else {\n';
441
- script += ' row.caller = "User Not Found";\n';
442
- script += ' }\n';
443
- script += ' } catch (callerError) {\n';
444
- script += ' gs.warn("Error fetching caller info: " + callerError.message, "' + requirements.name + '");\n';
445
- script += ' row.caller = "Error Loading User";\n';
446
- script += ' }\n';
447
- script += ' } else {\n';
448
- script += ' row.caller = "No Caller";\n';
449
- script += ' }\n\n';
450
-
451
- script += ' data.rows.push(row);\n';
452
- script += ' }\n';
453
- script += ' \n gs.log("Processed " + data.rows.length + " table rows", "' + requirements.name + '");\n';
454
- }
455
-
456
- if (requirements.needsChart) {
457
- script += ' \n // Prepare chart data\n';
458
- script += ' var chartData = {\n';
459
- script += ' type: "bar",\n';
460
- script += ' labels: [],\n';
461
- script += ' datasets: [{\n';
462
- script += ' label: "' + requirements.dataSource + ' by State",\n';
463
- script += ' data: [],\n';
464
- script += ' backgroundColor: ["#428bca", "#5cb85c", "#d9534f", "#f0ad4e"]\n';
465
- script += ' }]\n';
466
- script += ' };\n\n';
467
-
468
- script += ' // Aggregate data for chart\n';
469
- script += ' var stateCount = {};\n';
470
- script += ' gr.rewind();\n';
471
- script += ' while (gr.next()) {\n';
472
- script += ' var state = gr.getDisplayValue("state") || "Unknown";\n';
473
- script += ' stateCount[state] = (stateCount[state] || 0) + 1;\n';
474
- script += ' }\n\n';
475
-
476
- script += ' for (var state in stateCount) {\n';
477
- script += ' chartData.labels.push(state);\n';
478
- script += ' chartData.datasets[0].data.push(stateCount[state]);\n';
479
- script += ' }\n';
480
- script += ' data.chartData = chartData;\n';
481
- script += ' gs.log("Chart prepared with " + chartData.labels.length + " categories", "' + requirements.name + '");\n';
482
- }
483
- }
484
-
485
- script += ' } catch (loadError) {\n';
486
- script += ' gs.error("Error loading widget data: " + loadError.message, "' + requirements.name + '");\n';
487
- script += ' data.error = "Error loading data: " + loadError.message;\n';
488
- script += ' data.success = false;\n';
489
- script += ' }\n';
490
- script += ' }\n\n';
491
-
492
- if (requirements.needsForm) {
493
- script += ' function handleFormSubmission() {\n';
494
- script += ' try {\n';
495
- script += ' var formData = input.data || {};\n';
496
- script += ' gs.log("Processing form submission", "' + requirements.name + '");\n';
497
- script += ' \n';
498
- script += ' // ✅ FIXED: Validate form data\n';
499
- script += ' if (!formData || Object.keys(formData).length === 0) {\n';
500
- script += ' throw new Error("No form data provided");\n';
501
- script += ' }\n';
502
- script += ' \n';
503
- script += ' // Process form submission\n';
504
- script += ' // Add your form processing logic here\n';
505
- script += ' \n';
506
- script += ' data.success = true;\n';
507
- script += ' data.message = "Form submitted successfully";\n';
508
- script += ' gs.log("Form submission successful", "' + requirements.name + '");\n';
509
- script += ' } catch (formError) {\n';
510
- script += ' gs.error("Error processing form: " + formError.message, "' + requirements.name + '");\n';
511
- script += ' data.success = false;\n';
512
- script += ' data.error = "Form submission failed: " + formError.message;\n';
513
- script += ' }\n';
514
- script += ' }\n';
515
- }
516
-
517
- script += ' } catch (error) {\n';
518
- script += ' gs.error("Critical widget error: " + error.message, "' + requirements.name + '");\n';
519
- script += ' data.error = "Widget error: " + error.message;\n';
520
- script += ' data.success = false;\n';
521
- script += ' }\n';
522
- script += '})();';
523
-
524
- return script;
525
- }
526
-
527
- private async generateDemoData(requirements: any): Promise<any> {
528
- const demoData: any = {};
529
-
530
- if (requirements.needsTable) {
531
- demoData.rows = [
532
- { number: 'INC0010001', short_description: 'Network connectivity issue', state: 'Open' },
533
- { number: 'INC0010002', short_description: 'Software installation request', state: 'In Progress' },
534
- { number: 'INC0010003', short_description: 'Password reset', state: 'Resolved' }
535
- ];
536
- }
537
-
538
- if (requirements.needsChart) {
539
- demoData.chartData = {
540
- type: 'bar',
541
- labels: ['Open', 'In Progress', 'Resolved', 'Closed'],
542
- datasets: [{
543
- label: 'Records by State',
544
- data: [12, 8, 15, 5],
545
- backgroundColor: ['#428bca', '#5cb85c', '#f0ad4e', '#d9534f']
546
- }]
547
- };
548
- }
549
-
550
- return demoData;
551
- }
552
-
553
- private prepareDeploymentInstructions(widgetConfig: any): any {
554
- return {
555
- mcpTool: 'snow_deploy',
556
- parameters: {
557
- type: 'widget',
558
- config: widgetConfig
559
- },
560
- validationSteps: [
561
- 'Preview widget using snow_preview_widget',
562
- 'Test widget functionality with snow_widget_test',
563
- 'Verify responsive design on mobile devices',
564
- 'Check data binding and server script execution'
565
- ]
566
- };
567
- }
568
- }