snow-flow 11.0.12 → 11.0.13
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.
|
@@ -68,8 +68,8 @@ import{createRequire as bm}from"node:module";var qm=Object.create;var{getPrototy
|
|
|
68
68
|
• Create incident: { action: 'create', table: 'incident', short_description: '...', urgency: 2 }
|
|
69
69
|
• Query incidents: { action: 'query', table: 'incident', query: 'state=1' }
|
|
70
70
|
• Get by number: { action: 'get', table: 'incident', number: 'INC0010001' }`,category:"core-operations",subcategory:"crud",use_cases:["create incident","update incident","get incident","delete incident","query incidents","create change","update change","get change","delete change","query changes","create problem","update problem","get problem","delete problem","query problems","create user","update user","get user","delete user","query users","create asset","update asset","get asset","delete asset","query assets","create ci","update ci","get ci","delete ci","query ci","create record","update record","get record","delete record","query records","incident management","change management","problem management","user management","modify incident","edit incident","change incident state","assign incident","modify change","edit change","modify problem","edit problem"],complexity:"intermediate",frequency:"high",permission:"write",allowedRoles:["developer","admin"],inputSchema:{type:"object",properties:{action:{type:"string",description:"Operation to perform",enum:["create","get","update","delete","query"]},table:{type:"string",description:"Table name or preset (incident, change, user, asset, etc.)"},sys_id:{type:"string",description:"[get/update/delete] Record sys_id"},number:{type:"string",description:"[get] Record number (e.g., INC0010001, CHG0001234)"},data:{type:"object",description:"[create/update] Field values for the record (alternative to helper shortcuts)"},short_description:{type:"string",description:"[create/update] Brief description (incident, problem, change, etc.)"},description:{type:"string",description:"[create/update] Detailed description"},caller_id:{type:"string",description:"[incident] User sys_id or username of caller"},urgency:{type:"number",description:"[incident/problem] 1=High, 2=Medium, 3=Low",enum:[1,2,3],default:3},impact:{type:"number",description:"[incident/change] 1=High, 2=Medium, 3=Low",enum:[1,2,3],default:3},priority:{type:"number",description:"[incident/problem/change] 1=Critical, 2=High, 3=Moderate, 4=Low, 5=Planning",enum:[1,2,3,4,5]},category:{type:"string",description:'[incident/problem] Category (e.g., "software", "hardware", "network")'},subcategory:{type:"string",description:"[incident/problem] Subcategory"},assignment_group:{type:"string",description:"[incident/change/problem] Assignment group sys_id or name"},assigned_to:{type:"string",description:"[incident/change/problem] Assigned user sys_id or username"},configuration_item:{type:"string",description:"[incident] Configuration Item sys_id or name"},work_notes:{type:"string",description:"[incident/change/problem] Work notes (internal)"},comments:{type:"string",description:"[incident/change/problem] Additional comments (customer visible)"},state:{type:"number",description:"[incident] State: 1=New, 2=InProgress, 3=OnHold, 6=Resolved, 7=Closed"},type:{type:"string",description:"[change] Change type",enum:["normal","standard","emergency"]},risk:{type:"number",description:"[change] Risk level: 1=Very High, 2=High, 3=Moderate, 4=Low",enum:[1,2,3,4]},start_date:{type:"string",description:"[change/project] Planned start date (YYYY-MM-DD HH:mm:ss)"},end_date:{type:"string",description:"[change/project] Planned end date (YYYY-MM-DD HH:mm:ss)"},justification:{type:"string",description:"[change] Business justification"},implementation_plan:{type:"string",description:"[change] Implementation plan"},backout_plan:{type:"string",description:"[change] Backout/rollback plan"},test_plan:{type:"string",description:"[change] Test plan"},cab_required:{type:"boolean",description:"[change] Requires CAB approval",default:!1},user_name:{type:"string",description:"[user] Username (login ID)"},first_name:{type:"string",description:"[user/contact] First name"},last_name:{type:"string",description:"[user/contact] Last name"},email:{type:"string",description:"[user/contact/group] Email address"},active:{type:"boolean",description:"[user/group/contact] Active status",default:!0},department:{type:"string",description:"[user] Department sys_id or name"},location:{type:"string",description:"[user/ci/asset] Location sys_id or name"},manager:{type:"string",description:"[user/group] Manager sys_id or username"},title:{type:"string",description:"[user/contact] Job title"},phone:{type:"string",description:"[user/contact/account] Phone number"},name:{type:"string",description:"[group/ci/asset/account] Name"},ip_address:{type:"string",description:"[ci/server/computer] IP address"},mac_address:{type:"string",description:"[ci] MAC address"},os:{type:"string",description:"[server/computer] Operating system"},os_version:{type:"string",description:"[server/computer] OS version"},operational_status:{type:"number",description:"[ci] 1=Operational, 2=Non-Operational, 3=Repair, 4=Retired",enum:[1,2,3,4]},install_status:{type:"number",description:"[ci/asset] 1=Installed, 2=In Stock, 3=On Order, 6=In Maintenance, 7=Retired",enum:[1,2,3,6,7]},support_group:{type:"string",description:"[ci] Support group sys_id or name"},manufacturer:{type:"string",description:"[ci] Manufacturer sys_id or name"},model_id:{type:"string",description:"[ci] Model sys_id or name"},serial_number:{type:"string",description:"[ci/asset] Serial number"},cpu_count:{type:"number",description:"[server] Number of CPUs"},cpu_type:{type:"string",description:"[server/computer] CPU type"},ram:{type:"number",description:"[server/computer] RAM in MB"},disk_space:{type:"number",description:"[server] Disk space in GB"},parent:{type:"string",description:"[ci_relationship/project_task/hr_task] Parent CI/record sys_id"},child:{type:"string",description:"[ci_relationship] Child CI sys_id"},relationship_type:{type:"string",description:"[ci_relationship] Relationship type sys_id or name"},display_name:{type:"string",description:"[asset] Display name"},asset_tag:{type:"string",description:"[asset] Asset tag"},model:{type:"string",description:"[asset] Model sys_id or name"},cost:{type:"number",description:"[asset] Cost"},acquisition_method:{type:"string",description:"[asset] Acquisition method"},vendor:{type:"string",description:"[asset/purchase_order] Vendor sys_id or name"},warranty_expiration:{type:"string",description:"[asset] Warranty expiration date (YYYY-MM-DD)"},hr_service:{type:"string",description:"[hr_case] HR Service sys_id or name"},opened_for:{type:"string",description:"[hr_case] Opened for user sys_id or username"},account:{type:"string",description:"[customer_case/contact] Customer account sys_id or name"},contact:{type:"string",description:"[customer_case] Customer contact sys_id or name"},product:{type:"string",description:"[customer_case] Product sys_id or name"},account_code:{type:"string",description:"[customer_account] Account code"},primary_contact:{type:"string",description:"[customer_account] Primary contact sys_id or name"},city:{type:"string",description:"[customer_account] City"},country:{type:"string",description:"[customer_account] Country"},website:{type:"string",description:"[customer_account] Website URL"},project_manager:{type:"string",description:"[project] Project manager sys_id or username"},percent_complete:{type:"number",description:"[project/project_task] Percent complete (0-100)"},primary_goal:{type:"string",description:"[project] Primary goal"},text:{type:"string",description:"[knowledge_article] Article body/content"},kb_knowledge_base:{type:"string",description:"[knowledge_article] Knowledge base sys_id or name"},author:{type:"string",description:"[knowledge_article] Author sys_id or username"},workflow_state:{type:"string",description:"[knowledge_article] Workflow state",enum:["draft","review","published","retired"]},valid_to:{type:"string",description:"[knowledge_article] Valid until date (YYYY-MM-DD)"},auto_assign:{type:"boolean",description:"[incident/change/problem] Auto-assign based on category and assignment rules",default:!1},query:{type:"string",description:'[query] Encoded query string (e.g., "state=1^priority<=2^active=true")'},limit:{type:"number",description:"[query] Maximum records to return (default: 20, max: 1000)",default:20},offset:{type:"number",description:"[query] Number of records to skip for pagination",default:0},order_by:{type:"string",description:"[query] Field to order by (prefix with - for descending)"},fields:{type:"string",description:"[get/query] Comma-separated fields to return"},display_value:{type:"boolean",description:"Return display values instead of sys_ids",default:!0},validate_references:{type:"boolean",description:"[create] Validate reference fields exist",default:!0},check_version:{type:"boolean",description:"[update] Perform optimistic locking check",default:!1},expected_version:{type:"string",description:"[update] Expected sys_mod_count for optimistic locking"},check_references:{type:"boolean",description:"[delete] Check for dependent records",default:!0},soft_delete:{type:"boolean",description:"[delete] Mark as inactive instead of hard delete",default:!1},force:{type:"boolean",description:"[delete] Force deletion even with dependencies",default:!1}},required:["action","table"]}};async function qV($,Y){var{action:X,table:z}=$,J=Ai(z);try{switch(X){case"create":return await _i($,Y,J);case"get":return await wi($,Y,J);case"update":return await bi($,Y,J);case"delete":return await ji($,Y,J);case"query":return await Di($,Y,J);default:return x("Unknown action: "+X+". Valid actions: create, get, update, delete, query")}}catch(Z){return x(Z instanceof D?Z:new D("SERVICENOW_API_ERROR","Record "+X+" failed: "+Z.message,{originalError:Z,details:{table:J.table}}))}}function Ai($){var Y=VV[$.toLowerCase()];if(Y)return{table:Y.table,label:Y.label,defaultFields:Y.defaultFields,numberField:Y.numberField||"number",isPreset:!0};return{table:$,label:$,defaultFields:["sys_id","sys_created_on","sys_updated_on"],numberField:"number",isPreset:!1}}function NV($,Y){var X=$.data?{...$.data}:{},z=OV[Y]||OV[Y.toLowerCase()]||[],J=["short_description","description","assignment_group","assigned_to","state","active","work_notes","comments"],Z=[...new Set([...z,...J])];for(var G=0;G<Z.length;G++){var K=Z[G];if($[K]!==void 0&&$[K]!==null)X[K]=$[K]}if($.configuration_item!==void 0)X.cmdb_ci=$.configuration_item;if($.relationship_type!==void 0)X.type=$.relationship_type;return X}async function _i($,Y,X){var z=X.table,J=$.table.toLowerCase(),Z=$.display_value!==!1,G=$.validate_references!==!1,K=$.auto_assign===!0,Q=NV($,J);if(Object.keys(Q).length===0)return x("No data provided. Use helper shortcuts (short_description, priority, etc.) or data object.");var W=await P(Y);if(J==="incident"){if(Q.urgency===void 0)Q.urgency=3;if(Q.impact===void 0)Q.impact=3}if(J==="change"||J==="change_request"){if(Q.type===void 0)Q.type="normal";if(Q.risk===void 0)Q.risk=4}if(K&&(J==="incident"||J==="change"||J==="problem")){var H=await Si(W,z,Q);if(H.assignment_group)Q.assignment_group=H.assignment_group;if(H.assigned_to)Q.assigned_to=H.assigned_to}Q=await LV(W,z,Q);var U=await W.get("/api/now/table/sys_db_object",{params:{sysparm_query:"name="+z,sysparm_fields:"name,label",sysparm_limit:1}});if(!U.data.result||U.data.result.length===0)throw new D("VALIDATION_ERROR","Table '"+z+"' does not exist.",{details:{table:z,available_presets:vi.slice(0,20)}});if(G){var B=await W.get("/api/now/table/sys_dictionary",{params:{sysparm_query:"name="+z+"^internal_type=reference",sysparm_fields:"element,reference",sysparm_limit:1000}});for(var V=0;V<(B.data.result||[]).length;V++){var O=B.data.result[V],q=O.element,N=O.reference;if(Q[q])try{var L=await W.get("/api/now/table/"+N+"/"+Q[q],{params:{sysparm_fields:"sys_id"}});if(!L.data.result)throw new D("VALIDATION_ERROR","Reference validation failed: Field '"+q+"' points to non-existent record.",{details:{field:q,value:Q[q],reference_table:N}})}catch(j){if(j instanceof D)throw j}}}try{var F=await W.post("/api/now/table/"+z,Q,{params:{sysparm_display_value:Z?"all":"false",sysparm_exclude_reference_link:"true"}}),v=F.data.result,A=v[X.numberField]||v.number||v.name||v.sys_id,_={action:"create",created:!0,sys_id:B1(v.sys_id),table:z,table_label:X.label,record:v,url:Y.instanceUrl+"/nav_to.do?uri="+z+".do?sys_id="+B1(v.sys_id)};if(_[X.numberField]=B1(A),K){if(_.auto_assigned=!0,Q.assignment_group)_.assigned_group=Q.assignment_group;if(Q.assigned_to)_.assigned_user=Q.assigned_to}return M(_)}catch(j){var w=j.response?.data?.error||{},b=w.message||j.message;throw new D("VALIDATION_ERROR","Failed to create record in '"+X.label+"': "+b,{details:{table:z,data:Q,snow_error:w}})}}async function wi($,Y,X){var z=X.table,J=$.sys_id,Z=$.number,G=$.fields,K=$.display_value!==!1;if(!J&&!Z)return x("sys_id or number is required for get action");var Q=await P(Y),W=null,H=G||X.defaultFields.join(",");if(J)try{var U=await Q.get("/api/now/table/"+z+"/"+J,{params:{sysparm_fields:H,sysparm_display_value:K?"all":"false"}});W=U.data.result}catch(q){}if(!W&&Z){var B=X.numberField||"number",V=await Q.get("/api/now/table/"+z,{params:{sysparm_query:B+"="+Z,sysparm_fields:H,sysparm_display_value:K?"all":"false",sysparm_limit:1}});if(V.data.result&&V.data.result.length>0)W=V.data.result[0]}if(!W)return x(X.label+" not found: "+(J||Z));var O={action:"get",found:!0,sys_id:B1(W.sys_id),table:z,table_label:X.label,record:W,url:Y.instanceUrl+"/nav_to.do?uri="+z+".do?sys_id="+W.sys_id};return O[X.numberField]=B1(W[X.numberField]||W.number||W.name),M(O)}async function bi($,Y,X){var z=X.table,J=$.table.toLowerCase(),Z=$.sys_id,G=$.display_value!==!1,K=$.check_version===!0,Q=$.expected_version;if(!Z)return x("sys_id is required for update action");var W=NV($,J);if(Object.keys(W).length===0)return x("No data provided for update.");var H=await P(Y);W=await LV(H,z,W);var U=await H.get("/api/now/table/"+z+"/"+Z,{params:{sysparm_fields:K?"sys_id,sys_mod_count":"sys_id"}});if(!U.data.result)throw new D("NOT_FOUND_ERROR",X.label+" not found with sys_id '"+Z+"'",{details:{table:z,sys_id:Z}});if(K&&Q){var B=U.data.result.sys_mod_count;if(B!==Q)throw new D("VALIDATION_ERROR","Record has been modified by another user (optimistic lock conflict)",{details:{expected_version:Q,current_version:B}})}var V=await H.patch("/api/now/table/"+z+"/"+Z,W,{params:{sysparm_display_value:G?"all":"false",sysparm_exclude_reference_link:"true"}}),O=V.data.result,q=Object.keys(W),N={action:"update",updated:!0,sys_id:B1(O.sys_id),table:z,table_label:X.label,changed_fields:q,record:O,new_version:B1(O.sys_mod_count),url:Y.instanceUrl+"/nav_to.do?uri="+z+".do?sys_id="+B1(O.sys_id)};return N[X.numberField]=B1(O[X.numberField]||O.number||O.name),M(N)}async function ji($,Y,X){var z=X.table,J=$.sys_id,Z=$.check_references!==!1,G=$.soft_delete===!0,K=$.force===!0;if(!J)return x("sys_id is required for delete action");var Q=await P(Y),W=await Q.get("/api/now/table/"+z+"/"+J,{params:{sysparm_fields:"sys_id,"+X.numberField}});if(!W.data.result)throw new D("NOT_FOUND_ERROR",X.label+" not found with sys_id '"+J+"'",{details:{table:z,sys_id:J}});var H=W.data.result,U=[];if(Z&&!K){var B=await Q.get("/api/now/table/sys_dictionary",{params:{sysparm_query:"reference="+z+"^internal_type=reference",sysparm_fields:"name,element",sysparm_limit:100}});for(var V=0;V<(B.data.result||[]).length;V++){var O=B.data.result[V];try{var q=await Q.get("/api/now/table/"+O.name,{params:{sysparm_query:O.element+"="+J,sysparm_fields:"sys_id,number",sysparm_limit:5}});if(q.data.result&&q.data.result.length>0)U.push({table:O.name,field:O.element,count:q.data.result.length})}catch(v){}}if(U.length>0)throw new D("VALIDATION_ERROR","Cannot delete "+X.label+" with dependencies. Use force=true to override.",{details:{dependencies:U}})}if(G){var N=await Q.get("/api/now/table/sys_dictionary",{params:{sysparm_query:"name="+z+"^element=active",sysparm_fields:"element",sysparm_limit:1}});if(N.data.result&&N.data.result.length>0){await Q.patch("/api/now/table/"+z+"/"+J,{active:"false"});var L={action:"delete",deleted:!0,soft_delete:!0,sys_id:J,table:z,table_label:X.label,message:X.label+" marked as inactive (soft delete)"};return L[X.numberField]=B1(H[X.numberField]||H.number),M(L)}else throw new D("VALIDATION_ERROR","Table '"+z+"' does not support soft delete (no 'active' field)",{details:{table:z}})}await Q.delete("/api/now/table/"+z+"/"+J);var F={action:"delete",deleted:!0,soft_delete:!1,sys_id:J,table:z,table_label:X.label,message:X.label+" permanently deleted",forced:K&&U.length>0};return F[X.numberField]=B1(H[X.numberField]||H.number),M(F)}async function Di($,Y,X){var z=X.table,J=$.query||"",Z=$.limit||20,G=$.offset||0,K=$.order_by,Q=$.fields,W=$.display_value!==!1,H=await P(Y),U=Q||X.defaultFields.join(","),B={sysparm_limit:Math.min(Z,1000),sysparm_offset:G,sysparm_fields:U,sysparm_display_value:W?"all":"false",sysparm_exclude_reference_link:"true"};if(J)B.sysparm_query=J;if(K)if(K.charAt(0)==="-")B.sysparm_query=(B.sysparm_query?B.sysparm_query+"^":"")+"ORDERBYDESC"+K.substring(1);else B.sysparm_query=(B.sysparm_query?B.sysparm_query+"^":"")+"ORDERBY"+K;var V=await H.get("/api/now/table/"+z,{params:B}),O=V.data.result||[],q={sysparm_count:!0};if(J)q.sysparm_query=J;var N=await H.get("/api/now/table/"+z,{params:q}),L=parseInt(N.headers["x-total-count"]||"0",10),F=[];F.push("✓ Query completed"),F.push(" table: "+z),F.push(" Records: "+O.length+(L>O.length?" of "+L:""));var v=Math.min(O.length,10);for(var A=0;A<v;A++){var _=O[A],w=B1(_[X.numberField])||B1(_.number)||B1(_.name)||B1(_.sys_id),b=B1(_.short_description)||B1(_.description)||B1(_.title)||B1(_.label)||"",j=" • "+w;if(b){var k=b.length>50?b.substring(0,47)+"...":b;j+=" - "+k}F.push(j)}if(O.length>v)F.push(" ... and "+(O.length-v)+" more");if(L>O.length)F.push(" (Use offset="+(G+O.length)+" to get next page)");return M({action:"query",table:z,table_label:X.label,count:O.length,total_count:L,offset:G,limit:Z,has_more:G+O.length<L,query:J||"(all records)",records:O.map(function(T){var u={sys_id:B1(T.sys_id),...T,_url:Y.instanceUrl+"/nav_to.do?uri="+z+".do?sys_id="+B1(T.sys_id)};return u[X.numberField]=B1(T[X.numberField]||T.number||T.name),u})},{},F.join(`
|
|
71
|
-
`))}async function LV($,Y,X){var z={...X},J=["caller_id","assigned_to","opened_for","manager","project_manager","author","contact","primary_contact","requested_for"];for(var Z=0;Z<J.length;Z++){var G=J[Z];if(z[G]&&!$$(z[G])){var K=await ki($,z[G]);if(K)z[G]=K}}var Q=["assignment_group","support_group"];for(var W=0;W<Q.length;W++){var H=Q[W];if(z[H]&&!$$(z[H])){var U=await Ti($,z[H]);if(U)z[H]=U}}if(z.cmdb_ci&&!$$(z.cmdb_ci)){var B=await Ci($,z.cmdb_ci);if(B)z.cmdb_ci=B}if(z.department&&!$$(z.department)){var V=await Ei($,z.department);if(V)z.department=V}if(z.location&&!$$(z.location)){var O=await Ii($,z.location);if(O)z.location=O}return z}function $$($){return/^[a-f0-9]{32}$/i.test($)}async function ki($,Y){try{var X=await $.get("/api/now/table/sys_user",{params:{sysparm_query:"user_name="+Y+"^ORemail="+Y+"^ORname="+Y,sysparm_fields:"sys_id",sysparm_limit:1}});if(X.data.result&&X.data.result.length>0)return X.data.result[0].sys_id}catch(z){}return null}async function Ti($,Y){try{var X=await $.get("/api/now/table/sys_user_group",{params:{sysparm_query:"name="+Y,sysparm_fields:"sys_id",sysparm_limit:1}});if(X.data.result&&X.data.result.length>0)return X.data.result[0].sys_id}catch(z){}return null}async function Ci($,Y){try{var X=await $.get("/api/now/table/cmdb_ci",{params:{sysparm_query:"name="+Y,sysparm_fields:"sys_id",sysparm_limit:1}});if(X.data.result&&X.data.result.length>0)return X.data.result[0].sys_id}catch(z){}return null}async function Ei($,Y){try{var X=await $.get("/api/now/table/cmn_department",{params:{sysparm_query:"name="+Y,sysparm_fields:"sys_id",sysparm_limit:1}});if(X.data.result&&X.data.result.length>0)return X.data.result[0].sys_id}catch(z){}return null}async function Ii($,Y){try{var X=await $.get("/api/now/table/cmn_location",{params:{sysparm_query:"name="+Y,sysparm_fields:"sys_id",sysparm_limit:1}});if(X.data.result&&X.data.result.length>0)return X.data.result[0].sys_id}catch(z){}return null}async function Si($,Y,X){var z={};if(X.category)try{var J=await $.get("/api/now/table/sysrule_assignment",{params:{sysparm_query:"table="+Y+"^active=true^conditionLIKEcategory="+X.category,sysparm_fields:"group,user",sysparm_limit:1}});if(J.data.result&&J.data.result.length>0){var Z=J.data.result[0];if(Z.group)z.assignment_group=typeof Z.group==="object"?Z.group.value:Z.group;if(Z.user)z.assigned_to=typeof Z.user==="object"?Z.user.value:Z.user;return z}}catch(K){}try{var G=await $.get("/api/now/table/sys_user_group",{params:{sysparm_query:"nameLIKE"+Y+"^active=true",sysparm_fields:"sys_id,name",sysparm_limit:1}});if(G.data.result&&G.data.result.length>0)z.assignment_group=G.data.result[0].sys_id}catch(K){}return z}var Ri=["template","script","server_script","client_script","css","html","xml","json","payload","body","content","description","comments","work_notes","additional_comments","close_notes","resolution_notes","instructions","short_description","long_description"],bJ=200;function fi($,Y){if(!Y)return $;return $.map((X)=>{let z={};for(let[J,Z]of Object.entries(X))if(typeof Z==="string"&&Z.length>bJ)if(Ri.some((K)=>J.toLowerCase().includes(K))||Z.length>bJ*2)z[J]=Z.substring(0,bJ)+`... [truncated, ${Z.length} chars total]`;else z[J]=Z;else z[J]=Z;return z})}var FV={name:"snow_query_table",description:"Query any ServiceNow table with filtering, pagination, and field selection. Always returns sys_id for each record.",category:"core-operations",subcategory:"crud",use_cases:["query","read","records"],complexity:"beginner",frequency:"high",permission:"read",allowedRoles:["developer","stakeholder","admin"],inputSchema:{type:"object",properties:{table:{type:"string",description:"Table name to query (e.g., incident, task, sys_user)"},query:{type:"string",description:"Encoded query string (e.g., active=true^priority=1)"},fields:{type:"array",items:{type:"string"},description:"Fields to return (default: all fields)",default:[]},limit:{type:"number",description:"Maximum number of records to return",default:100,minimum:1,maximum:1e4},offset:{type:"number",description:"Number of records to skip (for pagination)",default:0,minimum:0},order_by:{type:"string",description:"Field to order by (prefix with - for descending, e.g., -sys_created_on)"},display_value:{type:"boolean",description:"Return display values instead of sys_ids for reference fields",default:!1},truncate_output:{type:"boolean",description:"Truncate large field values (scripts, templates, etc.) for cleaner output",default:!0}},required:["table"]}};async function PV($,Y){let{table:X,query:z="",
|
|
72
|
-
`))}catch(H){return x(H.message)}}var vV={name:"snow_discover_table_fields",description:"Discover table schema with fields, types, relationships, and metadata",category:"development",subcategory:"schema",use_cases:["discovery","schema"],complexity:"intermediate",frequency:"medium",permission:"read",allowedRoles:["developer","stakeholder","admin"],inputSchema:{type:"object",properties:{table_name:{type:"string",description:"Table name to discover schema for"},include_relationships:{type:"boolean",description:"Include field relationships (reference fields)",default:!0},include_acls:{type:"boolean",description:"Include ACL information",default:!1},include_indexes:{type:"boolean",description:"Include index information",default:!1}},required:["table_name"]}};async function AV($,Y){let{table_name:X,include_relationships:z=!0,include_acls:J=!1,include_indexes:Z=!1}=$;try{let G=await P(Y),K=await G.get("/api/now/table/sys_db_object",{params:{sysparm_query:`name=${X}`,sysparm_limit:1}});if(K.data.result.length===0)return x(`Table not found: ${X}`);let Q=K.data.result[0],H=(await G.get("/api/now/table/sys_dictionary",{params:{sysparm_query:`name=${X}^element!=NULL^ORDERBYelement`,sysparm_limit:1000}})).data.result.map((O)=>({name:O.element,label:O.column_label,type:O.internal_type?.display_value||O.internal_type,max_length:O.max_length,mandatory:O.mandatory==="true",read_only:O.read_only==="true",default_value:O.default_value,reference:O.reference?.display_value||O.reference,help_text:O.help})),U=[];if(z)U=H.filter((q)=>q.type==="reference").map((q)=>({field:q.name,references_table:q.reference,type:"many-to-one"}));let B=[];if(J)B=(await G.get("/api/now/table/sys_security_acl",{params:{sysparm_query:`name=${X}`,sysparm_limit:100}})).data.result.map((q)=>({operation:q.operation,roles:q.roles,condition:q.condition,script:q.script?"Present":"None"}));let V=[];if(Z)V=(await G.get("/api/now/table/sys_db_index",{params:{sysparm_query:`table=${X}`,sysparm_limit:100}})).data.result.map((q)=>({name:q.name,fields:q.field_list,unique:q.unique==="true"}));return M({table:{name:X,label:Q.label,extends:Q.super_class?.display_value||null,sys_id:Q.sys_id},fields:H,field_count:H.length,relationships:U,acls:J?B:void 0,indexes:Z?V:void 0})}catch(G){return x(G.message)}}var _V={name:"snow_get_by_sysid",description:"Get any ServiceNow record by sys_id with optional field selection",category:"core-operations",subcategory:"crud",use_cases:["read","records"],complexity:"beginner",frequency:"high",permission:"read",allowedRoles:["developer","stakeholder","admin"],inputSchema:{type:"object",properties:{table:{type:"string",description:"Table name (e.g., sp_widget, sys_ux_page, incident)"},sys_id:{type:"string",description:"sys_id of the record to retrieve"},fields:{type:"array",items:{type:"string"},description:"Specific fields to return (default: all)",default:[]},display_value:{type:"boolean",description:"Return display values for reference fields",default:!1}},required:["table","sys_id"]}};async function wV($,Y){let{table:X,sys_id:z,fields:J=[],display_value:Z=!1}=$;try{let G=await P(Y),K={};if(J.length>0)K.sysparm_fields=J.join(",");if(Z)K.sysparm_display_value="true";let Q=await G.get(`/api/now/table/${X}/${z}`,{params:K});if(!Q.data||!Q.data.result)return x(`Record not found: ${X}/${z}`);let W=Q.data.result;return M({found:!0,record:W,table:X,sys_id:z})}catch(G){if(G.response?.status===404)return M({found:!1,table:X,sys_id:z,error:"Record not found"});return x(G.message)}}var q7={name:"snow_search_artifacts",description:"Search ServiceNow development artifacts (widgets, pages, scripts, flows, UI actions, client scripts). For data/table searches, use snow_query_table or snow_fuzzy_search instead.",category:"core-operations",subcategory:"search",use_cases:["artifact-search","development-search","find-widget","find-script"],complexity:"intermediate",frequency:"high",permission:"read",allowedRoles:["developer","stakeholder","admin"],inputSchema:{type:"object",properties:{query:{type:"string",description:"Search query - matches against name, title, and description fields"},types:{type:"array",items:{type:"string",enum:["widget","page","flow","script_include","business_rule","client_script","ui_action","ui_policy","ui_page","scheduled_job","all"]},description:"Artifact types to search (default: all)",default:["all"]},limit:{type:"number",description:"Maximum results per artifact type (default: 10)",default:10,minimum:1,maximum:50},include_inactive:{type:"boolean",description:"Include inactive/disabled artifacts",default:!1},search_tables:{type:"boolean",description:"Also search sys_db_object for matching table definitions (slower)",default:!1}},required:["query"]}},jJ={widget:{table:"sp_widget",name_field:"id",title_field:"name",active_field:"active",description:"Service Portal widgets",extra_fields:["template","css"]},page:{table:"sp_page",name_field:"id",title_field:"title",active_field:"active",description:"Service Portal pages"},flow:{table:"sys_hub_flow",name_field:"name",active_field:"active",description:"Flow Designer flows"},script_include:{table:"sys_script_include",name_field:"name",active_field:"active",description:"Script Includes (reusable server scripts)"},business_rule:{table:"sys_script",name_field:"name",active_field:"active",description:"Business Rules",extra_fields:["collection","when"]},client_script:{table:"sys_script_client",name_field:"name",active_field:"active",description:"Client Scripts",extra_fields:["table","type"]},ui_action:{table:"sys_ui_action",name_field:"name",active_field:"active",description:"UI Actions (buttons, links, context menus)",extra_fields:["table","action_name"]},ui_policy:{table:"sys_ui_policy",name_field:"short_description",active_field:"active",description:"UI Policies",extra_fields:["table","conditions"]},ui_page:{table:"sys_ui_page",name_field:"name",active_field:"active",description:"UI Pages (classic UI)",extra_fields:["category"]},scheduled_job:{table:"sysauto_script",name_field:"name",active_field:"active",description:"Scheduled Jobs"}};async function mi($,Y,X,z,J,Z){try{let G=[X.name_field];if(X.title_field)G.push(X.title_field);G.push("description");let K=G.map((B)=>`${B}LIKE${z}`).join("^NQ"),Q=!Z&&X.active_field?`^${X.active_field}=true`:"",W=K+Q,H=["sys_id",...G,"sys_created_on","sys_updated_on"];if(X.active_field)H.push(X.active_field);if(X.extra_fields)H.push(...X.extra_fields);let U=await $.get(`/api/now/table/${X.table}`,{params:{sysparm_query:W,sysparm_limit:J,sysparm_fields:[...new Set(H)].join(",")},timeout:1e4});if(!U.data.result||U.data.result.length===0)return{type:Y,table:X.table,description:X.description,count:0,artifacts:[]};return{type:Y,table:X.table,description:X.description,count:U.data.result.length,artifacts:U.data.result.map((B)=>({sys_id:B.sys_id,name:B[X.name_field],title:X.title_field?B[X.title_field]:void 0,description:B.description,active:X.active_field?B[X.active_field]==="true":void 0,created:B.sys_created_on,updated:B.sys_updated_on,...X.extra_fields?.reduce((V,O)=>{if(B[O])V[O]=B[O];return V},{})||{}}))}}catch(G){return{type:Y,table:X.table,description:X.description,count:0,artifacts:[],error:G.message}}}async function yi($,Y,X){try{let z=await $.get("/api/now/table/sys_db_object",{params:{sysparm_query:`nameLIKE${Y}^ORlabelLIKE${Y}`,sysparm_limit:X,sysparm_fields:"sys_id,name,label,super_class,is_extendable"},timeout:15000});if(!z.data.result||z.data.result.length===0)return{type:"table",table:"sys_db_object",description:"Table definitions",count:0,artifacts:[]};return{type:"table",table:"sys_db_object",description:"Table definitions",count:z.data.result.length,artifacts:z.data.result.map((J)=>({sys_id:J.sys_id,name:J.name,label:J.label,super_class:J.super_class?.display_value||J.super_class,is_extendable:J.is_extendable==="true"}))}}catch(z){return{type:"table",table:"sys_db_object",description:"Table definitions",count:0,artifacts:[],error:z.message}}}async function DJ($,Y){let{query:X,types:z=["all"],limit:J=10,include_inactive:Z=!1,search_tables:G=!1}=$;if(!X||X.trim().length===0)return x("Search query cannot be empty");try{let K=await P(Y),Q=z.includes("all")?Object.keys(jJ):z.filter((q)=>q!=="all"&&jJ[q]),W=Q.map((q)=>mi(K,q,jJ[q],X,J,Z));if(G)W.push(yi(K,X,J));let H=await Promise.all(W),U=H.filter((q)=>q.count>0),B=H.filter((q)=>q.error),V=U.reduce((q,N)=>q+N.count,0),O={query:X,summary:{total_found:V,artifact_types_searched:Q.length+(G?1:0),artifact_types_with_results:U.length,include_inactive:Z},found:U.map((q)=>({type:q.type,table:q.table,description:q.description,count:q.count,artifacts:q.artifacts})),message:V>0?`Found ${V} artifacts matching "${X}" across ${U.length} type(s)`:`No artifacts found matching "${X}"`};if(B.length>0)O.errors=B.map((q)=>({type:q.type,table:q.table,error:q.error}));if(!G&&V===0)O.suggestion="No artifacts found. Try search_tables=true to also search table definitions, or use snow_query_table for data searches.";return M(O)}catch(K){return x(`Artifact search failed: ${K.message}`)}}var bV={...q7,name:"snow_comprehensive_search",description:"[DEPRECATED - use snow_search_artifacts] "+q7.description};var jV=m8(uz(),1);import*as D5 from"fs/promises";import*as N7 from"path";var DV={name:"snow_attach_file",description:"Attach files to ServiceNow records with validation and content type detection",category:"core-operations",subcategory:"attachments",use_cases:["attachments","files"],complexity:"beginner",frequency:"medium",permission:"write",allowedRoles:["developer","admin"],inputSchema:{type:"object",properties:{table:{type:"string",description:"Table name"},sys_id:{type:"string",description:"Record sys_id to attach file to"},file_path:{type:"string",description:"Local file path to attach"},file_name:{type:"string",description:"Name for the attached file (defaults to original filename)"},content_type:{type:"string",description:"MIME type (auto-detected if not provided)"},max_size_mb:{type:"number",description:"Maximum file size in MB",default:25}},required:["table","sys_id","file_path"]}};async function kV($,Y){let{table:X,sys_id:z,file_path:J,file_name:Z,content_type:G,max_size_mb:K=25}=$;try{let Q=await P(Y);try{await D5.access(J)}catch{throw new D("VALIDATION_ERROR",`File not found: ${J}`,{details:{file_path:J}})}let H=(await D5.stat(J)).size/1048576;if(H>K)throw new D("VALIDATION_ERROR",`File size ${H.toFixed(2)}MB exceeds maximum ${K}MB`,{details:{file_size_mb:H,max_size_mb:K}});if(!(await Q.get(`/api/now/table/${X}/${z}`,{params:{sysparm_fields:"sys_id"}})).data.result)throw new D("NOT_FOUND_ERROR",`Record not found in table '${X}' with sys_id '${z}'`,{details:{table:X,sys_id:z}});let B=Z||N7.basename(J),V=G||hi(B),O=await D5.readFile(J),q=new jV.default;q.append("file",O,{filename:B,contentType:V});let L=(await Q.post("/api/now/attachment/file",q,{params:{table_name:X,table_sys_id:z,file_name:B},headers:{...q.getHeaders()}})).data.result;return M({attached:!0,attachment:{sys_id:L.sys_id,file_name:L.file_name,size_bytes:L.size_bytes,content_type:L.content_type,table_name:L.table_name,table_sys_id:L.table_sys_id},download_url:`${Y.instanceUrl}/api/now/attachment/${L.sys_id}/file`})}catch(Q){return x(Q instanceof D?Q:Q.message)}}function hi($){let Y=N7.extname($).toLowerCase();return{".txt":"text/plain",".pdf":"application/pdf",".doc":"application/msword",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document",".xls":"application/vnd.ms-excel",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".ppt":"application/vnd.ms-powerpoint",".pptx":"application/vnd.openxmlformats-officedocument.presentationml.presentation",".jpg":"image/jpeg",".jpeg":"image/jpeg",".png":"image/png",".gif":"image/gif",".zip":"application/zip",".json":"application/json",".xml":"application/xml",".csv":"text/csv"}[Y]||"application/octet-stream"}var TV={name:"snow_analyze_incident",description:"Analyzes specific incidents with pattern recognition, similar incident matching, and automated resolution suggestions",category:"itsm",subcategory:"operations",use_cases:["incidents","analysis"],complexity:"intermediate",frequency:"medium",permission:"read",allowedRoles:["developer","stakeholder","admin"],inputSchema:{type:"object",properties:{incident_id:{type:"string",description:"Incident number or sys_id to analyze"},include_similar:{type:"boolean",description:"Include similar incidents in analysis",default:!0},suggest_resolution:{type:"boolean",description:"Generate automated resolution suggestions",default:!0}},required:["incident_id"]}},ui={network_issues:{keywords:["network","connectivity","ping","dns","timeout","unreachable"],solutions:["Check network connectivity","Verify DNS resolution","Test ping to server","Review firewall rules"]},database_issues:{keywords:["database","connection","sql","timeout","deadlock","performance"],solutions:["Check database connection","Review connection pool settings","Analyze query performance","Check for blocking processes"]},application_errors:{keywords:["application","error","exception","crash","memory","cpu"],solutions:["Check application logs","Review memory usage","Analyze CPU utilization","Restart application service"]},auth_issues:{keywords:["authentication","login","password","ldap","sso","unauthorized"],solutions:["Reset user password","Check LDAP connectivity","Verify SSO configuration","Review user permissions"]}};async function CV($,Y){let{incident_id:X,include_similar:z=!0,suggest_resolution:J=!0}=$;try{let Z=await P(Y),G=`number=${X}`,K=await Z.get("/api/now/table/incident",{params:{sysparm_query:G,sysparm_limit:1}});if(!K.data.result||K.data.result.length===0)G=`sys_id=${X}`,K=await Z.get("/api/now/table/incident",{params:{sysparm_query:G,sysparm_limit:1}});if(!K.data.result||K.data.result.length===0)return x(`Incident ${X} not found`);let Q=K.data.result[0],W=[],H=[],U=0,B=(Q.short_description||"").toLowerCase();for(let[F,v]of Object.entries(ui))if(v.keywords.some((A)=>B.includes(A)))W.push(F),H.push(...v.solutions),U+=0.2;let V=pi(W),O=gi(W),q=[];if(z&&W.length>0){let F=`short_descriptionLIKE${Q.short_description}^sys_id!=${Q.sys_id}^state=6`;q=(await Z.get("/api/now/table/incident",{params:{sysparm_query:F,sysparm_limit:5}})).data.result||[]}let N=[];if(J){let F=`textLIKE${Q.short_description}^workflow_state=published`;N=(await Z.get("/api/now/table/kb_knowledge",{params:{sysparm_query:F,sysparm_limit:3}})).data.result||[]}let L={incident_id:Q.number,incident_sys_id:Q.sys_id,patterns_found:W,root_cause_analysis:V,suggested_resolution:H,confidence_score:Math.min(U,1),similar_incidents:q.map((F)=>({number:F.number,short_description:F.short_description,state:F.state})),knowledge_articles:N.map((F)=>({number:F.number,short_description:F.short_description,text:F.text?F.text.substring(0,200)+"...":""})),automated_actions:O};return M({analysis:L},{incident_id:X,patterns_found:W.length})}catch(Z){return x(Z.message)}}function pi($){if($.length===0)return"No specific patterns detected. Manual investigation required.";let Y=[];if($.includes("network_issues"))Y.push("Network connectivity issue detected. Check network infrastructure, DNS, and firewall rules.");if($.includes("database_issues"))Y.push("Database connectivity or performance issue detected. Check database server, connection pools, and query performance.");if($.includes("application_errors"))Y.push("Application error detected. Check application logs, resource utilization, and service status.");if($.includes("auth_issues"))Y.push("Authentication issue detected. Check user credentials, LDAP/SSO configuration, and permissions.");return Y.join(" ")}function gi($){let Y=[];if($.includes("network_issues"))Y.push("Execute network connectivity test","Check DNS resolution","Verify firewall rules");if($.includes("database_issues"))Y.push("Test database connectivity","Check database performance metrics","Review connection pool status");if($.includes("application_errors"))Y.push("Restart application service","Check application logs","Monitor resource utilization");if($.includes("auth_issues"))Y.push("Reset user session","Verify user permissions","Check authentication service status");return Y}var EV={name:"snow_auto_resolve_incident",description:"Attempts automated resolution of technical incidents based on known patterns and previous solutions. Includes dry-run mode for safety.",category:"itsm",subcategory:"operations",use_cases:["incidents","automation"],complexity:"advanced",frequency:"medium",permission:"write",allowedRoles:["developer","admin"],inputSchema:{type:"object",properties:{incident_id:{type:"string",description:"Incident number or sys_id to auto-resolve"},dry_run:{type:"boolean",description:"Preview actions without executing (default: true for safety)",default:!0}},required:["incident_id"]}},ni={password_reset:{keywords:["password","reset","forgot","locked"],actions:["Send password reset email","Unlock user account","Update password policy"]},network_restart:{keywords:["network","connectivity","unreachable"],actions:["Restart network service","Clear DNS cache","Reset network adapter"]},service_restart:{keywords:["service","down","not responding","crash"],actions:["Restart service","Check service logs","Verify service configuration"]},cache_clear:{keywords:["cache","stale","outdated","refresh"],actions:["Clear cache","Restart caching service","Verify cache configuration"]}};async function IV($,Y){let{incident_id:X,dry_run:z=!0}=$;try{let J=await P(Y),Z=`number=${X}`,G=await J.get("/api/now/table/incident",{params:{sysparm_query:Z,sysparm_limit:1}});if(!G.data.result||G.data.result.length===0)Z=`sys_id=${X}`,G=await J.get("/api/now/table/incident",{params:{sysparm_query:Z,sysparm_limit:1}});if(!G.data.result||G.data.result.length===0)return x(`Incident ${X} not found`);let K=G.data.result[0],Q=(K.short_description||"").toLowerCase(),W=[],H=[],U=0;for(let[F,v]of Object.entries(ni))if(v.keywords.some((A)=>Q.includes(A)))W.push(F),H.push(...v.actions),U+=0.25;let B=`short_descriptionLIKE${K.short_description}^state=6^close_code!=Cancelled`,O=(await J.get("/api/now/table/incident",{params:{sysparm_query:B,sysparm_limit:3}})).data.result||[],q=O.filter((F)=>F.close_notes).map((F)=>F.close_notes),N=[];if(!z&&U>=0.5){let F=`Auto-resolution attempted based on patterns: ${W.join(", ")}\\n\\nActions: ${H.join(", ")}`;await J.put(`/api/now/table/incident/${K.sys_id}`,{work_notes:F,state:6,close_code:"Solved (Permanently)",close_notes:`Auto-resolved using pattern recognition. Actions executed: ${H.join(", ")}`}),N.push("Updated incident to Resolved state"),N.push("Added work notes with resolution details"),N.push("Set close code to Solved (Permanently)")}let L={incident_id:K.number,incident_sys_id:K.sys_id,dry_run:z,patterns_found:W,confidence_score:Math.min(U,1),resolution_actions:H,similar_resolved_incidents:O.length,resolution_notes_from_similar:q,actions_executed:N,can_auto_resolve:U>=0.5,recommendation:U>=0.5?"High confidence - safe to auto-resolve":"Low confidence - manual review recommended"};return M({result:L},{incident_id:X,dry_run:z,confidence:U})}catch(J){return x(J.message)}}var SV={name:"snow_operational_metrics",description:"Provides operational metrics and analytics including incident trends, resolution times, and performance indicators",category:"ml-analytics",subcategory:"metrics",use_cases:["analytics","metrics"],complexity:"intermediate",frequency:"medium",permission:"read",allowedRoles:["developer","stakeholder","admin"],inputSchema:{type:"object",properties:{timeframe:{type:"string",description:"Time period for metrics",enum:["today","week","month","quarter"],default:"week"},metric_types:{type:"array",items:{type:"string"},description:"Types of metrics to include (leave empty for all)",examples:[["incidents","requests","problems"]]}}}};function ci($){switch($){case"today":return"ONToday@javascript:gs.daysAgoStart(0)@javascript:gs.daysAgoEnd(0)";case"week":return"ONLast 7 days@javascript:gs.daysAgoStart(7)@javascript:gs.daysAgoEnd(0)";case"month":return"ONLast 30 days@javascript:gs.daysAgoStart(30)@javascript:gs.daysAgoEnd(0)";case"quarter":return"ONLast 90 days@javascript:gs.daysAgoStart(90)@javascript:gs.daysAgoEnd(0)";default:return"ONLast 7 days@javascript:gs.daysAgoStart(7)@javascript:gs.daysAgoEnd(0)"}}async function RV($,Y){let{timeframe:X="week",metric_types:z=[]}=$;try{let J=await P(Y),Z=ci(X),G={timeframe:X,generated_at:new Date().toISOString()},K=z.length===0;if(K||z.includes("incidents")){let W=(await J.get("/api/now/table/incident",{params:{sysparm_query:`sys_created_on${Z}`,sysparm_limit:1000,sysparm_fields:"number,state,priority,category"}})).data.result||[],H=W.filter((V)=>V.state!=="6"&&V.state!=="7"),U=W.filter((V)=>V.priority==="1"),B=new Map;W.forEach((V)=>{let O=V.category||"uncategorized";B.set(O,(B.get(O)||0)+1)}),G.incidents={total:W.length,open:H.length,high_priority:U.length,common_categories:Array.from(B.entries()).sort((V,O)=>O[1]-V[1]).slice(0,5).map(([V,O])=>({category:V,count:O}))}}if(K||z.includes("requests")){let W=(await J.get("/api/now/table/sc_request",{params:{sysparm_query:`sys_created_on${Z}`,sysparm_limit:1000,sysparm_fields:"number,request_state,approval"}})).data.result||[],H=W.filter((B)=>B.request_state!=="closed"),U=W.filter((B)=>B.approval==="requested");G.requests={total:W.length,open:H.length,pending_approval:U.length}}if(K||z.includes("problems")){let W=(await J.get("/api/now/table/problem",{params:{sysparm_query:`sys_created_on${Z}`,sysparm_limit:100,sysparm_fields:"number,state,priority"}})).data.result||[],H=W.filter((U)=>U.state!=="4");G.problems={total:W.length,open:H.length}}return M({metrics:G},{timeframe:X,metric_types:K?"all":z.join(",")})}catch(J){return x(J.message)}}var fV={name:"snow_pattern_analysis",description:"Analyzes patterns across incidents, requests, and problems to identify trends, common issues, and improvement opportunities",category:"reporting",subcategory:"analytics",use_cases:["pattern-analysis","trends","data-analysis"],complexity:"advanced",frequency:"medium",permission:"read",allowedRoles:["developer","stakeholder","admin"],inputSchema:{type:"object",properties:{analysis_type:{type:"string",description:"Type of pattern analysis",enum:["incident_patterns","request_trends","problem_root_causes","user_behavior"]},timeframe:{type:"string",description:"Time period for analysis",enum:["day","week","month","quarter"],default:"week"}},required:["analysis_type"]}};function ii($){let Y={day:"ONToday@javascript:gs.daysAgoStart(0)@javascript:gs.daysAgoEnd(0)",week:"ONLast 7 days@javascript:gs.daysAgoStart(7)@javascript:gs.daysAgoEnd(0)",month:"ONLast 30 days@javascript:gs.daysAgoStart(30)@javascript:gs.daysAgoEnd(0)",quarter:"ONLast 90 days@javascript:gs.daysAgoStart(90)@javascript:gs.daysAgoEnd(0)"};return Y[$]||Y.week}async function mV($,Y){let{analysis_type:X,timeframe:z="week"}=$;try{let J=await P(Y),Z=ii(z),G={analysis_type:X,timeframe:z,generated_at:new Date().toISOString()};switch(X){case"incident_patterns":G={...G,...await li(J,Z)};break;case"request_trends":G={...G,...await oi(J,Z)};break;case"problem_root_causes":G={...G,...await di(J,Z)};break;case"user_behavior":G={...G,...await ai(J,Z)};break;default:return x(`Unknown analysis type: ${X}`)}return M({patterns:G},{analysis_type:X,timeframe:z})}catch(J){return x(J.message)}}async function li($,Y){let z=(await $.get("/api/now/table/incident",{params:{sysparm_query:`sys_created_on${Y}`,sysparm_limit:1000}})).data.result||[],J={by_category:new Map,by_priority:new Map,by_state:new Map,by_hour:new Map,common_keywords:new Map};return z.forEach((Z)=>{let G=Z.category||"uncategorized";J.by_category.set(G,(J.by_category.get(G)||0)+1);let K=Z.priority||"unknown";J.by_priority.set(K,(J.by_priority.get(K)||0)+1);let Q=Z.state||"unknown";if(J.by_state.set(Q,(J.by_state.get(Q)||0)+1),Z.sys_created_on){let U=new Date(Z.sys_created_on).getHours();J.by_hour.set(U,(J.by_hour.get(U)||0)+1)}(Z.short_description||"").toLowerCase().split(/\s+/).filter((U)=>U.length>3).slice(0,5).forEach((U)=>{J.common_keywords.set(U,(J.common_keywords.get(U)||0)+1)})}),{total_incidents:z.length,patterns:{by_category:Object.fromEntries(J.by_category),by_priority:Object.fromEntries(J.by_priority),by_state:Object.fromEntries(J.by_state),peak_hours:Array.from(J.by_hour.entries()).sort((Z,G)=>G[1]-Z[1]).slice(0,5).map(([Z,G])=>({hour:Z,count:G})),top_keywords:Array.from(J.common_keywords.entries()).sort((Z,G)=>G[1]-Z[1]).slice(0,10).map(([Z,G])=>({keyword:Z,count:G}))}}}async function oi($,Y){let z=(await $.get("/api/now/table/sc_request",{params:{sysparm_query:`sys_created_on${Y}`,sysparm_limit:1000}})).data.result||[],J={by_state:new Map,by_approval:new Map};return z.forEach((Z)=>{let G=Z.request_state||"unknown";J.by_state.set(G,(J.by_state.get(G)||0)+1);let K=Z.approval||"unknown";J.by_approval.set(K,(J.by_approval.get(K)||0)+1)}),{total_requests:z.length,trends:{by_state:Object.fromEntries(J.by_state),by_approval_status:Object.fromEntries(J.by_approval)}}}async function di($,Y){let z=(await $.get("/api/now/table/problem",{params:{sysparm_query:`sys_created_on${Y}`,sysparm_limit:100}})).data.result||[],J={by_category:new Map,by_state:new Map};return z.forEach((Z)=>{let G=Z.category||"uncategorized";J.by_category.set(G,(J.by_category.get(G)||0)+1);let K=Z.state||"unknown";J.by_state.set(K,(J.by_state.get(K)||0)+1)}),{total_problems:z.length,root_causes:{by_category:Object.fromEntries(J.by_category),by_state:Object.fromEntries(J.by_state)}}}async function ai($,Y){let z=(await $.get("/api/now/table/incident",{params:{sysparm_query:`sys_created_on${Y}`,sysparm_limit:500,sysparm_fields:"caller_id"}})).data.result||[],J=new Map;return z.forEach((Z)=>{let G=Z.caller_id?.value||Z.caller_id;if(G)J.set(G,(J.get(G)||0)+1)}),{user_activities:{total_incidents:z.length,unique_users:J.size,avg_incidents_per_user:J.size>0?Math.round(z.length/J.size*10)/10:0}}}var yV={name:"snow_predictive_analysis",description:"Provides predictive analysis for incident volumes, system failures, and resource issues based on historical patterns",category:"ml-analytics",subcategory:"prediction",use_cases:["prediction","analytics"],complexity:"advanced",frequency:"low",permission:"read",allowedRoles:["developer","stakeholder","admin"],inputSchema:{type:"object",properties:{prediction_type:{type:"string",description:"Type of prediction",enum:["incident_volume","system_failure","resource_exhaustion","user_impact"]},timeframe:{type:"string",description:"Prediction timeframe",enum:["day","week","month"],default:"week"}},required:["prediction_type"]}};function si($){let Y={day:"ONLast 7 days@javascript:gs.daysAgoStart(7)@javascript:gs.daysAgoEnd(0)",week:"ONLast 30 days@javascript:gs.daysAgoStart(30)@javascript:gs.daysAgoEnd(0)",month:"ONLast 90 days@javascript:gs.daysAgoStart(90)@javascript:gs.daysAgoEnd(0)"};return Y[$]||Y.week}async function hV($,Y){let{prediction_type:X,timeframe:z="week"}=$;try{let J=await P(Y),Z=si(z),G={prediction_type:X,timeframe:z,generated_at:new Date().toISOString(),analysis_method:"trend_analysis"};switch(X){case"incident_volume":G={...G,...await ri(J,Z,z)};break;case"system_failure":G={...G,...await ti(J,Z,z)};break;case"resource_exhaustion":G={...G,...await ei(J,Z,z)};break;case"user_impact":G={...G,...await $l(J,Z,z)};break;default:return x(`Unknown prediction type: ${X}`)}return M({predictions:G},{prediction_type:X,timeframe:z})}catch(J){return x(J.message)}}async function ri($,Y,X){let J=(await $.get("/api/now/table/incident",{params:{sysparm_query:`sys_created_on${Y}`,sysparm_limit:1000,sysparm_fields:"sys_created_on,priority"}})).data.result||[],Z=new Map;J.forEach((Q)=>{if(Q.sys_created_on){let W=Q.sys_created_on.split(" ")[0];Z.set(W,(Z.get(W)||0)+1)}});let G=Array.from(Z.values()),K=G.length>0?G.reduce((Q,W)=>Q+W,0)/G.length:0;return{historical_data:{total_incidents:J.length,average_daily_volume:Math.round(K),peak_volume:Math.max(...G,0),low_volume:Math.min(...G,0)},prediction:{expected_volume:Math.round(K),confidence:G.length>=7?"high":"low",interpretation:`Based on ${G.length} days of data, expecting approximately ${Math.round(K)} incidents per ${X}`}}}async function ti($,Y,X){let J=(await $.get("/api/now/table/incident",{params:{sysparm_query:`sys_created_on${Y}^priority=1`,sysparm_limit:500}})).data.result||[];return{historical_data:{critical_incidents:J.length},prediction:{risk_level:J.length>10?"high":"low",interpretation:`Based on ${J.length} critical incidents, system failure risk is ${J.length>10?"elevated":"normal"}`}}}async function ei($,Y,X){let J=(await $.get("/api/now/table/sc_request",{params:{sysparm_query:`sys_created_on${Y}`,sysparm_limit:1000}})).data.result||[];return{historical_data:{total_requests:J.length},prediction:{risk_level:J.length>500?"medium":"low",interpretation:`Based on ${J.length} service requests, resource demand is ${J.length>500?"increasing":"stable"}`}}}async function $l($,Y,X){let J=(await $.get("/api/now/table/incident",{params:{sysparm_query:`sys_created_on${Y}`,sysparm_limit:1000,sysparm_fields:"caller_id,state"}})).data.result||[],Z=new Set(J.map((G)=>G.caller_id?.value||G.caller_id).filter(Boolean));return{historical_data:{total_incidents:J.length,affected_users:Z.size},prediction:{impact_level:Z.size>50?"high":"medium",interpretation:`${Z.size} unique users affected. User impact is ${Z.size>50?"widespread":"localized"}`}}}var uV={name:"snow_cmdb_search",description:"Searches Configuration Management Database (CMDB) for configuration items with relationship mapping",category:"cmdb",subcategory:"discovery",use_cases:["cmdb","configuration-items"],complexity:"intermediate",frequency:"high",permission:"read",allowedRoles:["developer","stakeholder","admin"],inputSchema:{type:"object",properties:{query:{type:"string",description:'Search query for configuration items (e.g., "server name", "application")'},ci_type:{type:"string",description:"Type of CI to search",enum:["server","application","database","network_device","service","any"],default:"any"},limit:{type:"number",description:"Maximum number of results",default:10,minimum:1,maximum:100},include_relationships:{type:"boolean",description:"Include CI relationships",default:!1}},required:["query"]}},Xl={server:"cmdb_ci_server",application:"cmdb_ci_application",database:"cmdb_ci_database",network_device:"cmdb_ci_network_device",service:"cmdb_ci_service",any:"cmdb_ci"};function Yl($){if($.includes("=")||$.includes("!=")||$.includes("^")||$.includes("LIKE"))return $;return`nameLIKE${$}^ORshort_descriptionLIKE${$}`}async function pV($,Y){let{query:X,ci_type:z="any",limit:J=10,include_relationships:Z=!1}=$;if(!X||typeof X!=="string"||X.trim()==="")return x('Parameter "query" is required and must be a non-empty string');try{let K=await P(Y),Q=Xl[z]||"cmdb_ci",W=Yl(X.trim());var G;try{G=await K.get(`/api/now/table/${Q}`,{params:{sysparm_query:W,sysparm_limit:J,sysparm_fields:"sys_id,name,short_description,operational_status,support_group,sys_class_name"}})}catch(B){if(Q!=="cmdb_ci"&&B.response?.status===400)G=await K.get("/api/now/table/cmdb_ci",{params:{sysparm_query:W,sysparm_limit:J,sysparm_fields:"sys_id,name,short_description,operational_status,support_group,sys_class_name"}});else throw B}let H=G.data.result||[],U={total_results:H.length,ci_type:z,table_searched:Q,query_used:W,configuration_items:H.map((B)=>({sys_id:B.sys_id,name:B.name,short_description:B.short_description,operational_status:B.operational_status,support_group:B.support_group,sys_class_name:B.sys_class_name}))};if(Z&&H.length>0){let B=[];for(let V of H)try{let O=await K.get("/api/now/table/cmdb_rel_ci",{params:{sysparm_query:`parent=${V.sys_id}^ORchild=${V.sys_id}`,sysparm_limit:20}});if(O.data.result&&O.data.result.length>0)B.push({ci_sys_id:V.sys_id,ci_name:V.name,relationship_count:O.data.result.length,relationships:O.data.result.map((q)=>({type:q.type,parent:q.parent?.name||q.parent,child:q.child?.name||q.child}))})}catch(O){console.warn(`Failed to get relationships for CI ${V.sys_id}:`,O)}U.relationships=B}return M(U,{query:W,ci_type:z,limit:J,count:H.length})}catch(K){return x(K.message)}}var gV={name:"snow_catalog_item_manager",description:"Create, update, or manage service catalog items",category:"itsm",subcategory:"catalog",use_cases:["catalog-management","service-catalog","crud"],complexity:"intermediate",frequency:"medium",permission:"write",allowedRoles:["developer","admin"],inputSchema:{type:"object",properties:{action:{type:"string",description:"Action to perform",enum:["create","update","activate","deactivate","delete"]},sys_id:{type:"string",description:"Catalog item sys_id (required for update/activate/deactivate/delete)"},name:{type:"string",description:"Catalog item name (required for create)"},short_description:{type:"string",description:"Short description"},category:{type:"string",description:"Category sys_id"},price:{type:"string",description:"Item price"}},required:["action"]}};async function nV($,Y){let{action:X,sys_id:z,name:J,short_description:Z,category:G,price:K}=$;try{let Q=await P(Y);switch(X){case"create":if(!J)return x("name is required for create action");let W={name:J,short_description:Z||"",active:!0};if(G)W.category=G;if(K)W.price=K;let U=(await Q.post("/api/now/table/sc_cat_item",W)).data.result;return M({message:`Catalog item "${J}" created successfully`,catalog_item:{sys_id:U.sys_id,name:U.name,short_description:U.short_description,active:U.active}},{action:X,sys_id:U.sys_id});case"update":if(!z)return x("sys_id is required for update action");let B={};if(J)B.name=J;if(Z)B.short_description=Z;if(G)B.category=G;if(K)B.price=K;let O=(await Q.put(`/api/now/table/sc_cat_item/${z}`,B)).data.result;return M({message:"Catalog item updated successfully",catalog_item:O},{action:X,sys_id:z});case"activate":case"deactivate":if(!z)return x(`sys_id is required for ${X} action`);let q=X==="activate",N=await Q.put(`/api/now/table/sc_cat_item/${z}`,{active:q});return M({message:`Catalog item ${X}d successfully`,sys_id:z,active:q},{action:X,sys_id:z});case"delete":if(!z)return x("sys_id is required for delete action");return await Q.delete(`/api/now/table/sc_cat_item/${z}`),M({message:"Catalog item deleted successfully",sys_id:z},{action:X,sys_id:z});default:return x(`Unknown action: ${X}`)}}catch(Q){return x(Q.message)}}var cV={name:"snow_catalog_item_search",description:"Search service catalog items with filtering options",category:"itsm",subcategory:"catalog",use_cases:["catalog-search","service-catalog","discovery"],complexity:"beginner",frequency:"medium",permission:"read",allowedRoles:["developer","stakeholder","admin"],inputSchema:{type:"object",properties:{query:{type:"string",description:"Search query (searches name and short_description)"},active_only:{type:"boolean",description:"Only return active catalog items",default:!0},category:{type:"string",description:"Filter by category sys_id"},limit:{type:"number",description:"Maximum number of results",default:20,minimum:1,maximum:100}}}};async function iV($,Y){let{query:X,active_only:z=!0,category:J,limit:Z=20}=$;try{let G=await P(Y),K="";if(X)K=`nameLIKE${X}^ORshort_descriptionLIKE${X}`;if(z)K+=K?"^active=true":"active=true";if(J)K+=K?`^category=${J}`:`category=${J}`;let W=(await G.get("/api/now/table/sc_cat_item",{params:{sysparm_query:K||void 0,sysparm_limit:Z}})).data.result||[];return M({total_results:W.length,catalog_items:W.map((H)=>({sys_id:H.sys_id,name:H.name,short_description:H.short_description,active:H.active,category:H.category,price:H.price}))},{query:X||"all",limit:Z,count:W.length})}catch(G){return x(G.message)}}var lV={name:"snow_cleanup_test_artifacts",description:"Safely cleanup test artifacts from ServiceNow (dry-run enabled by default for safety)",category:"development",subcategory:"testing",use_cases:["testing","cleanup"],complexity:"intermediate",frequency:"low",permission:"write",allowedRoles:["developer","admin"],inputSchema:{type:"object",properties:{artifact_type:{type:"string",description:"Type of artifacts to clean up",enum:["incidents","requests","test_data","all"]},name_pattern:{type:"string",description:'Pattern to match artifact names (e.g., "TEST", "DEMO")',default:"TEST"},dry_run:{type:"boolean",description:"Preview cleanup without executing (default: true for safety)",default:!0},limit:{type:"number",description:"Maximum number of records to clean up",default:10,maximum:100}},required:["artifact_type"]}};async function oV($,Y){let{artifact_type:X,name_pattern:z="TEST",dry_run:J=!0,limit:Z=10}=$;try{let G=await P(Y),K={artifact_type:X,name_pattern:z,dry_run:J,items_found:0,items_deleted:0,artifacts:[]},Q=[];if(X==="incidents"||X==="all")Q.push("incident");if(X==="requests"||X==="all")Q.push("sc_request");for(let H of Q){let U=`short_descriptionLIKE${z}`,V=(await G.get(`/api/now/table/${H}`,{params:{sysparm_query:U,sysparm_limit:Z}})).data.result||[];K.items_found+=V.length;for(let O of V)if(K.artifacts.push({table:H,sys_id:O.sys_id,number:O.number,short_description:O.short_description}),!J)await G.delete(`/api/now/table/${H}/${O.sys_id}`),K.items_deleted++}let W=J?`Found ${K.items_found} test artifacts. Run with dry_run=false to delete.`:`Deleted ${K.items_deleted} test artifacts successfully.`;return M({message:W,...K},{artifact_type:X,dry_run:J,items_found:K.items_found})}catch(G){return x(G.message)}}var dV={name:"snow_assign_task",description:"Assign task to user or group with workload balancing and skill matching",category:"core-operations",subcategory:"task-management",use_cases:["task-assignment","workload"],complexity:"intermediate",frequency:"high",permission:"write",allowedRoles:["developer","admin"],inputSchema:{type:"object",properties:{table:{type:"string",description:"Task table (incident, change_request, sc_task, etc.)",default:"task"},sys_id:{type:"string",description:"Task sys_id or number"},assigned_to:{type:"string",description:"User sys_id or username to assign to"},assignment_group:{type:"string",description:"Group sys_id or name to assign to"},auto_assign:{type:"boolean",description:"Auto-assign to available group member with lowest workload",default:!1},check_availability:{type:"boolean",description:"Check user availability before assignment",default:!1},work_notes:{type:"string",description:"Work notes to add with assignment"}},required:["sys_id"]}};async function aV($,Y){let{table:X="task",sys_id:z,assigned_to:J,assignment_group:Z,auto_assign:G=!1,check_availability:K=!1,work_notes:Q}=$;try{let W=await P(Y),H;if(z.length===32)H=(await W.get(`/api/now/table/${X}/${z}`,{params:{sysparm_fields:"sys_id,number,assigned_to,assignment_group"}})).data.result;else{let q=await W.get(`/api/now/table/${X}`,{params:{sysparm_query:`number=${z}`,sysparm_fields:"sys_id,number,assigned_to,assignment_group",sysparm_limit:1}});if(q.data.result&&q.data.result.length>0)H=q.data.result[0]}if(!H)throw new D("NOT_FOUND_ERROR",`Task not found: ${z}`,{details:{table:X,sys_id:z}});let U={},B;if(Z){if(Z.length===32)B=Z;else{let q=await W.get("/api/now/table/sys_user_group",{params:{sysparm_query:`name=${Z}`,sysparm_fields:"sys_id,name",sysparm_limit:1}});if(q.data.result&&q.data.result.length>0)B=q.data.result[0].sys_id}U.assignment_group=B}if(J){if(J.length===32)U.assigned_to=J;else{let q=await W.get("/api/now/table/sys_user",{params:{sysparm_query:`user_name=${J}`,sysparm_fields:"sys_id,user_name,active",sysparm_limit:1}});if(q.data.result&&q.data.result.length>0){let N=q.data.result[0];if(!N.active)throw new D("VALIDATION_ERROR",`User '${J}' is inactive and cannot be assigned tasks`,{details:{user:J}});U.assigned_to=N.sys_id}}if(K&&U.assigned_to){let q=await W.get("/api/now/table/cmn_schedule",{params:{sysparm_query:`type=user^user=${U.assigned_to}`,sysparm_fields:"sys_id",sysparm_limit:1}})}}else if(G&&B){let q=await W.get("/api/now/table/sys_user_grmember",{params:{sysparm_query:`group=${B}^user.active=true`,sysparm_fields:"user",sysparm_limit:100}});if(q.data.result&&q.data.result.length>0){let N=q.data.result.map((v)=>v.user.value),F=(await Promise.all(N.map(async(v)=>{let A=await W.get(`/api/now/table/${X}`,{params:{sysparm_query:`assigned_to=${v}^active=true`,sysparm_fields:"sys_id",sysparm_limit:1000}});return{user_id:v,count:A.data.result?.length||0}}))).reduce((v,A)=>A.count<v.count?A:v);U.assigned_to=F.user_id}}if(Q)U.work_notes=Q;let O=(await W.put(`/api/now/table/${X}/${H.sys_id}`,U,{params:{sysparm_display_value:"all",sysparm_exclude_reference_link:"true"}})).data.result;return M({assigned:!0,number:O.number,sys_id:O.sys_id,previous_assigned_to:H.assigned_to,current_assigned_to:O.assigned_to,previous_assignment_group:H.assignment_group,current_assignment_group:O.assignment_group,auto_assigned:G&&!J,task:{number:O.number,sys_id:O.sys_id,assigned_to:O.assigned_to,assignment_group:O.assignment_group},url:`${Y.instanceUrl}/${X}.do?sys_id=${O.sys_id}`})}catch(W){return x(W instanceof D?W:W.message)}}var rV={name:"snow_manage_group_membership",description:"Manage group memberships: add/remove users, list members",category:"core-operations",subcategory:"user-management",use_cases:["user-management","access-control","group-administration"],complexity:"beginner",frequency:"high",permission:"write",allowedRoles:["developer","admin"],inputSchema:{type:"object",properties:{action:{type:"string",description:"Operation: add, remove, or list",enum:["add","remove","list"]},user_identifier:{type:"string",description:"User sys_id, username, or email"},group_identifier:{type:"string",description:"Group sys_id or name"},include_details:{type:"boolean",description:"Include user details (list only)",default:!0}},required:["action","group_identifier"]}};async function sV($,Y){let X=Y.includes("@")?`email=${Y}`:Y.length===32?`sys_id=${Y}`:`user_name=${Y}`,z=await $.get("/api/now/table/sys_user",{params:{sysparm_query:X,sysparm_limit:1}});if(!z.data.result||z.data.result.length===0)throw Error(`User "${Y}" not found`);return z.data.result[0]}async function zl($,Y){let X=Y.length===32?`sys_id=${Y}`:`name=${Y}`,z=await $.get("/api/now/table/sys_user_group",{params:{sysparm_query:X,sysparm_limit:1}});if(!z.data.result||z.data.result.length===0)throw Error(`Group "${Y}" not found`);return z.data.result[0]}async function Jl($,Y,X){var z=await $.get("/api/now/table/sys_user_grmember",{params:{sysparm_query:`user=${Y.sys_id}^group=${X.sys_id}`,sysparm_limit:1}});if(z.data.result&&z.data.result.length>0)return{message:`User "${Y.user_name}" is already a member of group "${X.name}"`,membership_sys_id:z.data.result[0].sys_id,already_exists:!0};var J={user:Y.sys_id,group:X.sys_id},Z=await $.post("/api/now/table/sys_user_grmember",J),G=Z.data.result;return{message:`User "${Y.user_name}" assigned to group "${X.name}" successfully`,membership:{sys_id:G.sys_id,user:{sys_id:Y.sys_id,user_name:Y.user_name,name:Y.name},group:{sys_id:X.sys_id,name:X.name}},already_exists:!1}}async function Gl($,Y,X){var z=await $.get("/api/now/table/sys_user_grmember",{params:{sysparm_query:`user=${Y.sys_id}^group=${X.sys_id}`,sysparm_limit:1}});if(!z.data.result||z.data.result.length===0)throw Error(`User "${Y.user_name}" is not a member of group "${X.name}"`);var J=z.data.result[0];return await $.delete(`/api/now/table/sys_user_grmember/${J.sys_id}`),{message:`User "${Y.user_name}" removed from group "${X.name}" successfully`,removed_membership:{sys_id:J.sys_id,user:{sys_id:Y.sys_id,user_name:Y.user_name,name:Y.name},group:{sys_id:X.sys_id,name:X.name}}}}async function Zl($,Y,X){var z=await $.get("/api/now/table/sys_user_grmember",{params:{sysparm_query:`group=${Y.sys_id}`,sysparm_limit:500}}),J=z.data.result||[],Z=[];if(X&&J.length>0){var G=J.map(function(L){return L.user.value||L.user}),K=`sys_idIN${G.join(",")}`,Q=await $.get("/api/now/table/sys_user",{params:{sysparm_query:K,sysparm_limit:500}}),W=Q.data.result||[],H={};for(var U=0;U<W.length;U++)H[W[U].sys_id]=W[U];for(var B=0;B<J.length;B++){var V=J[B],O=V.user.value||V.user,q=H[O];Z.push({membership_sys_id:V.sys_id,user_sys_id:O,user_name:q?q.user_name:"Unknown",name:q?q.name:"Unknown",email:q?q.email:void 0,title:q?q.title:void 0,department:q?q.department:void 0,active:q?q.active:void 0})}}else for(var N=0;N<J.length;N++)Z.push({membership_sys_id:J[N].sys_id,user_sys_id:J[N].user.value||J[N].user});return{group:{sys_id:Y.sys_id,name:Y.name,description:Y.description,type:Y.type},member_count:Z.length,members:Z}}async function tV($,Y){var{action:X,user_identifier:z,group_identifier:J}=$,Z=$.include_details!==void 0?$.include_details:!0;try{var G=await P(Y),K=await zl(G,J);if(X==="add"){if(!z)return x("user_identifier is required for add action");var Q=await sV(G,z),W=await Jl(G,Q,K);return M(W,{user_name:Q.user_name,group_name:K.name})}if(X==="remove"){if(!z)return x("user_identifier is required for remove action");var H=await sV(G,z),U=await Gl(G,H,K);return M(U,{user_name:H.user_name,group_name:K.name})}if(X==="list"){var B=await Zl(G,K,Z);return M(B,{group_name:K.name,member_count:B.member_count})}return x(`Invalid action: ${X}. Must be add, remove, or list`)}catch(V){return x(V.message)}}var IJ={};z0(IJ,{snow_validate_deployment_exec:()=>qM,snow_validate_deployment_def:()=>MM,snow_rollback_deployment_exec:()=>VM,snow_rollback_deployment_def:()=>OM,snow_github_tree_exec:()=>wM,snow_github_tree_def:()=>_M,snow_github_deploy_exec:()=>DM,snow_github_deploy_def:()=>jM,snow_deployment_status_exec:()=>xM,snow_deployment_status_def:()=>BM,snow_deployment_debug_exec:()=>HM,snow_deployment_debug_def:()=>WM,snow_create_solution_package_exec:()=>QM,snow_create_solution_package_def:()=>KM,snow_clone_instance_artifact_exec:()=>ZM,snow_clone_instance_artifact_def:()=>GM,snow_auth_diagnostics_exec:()=>JM,snow_auth_diagnostics_def:()=>zM,snow_artifact_manage_exec:()=>F7,snow_artifact_manage_def:()=>YM});import*as b4 from"fs/promises";import*as T5 from"path";import{existsSync as XM}from"fs";var k5={sp_widget:"sp_widget",widget:"sp_widget",sp_page:"sp_page",page:"sp_page",sys_ux_page:"sys_ux_page",uib_page:"sys_ux_page",script_include:"sys_script_include",business_rule:"sys_script",client_script:"sys_script_client",ui_policy:"sys_ui_policy",ui_action:"sys_ui_action",rest_message:"sys_rest_message",scheduled_job:"sysauto_script",transform_map:"sys_transform_map",fix_script:"sys_script_fix",table:"sys_db_object",field:"sys_dictionary",flow:"sys_hub_flow",application:"sys_app"},I6={sp_widget:"id",sp_page:"id",sys_ux_page:"name",sys_script_include:"name",sys_script:"name",sys_script_client:"name",sys_ui_policy:"short_description",sys_ui_action:"name",sys_rest_message:"name",sysauto_script:"name",sys_transform_map:"name",sys_script_fix:"name",sys_db_object:"name",sys_dictionary:"element",sys_hub_flow:"name",sys_app:"name"},X$={sp_widget:{template:["template.html","index.html","widget.html"],script:["server.js","server-script.js","script.js"],client_script:["client.js","client-script.js","controller.js"],css:["style.css","styles.css","widget.css"],option_schema:["options.json","option_schema.json","schema.json"]},sys_script:{script:["script.js","index.js","main.js"],condition:["condition.js","condition.txt"]},sys_script_include:{script:["script.js","index.js","main.js","{name}.js"]},sys_script_client:{script:["script.js","client.js","index.js"]},sp_page:{},sys_ux_page:{},sys_ui_action:{script:["script.js","action.js","index.js"],condition:["condition.js"]},sysauto_script:{script:["script.js","job.js","index.js"]},sys_script_fix:{script:["script.js","fix.js","index.js"]}},eV={sp_widget:{template:"template.html",script:"server.js",client_script:"client.js",css:"style.css",option_schema:"options.json"},sys_script:{script:"script.js",condition:"condition.js"},sys_script_include:{script:"script.js"},sys_script_client:{script:"script.js"},sys_ui_action:{script:"script.js",condition:"condition.js"},sysauto_script:{script:"script.js"},sys_script_fix:{script:"script.js"}},$M={sys_script_include:".js",sys_script:".js",sys_script_client:".js",sys_ui_action:".js",sysauto_script:".js",sys_script_fix:".js",sp_widget:"",sp_page:"",sys_ux_page:""};var YM={name:"snow_artifact_manage",transports:["stdio"],description:`Unified tool for ServiceNow artifact management (create, get, update, delete, find, list, analyze, export, import)
|
|
71
|
+
`))}async function LV($,Y,X){var z={...X},J=["caller_id","assigned_to","opened_for","manager","project_manager","author","contact","primary_contact","requested_for"];for(var Z=0;Z<J.length;Z++){var G=J[Z];if(z[G]&&!$$(z[G])){var K=await ki($,z[G]);if(K)z[G]=K}}var Q=["assignment_group","support_group"];for(var W=0;W<Q.length;W++){var H=Q[W];if(z[H]&&!$$(z[H])){var U=await Ti($,z[H]);if(U)z[H]=U}}if(z.cmdb_ci&&!$$(z.cmdb_ci)){var B=await Ci($,z.cmdb_ci);if(B)z.cmdb_ci=B}if(z.department&&!$$(z.department)){var V=await Ei($,z.department);if(V)z.department=V}if(z.location&&!$$(z.location)){var O=await Ii($,z.location);if(O)z.location=O}return z}function $$($){return/^[a-f0-9]{32}$/i.test($)}async function ki($,Y){try{var X=await $.get("/api/now/table/sys_user",{params:{sysparm_query:"user_name="+Y+"^ORemail="+Y+"^ORname="+Y,sysparm_fields:"sys_id",sysparm_limit:1}});if(X.data.result&&X.data.result.length>0)return X.data.result[0].sys_id}catch(z){}return null}async function Ti($,Y){try{var X=await $.get("/api/now/table/sys_user_group",{params:{sysparm_query:"name="+Y,sysparm_fields:"sys_id",sysparm_limit:1}});if(X.data.result&&X.data.result.length>0)return X.data.result[0].sys_id}catch(z){}return null}async function Ci($,Y){try{var X=await $.get("/api/now/table/cmdb_ci",{params:{sysparm_query:"name="+Y,sysparm_fields:"sys_id",sysparm_limit:1}});if(X.data.result&&X.data.result.length>0)return X.data.result[0].sys_id}catch(z){}return null}async function Ei($,Y){try{var X=await $.get("/api/now/table/cmn_department",{params:{sysparm_query:"name="+Y,sysparm_fields:"sys_id",sysparm_limit:1}});if(X.data.result&&X.data.result.length>0)return X.data.result[0].sys_id}catch(z){}return null}async function Ii($,Y){try{var X=await $.get("/api/now/table/cmn_location",{params:{sysparm_query:"name="+Y,sysparm_fields:"sys_id",sysparm_limit:1}});if(X.data.result&&X.data.result.length>0)return X.data.result[0].sys_id}catch(z){}return null}async function Si($,Y,X){var z={};if(X.category)try{var J=await $.get("/api/now/table/sysrule_assignment",{params:{sysparm_query:"table="+Y+"^active=true^conditionLIKEcategory="+X.category,sysparm_fields:"group,user",sysparm_limit:1}});if(J.data.result&&J.data.result.length>0){var Z=J.data.result[0];if(Z.group)z.assignment_group=typeof Z.group==="object"?Z.group.value:Z.group;if(Z.user)z.assigned_to=typeof Z.user==="object"?Z.user.value:Z.user;return z}}catch(K){}try{var G=await $.get("/api/now/table/sys_user_group",{params:{sysparm_query:"nameLIKE"+Y+"^active=true",sysparm_fields:"sys_id,name",sysparm_limit:1}});if(G.data.result&&G.data.result.length>0)z.assignment_group=G.data.result[0].sys_id}catch(K){}return z}var Ri=["template","script","server_script","client_script","css","html","xml","json","payload","body","content","description","comments","work_notes","additional_comments","close_notes","resolution_notes","instructions","short_description","long_description"],bJ=200;function fi($,Y){if(!Y)return $;return $.map((X)=>{let z={};for(let[J,Z]of Object.entries(X))if(typeof Z==="string"&&Z.length>bJ)if(Ri.some((K)=>J.toLowerCase().includes(K))||Z.length>bJ*2)z[J]=Z.substring(0,bJ)+`... [truncated, ${Z.length} chars total]`;else z[J]=Z;else z[J]=Z;return z})}var FV={name:"snow_query_table",description:"Query any ServiceNow table with filtering, pagination, and field selection. Always returns sys_id for each record.",category:"core-operations",subcategory:"crud",use_cases:["query","read","records"],complexity:"beginner",frequency:"high",permission:"read",allowedRoles:["developer","stakeholder","admin"],inputSchema:{type:"object",properties:{table:{type:"string",description:"Table name to query (e.g., incident, task, sys_user)"},query:{type:"string",description:"Encoded query string (e.g., active=true^priority=1)"},fields:{type:"array",items:{type:"string"},description:"Fields to return (default: all fields)",default:[]},limit:{type:"number",description:"Maximum number of records to return",default:100,minimum:1,maximum:1e4},offset:{type:"number",description:"Number of records to skip (for pagination)",default:0,minimum:0},order_by:{type:"string",description:"Field to order by (prefix with - for descending, e.g., -sys_created_on)"},display_value:{type:"boolean",description:"Return display values instead of sys_ids for reference fields",default:!1},truncate_output:{type:"boolean",description:"Truncate large field values (scripts, templates, etc.) for cleaner output",default:!0}},required:["table"]}};async function PV($,Y){let{table:X,query:z="",limit:J=100,offset:Z=0,truncate_output:G=!0}=$,K=$.fields??[],Q=Array.isArray(K)?K:typeof K==="string"?K.split(",").map((U)=>U.trim()).filter(Boolean):[],W=$.order_by??$.orderBy,H=$.display_value??$.displayValue??!1;try{let U=await P(Y),B={sysparm_limit:J,sysparm_offset:Z};if(z)B.sysparm_query=z;if(Q.length>0){let L=Q.includes("sys_id")?Q:["sys_id",...Q];B.sysparm_fields=L.join(",")}if(W){let L=W.startsWith("-")?"DESC":"ASC",F=W.replace(/^-/,"");B.sysparm_query=(B.sysparm_query||"")+`^ORDERBY${L}${F}`}if(H)B.sysparm_display_value="true";let O=(await U.get(`/api/now/table/${X}`,{params:B})).data.result,q=fi(O,G),N=[];if(N.push(`Found ${q.length} record(s) in ${X}`),q.length>0){N.push(""),N.push("Record Preview:");let L=Math.min(q.length,5);for(let F=0;F<L;F++){let v=q[F],A=v.sys_id||"unknown",_=v.number||v.name||v.short_description||v.title||A,w=[`sys_id: ${A}`];if(v.number)w.push(`number: ${v.number}`);if(v.name&&v.name!==v.number)w.push(`name: ${v.name}`);if(v.short_description)w.push(`short_description: ${v.short_description.substring(0,50)}${v.short_description.length>50?"...":""}`);if(v.state)w.push(`state: ${v.state}`);if(v.active!==void 0)w.push(`active: ${v.active}`);N.push(` ${F+1}. ${_}`),N.push(` ${w.join(" | ")}`)}if(q.length>5)N.push(` ... and ${q.length-5} more records`)}if(q.length===J)N.push(""),N.push("Note: Results may be limited. Use offset parameter to paginate.");return M({records:q,count:q.length,total:q.length<J?q.length:"100+",has_more:q.length===J,truncated:G},{table:X,query:z,limit:J,offset:Z},N.join(`
|
|
72
|
+
`))}catch(U){return x(U.message)}}var vV={name:"snow_discover_table_fields",description:"Discover table schema with fields, types, relationships, and metadata",category:"development",subcategory:"schema",use_cases:["discovery","schema"],complexity:"intermediate",frequency:"medium",permission:"read",allowedRoles:["developer","stakeholder","admin"],inputSchema:{type:"object",properties:{table_name:{type:"string",description:"Table name to discover schema for"},include_relationships:{type:"boolean",description:"Include field relationships (reference fields)",default:!0},include_acls:{type:"boolean",description:"Include ACL information",default:!1},include_indexes:{type:"boolean",description:"Include index information",default:!1}},required:["table_name"]}};async function AV($,Y){let{table_name:X,include_relationships:z=!0,include_acls:J=!1,include_indexes:Z=!1}=$;try{let G=await P(Y),K=await G.get("/api/now/table/sys_db_object",{params:{sysparm_query:`name=${X}`,sysparm_limit:1}});if(K.data.result.length===0)return x(`Table not found: ${X}`);let Q=K.data.result[0],H=(await G.get("/api/now/table/sys_dictionary",{params:{sysparm_query:`name=${X}^element!=NULL^ORDERBYelement`,sysparm_limit:1000}})).data.result.map((O)=>({name:O.element,label:O.column_label,type:O.internal_type?.display_value||O.internal_type,max_length:O.max_length,mandatory:O.mandatory==="true",read_only:O.read_only==="true",default_value:O.default_value,reference:O.reference?.display_value||O.reference,help_text:O.help})),U=[];if(z)U=H.filter((q)=>q.type==="reference").map((q)=>({field:q.name,references_table:q.reference,type:"many-to-one"}));let B=[];if(J)B=(await G.get("/api/now/table/sys_security_acl",{params:{sysparm_query:`name=${X}`,sysparm_limit:100}})).data.result.map((q)=>({operation:q.operation,roles:q.roles,condition:q.condition,script:q.script?"Present":"None"}));let V=[];if(Z)V=(await G.get("/api/now/table/sys_db_index",{params:{sysparm_query:`table=${X}`,sysparm_limit:100}})).data.result.map((q)=>({name:q.name,fields:q.field_list,unique:q.unique==="true"}));return M({table:{name:X,label:Q.label,extends:Q.super_class?.display_value||null,sys_id:Q.sys_id},fields:H,field_count:H.length,relationships:U,acls:J?B:void 0,indexes:Z?V:void 0})}catch(G){return x(G.message)}}var _V={name:"snow_get_by_sysid",description:"Get any ServiceNow record by sys_id with optional field selection",category:"core-operations",subcategory:"crud",use_cases:["read","records"],complexity:"beginner",frequency:"high",permission:"read",allowedRoles:["developer","stakeholder","admin"],inputSchema:{type:"object",properties:{table:{type:"string",description:"Table name (e.g., sp_widget, sys_ux_page, incident)"},sys_id:{type:"string",description:"sys_id of the record to retrieve"},fields:{type:"array",items:{type:"string"},description:"Specific fields to return (default: all)",default:[]},display_value:{type:"boolean",description:"Return display values for reference fields",default:!1}},required:["table","sys_id"]}};async function wV($,Y){let{table:X,sys_id:z,fields:J=[],display_value:Z=!1}=$;try{let G=await P(Y),K={};if(J.length>0)K.sysparm_fields=J.join(",");if(Z)K.sysparm_display_value="true";let Q=await G.get(`/api/now/table/${X}/${z}`,{params:K});if(!Q.data||!Q.data.result)return x(`Record not found: ${X}/${z}`);let W=Q.data.result;return M({found:!0,record:W,table:X,sys_id:z})}catch(G){if(G.response?.status===404)return M({found:!1,table:X,sys_id:z,error:"Record not found"});return x(G.message)}}var q7={name:"snow_search_artifacts",description:"Search ServiceNow development artifacts (widgets, pages, scripts, flows, UI actions, client scripts). For data/table searches, use snow_query_table or snow_fuzzy_search instead.",category:"core-operations",subcategory:"search",use_cases:["artifact-search","development-search","find-widget","find-script"],complexity:"intermediate",frequency:"high",permission:"read",allowedRoles:["developer","stakeholder","admin"],inputSchema:{type:"object",properties:{query:{type:"string",description:"Search query - matches against name, title, and description fields"},types:{type:"array",items:{type:"string",enum:["widget","page","flow","script_include","business_rule","client_script","ui_action","ui_policy","ui_page","scheduled_job","all"]},description:"Artifact types to search (default: all)",default:["all"]},limit:{type:"number",description:"Maximum results per artifact type (default: 10)",default:10,minimum:1,maximum:50},include_inactive:{type:"boolean",description:"Include inactive/disabled artifacts",default:!1},search_tables:{type:"boolean",description:"Also search sys_db_object for matching table definitions (slower)",default:!1}},required:["query"]}},jJ={widget:{table:"sp_widget",name_field:"id",title_field:"name",active_field:"active",description:"Service Portal widgets",extra_fields:["template","css"]},page:{table:"sp_page",name_field:"id",title_field:"title",active_field:"active",description:"Service Portal pages"},flow:{table:"sys_hub_flow",name_field:"name",active_field:"active",description:"Flow Designer flows"},script_include:{table:"sys_script_include",name_field:"name",active_field:"active",description:"Script Includes (reusable server scripts)"},business_rule:{table:"sys_script",name_field:"name",active_field:"active",description:"Business Rules",extra_fields:["collection","when"]},client_script:{table:"sys_script_client",name_field:"name",active_field:"active",description:"Client Scripts",extra_fields:["table","type"]},ui_action:{table:"sys_ui_action",name_field:"name",active_field:"active",description:"UI Actions (buttons, links, context menus)",extra_fields:["table","action_name"]},ui_policy:{table:"sys_ui_policy",name_field:"short_description",active_field:"active",description:"UI Policies",extra_fields:["table","conditions"]},ui_page:{table:"sys_ui_page",name_field:"name",active_field:"active",description:"UI Pages (classic UI)",extra_fields:["category"]},scheduled_job:{table:"sysauto_script",name_field:"name",active_field:"active",description:"Scheduled Jobs"}};async function mi($,Y,X,z,J,Z){try{let G=[X.name_field];if(X.title_field)G.push(X.title_field);G.push("description");let K=G.map((B)=>`${B}LIKE${z}`).join("^NQ"),Q=!Z&&X.active_field?`^${X.active_field}=true`:"",W=K+Q,H=["sys_id",...G,"sys_created_on","sys_updated_on"];if(X.active_field)H.push(X.active_field);if(X.extra_fields)H.push(...X.extra_fields);let U=await $.get(`/api/now/table/${X.table}`,{params:{sysparm_query:W,sysparm_limit:J,sysparm_fields:[...new Set(H)].join(",")},timeout:1e4});if(!U.data.result||U.data.result.length===0)return{type:Y,table:X.table,description:X.description,count:0,artifacts:[]};return{type:Y,table:X.table,description:X.description,count:U.data.result.length,artifacts:U.data.result.map((B)=>({sys_id:B.sys_id,name:B[X.name_field],title:X.title_field?B[X.title_field]:void 0,description:B.description,active:X.active_field?B[X.active_field]==="true":void 0,created:B.sys_created_on,updated:B.sys_updated_on,...X.extra_fields?.reduce((V,O)=>{if(B[O])V[O]=B[O];return V},{})||{}}))}}catch(G){return{type:Y,table:X.table,description:X.description,count:0,artifacts:[],error:G.message}}}async function yi($,Y,X){try{let z=await $.get("/api/now/table/sys_db_object",{params:{sysparm_query:`nameLIKE${Y}^ORlabelLIKE${Y}`,sysparm_limit:X,sysparm_fields:"sys_id,name,label,super_class,is_extendable"},timeout:15000});if(!z.data.result||z.data.result.length===0)return{type:"table",table:"sys_db_object",description:"Table definitions",count:0,artifacts:[]};return{type:"table",table:"sys_db_object",description:"Table definitions",count:z.data.result.length,artifacts:z.data.result.map((J)=>({sys_id:J.sys_id,name:J.name,label:J.label,super_class:J.super_class?.display_value||J.super_class,is_extendable:J.is_extendable==="true"}))}}catch(z){return{type:"table",table:"sys_db_object",description:"Table definitions",count:0,artifacts:[],error:z.message}}}async function DJ($,Y){let{query:X,types:z=["all"],limit:J=10,include_inactive:Z=!1,search_tables:G=!1}=$;if(!X||X.trim().length===0)return x("Search query cannot be empty");try{let K=await P(Y),Q=z.includes("all")?Object.keys(jJ):z.filter((q)=>q!=="all"&&jJ[q]),W=Q.map((q)=>mi(K,q,jJ[q],X,J,Z));if(G)W.push(yi(K,X,J));let H=await Promise.all(W),U=H.filter((q)=>q.count>0),B=H.filter((q)=>q.error),V=U.reduce((q,N)=>q+N.count,0),O={query:X,summary:{total_found:V,artifact_types_searched:Q.length+(G?1:0),artifact_types_with_results:U.length,include_inactive:Z},found:U.map((q)=>({type:q.type,table:q.table,description:q.description,count:q.count,artifacts:q.artifacts})),message:V>0?`Found ${V} artifacts matching "${X}" across ${U.length} type(s)`:`No artifacts found matching "${X}"`};if(B.length>0)O.errors=B.map((q)=>({type:q.type,table:q.table,error:q.error}));if(!G&&V===0)O.suggestion="No artifacts found. Try search_tables=true to also search table definitions, or use snow_query_table for data searches.";return M(O)}catch(K){return x(`Artifact search failed: ${K.message}`)}}var bV={...q7,name:"snow_comprehensive_search",description:"[DEPRECATED - use snow_search_artifacts] "+q7.description};var jV=m8(uz(),1);import*as D5 from"fs/promises";import*as N7 from"path";var DV={name:"snow_attach_file",description:"Attach files to ServiceNow records with validation and content type detection",category:"core-operations",subcategory:"attachments",use_cases:["attachments","files"],complexity:"beginner",frequency:"medium",permission:"write",allowedRoles:["developer","admin"],inputSchema:{type:"object",properties:{table:{type:"string",description:"Table name"},sys_id:{type:"string",description:"Record sys_id to attach file to"},file_path:{type:"string",description:"Local file path to attach"},file_name:{type:"string",description:"Name for the attached file (defaults to original filename)"},content_type:{type:"string",description:"MIME type (auto-detected if not provided)"},max_size_mb:{type:"number",description:"Maximum file size in MB",default:25}},required:["table","sys_id","file_path"]}};async function kV($,Y){let{table:X,sys_id:z,file_path:J,file_name:Z,content_type:G,max_size_mb:K=25}=$;try{let Q=await P(Y);try{await D5.access(J)}catch{throw new D("VALIDATION_ERROR",`File not found: ${J}`,{details:{file_path:J}})}let H=(await D5.stat(J)).size/1048576;if(H>K)throw new D("VALIDATION_ERROR",`File size ${H.toFixed(2)}MB exceeds maximum ${K}MB`,{details:{file_size_mb:H,max_size_mb:K}});if(!(await Q.get(`/api/now/table/${X}/${z}`,{params:{sysparm_fields:"sys_id"}})).data.result)throw new D("NOT_FOUND_ERROR",`Record not found in table '${X}' with sys_id '${z}'`,{details:{table:X,sys_id:z}});let B=Z||N7.basename(J),V=G||hi(B),O=await D5.readFile(J),q=new jV.default;q.append("file",O,{filename:B,contentType:V});let L=(await Q.post("/api/now/attachment/file",q,{params:{table_name:X,table_sys_id:z,file_name:B},headers:{...q.getHeaders()}})).data.result;return M({attached:!0,attachment:{sys_id:L.sys_id,file_name:L.file_name,size_bytes:L.size_bytes,content_type:L.content_type,table_name:L.table_name,table_sys_id:L.table_sys_id},download_url:`${Y.instanceUrl}/api/now/attachment/${L.sys_id}/file`})}catch(Q){return x(Q instanceof D?Q:Q.message)}}function hi($){let Y=N7.extname($).toLowerCase();return{".txt":"text/plain",".pdf":"application/pdf",".doc":"application/msword",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document",".xls":"application/vnd.ms-excel",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".ppt":"application/vnd.ms-powerpoint",".pptx":"application/vnd.openxmlformats-officedocument.presentationml.presentation",".jpg":"image/jpeg",".jpeg":"image/jpeg",".png":"image/png",".gif":"image/gif",".zip":"application/zip",".json":"application/json",".xml":"application/xml",".csv":"text/csv"}[Y]||"application/octet-stream"}var TV={name:"snow_analyze_incident",description:"Analyzes specific incidents with pattern recognition, similar incident matching, and automated resolution suggestions",category:"itsm",subcategory:"operations",use_cases:["incidents","analysis"],complexity:"intermediate",frequency:"medium",permission:"read",allowedRoles:["developer","stakeholder","admin"],inputSchema:{type:"object",properties:{incident_id:{type:"string",description:"Incident number or sys_id to analyze"},include_similar:{type:"boolean",description:"Include similar incidents in analysis",default:!0},suggest_resolution:{type:"boolean",description:"Generate automated resolution suggestions",default:!0}},required:["incident_id"]}},ui={network_issues:{keywords:["network","connectivity","ping","dns","timeout","unreachable"],solutions:["Check network connectivity","Verify DNS resolution","Test ping to server","Review firewall rules"]},database_issues:{keywords:["database","connection","sql","timeout","deadlock","performance"],solutions:["Check database connection","Review connection pool settings","Analyze query performance","Check for blocking processes"]},application_errors:{keywords:["application","error","exception","crash","memory","cpu"],solutions:["Check application logs","Review memory usage","Analyze CPU utilization","Restart application service"]},auth_issues:{keywords:["authentication","login","password","ldap","sso","unauthorized"],solutions:["Reset user password","Check LDAP connectivity","Verify SSO configuration","Review user permissions"]}};async function CV($,Y){let{incident_id:X,include_similar:z=!0,suggest_resolution:J=!0}=$;try{let Z=await P(Y),G=`number=${X}`,K=await Z.get("/api/now/table/incident",{params:{sysparm_query:G,sysparm_limit:1}});if(!K.data.result||K.data.result.length===0)G=`sys_id=${X}`,K=await Z.get("/api/now/table/incident",{params:{sysparm_query:G,sysparm_limit:1}});if(!K.data.result||K.data.result.length===0)return x(`Incident ${X} not found`);let Q=K.data.result[0],W=[],H=[],U=0,B=(Q.short_description||"").toLowerCase();for(let[F,v]of Object.entries(ui))if(v.keywords.some((A)=>B.includes(A)))W.push(F),H.push(...v.solutions),U+=0.2;let V=pi(W),O=gi(W),q=[];if(z&&W.length>0){let F=`short_descriptionLIKE${Q.short_description}^sys_id!=${Q.sys_id}^state=6`;q=(await Z.get("/api/now/table/incident",{params:{sysparm_query:F,sysparm_limit:5}})).data.result||[]}let N=[];if(J){let F=`textLIKE${Q.short_description}^workflow_state=published`;N=(await Z.get("/api/now/table/kb_knowledge",{params:{sysparm_query:F,sysparm_limit:3}})).data.result||[]}let L={incident_id:Q.number,incident_sys_id:Q.sys_id,patterns_found:W,root_cause_analysis:V,suggested_resolution:H,confidence_score:Math.min(U,1),similar_incidents:q.map((F)=>({number:F.number,short_description:F.short_description,state:F.state})),knowledge_articles:N.map((F)=>({number:F.number,short_description:F.short_description,text:F.text?F.text.substring(0,200)+"...":""})),automated_actions:O};return M({analysis:L},{incident_id:X,patterns_found:W.length})}catch(Z){return x(Z.message)}}function pi($){if($.length===0)return"No specific patterns detected. Manual investigation required.";let Y=[];if($.includes("network_issues"))Y.push("Network connectivity issue detected. Check network infrastructure, DNS, and firewall rules.");if($.includes("database_issues"))Y.push("Database connectivity or performance issue detected. Check database server, connection pools, and query performance.");if($.includes("application_errors"))Y.push("Application error detected. Check application logs, resource utilization, and service status.");if($.includes("auth_issues"))Y.push("Authentication issue detected. Check user credentials, LDAP/SSO configuration, and permissions.");return Y.join(" ")}function gi($){let Y=[];if($.includes("network_issues"))Y.push("Execute network connectivity test","Check DNS resolution","Verify firewall rules");if($.includes("database_issues"))Y.push("Test database connectivity","Check database performance metrics","Review connection pool status");if($.includes("application_errors"))Y.push("Restart application service","Check application logs","Monitor resource utilization");if($.includes("auth_issues"))Y.push("Reset user session","Verify user permissions","Check authentication service status");return Y}var EV={name:"snow_auto_resolve_incident",description:"Attempts automated resolution of technical incidents based on known patterns and previous solutions. Includes dry-run mode for safety.",category:"itsm",subcategory:"operations",use_cases:["incidents","automation"],complexity:"advanced",frequency:"medium",permission:"write",allowedRoles:["developer","admin"],inputSchema:{type:"object",properties:{incident_id:{type:"string",description:"Incident number or sys_id to auto-resolve"},dry_run:{type:"boolean",description:"Preview actions without executing (default: true for safety)",default:!0}},required:["incident_id"]}},ni={password_reset:{keywords:["password","reset","forgot","locked"],actions:["Send password reset email","Unlock user account","Update password policy"]},network_restart:{keywords:["network","connectivity","unreachable"],actions:["Restart network service","Clear DNS cache","Reset network adapter"]},service_restart:{keywords:["service","down","not responding","crash"],actions:["Restart service","Check service logs","Verify service configuration"]},cache_clear:{keywords:["cache","stale","outdated","refresh"],actions:["Clear cache","Restart caching service","Verify cache configuration"]}};async function IV($,Y){let{incident_id:X,dry_run:z=!0}=$;try{let J=await P(Y),Z=`number=${X}`,G=await J.get("/api/now/table/incident",{params:{sysparm_query:Z,sysparm_limit:1}});if(!G.data.result||G.data.result.length===0)Z=`sys_id=${X}`,G=await J.get("/api/now/table/incident",{params:{sysparm_query:Z,sysparm_limit:1}});if(!G.data.result||G.data.result.length===0)return x(`Incident ${X} not found`);let K=G.data.result[0],Q=(K.short_description||"").toLowerCase(),W=[],H=[],U=0;for(let[F,v]of Object.entries(ni))if(v.keywords.some((A)=>Q.includes(A)))W.push(F),H.push(...v.actions),U+=0.25;let B=`short_descriptionLIKE${K.short_description}^state=6^close_code!=Cancelled`,O=(await J.get("/api/now/table/incident",{params:{sysparm_query:B,sysparm_limit:3}})).data.result||[],q=O.filter((F)=>F.close_notes).map((F)=>F.close_notes),N=[];if(!z&&U>=0.5){let F=`Auto-resolution attempted based on patterns: ${W.join(", ")}\\n\\nActions: ${H.join(", ")}`;await J.put(`/api/now/table/incident/${K.sys_id}`,{work_notes:F,state:6,close_code:"Solved (Permanently)",close_notes:`Auto-resolved using pattern recognition. Actions executed: ${H.join(", ")}`}),N.push("Updated incident to Resolved state"),N.push("Added work notes with resolution details"),N.push("Set close code to Solved (Permanently)")}let L={incident_id:K.number,incident_sys_id:K.sys_id,dry_run:z,patterns_found:W,confidence_score:Math.min(U,1),resolution_actions:H,similar_resolved_incidents:O.length,resolution_notes_from_similar:q,actions_executed:N,can_auto_resolve:U>=0.5,recommendation:U>=0.5?"High confidence - safe to auto-resolve":"Low confidence - manual review recommended"};return M({result:L},{incident_id:X,dry_run:z,confidence:U})}catch(J){return x(J.message)}}var SV={name:"snow_operational_metrics",description:"Provides operational metrics and analytics including incident trends, resolution times, and performance indicators",category:"ml-analytics",subcategory:"metrics",use_cases:["analytics","metrics"],complexity:"intermediate",frequency:"medium",permission:"read",allowedRoles:["developer","stakeholder","admin"],inputSchema:{type:"object",properties:{timeframe:{type:"string",description:"Time period for metrics",enum:["today","week","month","quarter"],default:"week"},metric_types:{type:"array",items:{type:"string"},description:"Types of metrics to include (leave empty for all)",examples:[["incidents","requests","problems"]]}}}};function ci($){switch($){case"today":return"ONToday@javascript:gs.daysAgoStart(0)@javascript:gs.daysAgoEnd(0)";case"week":return"ONLast 7 days@javascript:gs.daysAgoStart(7)@javascript:gs.daysAgoEnd(0)";case"month":return"ONLast 30 days@javascript:gs.daysAgoStart(30)@javascript:gs.daysAgoEnd(0)";case"quarter":return"ONLast 90 days@javascript:gs.daysAgoStart(90)@javascript:gs.daysAgoEnd(0)";default:return"ONLast 7 days@javascript:gs.daysAgoStart(7)@javascript:gs.daysAgoEnd(0)"}}async function RV($,Y){let{timeframe:X="week",metric_types:z=[]}=$;try{let J=await P(Y),Z=ci(X),G={timeframe:X,generated_at:new Date().toISOString()},K=z.length===0;if(K||z.includes("incidents")){let W=(await J.get("/api/now/table/incident",{params:{sysparm_query:`sys_created_on${Z}`,sysparm_limit:1000,sysparm_fields:"number,state,priority,category"}})).data.result||[],H=W.filter((V)=>V.state!=="6"&&V.state!=="7"),U=W.filter((V)=>V.priority==="1"),B=new Map;W.forEach((V)=>{let O=V.category||"uncategorized";B.set(O,(B.get(O)||0)+1)}),G.incidents={total:W.length,open:H.length,high_priority:U.length,common_categories:Array.from(B.entries()).sort((V,O)=>O[1]-V[1]).slice(0,5).map(([V,O])=>({category:V,count:O}))}}if(K||z.includes("requests")){let W=(await J.get("/api/now/table/sc_request",{params:{sysparm_query:`sys_created_on${Z}`,sysparm_limit:1000,sysparm_fields:"number,request_state,approval"}})).data.result||[],H=W.filter((B)=>B.request_state!=="closed"),U=W.filter((B)=>B.approval==="requested");G.requests={total:W.length,open:H.length,pending_approval:U.length}}if(K||z.includes("problems")){let W=(await J.get("/api/now/table/problem",{params:{sysparm_query:`sys_created_on${Z}`,sysparm_limit:100,sysparm_fields:"number,state,priority"}})).data.result||[],H=W.filter((U)=>U.state!=="4");G.problems={total:W.length,open:H.length}}return M({metrics:G},{timeframe:X,metric_types:K?"all":z.join(",")})}catch(J){return x(J.message)}}var fV={name:"snow_pattern_analysis",description:"Analyzes patterns across incidents, requests, and problems to identify trends, common issues, and improvement opportunities",category:"reporting",subcategory:"analytics",use_cases:["pattern-analysis","trends","data-analysis"],complexity:"advanced",frequency:"medium",permission:"read",allowedRoles:["developer","stakeholder","admin"],inputSchema:{type:"object",properties:{analysis_type:{type:"string",description:"Type of pattern analysis",enum:["incident_patterns","request_trends","problem_root_causes","user_behavior"]},timeframe:{type:"string",description:"Time period for analysis",enum:["day","week","month","quarter"],default:"week"}},required:["analysis_type"]}};function ii($){let Y={day:"ONToday@javascript:gs.daysAgoStart(0)@javascript:gs.daysAgoEnd(0)",week:"ONLast 7 days@javascript:gs.daysAgoStart(7)@javascript:gs.daysAgoEnd(0)",month:"ONLast 30 days@javascript:gs.daysAgoStart(30)@javascript:gs.daysAgoEnd(0)",quarter:"ONLast 90 days@javascript:gs.daysAgoStart(90)@javascript:gs.daysAgoEnd(0)"};return Y[$]||Y.week}async function mV($,Y){let{analysis_type:X,timeframe:z="week"}=$;try{let J=await P(Y),Z=ii(z),G={analysis_type:X,timeframe:z,generated_at:new Date().toISOString()};switch(X){case"incident_patterns":G={...G,...await li(J,Z)};break;case"request_trends":G={...G,...await oi(J,Z)};break;case"problem_root_causes":G={...G,...await di(J,Z)};break;case"user_behavior":G={...G,...await ai(J,Z)};break;default:return x(`Unknown analysis type: ${X}`)}return M({patterns:G},{analysis_type:X,timeframe:z})}catch(J){return x(J.message)}}async function li($,Y){let z=(await $.get("/api/now/table/incident",{params:{sysparm_query:`sys_created_on${Y}`,sysparm_limit:1000}})).data.result||[],J={by_category:new Map,by_priority:new Map,by_state:new Map,by_hour:new Map,common_keywords:new Map};return z.forEach((Z)=>{let G=Z.category||"uncategorized";J.by_category.set(G,(J.by_category.get(G)||0)+1);let K=Z.priority||"unknown";J.by_priority.set(K,(J.by_priority.get(K)||0)+1);let Q=Z.state||"unknown";if(J.by_state.set(Q,(J.by_state.get(Q)||0)+1),Z.sys_created_on){let U=new Date(Z.sys_created_on).getHours();J.by_hour.set(U,(J.by_hour.get(U)||0)+1)}(Z.short_description||"").toLowerCase().split(/\s+/).filter((U)=>U.length>3).slice(0,5).forEach((U)=>{J.common_keywords.set(U,(J.common_keywords.get(U)||0)+1)})}),{total_incidents:z.length,patterns:{by_category:Object.fromEntries(J.by_category),by_priority:Object.fromEntries(J.by_priority),by_state:Object.fromEntries(J.by_state),peak_hours:Array.from(J.by_hour.entries()).sort((Z,G)=>G[1]-Z[1]).slice(0,5).map(([Z,G])=>({hour:Z,count:G})),top_keywords:Array.from(J.common_keywords.entries()).sort((Z,G)=>G[1]-Z[1]).slice(0,10).map(([Z,G])=>({keyword:Z,count:G}))}}}async function oi($,Y){let z=(await $.get("/api/now/table/sc_request",{params:{sysparm_query:`sys_created_on${Y}`,sysparm_limit:1000}})).data.result||[],J={by_state:new Map,by_approval:new Map};return z.forEach((Z)=>{let G=Z.request_state||"unknown";J.by_state.set(G,(J.by_state.get(G)||0)+1);let K=Z.approval||"unknown";J.by_approval.set(K,(J.by_approval.get(K)||0)+1)}),{total_requests:z.length,trends:{by_state:Object.fromEntries(J.by_state),by_approval_status:Object.fromEntries(J.by_approval)}}}async function di($,Y){let z=(await $.get("/api/now/table/problem",{params:{sysparm_query:`sys_created_on${Y}`,sysparm_limit:100}})).data.result||[],J={by_category:new Map,by_state:new Map};return z.forEach((Z)=>{let G=Z.category||"uncategorized";J.by_category.set(G,(J.by_category.get(G)||0)+1);let K=Z.state||"unknown";J.by_state.set(K,(J.by_state.get(K)||0)+1)}),{total_problems:z.length,root_causes:{by_category:Object.fromEntries(J.by_category),by_state:Object.fromEntries(J.by_state)}}}async function ai($,Y){let z=(await $.get("/api/now/table/incident",{params:{sysparm_query:`sys_created_on${Y}`,sysparm_limit:500,sysparm_fields:"caller_id"}})).data.result||[],J=new Map;return z.forEach((Z)=>{let G=Z.caller_id?.value||Z.caller_id;if(G)J.set(G,(J.get(G)||0)+1)}),{user_activities:{total_incidents:z.length,unique_users:J.size,avg_incidents_per_user:J.size>0?Math.round(z.length/J.size*10)/10:0}}}var yV={name:"snow_predictive_analysis",description:"Provides predictive analysis for incident volumes, system failures, and resource issues based on historical patterns",category:"ml-analytics",subcategory:"prediction",use_cases:["prediction","analytics"],complexity:"advanced",frequency:"low",permission:"read",allowedRoles:["developer","stakeholder","admin"],inputSchema:{type:"object",properties:{prediction_type:{type:"string",description:"Type of prediction",enum:["incident_volume","system_failure","resource_exhaustion","user_impact"]},timeframe:{type:"string",description:"Prediction timeframe",enum:["day","week","month"],default:"week"}},required:["prediction_type"]}};function si($){let Y={day:"ONLast 7 days@javascript:gs.daysAgoStart(7)@javascript:gs.daysAgoEnd(0)",week:"ONLast 30 days@javascript:gs.daysAgoStart(30)@javascript:gs.daysAgoEnd(0)",month:"ONLast 90 days@javascript:gs.daysAgoStart(90)@javascript:gs.daysAgoEnd(0)"};return Y[$]||Y.week}async function hV($,Y){let{prediction_type:X,timeframe:z="week"}=$;try{let J=await P(Y),Z=si(z),G={prediction_type:X,timeframe:z,generated_at:new Date().toISOString(),analysis_method:"trend_analysis"};switch(X){case"incident_volume":G={...G,...await ri(J,Z,z)};break;case"system_failure":G={...G,...await ti(J,Z,z)};break;case"resource_exhaustion":G={...G,...await ei(J,Z,z)};break;case"user_impact":G={...G,...await $l(J,Z,z)};break;default:return x(`Unknown prediction type: ${X}`)}return M({predictions:G},{prediction_type:X,timeframe:z})}catch(J){return x(J.message)}}async function ri($,Y,X){let J=(await $.get("/api/now/table/incident",{params:{sysparm_query:`sys_created_on${Y}`,sysparm_limit:1000,sysparm_fields:"sys_created_on,priority"}})).data.result||[],Z=new Map;J.forEach((Q)=>{if(Q.sys_created_on){let W=Q.sys_created_on.split(" ")[0];Z.set(W,(Z.get(W)||0)+1)}});let G=Array.from(Z.values()),K=G.length>0?G.reduce((Q,W)=>Q+W,0)/G.length:0;return{historical_data:{total_incidents:J.length,average_daily_volume:Math.round(K),peak_volume:Math.max(...G,0),low_volume:Math.min(...G,0)},prediction:{expected_volume:Math.round(K),confidence:G.length>=7?"high":"low",interpretation:`Based on ${G.length} days of data, expecting approximately ${Math.round(K)} incidents per ${X}`}}}async function ti($,Y,X){let J=(await $.get("/api/now/table/incident",{params:{sysparm_query:`sys_created_on${Y}^priority=1`,sysparm_limit:500}})).data.result||[];return{historical_data:{critical_incidents:J.length},prediction:{risk_level:J.length>10?"high":"low",interpretation:`Based on ${J.length} critical incidents, system failure risk is ${J.length>10?"elevated":"normal"}`}}}async function ei($,Y,X){let J=(await $.get("/api/now/table/sc_request",{params:{sysparm_query:`sys_created_on${Y}`,sysparm_limit:1000}})).data.result||[];return{historical_data:{total_requests:J.length},prediction:{risk_level:J.length>500?"medium":"low",interpretation:`Based on ${J.length} service requests, resource demand is ${J.length>500?"increasing":"stable"}`}}}async function $l($,Y,X){let J=(await $.get("/api/now/table/incident",{params:{sysparm_query:`sys_created_on${Y}`,sysparm_limit:1000,sysparm_fields:"caller_id,state"}})).data.result||[],Z=new Set(J.map((G)=>G.caller_id?.value||G.caller_id).filter(Boolean));return{historical_data:{total_incidents:J.length,affected_users:Z.size},prediction:{impact_level:Z.size>50?"high":"medium",interpretation:`${Z.size} unique users affected. User impact is ${Z.size>50?"widespread":"localized"}`}}}var uV={name:"snow_cmdb_search",description:"Searches Configuration Management Database (CMDB) for configuration items with relationship mapping",category:"cmdb",subcategory:"discovery",use_cases:["cmdb","configuration-items"],complexity:"intermediate",frequency:"high",permission:"read",allowedRoles:["developer","stakeholder","admin"],inputSchema:{type:"object",properties:{query:{type:"string",description:'Search query for configuration items (e.g., "server name", "application")'},ci_type:{type:"string",description:"Type of CI to search",enum:["server","application","database","network_device","service","any"],default:"any"},limit:{type:"number",description:"Maximum number of results",default:10,minimum:1,maximum:100},include_relationships:{type:"boolean",description:"Include CI relationships",default:!1}},required:["query"]}},Xl={server:"cmdb_ci_server",application:"cmdb_ci_application",database:"cmdb_ci_database",network_device:"cmdb_ci_network_device",service:"cmdb_ci_service",any:"cmdb_ci"};function Yl($){if($.includes("=")||$.includes("!=")||$.includes("^")||$.includes("LIKE"))return $;return`nameLIKE${$}^ORshort_descriptionLIKE${$}`}async function pV($,Y){let{query:X,ci_type:z="any",limit:J=10,include_relationships:Z=!1}=$;if(!X||typeof X!=="string"||X.trim()==="")return x('Parameter "query" is required and must be a non-empty string');try{let K=await P(Y),Q=Xl[z]||"cmdb_ci",W=Yl(X.trim());var G;try{G=await K.get(`/api/now/table/${Q}`,{params:{sysparm_query:W,sysparm_limit:J,sysparm_fields:"sys_id,name,short_description,operational_status,support_group,sys_class_name"}})}catch(B){if(Q!=="cmdb_ci"&&B.response?.status===400)G=await K.get("/api/now/table/cmdb_ci",{params:{sysparm_query:W,sysparm_limit:J,sysparm_fields:"sys_id,name,short_description,operational_status,support_group,sys_class_name"}});else throw B}let H=G.data.result||[],U={total_results:H.length,ci_type:z,table_searched:Q,query_used:W,configuration_items:H.map((B)=>({sys_id:B.sys_id,name:B.name,short_description:B.short_description,operational_status:B.operational_status,support_group:B.support_group,sys_class_name:B.sys_class_name}))};if(Z&&H.length>0){let B=[];for(let V of H)try{let O=await K.get("/api/now/table/cmdb_rel_ci",{params:{sysparm_query:`parent=${V.sys_id}^ORchild=${V.sys_id}`,sysparm_limit:20}});if(O.data.result&&O.data.result.length>0)B.push({ci_sys_id:V.sys_id,ci_name:V.name,relationship_count:O.data.result.length,relationships:O.data.result.map((q)=>({type:q.type,parent:q.parent?.name||q.parent,child:q.child?.name||q.child}))})}catch(O){console.warn(`Failed to get relationships for CI ${V.sys_id}:`,O)}U.relationships=B}return M(U,{query:W,ci_type:z,limit:J,count:H.length})}catch(K){return x(K.message)}}var gV={name:"snow_catalog_item_manager",description:"Create, update, or manage service catalog items",category:"itsm",subcategory:"catalog",use_cases:["catalog-management","service-catalog","crud"],complexity:"intermediate",frequency:"medium",permission:"write",allowedRoles:["developer","admin"],inputSchema:{type:"object",properties:{action:{type:"string",description:"Action to perform",enum:["create","update","activate","deactivate","delete"]},sys_id:{type:"string",description:"Catalog item sys_id (required for update/activate/deactivate/delete)"},name:{type:"string",description:"Catalog item name (required for create)"},short_description:{type:"string",description:"Short description"},category:{type:"string",description:"Category sys_id"},price:{type:"string",description:"Item price"}},required:["action"]}};async function nV($,Y){let{action:X,sys_id:z,name:J,short_description:Z,category:G,price:K}=$;try{let Q=await P(Y);switch(X){case"create":if(!J)return x("name is required for create action");let W={name:J,short_description:Z||"",active:!0};if(G)W.category=G;if(K)W.price=K;let U=(await Q.post("/api/now/table/sc_cat_item",W)).data.result;return M({message:`Catalog item "${J}" created successfully`,catalog_item:{sys_id:U.sys_id,name:U.name,short_description:U.short_description,active:U.active}},{action:X,sys_id:U.sys_id});case"update":if(!z)return x("sys_id is required for update action");let B={};if(J)B.name=J;if(Z)B.short_description=Z;if(G)B.category=G;if(K)B.price=K;let O=(await Q.put(`/api/now/table/sc_cat_item/${z}`,B)).data.result;return M({message:"Catalog item updated successfully",catalog_item:O},{action:X,sys_id:z});case"activate":case"deactivate":if(!z)return x(`sys_id is required for ${X} action`);let q=X==="activate",N=await Q.put(`/api/now/table/sc_cat_item/${z}`,{active:q});return M({message:`Catalog item ${X}d successfully`,sys_id:z,active:q},{action:X,sys_id:z});case"delete":if(!z)return x("sys_id is required for delete action");return await Q.delete(`/api/now/table/sc_cat_item/${z}`),M({message:"Catalog item deleted successfully",sys_id:z},{action:X,sys_id:z});default:return x(`Unknown action: ${X}`)}}catch(Q){return x(Q.message)}}var cV={name:"snow_catalog_item_search",description:"Search service catalog items with filtering options",category:"itsm",subcategory:"catalog",use_cases:["catalog-search","service-catalog","discovery"],complexity:"beginner",frequency:"medium",permission:"read",allowedRoles:["developer","stakeholder","admin"],inputSchema:{type:"object",properties:{query:{type:"string",description:"Search query (searches name and short_description)"},active_only:{type:"boolean",description:"Only return active catalog items",default:!0},category:{type:"string",description:"Filter by category sys_id"},limit:{type:"number",description:"Maximum number of results",default:20,minimum:1,maximum:100}}}};async function iV($,Y){let{query:X,active_only:z=!0,category:J,limit:Z=20}=$;try{let G=await P(Y),K="";if(X)K=`nameLIKE${X}^ORshort_descriptionLIKE${X}`;if(z)K+=K?"^active=true":"active=true";if(J)K+=K?`^category=${J}`:`category=${J}`;let W=(await G.get("/api/now/table/sc_cat_item",{params:{sysparm_query:K||void 0,sysparm_limit:Z}})).data.result||[];return M({total_results:W.length,catalog_items:W.map((H)=>({sys_id:H.sys_id,name:H.name,short_description:H.short_description,active:H.active,category:H.category,price:H.price}))},{query:X||"all",limit:Z,count:W.length})}catch(G){return x(G.message)}}var lV={name:"snow_cleanup_test_artifacts",description:"Safely cleanup test artifacts from ServiceNow (dry-run enabled by default for safety)",category:"development",subcategory:"testing",use_cases:["testing","cleanup"],complexity:"intermediate",frequency:"low",permission:"write",allowedRoles:["developer","admin"],inputSchema:{type:"object",properties:{artifact_type:{type:"string",description:"Type of artifacts to clean up",enum:["incidents","requests","test_data","all"]},name_pattern:{type:"string",description:'Pattern to match artifact names (e.g., "TEST", "DEMO")',default:"TEST"},dry_run:{type:"boolean",description:"Preview cleanup without executing (default: true for safety)",default:!0},limit:{type:"number",description:"Maximum number of records to clean up",default:10,maximum:100}},required:["artifact_type"]}};async function oV($,Y){let{artifact_type:X,name_pattern:z="TEST",dry_run:J=!0,limit:Z=10}=$;try{let G=await P(Y),K={artifact_type:X,name_pattern:z,dry_run:J,items_found:0,items_deleted:0,artifacts:[]},Q=[];if(X==="incidents"||X==="all")Q.push("incident");if(X==="requests"||X==="all")Q.push("sc_request");for(let H of Q){let U=`short_descriptionLIKE${z}`,V=(await G.get(`/api/now/table/${H}`,{params:{sysparm_query:U,sysparm_limit:Z}})).data.result||[];K.items_found+=V.length;for(let O of V)if(K.artifacts.push({table:H,sys_id:O.sys_id,number:O.number,short_description:O.short_description}),!J)await G.delete(`/api/now/table/${H}/${O.sys_id}`),K.items_deleted++}let W=J?`Found ${K.items_found} test artifacts. Run with dry_run=false to delete.`:`Deleted ${K.items_deleted} test artifacts successfully.`;return M({message:W,...K},{artifact_type:X,dry_run:J,items_found:K.items_found})}catch(G){return x(G.message)}}var dV={name:"snow_assign_task",description:"Assign task to user or group with workload balancing and skill matching",category:"core-operations",subcategory:"task-management",use_cases:["task-assignment","workload"],complexity:"intermediate",frequency:"high",permission:"write",allowedRoles:["developer","admin"],inputSchema:{type:"object",properties:{table:{type:"string",description:"Task table (incident, change_request, sc_task, etc.)",default:"task"},sys_id:{type:"string",description:"Task sys_id or number"},assigned_to:{type:"string",description:"User sys_id or username to assign to"},assignment_group:{type:"string",description:"Group sys_id or name to assign to"},auto_assign:{type:"boolean",description:"Auto-assign to available group member with lowest workload",default:!1},check_availability:{type:"boolean",description:"Check user availability before assignment",default:!1},work_notes:{type:"string",description:"Work notes to add with assignment"}},required:["sys_id"]}};async function aV($,Y){let{table:X="task",sys_id:z,assigned_to:J,assignment_group:Z,auto_assign:G=!1,check_availability:K=!1,work_notes:Q}=$;try{let W=await P(Y),H;if(z.length===32)H=(await W.get(`/api/now/table/${X}/${z}`,{params:{sysparm_fields:"sys_id,number,assigned_to,assignment_group"}})).data.result;else{let q=await W.get(`/api/now/table/${X}`,{params:{sysparm_query:`number=${z}`,sysparm_fields:"sys_id,number,assigned_to,assignment_group",sysparm_limit:1}});if(q.data.result&&q.data.result.length>0)H=q.data.result[0]}if(!H)throw new D("NOT_FOUND_ERROR",`Task not found: ${z}`,{details:{table:X,sys_id:z}});let U={},B;if(Z){if(Z.length===32)B=Z;else{let q=await W.get("/api/now/table/sys_user_group",{params:{sysparm_query:`name=${Z}`,sysparm_fields:"sys_id,name",sysparm_limit:1}});if(q.data.result&&q.data.result.length>0)B=q.data.result[0].sys_id}U.assignment_group=B}if(J){if(J.length===32)U.assigned_to=J;else{let q=await W.get("/api/now/table/sys_user",{params:{sysparm_query:`user_name=${J}`,sysparm_fields:"sys_id,user_name,active",sysparm_limit:1}});if(q.data.result&&q.data.result.length>0){let N=q.data.result[0];if(!N.active)throw new D("VALIDATION_ERROR",`User '${J}' is inactive and cannot be assigned tasks`,{details:{user:J}});U.assigned_to=N.sys_id}}if(K&&U.assigned_to){let q=await W.get("/api/now/table/cmn_schedule",{params:{sysparm_query:`type=user^user=${U.assigned_to}`,sysparm_fields:"sys_id",sysparm_limit:1}})}}else if(G&&B){let q=await W.get("/api/now/table/sys_user_grmember",{params:{sysparm_query:`group=${B}^user.active=true`,sysparm_fields:"user",sysparm_limit:100}});if(q.data.result&&q.data.result.length>0){let N=q.data.result.map((v)=>v.user.value),F=(await Promise.all(N.map(async(v)=>{let A=await W.get(`/api/now/table/${X}`,{params:{sysparm_query:`assigned_to=${v}^active=true`,sysparm_fields:"sys_id",sysparm_limit:1000}});return{user_id:v,count:A.data.result?.length||0}}))).reduce((v,A)=>A.count<v.count?A:v);U.assigned_to=F.user_id}}if(Q)U.work_notes=Q;let O=(await W.put(`/api/now/table/${X}/${H.sys_id}`,U,{params:{sysparm_display_value:"all",sysparm_exclude_reference_link:"true"}})).data.result;return M({assigned:!0,number:O.number,sys_id:O.sys_id,previous_assigned_to:H.assigned_to,current_assigned_to:O.assigned_to,previous_assignment_group:H.assignment_group,current_assignment_group:O.assignment_group,auto_assigned:G&&!J,task:{number:O.number,sys_id:O.sys_id,assigned_to:O.assigned_to,assignment_group:O.assignment_group},url:`${Y.instanceUrl}/${X}.do?sys_id=${O.sys_id}`})}catch(W){return x(W instanceof D?W:W.message)}}var rV={name:"snow_manage_group_membership",description:"Manage group memberships: add/remove users, list members",category:"core-operations",subcategory:"user-management",use_cases:["user-management","access-control","group-administration"],complexity:"beginner",frequency:"high",permission:"write",allowedRoles:["developer","admin"],inputSchema:{type:"object",properties:{action:{type:"string",description:"Operation: add, remove, or list",enum:["add","remove","list"]},user_identifier:{type:"string",description:"User sys_id, username, or email"},group_identifier:{type:"string",description:"Group sys_id or name"},include_details:{type:"boolean",description:"Include user details (list only)",default:!0}},required:["action","group_identifier"]}};async function sV($,Y){let X=Y.includes("@")?`email=${Y}`:Y.length===32?`sys_id=${Y}`:`user_name=${Y}`,z=await $.get("/api/now/table/sys_user",{params:{sysparm_query:X,sysparm_limit:1}});if(!z.data.result||z.data.result.length===0)throw Error(`User "${Y}" not found`);return z.data.result[0]}async function zl($,Y){let X=Y.length===32?`sys_id=${Y}`:`name=${Y}`,z=await $.get("/api/now/table/sys_user_group",{params:{sysparm_query:X,sysparm_limit:1}});if(!z.data.result||z.data.result.length===0)throw Error(`Group "${Y}" not found`);return z.data.result[0]}async function Jl($,Y,X){var z=await $.get("/api/now/table/sys_user_grmember",{params:{sysparm_query:`user=${Y.sys_id}^group=${X.sys_id}`,sysparm_limit:1}});if(z.data.result&&z.data.result.length>0)return{message:`User "${Y.user_name}" is already a member of group "${X.name}"`,membership_sys_id:z.data.result[0].sys_id,already_exists:!0};var J={user:Y.sys_id,group:X.sys_id},Z=await $.post("/api/now/table/sys_user_grmember",J),G=Z.data.result;return{message:`User "${Y.user_name}" assigned to group "${X.name}" successfully`,membership:{sys_id:G.sys_id,user:{sys_id:Y.sys_id,user_name:Y.user_name,name:Y.name},group:{sys_id:X.sys_id,name:X.name}},already_exists:!1}}async function Gl($,Y,X){var z=await $.get("/api/now/table/sys_user_grmember",{params:{sysparm_query:`user=${Y.sys_id}^group=${X.sys_id}`,sysparm_limit:1}});if(!z.data.result||z.data.result.length===0)throw Error(`User "${Y.user_name}" is not a member of group "${X.name}"`);var J=z.data.result[0];return await $.delete(`/api/now/table/sys_user_grmember/${J.sys_id}`),{message:`User "${Y.user_name}" removed from group "${X.name}" successfully`,removed_membership:{sys_id:J.sys_id,user:{sys_id:Y.sys_id,user_name:Y.user_name,name:Y.name},group:{sys_id:X.sys_id,name:X.name}}}}async function Zl($,Y,X){var z=await $.get("/api/now/table/sys_user_grmember",{params:{sysparm_query:`group=${Y.sys_id}`,sysparm_limit:500}}),J=z.data.result||[],Z=[];if(X&&J.length>0){var G=J.map(function(L){return L.user.value||L.user}),K=`sys_idIN${G.join(",")}`,Q=await $.get("/api/now/table/sys_user",{params:{sysparm_query:K,sysparm_limit:500}}),W=Q.data.result||[],H={};for(var U=0;U<W.length;U++)H[W[U].sys_id]=W[U];for(var B=0;B<J.length;B++){var V=J[B],O=V.user.value||V.user,q=H[O];Z.push({membership_sys_id:V.sys_id,user_sys_id:O,user_name:q?q.user_name:"Unknown",name:q?q.name:"Unknown",email:q?q.email:void 0,title:q?q.title:void 0,department:q?q.department:void 0,active:q?q.active:void 0})}}else for(var N=0;N<J.length;N++)Z.push({membership_sys_id:J[N].sys_id,user_sys_id:J[N].user.value||J[N].user});return{group:{sys_id:Y.sys_id,name:Y.name,description:Y.description,type:Y.type},member_count:Z.length,members:Z}}async function tV($,Y){var{action:X,user_identifier:z,group_identifier:J}=$,Z=$.include_details!==void 0?$.include_details:!0;try{var G=await P(Y),K=await zl(G,J);if(X==="add"){if(!z)return x("user_identifier is required for add action");var Q=await sV(G,z),W=await Jl(G,Q,K);return M(W,{user_name:Q.user_name,group_name:K.name})}if(X==="remove"){if(!z)return x("user_identifier is required for remove action");var H=await sV(G,z),U=await Gl(G,H,K);return M(U,{user_name:H.user_name,group_name:K.name})}if(X==="list"){var B=await Zl(G,K,Z);return M(B,{group_name:K.name,member_count:B.member_count})}return x(`Invalid action: ${X}. Must be add, remove, or list`)}catch(V){return x(V.message)}}var IJ={};z0(IJ,{snow_validate_deployment_exec:()=>qM,snow_validate_deployment_def:()=>MM,snow_rollback_deployment_exec:()=>VM,snow_rollback_deployment_def:()=>OM,snow_github_tree_exec:()=>wM,snow_github_tree_def:()=>_M,snow_github_deploy_exec:()=>DM,snow_github_deploy_def:()=>jM,snow_deployment_status_exec:()=>xM,snow_deployment_status_def:()=>BM,snow_deployment_debug_exec:()=>HM,snow_deployment_debug_def:()=>WM,snow_create_solution_package_exec:()=>QM,snow_create_solution_package_def:()=>KM,snow_clone_instance_artifact_exec:()=>ZM,snow_clone_instance_artifact_def:()=>GM,snow_auth_diagnostics_exec:()=>JM,snow_auth_diagnostics_def:()=>zM,snow_artifact_manage_exec:()=>F7,snow_artifact_manage_def:()=>YM});import*as b4 from"fs/promises";import*as T5 from"path";import{existsSync as XM}from"fs";var k5={sp_widget:"sp_widget",widget:"sp_widget",sp_page:"sp_page",page:"sp_page",sys_ux_page:"sys_ux_page",uib_page:"sys_ux_page",script_include:"sys_script_include",business_rule:"sys_script",client_script:"sys_script_client",ui_policy:"sys_ui_policy",ui_action:"sys_ui_action",rest_message:"sys_rest_message",scheduled_job:"sysauto_script",transform_map:"sys_transform_map",fix_script:"sys_script_fix",table:"sys_db_object",field:"sys_dictionary",flow:"sys_hub_flow",application:"sys_app"},I6={sp_widget:"id",sp_page:"id",sys_ux_page:"name",sys_script_include:"name",sys_script:"name",sys_script_client:"name",sys_ui_policy:"short_description",sys_ui_action:"name",sys_rest_message:"name",sysauto_script:"name",sys_transform_map:"name",sys_script_fix:"name",sys_db_object:"name",sys_dictionary:"element",sys_hub_flow:"name",sys_app:"name"},X$={sp_widget:{template:["template.html","index.html","widget.html"],script:["server.js","server-script.js","script.js"],client_script:["client.js","client-script.js","controller.js"],css:["style.css","styles.css","widget.css"],option_schema:["options.json","option_schema.json","schema.json"]},sys_script:{script:["script.js","index.js","main.js"],condition:["condition.js","condition.txt"]},sys_script_include:{script:["script.js","index.js","main.js","{name}.js"]},sys_script_client:{script:["script.js","client.js","index.js"]},sp_page:{},sys_ux_page:{},sys_ui_action:{script:["script.js","action.js","index.js"],condition:["condition.js"]},sysauto_script:{script:["script.js","job.js","index.js"]},sys_script_fix:{script:["script.js","fix.js","index.js"]}},eV={sp_widget:{template:"template.html",script:"server.js",client_script:"client.js",css:"style.css",option_schema:"options.json"},sys_script:{script:"script.js",condition:"condition.js"},sys_script_include:{script:"script.js"},sys_script_client:{script:"script.js"},sys_ui_action:{script:"script.js",condition:"condition.js"},sysauto_script:{script:"script.js"},sys_script_fix:{script:"script.js"}},$M={sys_script_include:".js",sys_script:".js",sys_script_client:".js",sys_ui_action:".js",sysauto_script:".js",sys_script_fix:".js",sp_widget:"",sp_page:"",sys_ux_page:""};var YM={name:"snow_artifact_manage",transports:["stdio"],description:`Unified tool for ServiceNow artifact management (create, get, update, delete, find, list, analyze, export, import)
|
|
73
73
|
|
|
74
74
|
⚡ ACTIONS:
|
|
75
75
|
- create: Create new artifact (widget, page, script, table, field, etc.)
|
package/package.json
CHANGED
|
@@ -18,10 +18,30 @@
|
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
20
|
import { toolRegistry } from "../shared/tool-registry.js"
|
|
21
|
+
import { ToolSearch } from "../shared/tool-search.js"
|
|
21
22
|
import { createHttpApp } from "./http.js"
|
|
22
23
|
import { createHttpResolver } from "./http-resolver.js"
|
|
23
24
|
import { mcpDebug, mcpWarn } from "../../shared/mcp-debug.js"
|
|
24
25
|
|
|
26
|
+
/**
|
|
27
|
+
* Derive search keywords from a tool's name + description. Mirrors the
|
|
28
|
+
* stdio transport's helper so both transports produce the same index.
|
|
29
|
+
*/
|
|
30
|
+
const extractKeywords = (name: string, description: string): string[] => {
|
|
31
|
+
const keywords = new Set<string>()
|
|
32
|
+
const nameParts = name.replace(/^snow_/, "").split("_")
|
|
33
|
+
for (const part of nameParts) {
|
|
34
|
+
if (part.length > 2) keywords.add(part.toLowerCase())
|
|
35
|
+
}
|
|
36
|
+
const descWords = description
|
|
37
|
+
.toLowerCase()
|
|
38
|
+
.replace(/[^a-z0-9\s]/g, " ")
|
|
39
|
+
.split(/\s+/)
|
|
40
|
+
.filter((w) => w.length > 3 && !["this", "that", "with", "from", "will", "have", "been", "tool"].includes(w))
|
|
41
|
+
for (const w of descWords.slice(0, 10)) keywords.add(w)
|
|
42
|
+
return Array.from(keywords)
|
|
43
|
+
}
|
|
44
|
+
|
|
25
45
|
async function main(): Promise<void> {
|
|
26
46
|
const resolverUrl = process.env.MCP_RESOLVER_URL
|
|
27
47
|
const internalToken = process.env.MCP_INTERNAL_TOKEN
|
|
@@ -46,6 +66,30 @@ async function main(): Promise<void> {
|
|
|
46
66
|
}
|
|
47
67
|
}
|
|
48
68
|
|
|
69
|
+
// Populate the ToolSearch index so `listTools` can surface the full catalog
|
|
70
|
+
// (235+ tools). Without this, the HTTP list-tools handler sees an empty
|
|
71
|
+
// index + SNOW_LAZY_TOOLS defaulting to on, and filters everything except
|
|
72
|
+
// the two meta tools (tool_search / tool_execute) — which makes the LLM
|
|
73
|
+
// think ServiceNow is read-only.
|
|
74
|
+
const allTools = toolRegistry.getToolDefinitions()
|
|
75
|
+
const toolIndexEntries = allTools.map((tool) => {
|
|
76
|
+
const registeredTool = toolRegistry.getTool(tool.name)
|
|
77
|
+
return {
|
|
78
|
+
id: tool.name,
|
|
79
|
+
description: tool.description.substring(0, 200),
|
|
80
|
+
category: registeredTool?.domain || "unknown",
|
|
81
|
+
keywords: extractKeywords(tool.name, tool.description),
|
|
82
|
+
// HTTP callers (portal chat) do their own token budgeting + tool
|
|
83
|
+
// enablement on the client side. Marking everything non-deferred
|
|
84
|
+
// here means `listTools` returns the full catalog so the portal's
|
|
85
|
+
// tool_search overlay can match against write/deploy tools, not
|
|
86
|
+
// just the two meta tools.
|
|
87
|
+
deferred: false,
|
|
88
|
+
}
|
|
89
|
+
})
|
|
90
|
+
ToolSearch.registerTools(toolIndexEntries)
|
|
91
|
+
mcpDebug(`[mcp-http] tool search index populated with ${toolIndexEntries.length} tools`)
|
|
92
|
+
|
|
49
93
|
const app = createHttpApp({
|
|
50
94
|
resolveContext: createHttpResolver({ url: resolverUrl, internalToken }),
|
|
51
95
|
})
|