snow-flow
Version:
Snow-Flow v3.2.0: Complete ServiceNow Enterprise Suite with 180+ MCP Tools. ATF Testing, Knowledge Management, Service Catalog, Change Management with CAB scheduling, Virtual Agent chatbots with NLU, Performance Analytics KPIs, Flow Designer automation, A
351 lines • 10.8 kB
TypeScript
#!/usr/bin/env node
/**
* ServiceNow API Client
* Handles all ServiceNow API operations with OAuth authentication
*/
import { ServiceNowCredentials } from './snow-oauth';
export interface ServiceNowWidget {
sys_id?: string;
name: string;
id: string;
title: string;
description: string;
template: string;
css: string;
client_script: string;
server_script: string;
option_schema?: string;
demo_data?: string;
has_preview?: boolean;
category: string;
}
export interface ServiceNowWorkflow {
sys_id?: string;
name: string;
description: string;
active: boolean;
workflow_version: string;
table?: string;
condition?: string;
}
export interface ServiceNowApplication {
sys_id?: string;
name: string;
scope: string;
version: string;
short_description: string;
description: string;
vendor: string;
vendor_prefix: string;
template?: string;
logo?: string;
active: boolean;
}
export interface ServiceNowAPIResponse<T> {
success: boolean;
data?: T;
error?: string;
result?: T[];
details?: any;
}
export declare class ServiceNowClient {
private client;
private oauth;
private credentials;
private actionTypeCache;
private logger;
private deploymentTimeout;
constructor();
/**
* Public getter for credentials
*/
get credentialsInstance(): ServiceNowCredentials | null;
private tokenRefreshPromise;
private lastTokenRefresh;
/**
* 🔴 SNOW-003 FIX: Handle token refresh with locking to prevent concurrent refreshes
* This prevents cascade failures caused by multiple simultaneous token refresh attempts
*/
private handleTokenRefreshWithLock;
/**
* 🔴 SNOW-003 FIX: Token refresh with timeout to prevent hanging requests
*/
private performTokenRefreshWithTimeout;
/**
* Ensure we have valid authentication with improved error handling
*/
private ensureAuthenticated;
/**
* Proactively refresh token if it's about to expire
* Useful for long-running operations
*/
refreshTokenIfNeeded(): Promise<boolean>;
/**
* Get base URL for ServiceNow instance
*/
private getBaseUrl;
/**
* Sanitize a flow name for use as internal_name
*/
private sanitizeInternalName;
/**
* Validate deployment permissions and diagnose authentication issues
*/
validateDeploymentPermissions(): Promise<ServiceNowAPIResponse<any>>;
/**
* Extract HTTP status from error message
*/
private extractHttpStatus;
/**
* Generate authentication recommendations based on test results
*/
private generateAuthRecommendations;
/**
* Test connection to ServiceNow
*/
testConnection(): Promise<ServiceNowAPIResponse<any>>;
/**
* Create a new ServiceNow widget
*/
createWidget(widget: ServiceNowWidget): Promise<ServiceNowAPIResponse<ServiceNowWidget>>;
/**
* Update an existing ServiceNow widget
*/
updateWidget(sysId: string, widget: Partial<ServiceNowWidget>): Promise<ServiceNowAPIResponse<ServiceNowWidget>>;
/**
* Get widget by ID
*/
getWidget(widgetId: string): Promise<ServiceNowAPIResponse<ServiceNowWidget>>;
/**
* Create a new ServiceNow workflow
*/
createWorkflow(workflow: ServiceNowWorkflow): Promise<ServiceNowAPIResponse<ServiceNowWorkflow>>;
/**
* Create a new ServiceNow application
*/
createApplication(application: ServiceNowApplication): Promise<ServiceNowAPIResponse<ServiceNowApplication>>;
/**
* Execute a ServiceNow script
*/
executeScript(script: string): Promise<ServiceNowAPIResponse<any>>;
/**
* Get all widgets
*/
getWidgets(): Promise<ServiceNowAPIResponse<ServiceNowWidget[]>>;
/**
* Get all workflows
*/
getWorkflows(): Promise<ServiceNowAPIResponse<ServiceNowWorkflow[]>>;
/**
* Get all applications
*/
getApplications(): Promise<ServiceNowAPIResponse<ServiceNowApplication[]>>;
/**
* Get default flow structure from ServiceNow
*/
private getFlowDefaults;
/**
* Get instance info
*/
getInstanceInfo(): Promise<ServiceNowAPIResponse<any>>;
/**
* Get a specific record by sys_id
*/
getRecord(table: string, sys_id: string): Promise<any>;
/**
* Get multiple records from a table
*/
getRecords(table: string, params?: any): Promise<ServiceNowAPIResponse<any[]>>;
/**
* Search records in a table using encoded query
*/
searchRecords(table: string, query: string, limit?: number): Promise<ServiceNowAPIResponse<any>>;
/**
* Search records with offset for pagination/streaming
*/
searchRecordsWithOffset(table: string, query: string, limit?: number, offset?: number): Promise<ServiceNowAPIResponse<any>>;
/**
* Create a record in any ServiceNow table
*/
createRecord(table: string, data: any): Promise<ServiceNowAPIResponse<any>>;
/**
* Update a record in any ServiceNow table
*/
updateRecord(table: string, sysId: string, data: any): Promise<ServiceNowAPIResponse<any>>;
/**
* Delete a record from any ServiceNow table
*/
deleteRecord(table: string, sysId: string): Promise<ServiceNowAPIResponse<any>>;
/**
* Search for available flow actions in ServiceNow
*/
searchFlowActions(searchTerm: string): Promise<any>;
/**
* Get flow action details
*/
getFlowActionDetails(actionTypeId: string): Promise<any>;
/**
* Validate flow definition before deployment
*/
private validateFlowBeforeDeployment;
/**
* Verify deployment was successful and artifact has content
*/
private verifyDeployment;
/**
* Check if a flow has actual content (not empty)
*/
checkFlowContent(sysId: string): Promise<{
hasContent: boolean;
details: any;
}>;
/**
* Create a ServiceNow flow using the enhanced flow structure builder
* Generates proper sys_ids, logic chains, and all required records
*/
createFlowWithStructureBuilder(flowDefinition: any): Promise<ServiceNowAPIResponse<any>>;
/**
* Create a simple Flow Designer flow (original method)
* Focusing on basic flow creation with simple actions
*/
createFlow(flow: any): Promise<ServiceNowAPIResponse<any>>;
/**
* Activate a flow to ensure it's published and ready
*/
activateFlow(flowSysId: string): Promise<void>;
/**
* Generate flow snapshot to prevent "Your flow cannot be found" error
* This uses the Flow Designer API to generate a proper snapshot
*/
generateFlowSnapshot(flowSysId: string): Promise<void>;
/**
* Create a Subflow in ServiceNow
*/
createSubflow(subflow: any): Promise<ServiceNowAPIResponse<any>>;
/**
* Create a Flow Action (reusable component)
*/
createFlowAction(action: any): Promise<ServiceNowAPIResponse<any>>;
/**
* Create a flow action using discovered ServiceNow action types (private method)
*/
private createFlowActionPrivate;
/**
* Build action inputs based on action details
*/
private buildActionInputs;
/**
* Build simple action configuration
*/
private buildActionConfiguration;
/**
* Create a flow trigger instance
*/
private createFlowTrigger;
/**
* Create flow variables for inputs and outputs
*/
private createFlowVariables;
/**
* Create a flow action instance using simplified approach
*/
private createFlowActionInstance;
/**
* Create a flow operation (activity) for a Flow Designer flow
*/
private createFlowOperation;
/**
* Create a Script Include
*/
createScriptInclude(scriptInclude: any): Promise<ServiceNowAPIResponse<any>>;
/**
* Create a Business Rule
*/
createBusinessRule(businessRule: any): Promise<ServiceNowAPIResponse<any>>;
/**
* Create a Table
*/
createTable(table: any): Promise<ServiceNowAPIResponse<any>>;
/**
* Create a Table Field
*/
createTableField(field: any): Promise<ServiceNowAPIResponse<any>>;
/**
* Create a new Update Set
*/
createUpdateSet(updateSet: any): Promise<ServiceNowAPIResponse<any>>;
/**
* Set current Update Set for the session
*/
setCurrentUpdateSet(updateSetId: string): Promise<ServiceNowAPIResponse<any>>;
/**
* Get current Update Set
*/
getCurrentUpdateSet(): Promise<ServiceNowAPIResponse<any>>;
/**
* Get Update Set by ID
*/
getUpdateSet(updateSetId: string): Promise<ServiceNowAPIResponse<any>>;
/**
* List Update Sets
*/
listUpdateSets(options: any): Promise<ServiceNowAPIResponse<any[]>>;
/**
* Complete an Update Set
*/
completeUpdateSet(updateSetId: string, notes?: string): Promise<ServiceNowAPIResponse<any>>;
/**
* Activate an Update Set by setting it as current
*/
activateUpdateSet(updateSetId: string): Promise<ServiceNowAPIResponse<any>>;
/**
* Preview Update Set changes
*/
previewUpdateSet(updateSetId: string): Promise<ServiceNowAPIResponse<any>>;
/**
* Export Update Set as XML
*/
/**
* Ensure we have an active Update Set for tracking changes
*/
ensureUpdateSet(): Promise<ServiceNowAPIResponse<any>>;
exportUpdateSet(updateSetId: string): Promise<ServiceNowAPIResponse<any>>;
/**
* Debug flow structure - check what's missing for Flow Designer
*/
debugFlow(flowId: string): Promise<ServiceNowAPIResponse<any>>;
/**
* Create a flow logic entry (visual representation in Flow Designer)
*/
private createFlowLogic;
/**
* Create a connection between flow logic elements
*/
private createFlowConnection;
/**
* Generic GET method for ServiceNow API calls
*/
get(endpoint: string, params?: any): Promise<any>;
/**
* Generic POST method for ServiceNow API calls
*/
post(endpoint: string, data?: any): Promise<any>;
/**
* Generic PUT method for ServiceNow API calls
*/
put(endpoint: string, data?: any): Promise<any>;
/**
* Generic PATCH method for ServiceNow API calls
*/
patch(endpoint: string, data?: any): Promise<any>;
/**
* Generic DELETE method for ServiceNow API calls
*/
delete(endpoint: string): Promise<any>;
/**
* TEMPORARY FIX: makeRequest method to handle phantom calls
* This method provides compatibility for code that expects makeRequest
*/
makeRequest(config: any): Promise<any>;
}
//# sourceMappingURL=servicenow-client.d.ts.map