@tedorigawa001/servicenow-mcp 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (240) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +844 -0
  3. package/dist/cli/auth.d.ts +15 -0
  4. package/dist/cli/auth.d.ts.map +1 -0
  5. package/dist/cli/auth.js +200 -0
  6. package/dist/cli/auth.js.map +1 -0
  7. package/dist/cli/config-store.d.ts +28 -0
  8. package/dist/cli/config-store.d.ts.map +1 -0
  9. package/dist/cli/config-store.js +66 -0
  10. package/dist/cli/config-store.js.map +1 -0
  11. package/dist/cli/detect-clients.d.ts +16 -0
  12. package/dist/cli/detect-clients.d.ts.map +1 -0
  13. package/dist/cli/detect-clients.js +151 -0
  14. package/dist/cli/detect-clients.js.map +1 -0
  15. package/dist/cli/index.d.ts +3 -0
  16. package/dist/cli/index.d.ts.map +1 -0
  17. package/dist/cli/index.js +135 -0
  18. package/dist/cli/index.js.map +1 -0
  19. package/dist/cli/setup.d.ts +4 -0
  20. package/dist/cli/setup.d.ts.map +1 -0
  21. package/dist/cli/setup.js +564 -0
  22. package/dist/cli/setup.js.map +1 -0
  23. package/dist/cli/writers/index.d.ts +9 -0
  24. package/dist/cli/writers/index.d.ts.map +1 -0
  25. package/dist/cli/writers/index.js +135 -0
  26. package/dist/cli/writers/index.js.map +1 -0
  27. package/dist/prompts/index.d.ts +25 -0
  28. package/dist/prompts/index.d.ts.map +1 -0
  29. package/dist/prompts/index.js +38 -0
  30. package/dist/prompts/index.js.map +1 -0
  31. package/dist/prompts/itsm.d.ts +20 -0
  32. package/dist/prompts/itsm.d.ts.map +1 -0
  33. package/dist/prompts/itsm.js +110 -0
  34. package/dist/prompts/itsm.js.map +1 -0
  35. package/dist/prompts/user-prompts.d.ts +3 -0
  36. package/dist/prompts/user-prompts.d.ts.map +1 -0
  37. package/dist/prompts/user-prompts.js +35 -0
  38. package/dist/prompts/user-prompts.js.map +1 -0
  39. package/dist/resources/index.d.ts +26 -0
  40. package/dist/resources/index.d.ts.map +1 -0
  41. package/dist/resources/index.js +99 -0
  42. package/dist/resources/index.js.map +1 -0
  43. package/dist/server-http.d.ts +41 -0
  44. package/dist/server-http.d.ts.map +1 -0
  45. package/dist/server-http.js +187 -0
  46. package/dist/server-http.js.map +1 -0
  47. package/dist/server.d.ts +54 -0
  48. package/dist/server.d.ts.map +1 -0
  49. package/dist/server.js +150 -0
  50. package/dist/server.js.map +1 -0
  51. package/dist/servicenow/client.d.ts +137 -0
  52. package/dist/servicenow/client.d.ts.map +1 -0
  53. package/dist/servicenow/client.js +855 -0
  54. package/dist/servicenow/client.js.map +1 -0
  55. package/dist/servicenow/instances.d.ts +28 -0
  56. package/dist/servicenow/instances.d.ts.map +1 -0
  57. package/dist/servicenow/instances.js +190 -0
  58. package/dist/servicenow/instances.js.map +1 -0
  59. package/dist/servicenow/types.d.ts +578 -0
  60. package/dist/servicenow/types.d.ts.map +1 -0
  61. package/dist/servicenow/types.js +3 -0
  62. package/dist/servicenow/types.js.map +1 -0
  63. package/dist/tools/agile.d.ts +225 -0
  64. package/dist/tools/agile.d.ts.map +1 -0
  65. package/dist/tools/agile.js +205 -0
  66. package/dist/tools/agile.js.map +1 -0
  67. package/dist/tools/app-studio.d.ts +139 -0
  68. package/dist/tools/app-studio.d.ts.map +1 -0
  69. package/dist/tools/app-studio.js +139 -0
  70. package/dist/tools/app-studio.js.map +1 -0
  71. package/dist/tools/atf.d.ts +144 -0
  72. package/dist/tools/atf.d.ts.map +1 -0
  73. package/dist/tools/atf.js +186 -0
  74. package/dist/tools/atf.js.map +1 -0
  75. package/dist/tools/catalog.d.ts +966 -0
  76. package/dist/tools/catalog.d.ts.map +1 -0
  77. package/dist/tools/catalog.js +640 -0
  78. package/dist/tools/catalog.js.map +1 -0
  79. package/dist/tools/change.d.ts +351 -0
  80. package/dist/tools/change.d.ts.map +1 -0
  81. package/dist/tools/change.js +214 -0
  82. package/dist/tools/change.js.map +1 -0
  83. package/dist/tools/core.d.ts +768 -0
  84. package/dist/tools/core.d.ts.map +1 -0
  85. package/dist/tools/core.js +695 -0
  86. package/dist/tools/core.js.map +1 -0
  87. package/dist/tools/csm.d.ts +403 -0
  88. package/dist/tools/csm.d.ts.map +1 -0
  89. package/dist/tools/csm.js +256 -0
  90. package/dist/tools/csm.js.map +1 -0
  91. package/dist/tools/deployment.d.ts +366 -0
  92. package/dist/tools/deployment.d.ts.map +1 -0
  93. package/dist/tools/deployment.js +181 -0
  94. package/dist/tools/deployment.js.map +1 -0
  95. package/dist/tools/devops.d.ts +236 -0
  96. package/dist/tools/devops.d.ts.map +1 -0
  97. package/dist/tools/devops.js +207 -0
  98. package/dist/tools/devops.js.map +1 -0
  99. package/dist/tools/discovery.d.ts +306 -0
  100. package/dist/tools/discovery.d.ts.map +1 -0
  101. package/dist/tools/discovery.js +357 -0
  102. package/dist/tools/discovery.js.map +1 -0
  103. package/dist/tools/flow.d.ts +496 -0
  104. package/dist/tools/flow.d.ts.map +1 -0
  105. package/dist/tools/flow.js +348 -0
  106. package/dist/tools/flow.js.map +1 -0
  107. package/dist/tools/hrsd.d.ts +790 -0
  108. package/dist/tools/hrsd.d.ts.map +1 -0
  109. package/dist/tools/hrsd.js +378 -0
  110. package/dist/tools/hrsd.js.map +1 -0
  111. package/dist/tools/incident.d.ts +259 -0
  112. package/dist/tools/incident.d.ts.map +1 -0
  113. package/dist/tools/incident.js +170 -0
  114. package/dist/tools/incident.js.map +1 -0
  115. package/dist/tools/index.d.ts +13 -0
  116. package/dist/tools/index.d.ts.map +1 -0
  117. package/dist/tools/index.js +385 -0
  118. package/dist/tools/index.js.map +1 -0
  119. package/dist/tools/integration.d.ts +940 -0
  120. package/dist/tools/integration.d.ts.map +1 -0
  121. package/dist/tools/integration.js +685 -0
  122. package/dist/tools/integration.js.map +1 -0
  123. package/dist/tools/itam.d.ts +462 -0
  124. package/dist/tools/itam.d.ts.map +1 -0
  125. package/dist/tools/itam.js +306 -0
  126. package/dist/tools/itam.js.map +1 -0
  127. package/dist/tools/knowledge.d.ts +187 -0
  128. package/dist/tools/knowledge.d.ts.map +1 -0
  129. package/dist/tools/knowledge.js +161 -0
  130. package/dist/tools/knowledge.js.map +1 -0
  131. package/dist/tools/ml.d.ts +263 -0
  132. package/dist/tools/ml.d.ts.map +1 -0
  133. package/dist/tools/ml.js +251 -0
  134. package/dist/tools/ml.js.map +1 -0
  135. package/dist/tools/mobile.d.ts +352 -0
  136. package/dist/tools/mobile.d.ts.map +1 -0
  137. package/dist/tools/mobile.js +122 -0
  138. package/dist/tools/mobile.js.map +1 -0
  139. package/dist/tools/notification.d.ts +590 -0
  140. package/dist/tools/notification.d.ts.map +1 -0
  141. package/dist/tools/notification.js +382 -0
  142. package/dist/tools/notification.js.map +1 -0
  143. package/dist/tools/now-assist.d.ts +300 -0
  144. package/dist/tools/now-assist.d.ts.map +1 -0
  145. package/dist/tools/now-assist.js +227 -0
  146. package/dist/tools/now-assist.js.map +1 -0
  147. package/dist/tools/performance.d.ts +447 -0
  148. package/dist/tools/performance.d.ts.map +1 -0
  149. package/dist/tools/performance.js +473 -0
  150. package/dist/tools/performance.js.map +1 -0
  151. package/dist/tools/portal.d.ts +530 -0
  152. package/dist/tools/portal.d.ts.map +1 -0
  153. package/dist/tools/portal.js +425 -0
  154. package/dist/tools/portal.js.map +1 -0
  155. package/dist/tools/problem.d.ts +111 -0
  156. package/dist/tools/problem.d.ts.map +1 -0
  157. package/dist/tools/problem.js +101 -0
  158. package/dist/tools/problem.js.map +1 -0
  159. package/dist/tools/reporting.d.ts +825 -0
  160. package/dist/tools/reporting.d.ts.map +1 -0
  161. package/dist/tools/reporting.js +453 -0
  162. package/dist/tools/reporting.js.map +1 -0
  163. package/dist/tools/sam.d.ts +312 -0
  164. package/dist/tools/sam.d.ts.map +1 -0
  165. package/dist/tools/sam.js +360 -0
  166. package/dist/tools/sam.js.map +1 -0
  167. package/dist/tools/schema-helpers.d.ts +119 -0
  168. package/dist/tools/schema-helpers.d.ts.map +1 -0
  169. package/dist/tools/schema-helpers.js +121 -0
  170. package/dist/tools/schema-helpers.js.map +1 -0
  171. package/dist/tools/script.d.ts +714 -0
  172. package/dist/tools/script.d.ts.map +1 -0
  173. package/dist/tools/script.js +629 -0
  174. package/dist/tools/script.js.map +1 -0
  175. package/dist/tools/security.d.ts +802 -0
  176. package/dist/tools/security.d.ts.map +1 -0
  177. package/dist/tools/security.js +426 -0
  178. package/dist/tools/security.js.map +1 -0
  179. package/dist/tools/smart-query.d.ts +84 -0
  180. package/dist/tools/smart-query.d.ts.map +1 -0
  181. package/dist/tools/smart-query.js +320 -0
  182. package/dist/tools/smart-query.js.map +1 -0
  183. package/dist/tools/sys-properties.d.ts +315 -0
  184. package/dist/tools/sys-properties.d.ts.map +1 -0
  185. package/dist/tools/sys-properties.js +416 -0
  186. package/dist/tools/sys-properties.js.map +1 -0
  187. package/dist/tools/task.d.ts +82 -0
  188. package/dist/tools/task.d.ts.map +1 -0
  189. package/dist/tools/task.js +96 -0
  190. package/dist/tools/task.js.map +1 -0
  191. package/dist/tools/updateset.d.ts +159 -0
  192. package/dist/tools/updateset.d.ts.map +1 -0
  193. package/dist/tools/updateset.js +266 -0
  194. package/dist/tools/updateset.js.map +1 -0
  195. package/dist/tools/usem-approval.d.ts +130 -0
  196. package/dist/tools/usem-approval.d.ts.map +1 -0
  197. package/dist/tools/usem-approval.js +194 -0
  198. package/dist/tools/usem-approval.js.map +1 -0
  199. package/dist/tools/usem-config.d.ts +171 -0
  200. package/dist/tools/usem-config.d.ts.map +1 -0
  201. package/dist/tools/usem-config.js +254 -0
  202. package/dist/tools/usem-config.js.map +1 -0
  203. package/dist/tools/usem-integration.d.ts +228 -0
  204. package/dist/tools/usem-integration.d.ts.map +1 -0
  205. package/dist/tools/usem-integration.js +223 -0
  206. package/dist/tools/usem-integration.js.map +1 -0
  207. package/dist/tools/usem-sla.d.ts +201 -0
  208. package/dist/tools/usem-sla.d.ts.map +1 -0
  209. package/dist/tools/usem-sla.js +322 -0
  210. package/dist/tools/usem-sla.js.map +1 -0
  211. package/dist/tools/usem.d.ts +489 -0
  212. package/dist/tools/usem.d.ts.map +1 -0
  213. package/dist/tools/usem.js +514 -0
  214. package/dist/tools/usem.js.map +1 -0
  215. package/dist/tools/user.d.ts +206 -0
  216. package/dist/tools/user.d.ts.map +1 -0
  217. package/dist/tools/user.js +163 -0
  218. package/dist/tools/user.js.map +1 -0
  219. package/dist/tools/va.d.ts +217 -0
  220. package/dist/tools/va.d.ts.map +1 -0
  221. package/dist/tools/va.js +178 -0
  222. package/dist/tools/va.js.map +1 -0
  223. package/dist/tools/workspace.d.ts +565 -0
  224. package/dist/tools/workspace.d.ts.map +1 -0
  225. package/dist/tools/workspace.js +201 -0
  226. package/dist/tools/workspace.js.map +1 -0
  227. package/dist/utils/errors.d.ts +6 -0
  228. package/dist/utils/errors.d.ts.map +1 -0
  229. package/dist/utils/errors.js +11 -0
  230. package/dist/utils/errors.js.map +1 -0
  231. package/dist/utils/logging.d.ts +7 -0
  232. package/dist/utils/logging.d.ts.map +1 -0
  233. package/dist/utils/logging.js +15 -0
  234. package/dist/utils/logging.js.map +1 -0
  235. package/dist/utils/permissions.d.ts +21 -0
  236. package/dist/utils/permissions.d.ts.map +1 -0
  237. package/dist/utils/permissions.js +54 -0
  238. package/dist/utils/permissions.js.map +1 -0
  239. package/instances.example.json +69 -0
  240. package/package.json +110 -0
@@ -0,0 +1,194 @@
1
+ import { ServiceNowError } from '../utils/errors.js';
2
+ import { requireWrite } from '../utils/permissions.js';
3
+ const SYS_ID_RE = /^[0-9a-f]{32}$/i;
4
+ /**
5
+ * Approval `source_table` values that represent VR state transitions. Exception
6
+ * approvals come through sn_sec_exception_change_approval; group/item approvals
7
+ * may come directly from the VR record classes.
8
+ */
9
+ const VR_APPROVAL_CLASSES = [
10
+ 'sn_sec_exception_change_approval',
11
+ 'sn_vul_vulnerability',
12
+ 'sn_vul_vulnerable_item',
13
+ 'sn_vul_remediation_task',
14
+ 'sn_vul_app_vulnerability',
15
+ 'sn_vul_app_vulnerable_item',
16
+ ];
17
+ /** Ultimate VR record classes an approval can resolve to (approval_source). */
18
+ const APPROVAL_SOURCE_CLASSES = [
19
+ 'sn_vul_vulnerability',
20
+ 'sn_vul_vulnerable_item',
21
+ 'sn_vul_remediation_task',
22
+ 'sn_vul_app_vulnerability',
23
+ 'sn_vul_app_vulnerable_item',
24
+ ];
25
+ const EXCEPTION_APPROVAL_STATE_LABELS = {
26
+ '0': 'In Review',
27
+ '1': 'Approved',
28
+ '2': 'Rejected',
29
+ '3': 'No Longer Required',
30
+ '4': 'Expired',
31
+ '5': 'Draft',
32
+ };
33
+ export function getUsemApprovalToolDefinitions() {
34
+ return [
35
+ {
36
+ name: 'list_vr_approvals',
37
+ description: 'List approval records (sysapproval_approver) for Vulnerability Response items — exception, ' +
38
+ 'risk-acceptance and false-positive requests whose approval drives a VR state transition. ' +
39
+ 'Defaults to pending (state=requested). Each row shows the source record class and number.',
40
+ inputSchema: {
41
+ type: 'object',
42
+ properties: {
43
+ state: {
44
+ type: 'string',
45
+ description: 'Approval state filter (default "requested"); e.g. requested, approved, rejected. Use "any" for all.',
46
+ },
47
+ source_table: {
48
+ type: 'string',
49
+ description: 'Restrict to one source_table (e.g. "sn_sec_exception_change_approval"); default = all VR classes',
50
+ },
51
+ approval_source: {
52
+ type: 'string',
53
+ description: 'Filter by the ultimate VR record class — "sn_vul_vulnerable_item" (e.g. False Positive on a VI) ' +
54
+ 'or "sn_vul_vulnerability" (group exception/deferral)',
55
+ },
56
+ limit: { type: 'number', description: 'Max records (default: 25, max: 1000)' },
57
+ },
58
+ },
59
+ },
60
+ {
61
+ name: 'list_vr_exception_requests',
62
+ description: 'List Vulnerability Response exception requests (sn_sec_exception_change_approval) — False ' +
63
+ 'Positive, Risk Acceptance and Exception/Deferral requests raised against vulnerable items or ' +
64
+ 'groups. Shows request_type, the target record, the desired state/substate if approved, the ' +
65
+ 'approval_state, requester and reason. Approve/reject via act_on_vr_approval (find the approver ' +
66
+ 'rows with list_vr_approvals).',
67
+ inputSchema: {
68
+ type: 'object',
69
+ properties: {
70
+ request_type: { type: 'string', description: 'Exact request type, e.g. "False positive", "Exception", "Risk Acceptance"' },
71
+ approval_state: {
72
+ type: 'string',
73
+ description: 'Approval state: 0=In Review, 1=Approved, 2=Rejected, 3=No Longer Required, 4=Expired, 5=Draft',
74
+ },
75
+ table: { type: 'string', description: 'Target record class, e.g. "sn_vul_vulnerable_item" or "sn_vul_vulnerability"' },
76
+ latest_only: { type: 'boolean', description: 'Only the latest revision of each request (default: true)' },
77
+ query: { type: 'string', description: 'Additional raw encoded query appended with ^' },
78
+ limit: { type: 'number', description: 'Max records (default: 25, max: 1000)' },
79
+ },
80
+ },
81
+ },
82
+ {
83
+ name: 'act_on_vr_approval',
84
+ description: 'Approve or reject a Vulnerability Response approval (sysapproval_approver) by sys_id, which ' +
85
+ 'advances the attached workflow and transitions the underlying VR record. Rejection requires ' +
86
+ 'a comment. **[Write — requires WRITE_ENABLED=true]**',
87
+ inputSchema: {
88
+ type: 'object',
89
+ properties: {
90
+ sys_id: { type: 'string', description: '32-char sys_id of the sysapproval_approver record' },
91
+ action: { type: 'string', enum: ['approve', 'reject'], description: 'approve or reject' },
92
+ comments: { type: 'string', description: 'Comment/justification (required when action=reject)' },
93
+ },
94
+ required: ['sys_id', 'action'],
95
+ },
96
+ },
97
+ ];
98
+ }
99
+ export async function executeUsemApprovalToolCall(client, name, args) {
100
+ switch (name) {
101
+ case 'list_vr_approvals': {
102
+ const parts = [];
103
+ const source = typeof args.source_table === 'string' ? args.source_table.trim() : '';
104
+ if (source) {
105
+ if (!VR_APPROVAL_CLASSES.includes(source)) {
106
+ throw new ServiceNowError(`source_table must be one of: ${VR_APPROVAL_CLASSES.join(', ')}`, 'INVALID_REQUEST');
107
+ }
108
+ parts.push(`source_table=${source}`);
109
+ }
110
+ else {
111
+ parts.push(`source_tableIN${VR_APPROVAL_CLASSES.join(',')}`);
112
+ }
113
+ const state = typeof args.state === 'string' && args.state.trim() ? args.state.trim() : 'requested';
114
+ if (state !== 'any')
115
+ parts.push(`state=${state}`);
116
+ const approvalSource = typeof args.approval_source === 'string' ? args.approval_source.trim() : '';
117
+ if (approvalSource) {
118
+ if (!APPROVAL_SOURCE_CLASSES.includes(approvalSource)) {
119
+ throw new ServiceNowError(`approval_source must be one of: ${APPROVAL_SOURCE_CLASSES.join(', ')}`, 'INVALID_REQUEST');
120
+ }
121
+ parts.push(`approval_source=${approvalSource}`);
122
+ }
123
+ const resp = await client.queryRecords({
124
+ table: 'sysapproval_approver',
125
+ query: parts.join('^'),
126
+ fields: 'state,approver,document_id,source_table,approval_source,group,due_date,sys_created_on,sys_id',
127
+ orderBy: '-sys_created_on',
128
+ limit: args.limit ?? 25,
129
+ display_value: 'all',
130
+ });
131
+ return {
132
+ count: resp.count,
133
+ records: resp.records,
134
+ summary: `Found ${resp.count} VR approval(s)${state !== 'any' ? ` in state "${state}"` : ''}`,
135
+ };
136
+ }
137
+ case 'list_vr_exception_requests': {
138
+ const parts = [];
139
+ if (args.latest_only !== false)
140
+ parts.push('is_latest=true');
141
+ if (args.request_type)
142
+ parts.push(`request_type=${args.request_type}`);
143
+ if (args.approval_state !== undefined && args.approval_state !== '')
144
+ parts.push(`approval_state=${args.approval_state}`);
145
+ if (args.table)
146
+ parts.push(`table=${args.table}`);
147
+ if (args.query)
148
+ parts.push(args.query);
149
+ const resp = await client.queryRecords({
150
+ table: 'sn_sec_exception_change_approval',
151
+ query: parts.join('^'),
152
+ fields: 'number,request_type,approval_state,record,table,desired_state,desired_substate,' +
153
+ 'desired_reason,requested_by,assignment_group,risk_rating,sys_created_on,sys_id',
154
+ orderBy: '-sys_created_on',
155
+ limit: args.limit ?? 25,
156
+ display_value: 'all',
157
+ });
158
+ const records = resp.records.map(r => {
159
+ const stateVal = r.approval_state && typeof r.approval_state === 'object'
160
+ ? (r.approval_state.value ?? '')
161
+ : String(r.approval_state ?? '');
162
+ return { ...r, approval_state_label: EXCEPTION_APPROVAL_STATE_LABELS[stateVal] ?? stateVal };
163
+ });
164
+ return {
165
+ count: resp.count,
166
+ records,
167
+ summary: `Found ${resp.count} exception request(s)`,
168
+ };
169
+ }
170
+ case 'act_on_vr_approval': {
171
+ requireWrite();
172
+ if (!args.sys_id || !SYS_ID_RE.test(args.sys_id)) {
173
+ throw new ServiceNowError('sys_id must be a 32-character hex string', 'INVALID_REQUEST');
174
+ }
175
+ if (args.action !== 'approve' && args.action !== 'reject') {
176
+ throw new ServiceNowError('action must be "approve" or "reject"', 'INVALID_REQUEST');
177
+ }
178
+ if (args.action === 'reject' && !args.comments) {
179
+ throw new ServiceNowError('comments are required when rejecting', 'INVALID_REQUEST');
180
+ }
181
+ const data = { state: args.action === 'approve' ? 'approved' : 'rejected' };
182
+ if (args.comments)
183
+ data.comments = args.comments;
184
+ const result = await client.updateRecord('sysapproval_approver', args.sys_id, data);
185
+ return {
186
+ ...result,
187
+ summary: `${args.action === 'approve' ? 'Approved' : 'Rejected'} VR approval ${args.sys_id}`,
188
+ };
189
+ }
190
+ default:
191
+ return null;
192
+ }
193
+ }
194
+ //# sourceMappingURL=usem-approval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usem-approval.js","sourceRoot":"","sources":["../../src/tools/usem-approval.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,MAAM,SAAS,GAAG,iBAAiB,CAAC;AAEpC;;;;GAIG;AACH,MAAM,mBAAmB,GAAG;IAC1B,kCAAkC;IAClC,sBAAsB;IACtB,wBAAwB;IACxB,yBAAyB;IACzB,0BAA0B;IAC1B,4BAA4B;CAC7B,CAAC;AAEF,+EAA+E;AAC/E,MAAM,uBAAuB,GAAG;IAC9B,sBAAsB;IACtB,wBAAwB;IACxB,yBAAyB;IACzB,0BAA0B;IAC1B,4BAA4B;CAC7B,CAAC;AAEF,MAAM,+BAA+B,GAA2B;IAC9D,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,UAAU;IACf,GAAG,EAAE,UAAU;IACf,GAAG,EAAE,oBAAoB;IACzB,GAAG,EAAE,SAAS;IACd,GAAG,EAAE,OAAO;CACb,CAAC;AAEF,MAAM,UAAU,8BAA8B;IAC5C,OAAO;QACL;YACE,IAAI,EAAE,mBAAmB;YACzB,WAAW,EACT,6FAA6F;gBAC7F,2FAA2F;gBAC3F,2FAA2F;YAC7F,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,qGAAqG;qBACnH;oBACD,YAAY,EAAE;wBACZ,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,kGAAkG;qBAChH;oBACD,eAAe,EAAE;wBACf,IAAI,EAAE,QAAQ;wBACd,WAAW,EACT,kGAAkG;4BAClG,sDAAsD;qBACzD;oBACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sCAAsC,EAAE;iBAC/E;aACF;SACF;QACD;YACE,IAAI,EAAE,4BAA4B;YAClC,WAAW,EACT,4FAA4F;gBAC5F,+FAA+F;gBAC/F,6FAA6F;gBAC7F,iGAAiG;gBACjG,+BAA+B;YACjC,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2EAA2E,EAAE;oBAC1H,cAAc,EAAE;wBACd,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,+FAA+F;qBAC7G;oBACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8EAA8E,EAAE;oBACtH,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,0DAA0D,EAAE;oBACzG,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8CAA8C,EAAE;oBACtF,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sCAAsC,EAAE;iBAC/E;aACF;SACF;QACD;YACE,IAAI,EAAE,oBAAoB;YAC1B,WAAW,EACT,8FAA8F;gBAC9F,8FAA8F;gBAC9F,sDAAsD;YACxD,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mDAAmD,EAAE;oBAC5F,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,WAAW,EAAE,mBAAmB,EAAE;oBACzF,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qDAAqD,EAAE;iBACjG;gBACD,QAAQ,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;aAC/B;SACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,MAAwB,EACxB,IAAY,EACZ,IAAyB;IAEzB,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,mBAAmB,CAAC,CAAC,CAAC;YACzB,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrF,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC1C,MAAM,IAAI,eAAe,CACvB,gCAAgC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAChE,iBAAiB,CAClB,CAAC;gBACJ,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,gBAAgB,MAAM,EAAE,CAAC,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,iBAAiB,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC/D,CAAC;YACD,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;YACpG,IAAI,KAAK,KAAK,KAAK;gBAAE,KAAK,CAAC,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC;YAElD,MAAM,cAAc,GAAG,OAAO,IAAI,CAAC,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnG,IAAI,cAAc,EAAE,CAAC;gBACnB,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;oBACtD,MAAM,IAAI,eAAe,CACvB,mCAAmC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACvE,iBAAiB,CAClB,CAAC;gBACJ,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,mBAAmB,cAAc,EAAE,CAAC,CAAC;YAClD,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC;gBACrC,KAAK,EAAE,sBAAsB;gBAC7B,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;gBACtB,MAAM,EAAE,8FAA8F;gBACtG,OAAO,EAAE,iBAAiB;gBAC1B,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;gBACvB,aAAa,EAAE,KAAK;aACrB,CAAC,CAAC;YACH,OAAO;gBACL,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,OAAO,EAAE,SAAS,IAAI,CAAC,KAAK,kBAAkB,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,cAAc,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;aAC9F,CAAC;QACJ,CAAC;QAED,KAAK,4BAA4B,CAAC,CAAC,CAAC;YAClC,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK;gBAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC7D,IAAI,IAAI,CAAC,YAAY;gBAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;YACvE,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,IAAI,IAAI,CAAC,cAAc,KAAK,EAAE;gBAAE,KAAK,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;YACzH,IAAI,IAAI,CAAC,KAAK;gBAAE,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAClD,IAAI,IAAI,CAAC,KAAK;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAEvC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC;gBACrC,KAAK,EAAE,kCAAkC;gBACzC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;gBACtB,MAAM,EACJ,iFAAiF;oBACjF,gFAAgF;gBAClF,OAAO,EAAE,iBAAiB;gBAC1B,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;gBACvB,aAAa,EAAE,KAAK;aACrB,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;gBACnC,MAAM,QAAQ,GACZ,CAAC,CAAC,cAAc,IAAI,OAAO,CAAC,CAAC,cAAc,KAAK,QAAQ;oBACtD,CAAC,CAAC,CAAE,CAAC,CAAC,cAAsB,CAAC,KAAK,IAAI,EAAE,CAAC;oBACzC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;gBACrC,OAAO,EAAE,GAAG,CAAC,EAAE,oBAAoB,EAAE,+BAA+B,CAAC,QAAQ,CAAC,IAAI,QAAQ,EAAE,CAAC;YAC/F,CAAC,CAAC,CAAC;YAEH,OAAO;gBACL,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,OAAO;gBACP,OAAO,EAAE,SAAS,IAAI,CAAC,KAAK,uBAAuB;aACpD,CAAC;QACJ,CAAC;QAED,KAAK,oBAAoB,CAAC,CAAC,CAAC;YAC1B,YAAY,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBACjD,MAAM,IAAI,eAAe,CAAC,0CAA0C,EAAE,iBAAiB,CAAC,CAAC;YAC3F,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC1D,MAAM,IAAI,eAAe,CAAC,sCAAsC,EAAE,iBAAiB,CAAC,CAAC;YACvF,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC/C,MAAM,IAAI,eAAe,CAAC,sCAAsC,EAAE,iBAAiB,CAAC,CAAC;YACvF,CAAC;YACD,MAAM,IAAI,GAA2B,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;YACpG,IAAI,IAAI,CAAC,QAAQ;gBAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YACjD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,sBAAsB,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACpF,OAAO;gBACL,GAAG,MAAM;gBACT,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,gBAAgB,IAAI,CAAC,MAAM,EAAE;aAC7F,CAAC;QACJ,CAAC;QAED;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC"}
@@ -0,0 +1,171 @@
1
+ /**
2
+ * USEM / Vulnerability Response configuration tools — operate the rule tables
3
+ * that drive automation (assignment, remediation task grouping, TTR targets,
4
+ * approval, auto-close, exclusion).
5
+ *
6
+ * A single rule-type registry maps a friendly `rule_type` to its backing table
7
+ * so one small set of generic tools (list/get/create/update/set_active) covers
8
+ * every rule family without per-table boilerplate.
9
+ *
10
+ * Read tools: Tier 0. Write tools: Tier 1 (WRITE_ENABLED=true) — these mutate
11
+ * platform automation config, so treat them as admin-level changes.
12
+ *
13
+ * Tables, key fields and schemas verified against a live PDI (dev400464):
14
+ * assignment → sn_sec_wf_assign_rule (USEM; key: name, has active)
15
+ * remediation_task → sn_sec_rem_task_rule (key: rule_name)
16
+ * remediation_target → sn_sec_wf_ttr_rule (key: name; TTR max/remind)
17
+ * risk_calculator → sn_sec_calculator_group (key: name; no order field)
18
+ * calculator_rule → sn_sec_calculator_rule (key: name; per-calculator rule)
19
+ * classification → sn_sec_wf_classification_group (extends calculator_group; no order)
20
+ * classification_rule→ sn_sec_wf_classification_rule (extends calculator_rule)
21
+ * exception_rule → sn_sec_exception_rule (key: name; state via rule_state/stage, no active)
22
+ * approval → sn_vul_cmn_approval_rule (key: name)
23
+ * auto_close → sn_vul_cmn_auto_close_rule (key: name)
24
+ * exclusion → sn_vul_cmn_auto_exclusion_rule (key: name)
25
+ *
26
+ * Migration note (KB2556844): USEM moved assignment/calculator/classification/
27
+ * exception config from the deprecated sn_vul_ and sn_vulc_ tables to sn_sec_.
28
+ * The legacy sn_vul_assignment_rule table no longer exists post-migration, and
29
+ * sn_vul_vgr_assignment_rule holds no records — the live assignment rules are in
30
+ * sn_sec_wf_assign_rule, which is what `assignment` now targets.
31
+ */
32
+ import type { ServiceNowClient } from '../servicenow/client.js';
33
+ export declare function getUsemConfigToolDefinitions(): ({
34
+ name: string;
35
+ description: string;
36
+ inputSchema: {
37
+ type: string;
38
+ properties: {
39
+ rule_type: {
40
+ type: string;
41
+ enum: string[];
42
+ description: string;
43
+ };
44
+ active: {
45
+ type: string;
46
+ description: string;
47
+ };
48
+ query: {
49
+ type: string;
50
+ description: string;
51
+ };
52
+ limit: {
53
+ type: string;
54
+ description: string;
55
+ };
56
+ display_value: {
57
+ description: string;
58
+ oneOf: ({
59
+ type: string;
60
+ enum?: undefined;
61
+ } | {
62
+ type: string;
63
+ enum: string[];
64
+ })[];
65
+ };
66
+ sys_id?: undefined;
67
+ fields?: undefined;
68
+ };
69
+ required: string[];
70
+ };
71
+ } | {
72
+ name: string;
73
+ description: string;
74
+ inputSchema: {
75
+ type: string;
76
+ properties: {
77
+ rule_type: {
78
+ type: string;
79
+ enum: string[];
80
+ description: string;
81
+ };
82
+ sys_id: {
83
+ type: string;
84
+ description: string;
85
+ };
86
+ active?: undefined;
87
+ query?: undefined;
88
+ limit?: undefined;
89
+ display_value?: undefined;
90
+ fields?: undefined;
91
+ };
92
+ required: string[];
93
+ };
94
+ } | {
95
+ name: string;
96
+ description: string;
97
+ inputSchema: {
98
+ type: string;
99
+ properties: {
100
+ rule_type: {
101
+ type: string;
102
+ enum: string[];
103
+ description: string;
104
+ };
105
+ fields: {
106
+ type: string;
107
+ description: string;
108
+ };
109
+ active?: undefined;
110
+ query?: undefined;
111
+ limit?: undefined;
112
+ display_value?: undefined;
113
+ sys_id?: undefined;
114
+ };
115
+ required: string[];
116
+ };
117
+ } | {
118
+ name: string;
119
+ description: string;
120
+ inputSchema: {
121
+ type: string;
122
+ properties: {
123
+ rule_type: {
124
+ type: string;
125
+ enum: string[];
126
+ description: string;
127
+ };
128
+ sys_id: {
129
+ type: string;
130
+ description: string;
131
+ };
132
+ fields: {
133
+ type: string;
134
+ description: string;
135
+ };
136
+ active?: undefined;
137
+ query?: undefined;
138
+ limit?: undefined;
139
+ display_value?: undefined;
140
+ };
141
+ required: string[];
142
+ };
143
+ } | {
144
+ name: string;
145
+ description: string;
146
+ inputSchema: {
147
+ type: string;
148
+ properties: {
149
+ rule_type: {
150
+ type: string;
151
+ enum: string[];
152
+ description: string;
153
+ };
154
+ sys_id: {
155
+ type: string;
156
+ description: string;
157
+ };
158
+ active: {
159
+ type: string;
160
+ description: string;
161
+ };
162
+ query?: undefined;
163
+ limit?: undefined;
164
+ display_value?: undefined;
165
+ fields?: undefined;
166
+ };
167
+ required: string[];
168
+ };
169
+ })[];
170
+ export declare function executeUsemConfigToolCall(client: ServiceNowClient, name: string, args: Record<string, any>): Promise<any>;
171
+ //# sourceMappingURL=usem-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usem-config.d.ts","sourceRoot":"","sources":["../../src/tools/usem-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AA2HhE,wBAAgB,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAmF3C;AAED,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACxB,OAAO,CAAC,GAAG,CAAC,CA4Ed"}
@@ -0,0 +1,254 @@
1
+ import { ServiceNowError } from '../utils/errors.js';
2
+ import { requireWrite } from '../utils/permissions.js';
3
+ const RULE_REGISTRY = {
4
+ assignment: {
5
+ table: 'sn_sec_wf_assign_rule',
6
+ label: 'Assignment Rule',
7
+ nameField: 'name',
8
+ hasActive: true,
9
+ listFields: 'name,active,order,table,assignment_group,condition,type,sys_id',
10
+ },
11
+ remediation_task: {
12
+ table: 'sn_sec_rem_task_rule',
13
+ label: 'Remediation Task Rule',
14
+ nameField: 'rule_name',
15
+ hasActive: true,
16
+ listFields: 'rule_name,active,order,assignment_group,table,condition,sys_id',
17
+ },
18
+ remediation_target: {
19
+ table: 'sn_sec_wf_ttr_rule',
20
+ label: 'Remediation Target Rule',
21
+ nameField: 'name',
22
+ hasActive: true,
23
+ listFields: 'name,active,order,table,ttr_max,ttr_remind,target_from,sys_id',
24
+ },
25
+ risk_calculator: {
26
+ table: 'sn_sec_calculator_group',
27
+ label: 'Risk Calculator',
28
+ nameField: 'name',
29
+ hasActive: true,
30
+ orderField: 'name', // no order column on this table
31
+ listFields: 'name,active,table,target_field,description,sys_id',
32
+ },
33
+ calculator_rule: {
34
+ table: 'sn_sec_calculator_rule',
35
+ label: 'Risk Calculator Rule',
36
+ nameField: 'name',
37
+ hasActive: true,
38
+ listFields: 'name,active,order,calculator_group,table,condition,value_type,sys_id',
39
+ },
40
+ classification: {
41
+ table: 'sn_sec_wf_classification_group',
42
+ label: 'Classification Group',
43
+ nameField: 'name',
44
+ hasActive: true,
45
+ orderField: 'name', // extends sn_sec_calculator_group, which has no order column
46
+ listFields: 'name,active,table,target_field,sys_id',
47
+ },
48
+ classification_rule: {
49
+ table: 'sn_sec_wf_classification_rule',
50
+ label: 'Classification Rule',
51
+ nameField: 'name',
52
+ hasActive: true,
53
+ listFields: 'name,active,order,classification,classification_type,table,condition,sys_id',
54
+ },
55
+ exception_rule: {
56
+ table: 'sn_sec_exception_rule',
57
+ label: 'Exception Rule',
58
+ nameField: 'name',
59
+ hasActive: false, // lifecycle is rule_state/stage, not an active flag
60
+ listFields: 'name,order,table,rule_state,stage,condition,applies_to,sys_id',
61
+ },
62
+ approval: {
63
+ table: 'sn_vul_cmn_approval_rule',
64
+ label: 'Approval Rule',
65
+ nameField: 'name',
66
+ hasActive: true,
67
+ listFields: 'name,active,order,table,type,condition,sys_id',
68
+ },
69
+ auto_close: {
70
+ table: 'sn_vul_cmn_auto_close_rule',
71
+ label: 'Auto-Close Rule',
72
+ nameField: 'name',
73
+ hasActive: true,
74
+ listFields: 'name,active,order,table,condition,sys_id',
75
+ },
76
+ exclusion: {
77
+ table: 'sn_vul_cmn_auto_exclusion_rule',
78
+ label: 'Exclusion Rule',
79
+ nameField: 'name',
80
+ hasActive: true,
81
+ listFields: 'name,active,order,table,condition,sys_id',
82
+ },
83
+ };
84
+ const RULE_TYPES = Object.keys(RULE_REGISTRY);
85
+ const SYS_ID_RE = /^[0-9a-f]{32}$/i;
86
+ const RULE_TYPE_SCHEMA = {
87
+ type: 'string',
88
+ enum: RULE_TYPES,
89
+ description: 'Which rule family to operate on: ' +
90
+ 'assignment (sn_sec_wf_assign_rule), remediation_task, remediation_target (TTR/SLA targets), ' +
91
+ 'risk_calculator + calculator_rule (risk scoring), classification + classification_rule, ' +
92
+ 'exception_rule (sn_sec_exception_rule), approval, auto_close, exclusion',
93
+ };
94
+ function resolveType(ruleType) {
95
+ if (typeof ruleType !== 'string' || !RULE_REGISTRY[ruleType]) {
96
+ throw new ServiceNowError(`rule_type must be one of: ${RULE_TYPES.join(', ')}`, 'INVALID_REQUEST');
97
+ }
98
+ return RULE_REGISTRY[ruleType];
99
+ }
100
+ export function getUsemConfigToolDefinitions() {
101
+ return [
102
+ {
103
+ name: 'list_usem_rules',
104
+ description: 'List USEM/Vulnerability Response automation rules of a given type (assignment, ' +
105
+ 'remediation_task, remediation_target, risk_calculator, calculator_rule, classification, ' +
106
+ 'classification_rule, exception_rule, approval, auto_close, exclusion). Ordered by ' +
107
+ 'execution order. Optionally filter by active state or an extra encoded query.',
108
+ inputSchema: {
109
+ type: 'object',
110
+ properties: {
111
+ rule_type: RULE_TYPE_SCHEMA,
112
+ active: { type: 'boolean', description: 'Filter by active state (ignored for rule types without an active field)' },
113
+ query: { type: 'string', description: 'Additional raw encoded query appended with ^' },
114
+ limit: { type: 'number', description: 'Max records (default: 50, max: 1000)' },
115
+ display_value: {
116
+ description: 'Return human-readable reference/choice values (true) or both raw and display ("all")',
117
+ oneOf: [{ type: 'boolean' }, { type: 'string', enum: ['all'] }],
118
+ },
119
+ },
120
+ required: ['rule_type'],
121
+ },
122
+ },
123
+ {
124
+ name: 'get_usem_rule',
125
+ description: 'Get the full definition of a single USEM/VR rule by sys_id.',
126
+ inputSchema: {
127
+ type: 'object',
128
+ properties: {
129
+ rule_type: RULE_TYPE_SCHEMA,
130
+ sys_id: { type: 'string', description: '32-char sys_id of the rule' },
131
+ },
132
+ required: ['rule_type', 'sys_id'],
133
+ },
134
+ },
135
+ {
136
+ name: 'create_usem_rule',
137
+ description: 'Create a USEM/VR automation rule. Provide the rule_type and a fields object matching ' +
138
+ 'that table (e.g. name/rule_name, active, order, condition, assignment_group, ttr_max). ' +
139
+ '**[Write — requires WRITE_ENABLED=true; admin-level config change]**',
140
+ inputSchema: {
141
+ type: 'object',
142
+ properties: {
143
+ rule_type: RULE_TYPE_SCHEMA,
144
+ fields: { type: 'object', description: 'Column/value map for the new rule record' },
145
+ },
146
+ required: ['rule_type', 'fields'],
147
+ },
148
+ },
149
+ {
150
+ name: 'update_usem_rule',
151
+ description: 'Update a USEM/VR automation rule by sys_id with a fields object. ' +
152
+ '**[Write — requires WRITE_ENABLED=true; admin-level config change]**',
153
+ inputSchema: {
154
+ type: 'object',
155
+ properties: {
156
+ rule_type: RULE_TYPE_SCHEMA,
157
+ sys_id: { type: 'string', description: '32-char sys_id of the rule' },
158
+ fields: { type: 'object', description: 'Column/value map of changes' },
159
+ },
160
+ required: ['rule_type', 'sys_id', 'fields'],
161
+ },
162
+ },
163
+ {
164
+ name: 'set_usem_rule_active',
165
+ description: 'Enable or disable a USEM/VR rule (convenience toggle of the active flag). ' +
166
+ 'Not supported for the assignment rule type, which has no active field. ' +
167
+ '**[Write — requires WRITE_ENABLED=true; admin-level config change]**',
168
+ inputSchema: {
169
+ type: 'object',
170
+ properties: {
171
+ rule_type: RULE_TYPE_SCHEMA,
172
+ sys_id: { type: 'string', description: '32-char sys_id of the rule' },
173
+ active: { type: 'boolean', description: 'true to enable, false to disable' },
174
+ },
175
+ required: ['rule_type', 'sys_id', 'active'],
176
+ },
177
+ },
178
+ ];
179
+ }
180
+ export async function executeUsemConfigToolCall(client, name, args) {
181
+ switch (name) {
182
+ case 'list_usem_rules': {
183
+ const rt = resolveType(args.rule_type);
184
+ const parts = [];
185
+ if (args.active !== undefined && rt.hasActive)
186
+ parts.push(`active=${args.active === true}`);
187
+ if (args.query)
188
+ parts.push(args.query);
189
+ const resp = await client.queryRecords({
190
+ table: rt.table,
191
+ query: parts.join('^'),
192
+ fields: rt.listFields,
193
+ orderBy: rt.orderField ?? 'order',
194
+ limit: args.limit ?? 50,
195
+ display_value: args.display_value,
196
+ });
197
+ return {
198
+ rule_type: args.rule_type,
199
+ table: rt.table,
200
+ count: resp.count,
201
+ records: resp.records,
202
+ summary: `Found ${resp.count} ${rt.label}(s)`,
203
+ };
204
+ }
205
+ case 'get_usem_rule': {
206
+ const rt = resolveType(args.rule_type);
207
+ if (!args.sys_id || !SYS_ID_RE.test(args.sys_id)) {
208
+ throw new ServiceNowError('sys_id must be a 32-character hex string', 'INVALID_REQUEST');
209
+ }
210
+ return await client.getRecord(rt.table, args.sys_id);
211
+ }
212
+ case 'create_usem_rule': {
213
+ requireWrite();
214
+ const rt = resolveType(args.rule_type);
215
+ if (!args.fields || typeof args.fields !== 'object' || Object.keys(args.fields).length === 0) {
216
+ throw new ServiceNowError('fields object with at least one column is required', 'INVALID_REQUEST');
217
+ }
218
+ const result = await client.createRecord(rt.table, args.fields);
219
+ const label = rt.nameField ? args.fields[rt.nameField] ?? result.sys_id : result.sys_id;
220
+ return { ...result, rule_type: args.rule_type, summary: `Created ${rt.label}: ${label}` };
221
+ }
222
+ case 'update_usem_rule': {
223
+ requireWrite();
224
+ const rt = resolveType(args.rule_type);
225
+ if (!args.sys_id)
226
+ throw new ServiceNowError('sys_id is required', 'INVALID_REQUEST');
227
+ if (!args.fields || typeof args.fields !== 'object' || Object.keys(args.fields).length === 0) {
228
+ throw new ServiceNowError('fields object with at least one column is required', 'INVALID_REQUEST');
229
+ }
230
+ const result = await client.updateRecord(rt.table, args.sys_id, args.fields);
231
+ return { ...result, rule_type: args.rule_type, summary: `Updated ${rt.label} ${args.sys_id}` };
232
+ }
233
+ case 'set_usem_rule_active': {
234
+ requireWrite();
235
+ const rt = resolveType(args.rule_type);
236
+ if (!rt.hasActive) {
237
+ throw new ServiceNowError(`${rt.label} has no active field; use update_usem_rule instead`, 'INVALID_REQUEST');
238
+ }
239
+ if (!args.sys_id)
240
+ throw new ServiceNowError('sys_id is required', 'INVALID_REQUEST');
241
+ if (typeof args.active !== 'boolean')
242
+ throw new ServiceNowError('active (boolean) is required', 'INVALID_REQUEST');
243
+ const result = await client.updateRecord(rt.table, args.sys_id, { active: args.active });
244
+ return {
245
+ ...result,
246
+ rule_type: args.rule_type,
247
+ summary: `${args.active ? 'Enabled' : 'Disabled'} ${rt.label} ${args.sys_id}`,
248
+ };
249
+ }
250
+ default:
251
+ return null;
252
+ }
253
+ }
254
+ //# sourceMappingURL=usem-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usem-config.js","sourceRoot":"","sources":["../../src/tools/usem-config.ts"],"names":[],"mappings":"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"}