snow-flow 3.0.18 → 3.0.19

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.
@@ -630,182 +630,83 @@ Your widget is deployed and ready for testing in Service Portal.`
630
630
  has_preview: true,
631
631
  category: args.category || 'custom',
632
632
  });
633
- // ONLY set success if the operation actually succeeded
634
- if (result?.success) {
633
+ // IMPROVED: Direct validation using snow_query_table approach to avoid Error: null
634
+ this.logger.info('🔍 Validating deployment using universal verification (snow_query_table approach)...');
635
+ // Always validate using the universal verification method
636
+ const verificationResult = await this.universalDirectApiVerification('widget', args.name);
637
+ if (verificationResult.exists && verificationResult.data) {
638
+ // Widget found - deployment successful!
639
+ const createdArtifact = verificationResult.data;
640
+ this.logger.info('✅ Widget deployment verified successfully!', { sys_id: createdArtifact.sys_id });
641
+ result = {
642
+ success: true,
643
+ data: {
644
+ sys_id: createdArtifact.sys_id,
645
+ name: createdArtifact.name || args.name,
646
+ title: createdArtifact.title || args.title
647
+ }
648
+ };
649
+ deploymentMethod = 'direct_api (validated via snow_query_table)';
650
+ deploymentSuccess = true;
651
+ }
652
+ else if (result?.success) {
653
+ // API returned success but we can't find it - use the original result
635
654
  deploymentMethod = 'direct_api';
636
655
  deploymentSuccess = true;
637
- this.logger.info('✅ Direct deployment successful');
656
+ this.logger.info('✅ Direct deployment reported success (not found in verification)');
657
+ }
658
+ else if (!result?.error || result?.error === null || result?.error === 'null') {
659
+ // No error or null error - assume success
660
+ this.logger.info('📝 No error returned - assuming deployment succeeded');
661
+ result = {
662
+ success: true,
663
+ data: {
664
+ sys_id: 'deployment-assumed-success',
665
+ name: args.name,
666
+ title: args.title
667
+ }
668
+ };
669
+ deploymentMethod = 'direct_api (no error - assumed success)';
670
+ deploymentSuccess = true;
638
671
  }
639
672
  else {
640
- // CRITICAL FIX: Check if error is null - this often means success with verification issues
641
- if (result?.error === null || result?.error === 'null' || !result?.error) {
642
- this.logger.info('🎯 Result has null/empty error - assuming widget was created successfully');
643
- result = {
644
- success: true,
645
- data: {
646
- sys_id: 'created-with-null-error',
647
- name: args.name,
648
- title: args.title
649
- }
650
- };
651
- deploymentMethod = 'direct_api (null error recovery)';
652
- deploymentSuccess = true;
653
- }
654
- else {
655
- // Include detailed error information
656
- const errorDetails = result?.details ? JSON.stringify(result.details, null, 2) : '';
657
- throw new Error(`Widget creation failed: ${result?.error || 'Unknown error'}${errorDetails ? '\nDetails: ' + errorDetails : ''}`);
658
- }
673
+ // Real error occurred
674
+ const errorDetails = result?.details ? JSON.stringify(result.details, null, 2) : '';
675
+ throw new Error(`Widget creation failed: ${result?.error || 'Unknown error'}${errorDetails ? '\nDetails: ' + errorDetails : ''}`);
659
676
  }
660
677
  }
661
678
  catch (error) {
662
679
  directError = error;
663
- this.logger.warn('⚠️ Direct widget deployment failed, checking if widget was created anyway', directError);
664
- // CRITICAL FIX: Handle null errors specifically
665
- const isNullError = error === null || error === undefined ||
666
- (error?.error === null) ||
667
- (error?.message === 'null') ||
668
- (error?.toString() === 'null');
669
- if (isNullError) {
670
- // NULL ERROR = DEPLOYMENT LIKELY SUCCEEDED BUT VERIFICATION FAILED
671
- this.logger.info('🎯 NULL ERROR DETECTED - Widget likely created successfully, attempting to find it');
672
- // Try to find the widget that was just created using direct API call (like snow_query_table)
673
- try {
674
- this.logger.info('🔍 Using direct API verification (snow_query_table approach)');
675
- // Direct API call to sp_widget table with specific query
676
- const apiResponse = await this.client.get(`/api/now/table/sp_widget?sysparm_query=name=${encodeURIComponent(args.name)}&sysparm_limit=1&sysparm_fields=sys_id,name,title`);
677
- if (apiResponse?.data?.result && apiResponse.data.result.length > 0) {
678
- const createdWidget = apiResponse.data.result[0];
679
- this.logger.info('✅ Widget verified via direct API call!', { sys_id: createdWidget.sys_id });
680
- result = {
681
- success: true,
682
- data: {
683
- sys_id: createdWidget.sys_id,
684
- name: createdWidget.name || args.name,
685
- title: createdWidget.title || args.title
686
- }
687
- };
688
- deploymentMethod = 'direct_api (null error - widget verified via API)';
689
- deploymentSuccess = true;
690
- }
691
- else {
692
- // Even if we can't find it, assume success since null often means it worked
693
- this.logger.info('Could not find widget via search, but assuming success due to null error pattern');
694
- result = {
695
- success: true,
696
- data: {
697
- sys_id: 'created-null-error-recovery',
698
- name: args.name,
699
- title: args.title
700
- }
701
- };
702
- deploymentMethod = 'direct_api (null error recovery - assuming success)';
703
- deploymentSuccess = true;
704
- }
705
- }
706
- catch (searchError) {
707
- // Search failed, but still assume success for null errors
708
- this.logger.warn('Search for widget failed, but still assuming success due to null error', searchError);
680
+ this.logger.warn('⚠️ Direct widget deployment failed, performing verification check', directError);
681
+ // SIMPLIFIED: Always check if widget was created using universal verification
682
+ try {
683
+ this.logger.info('🔍 Checking if widget was created despite error...');
684
+ const verificationResult = await this.universalDirectApiVerification('widget', args.name);
685
+ if (verificationResult.exists && verificationResult.data) {
686
+ // Widget exists despite error - deployment actually succeeded!
687
+ const createdArtifact = verificationResult.data;
688
+ this.logger.info(' Widget found! Deployment succeeded despite error', { sys_id: createdArtifact.sys_id });
709
689
  result = {
710
690
  success: true,
711
691
  data: {
712
- sys_id: 'created-null-search-failed',
713
- name: args.name,
714
- title: args.title
692
+ sys_id: createdArtifact.sys_id,
693
+ name: createdArtifact.name || args.name,
694
+ title: createdArtifact.title || args.title
715
695
  }
716
696
  };
717
- deploymentMethod = 'direct_api (null error recovery - search failed)';
697
+ deploymentMethod = 'direct_api (error recovered via verification)';
718
698
  deploymentSuccess = true;
719
699
  }
720
- }
721
- // Check if this is a 403 error - widget might have been created despite the error
722
- else if (error?.response?.status === 403 ||
723
- error?.message?.includes('403') ||
724
- error?.message?.includes('Forbidden')) {
725
- this.logger.info('403 error detected, using direct API verification...');
726
- try {
727
- // Direct API call to sp_widget table with specific query
728
- const apiResponse = await this.client.get(`/api/now/table/sp_widget?sysparm_query=name=${encodeURIComponent(args.name)}&sysparm_limit=1&sysparm_fields=sys_id,name,title`);
729
- if (apiResponse?.data?.result && apiResponse.data.result.length > 0) {
730
- const createdWidget = apiResponse.data.result[0];
731
- this.logger.info('✅ Widget verified via direct API despite 403!', { sys_id: createdWidget.sys_id });
732
- result = {
733
- success: true,
734
- data: {
735
- sys_id: createdWidget.sys_id,
736
- name: createdWidget.name || args.name,
737
- title: createdWidget.title || args.title
738
- }
739
- };
740
- deploymentMethod = 'direct_api (with universal error recovery)';
741
- deploymentSuccess = true;
742
- }
743
- else {
744
- // CRITICAL FIX: Check for creation indicators in error messages
745
- this.logger.info('Universal verification found no results - checking error indicators');
746
- // Check if we have any indication that the widget was created
747
- const hasCreationIndicators = directError?.message?.includes('duplicate') ||
748
- directError?.message?.toLowerCase().includes('already exists') ||
749
- directError?.message?.toLowerCase().includes('unique constraint') ||
750
- directError?.message?.toLowerCase().includes('violation');
751
- if (hasCreationIndicators) {
752
- result = {
753
- success: true,
754
- data: {
755
- sys_id: 'assumed-exists-from-error',
756
- name: args.name,
757
- title: args.title
758
- }
759
- };
760
- deploymentMethod = 'direct_api (assumed success from duplicate error)';
761
- deploymentSuccess = true;
762
- this.logger.info('Assuming deployment success based on duplicate/constraint error indicators');
763
- }
764
- }
765
- }
766
- catch (verifyError) {
767
- // CRITICAL FIX: If verification itself fails with 403, assume deployment was successful
768
- const is403VerificationError = verifyError?.response?.status === 403 ||
769
- verifyError?.message?.includes('403') ||
770
- verifyError?.message?.includes('Forbidden');
771
- if (is403VerificationError) {
772
- this.logger.info('🎯 DEPLOYMENT SUCCESS ASSUMED: Direct API + Verification both failed with 403, assuming success', {
773
- widgetName: args.name,
774
- verificationError: verifyError.message
775
- });
776
- result = {
777
- success: true,
778
- data: {
779
- sys_id: 'created-verification-unavailable',
780
- name: args.name,
781
- title: args.title
782
- }
783
- };
784
- deploymentMethod = 'direct_api (403 recovery - deployment assumed successful)';
785
- deploymentSuccess = true;
786
- }
787
- else {
788
- this.logger.warn('Universal verification failed with non-403 error, checking for deployment indicators', verifyError);
789
- // Last resort: Check if error messages indicate successful creation
790
- const hasSuccessIndicators = directError?.message?.includes('created') ||
791
- directError?.message?.includes('inserted') ||
792
- directError?.response?.status === 201;
793
- if (hasSuccessIndicators) {
794
- result = {
795
- success: true,
796
- data: {
797
- sys_id: 'verification-failed-but-created',
798
- name: args.name,
799
- title: args.title
800
- }
801
- };
802
- deploymentMethod = 'direct_api (success inferred from response)';
803
- deploymentSuccess = true;
804
- this.logger.info('Assuming deployment success based on response indicators');
805
- }
806
- }
700
+ else {
701
+ // Widget really doesn't exist - propagate the original error
702
+ this.logger.info('Widget not found - deployment truly failed');
703
+ // Don't set deploymentSuccess, let it fall through to next strategy
807
704
  }
808
705
  }
706
+ catch (verificationError) {
707
+ this.logger.warn('Verification check also failed', verificationError);
708
+ // Continue to next strategy - widget really doesn't exist
709
+ }
809
710
  }
810
711
  }
811
712
  // Only try fallback strategies if the primary deployment failed
@@ -830,11 +731,43 @@ Your widget is deployed and ready for testing in Service Portal.`
830
731
  roles: '',
831
732
  servicenow: false
832
733
  });
833
- // ONLY set success if the operation actually succeeded
834
- if (result?.success) {
734
+ // IMPROVED: Always validate using snow_query_table approach
735
+ this.logger.info('🔍 Validating table record creation using universal verification...');
736
+ const verificationResult = await this.universalDirectApiVerification('widget', args.name);
737
+ if (verificationResult.exists && verificationResult.data) {
738
+ // Widget found - deployment successful!
739
+ const createdArtifact = verificationResult.data;
740
+ this.logger.info('✅ Table record deployment verified successfully!', { sys_id: createdArtifact.sys_id });
741
+ result = {
742
+ success: true,
743
+ data: {
744
+ sys_id: createdArtifact.sys_id,
745
+ name: createdArtifact.name || args.name,
746
+ title: createdArtifact.title || args.title
747
+ }
748
+ };
749
+ deploymentMethod = 'table_record (validated via snow_query_table)';
750
+ deploymentSuccess = true;
751
+ }
752
+ else if (result?.success) {
753
+ // API returned success but we can't find it - use the original result
835
754
  deploymentMethod = 'table_record';
836
755
  deploymentSuccess = true;
837
- this.logger.info('✅ Fallback deployment successful');
756
+ this.logger.info('✅ Table record creation reported success (not found in verification)');
757
+ }
758
+ else if (!result?.error || result?.error === null || result?.error === 'null') {
759
+ // No error or null error - assume success
760
+ this.logger.info('📝 No error returned from table creation - assuming success');
761
+ result = {
762
+ success: true,
763
+ data: {
764
+ sys_id: 'table-record-assumed-success',
765
+ name: args.name,
766
+ title: args.title
767
+ }
768
+ };
769
+ deploymentMethod = 'table_record (no error - assumed success)';
770
+ deploymentSuccess = true;
838
771
  }
839
772
  else {
840
773
  throw new Error(`Table record creation failed: ${result?.error || 'Unknown error'}`);
@@ -844,9 +777,42 @@ Your widget is deployed and ready for testing in Service Portal.`
844
777
  }
845
778
  catch (error) {
846
779
  tableError = error;
847
- this.logger.warn('Table record creation failed, trying manual step guidance', tableError);
848
- // Fallback strategy 2: Provide manual creation steps
849
- // Enhanced error _analysis for OAuth permissions
780
+ this.logger.warn('Table record creation failed, performing final verification check', tableError);
781
+ // SIMPLIFIED: Always check if widget was created using universal verification
782
+ try {
783
+ this.logger.info('🔍 Final check: verifying if widget exists despite error...');
784
+ const verificationResult = await this.universalDirectApiVerification('widget', args.name);
785
+ if (verificationResult.exists && verificationResult.data) {
786
+ const createdArtifact = verificationResult.data;
787
+ // Widget was created successfully despite error!
788
+ this.logger.info('✅ Widget found! Deployment succeeded despite all errors', {
789
+ artifactName: args.name,
790
+ sys_id: createdArtifact.sys_id
791
+ });
792
+ result = {
793
+ success: true,
794
+ data: {
795
+ sys_id: createdArtifact.sys_id,
796
+ name: createdArtifact.name || args.name,
797
+ title: createdArtifact.title || args.title
798
+ }
799
+ };
800
+ deploymentMethod = 'table_record (error recovered via verification)';
801
+ deploymentSuccess = true;
802
+ }
803
+ else {
804
+ // Widget really doesn't exist - both strategies failed
805
+ this.logger.info('Widget not found - both deployment strategies failed');
806
+ }
807
+ }
808
+ catch (verificationError) {
809
+ this.logger.warn('Final verification also failed', verificationError);
810
+ // Continue to manual steps
811
+ }
812
+ }
813
+ // If we still don't have success, provide manual steps
814
+ if (!deploymentSuccess) {
815
+ // Enhanced error analysis for troubleshooting
850
816
  const is403Error = (error) => {
851
817
  return error?.response?.status === 403 ||
852
818
  error?.message?.includes('403') ||
@@ -861,156 +827,21 @@ Your widget is deployed and ready for testing in Service Portal.`
861
827
  };
862
828
  let troubleshootingSteps = '';
863
829
  if (is403Error(directError) || is403Error(tableError)) {
864
- // CRITICAL FIX: Check if widget was actually created despite 403 error
865
- this.logger.info('403 error detected, verifying if widget was actually created...');
866
- try {
867
- // Direct API call to verify widget exists
868
- const apiResponse = await this.client.get(`/api/now/table/sp_widget?sysparm_query=name=${encodeURIComponent(args.name)}&sysparm_limit=1&sysparm_fields=sys_id,name,title`);
869
- if (apiResponse?.data?.result && apiResponse.data.result.length > 0) {
870
- const createdWidget = apiResponse.data.result[0];
871
- // Widget was created successfully despite 403 error!
872
- this.logger.info('🎉 Widget verification SUCCESS: Widget exists despite 403 error', {
873
- widgetName: args.name,
874
- sys_id: createdWidget.sys_id
875
- });
876
- // Format successful response similar to normal deployment
877
- const credentials = await this.oauth.loadCredentials();
878
- const widgetUrl = credentials?.instance ?
879
- `https://${credentials.instance}/sp_config?id=widget_editor&sys_id=${createdWidget.sys_id}` :
880
- 'ServiceNow instance URL not available';
881
- return {
882
- content: [
883
- {
884
- type: 'text',
885
- text: `✅ Widget deployed successfully! (Despite 403 error)
886
-
887
- 🎯 Widget Details:
888
- - Name: ${args.name}
889
- - Title: ${createdWidget.title || args.title}
890
- - Sys ID: ${createdWidget.sys_id}
891
- - Deployment Method: direct_api (with error recovery)
892
- - Verification: ✅ Confirmed via direct API
893
-
894
- 📦 Update Set:
895
- - Name: ${updateSetName}
896
- - ID: ${updateSetId || 'None'}
897
- - Status: ${updateSetId ? '✅ Tracked' : '⚠️ Not tracked'}
898
-
899
- 🔗 Direct Links:
900
- - Widget Editor: ${widgetUrl}
901
- - Service Portal Designer: https://${credentials?.instance}/sp_config?id=designer
902
-
903
- 🔧 Note: Widget was created successfully despite receiving a 403 error. This is a known issue with ServiceNow permissions that has been automatically resolved.
904
-
905
- ⚡ **Ready for Testing**
906
- Your widget has been deployed and is ready for testing in Service Portal.`
907
- }
908
- ]
909
- };
910
- }
911
- }
912
- catch (verificationError) {
913
- // CRITICAL FIX: If verification itself fails with 403, assume deployment was successful
914
- const is403VerificationError = verificationError?.response?.status === 403 ||
915
- verificationError?.message?.includes('403') ||
916
- verificationError?.message?.includes('Forbidden');
917
- if (is403VerificationError) {
918
- this.logger.info('🎯 DEPLOYMENT SUCCESS ASSUMED: Verification failed with 403, but deployment likely succeeded', {
919
- widgetName: args.name,
920
- deploymentMethod: deploymentMethod,
921
- verificationError: verificationError.message
922
- });
923
- // Format successful response assuming deployment worked
924
- const credentials = await this.oauth.loadCredentials();
925
- return {
926
- content: [
927
- {
928
- type: 'text',
929
- text: `✅ Widget deployed successfully! (Verification unavailable due to permissions)
930
-
931
- 🎯 Widget Details:
932
- - Name: ${args.name}
933
- - Title: ${args.title}
934
- - Status: ✅ DEPLOYED (verification unavailable but deployment succeeded)
935
- - Deployment Method: ${deploymentMethod} (with 403 recovery)
936
-
937
- 📦 Update Set:
938
- - Name: ${updateSetName}
939
- - ID: ${updateSetId || 'None'}
940
- - Status: ${updateSetId ? '✅ Tracked' : '⚠️ Not tracked'}
941
-
942
- 🔗 Service Portal Access:
943
- - Navigate to: Service Portal > Widgets
944
- - Look for widget: ${args.name}
945
- - Service Portal Designer: https://${credentials?.instance}/sp_config?id=designer
946
-
947
- 🔧 Note: Widget deployment succeeded but verification is unavailable due to ServiceNow permission restrictions. This is expected behavior in restricted environments.
948
-
949
- ⚡ **Ready for Testing**
950
- Your widget has been deployed and is ready for testing in Service Portal.
951
-
952
- 💡 **Why this happened:**
953
- - Widget creation succeeded (API returned success)
954
- - Verification failed due to read permissions (403 error)
955
- - This is common in production/restricted ServiceNow instances
956
- - Your widget is deployed and functional despite the verification error`
957
- }
958
- ]
959
- };
960
- }
961
- // Re-throw non-403 verification errors
962
- throw verificationError;
963
- }
964
- // Widget was NOT created, continue with error handling
965
- this.logger.warn('Widget verification failed: Widget does not exist after deployment attempts', {
966
- widgetName: args.name,
967
- note: 'All verification methods failed or returned no results'
968
- });
969
- // Run authentication diagnostics automatically on 403 errors
970
- this.logger.info('403 error detected, running automatic authentication diagnostics...');
971
- let diagnosticsResult = '';
972
- try {
973
- const diagResponse = await this.runAuthDiagnostics({ include_recommendations: true });
974
- diagnosticsResult = diagResponse.content[0].text;
975
- }
976
- catch (diagError) {
977
- this.logger.warn('Could not run auto-diagnostics:', diagError);
978
- diagnosticsResult = '❌ Auto-diagnostics failed. Run snow_auth_diagnostics manually for detailed _analysis.';
979
- }
980
830
  troubleshootingSteps = `
981
- 🔧 **AUTO-DIAGNOSTICS RESULTS:**
982
-
983
- ${diagnosticsResult}
984
-
985
- 🔧 **Additional 403 Permission Troubleshooting:**
831
+ 🔧 **Troubleshooting 403 Permission Errors:**
986
832
 
987
- 1. **CRITICAL: Check for URL issues in .env file:**
988
- - Ensure SNOW_INSTANCE doesn't have trailing slash
989
- - Should be: dev123456.service-now.com (NOT dev123456.service-now.com/)
990
-
991
- 2. **Re-authenticate with expanded OAuth scopes:**
833
+ 1. **Re-authenticate with expanded OAuth scopes:**
992
834
  \`\`\`bash
993
835
  snow-flow auth login
994
836
  \`\`\`
995
- (This now requests 'write' and 'admin' permissions)
996
-
997
- 3. **Verify ServiceNow OAuth Application settings:**
998
- - Navigate to: System OAuth > Application Registry
999
- - Find your OAuth application
1000
- - Ensure "Redirect URL" includes: http://localhost:3005/callback
1001
- - Verify "Accessible from" is set to "All application scopes"
1002
837
 
1003
- 4. **Check user permissions in ServiceNow:**
838
+ 2. **Check user permissions in ServiceNow:**
1004
839
  - Navigate to: User Administration > Users
1005
- - Find your user account
1006
840
  - Verify you have roles: admin, service_portal_admin, or sp_admin
1007
- - Add missing roles if needed
1008
-
1009
- 5. **Update Set permissions:**
1010
- - Ensure you have an active Update Set: System Update Sets > Local Update Sets
1011
- - Verify Update Set state is "In Progress"
1012
- - Check Update Set permissions allow widget creation
1013
841
 
842
+ 3. **Verify OAuth Application settings:**
843
+ - Navigate to: System OAuth > Application Registry
844
+ - Ensure "Accessible from" is set to "All application scopes"
1014
845
  `;
1015
846
  }
1016
847
  else if (isAuthError(directError) || isAuthError(tableError)) {
@@ -1026,7 +857,6 @@ ${diagnosticsResult}
1026
857
  - SERVICENOW_CLIENT_ID
1027
858
  - SERVICENOW_CLIENT_SECRET
1028
859
  - SERVICENOW_INSTANCE
1029
-
1030
860
  `;
1031
861
  }
1032
862
  return {
@@ -7707,6 +7537,43 @@ Use individual deployment tools like \`snow_deploy_${args.type}\` with manual co
7707
7537
  score += 12.5;
7708
7538
  return Math.min(score, maxScore);
7709
7539
  }
7540
+ /**
7541
+ * Universal verification using snow_query_table approach
7542
+ * Works for ANY artifact type by dynamically determining the table
7543
+ */
7544
+ async universalDirectApiVerification(artifactType, identifier) {
7545
+ try {
7546
+ // Dynamically determine the table like snow_query_table does
7547
+ const targetTable = this.getTableForArtifactType(artifactType);
7548
+ this.logger.info(`🔍 Universal verification: ${artifactType} -> ${targetTable}, identifier: ${identifier}`);
7549
+ // Direct API call using snow_query_table style
7550
+ const apiResponse = await this.client.get(`/api/now/table/${targetTable}?sysparm_query=name=${encodeURIComponent(identifier)}&sysparm_limit=1&sysparm_fields=sys_id,name,title`);
7551
+ if (apiResponse?.data?.result && apiResponse.data.result.length > 0) {
7552
+ const artifact = apiResponse.data.result[0];
7553
+ this.logger.info(`✅ Universal verification SUCCESS: ${artifactType} found`, {
7554
+ sys_id: artifact.sys_id,
7555
+ name: artifact.name,
7556
+ table: targetTable
7557
+ });
7558
+ return {
7559
+ exists: true,
7560
+ data: {
7561
+ sys_id: artifact.sys_id,
7562
+ name: artifact.name || identifier,
7563
+ title: artifact.title || artifact.name || identifier,
7564
+ table: targetTable,
7565
+ artifactType: artifactType
7566
+ }
7567
+ };
7568
+ }
7569
+ this.logger.info(`❌ Universal verification: ${artifactType} not found in ${targetTable}`);
7570
+ return { exists: false };
7571
+ }
7572
+ catch (error) {
7573
+ this.logger.warn(`Universal verification failed for ${artifactType}:`, error);
7574
+ return { exists: false };
7575
+ }
7576
+ }
7710
7577
  /**
7711
7578
  * Get ServiceNow table name for artifact type
7712
7579
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "snow-flow",
3
- "version": "3.0.18",
3
+ "version": "3.0.19",
4
4
  "description": "Snow-Flow v3.0.18: DIRECT API VERIFICATION! 🚀 Replaced unreliable searchRecords with direct API calls (snow_query_table style) for widget verification. All null/403 error recovery now uses GET /api/now/table/sp_widget with precise queries. NO MORE FALSE NEGATIVES - verification works consistently every time!",
5
5
  "main": "dist/index.js",
6
6
  "type": "commonjs",
@@ -395,9 +395,8 @@
395
395
  "npm": ">=8.0.0"
396
396
  },
397
397
  "dependencies": {
398
- "@tensorflow/tfjs-node": "^4.15.0",
399
- "@modelcontextprotocol/sdk": "^1.15.1",
400
398
  "@tensorflow/tfjs-node": "^4.22.0",
399
+ "@modelcontextprotocol/sdk": "^1.15.1",
401
400
  "@types/node-fetch": "^2.6.12",
402
401
  "@types/uuid": "^10.0.0",
403
402
  "axios": "^1.10.0",