nowaikit 2.5.0

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.

Potentially problematic release.


This version of nowaikit might be problematic. Click here for more details.

Files changed (209) hide show
  1. package/.env.example +96 -0
  2. package/LICENSE +21 -0
  3. package/README.md +1253 -0
  4. package/desktop/renderer/dist/apple-touch-icon.png +0 -0
  5. package/desktop/renderer/dist/assets/index-Bb0ncZQl.css +1 -0
  6. package/desktop/renderer/dist/assets/index-MlBBSUMZ.js +49 -0
  7. package/desktop/renderer/dist/favicon-32.png +0 -0
  8. package/desktop/renderer/dist/favicon.svg +18 -0
  9. package/desktop/renderer/dist/index.html +18 -0
  10. package/desktop/serve.js +449 -0
  11. package/dist/cli/auth.d.ts +14 -0
  12. package/dist/cli/auth.d.ts.map +1 -0
  13. package/dist/cli/auth.js +179 -0
  14. package/dist/cli/auth.js.map +1 -0
  15. package/dist/cli/config-store.d.ts +28 -0
  16. package/dist/cli/config-store.d.ts.map +1 -0
  17. package/dist/cli/config-store.js +64 -0
  18. package/dist/cli/config-store.js.map +1 -0
  19. package/dist/cli/detect-clients.d.ts +16 -0
  20. package/dist/cli/detect-clients.d.ts.map +1 -0
  21. package/dist/cli/detect-clients.js +151 -0
  22. package/dist/cli/detect-clients.js.map +1 -0
  23. package/dist/cli/index.d.ts +3 -0
  24. package/dist/cli/index.d.ts.map +1 -0
  25. package/dist/cli/index.js +193 -0
  26. package/dist/cli/index.js.map +1 -0
  27. package/dist/cli/setup.d.ts +4 -0
  28. package/dist/cli/setup.d.ts.map +1 -0
  29. package/dist/cli/setup.js +575 -0
  30. package/dist/cli/setup.js.map +1 -0
  31. package/dist/cli/writers/index.d.ts +9 -0
  32. package/dist/cli/writers/index.d.ts.map +1 -0
  33. package/dist/cli/writers/index.js +140 -0
  34. package/dist/cli/writers/index.js.map +1 -0
  35. package/dist/prompts/index.d.ts +25 -0
  36. package/dist/prompts/index.d.ts.map +1 -0
  37. package/dist/prompts/index.js +38 -0
  38. package/dist/prompts/index.js.map +1 -0
  39. package/dist/prompts/itsm.d.ts +20 -0
  40. package/dist/prompts/itsm.d.ts.map +1 -0
  41. package/dist/prompts/itsm.js +110 -0
  42. package/dist/prompts/itsm.js.map +1 -0
  43. package/dist/prompts/user-prompts.d.ts +3 -0
  44. package/dist/prompts/user-prompts.d.ts.map +1 -0
  45. package/dist/prompts/user-prompts.js +35 -0
  46. package/dist/prompts/user-prompts.js.map +1 -0
  47. package/dist/resources/index.d.ts +26 -0
  48. package/dist/resources/index.d.ts.map +1 -0
  49. package/dist/resources/index.js +99 -0
  50. package/dist/resources/index.js.map +1 -0
  51. package/dist/server.d.ts +3 -0
  52. package/dist/server.d.ts.map +1 -0
  53. package/dist/server.js +129 -0
  54. package/dist/server.js.map +1 -0
  55. package/dist/servicenow/client.d.ts +135 -0
  56. package/dist/servicenow/client.d.ts.map +1 -0
  57. package/dist/servicenow/client.js +803 -0
  58. package/dist/servicenow/client.js.map +1 -0
  59. package/dist/servicenow/instances.d.ts +28 -0
  60. package/dist/servicenow/instances.d.ts.map +1 -0
  61. package/dist/servicenow/instances.js +204 -0
  62. package/dist/servicenow/instances.js.map +1 -0
  63. package/dist/servicenow/types.d.ts +574 -0
  64. package/dist/servicenow/types.d.ts.map +1 -0
  65. package/dist/servicenow/types.js +3 -0
  66. package/dist/servicenow/types.js.map +1 -0
  67. package/dist/tools/agile.d.ts +225 -0
  68. package/dist/tools/agile.d.ts.map +1 -0
  69. package/dist/tools/agile.js +205 -0
  70. package/dist/tools/agile.js.map +1 -0
  71. package/dist/tools/app-studio.d.ts +139 -0
  72. package/dist/tools/app-studio.d.ts.map +1 -0
  73. package/dist/tools/app-studio.js +139 -0
  74. package/dist/tools/app-studio.js.map +1 -0
  75. package/dist/tools/atf.d.ts +144 -0
  76. package/dist/tools/atf.d.ts.map +1 -0
  77. package/dist/tools/atf.js +186 -0
  78. package/dist/tools/atf.js.map +1 -0
  79. package/dist/tools/catalog.d.ts +628 -0
  80. package/dist/tools/catalog.d.ts.map +1 -0
  81. package/dist/tools/catalog.js +397 -0
  82. package/dist/tools/catalog.js.map +1 -0
  83. package/dist/tools/change.d.ts +347 -0
  84. package/dist/tools/change.d.ts.map +1 -0
  85. package/dist/tools/change.js +213 -0
  86. package/dist/tools/change.js.map +1 -0
  87. package/dist/tools/core.d.ts +540 -0
  88. package/dist/tools/core.d.ts.map +1 -0
  89. package/dist/tools/core.js +373 -0
  90. package/dist/tools/core.js.map +1 -0
  91. package/dist/tools/csm.d.ts +401 -0
  92. package/dist/tools/csm.d.ts.map +1 -0
  93. package/dist/tools/csm.js +255 -0
  94. package/dist/tools/csm.js.map +1 -0
  95. package/dist/tools/deployment.d.ts +366 -0
  96. package/dist/tools/deployment.d.ts.map +1 -0
  97. package/dist/tools/deployment.js +181 -0
  98. package/dist/tools/deployment.js.map +1 -0
  99. package/dist/tools/devops.d.ts +236 -0
  100. package/dist/tools/devops.d.ts.map +1 -0
  101. package/dist/tools/devops.js +207 -0
  102. package/dist/tools/devops.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 +789 -0
  108. package/dist/tools/hrsd.d.ts.map +1 -0
  109. package/dist/tools/hrsd.js +377 -0
  110. package/dist/tools/hrsd.js.map +1 -0
  111. package/dist/tools/incident.d.ts +256 -0
  112. package/dist/tools/incident.d.ts.map +1 -0
  113. package/dist/tools/incident.js +163 -0
  114. package/dist/tools/incident.js.map +1 -0
  115. package/dist/tools/index.d.ts +11514 -0
  116. package/dist/tools/index.d.ts.map +1 -0
  117. package/dist/tools/index.js +276 -0
  118. package/dist/tools/index.js.map +1 -0
  119. package/dist/tools/integration.d.ts +603 -0
  120. package/dist/tools/integration.d.ts.map +1 -0
  121. package/dist/tools/integration.js +510 -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 +110 -0
  156. package/dist/tools/problem.d.ts.map +1 -0
  157. package/dist/tools/problem.js +100 -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 +460 -0
  162. package/dist/tools/reporting.js.map +1 -0
  163. package/dist/tools/script.d.ts +714 -0
  164. package/dist/tools/script.d.ts.map +1 -0
  165. package/dist/tools/script.js +629 -0
  166. package/dist/tools/script.js.map +1 -0
  167. package/dist/tools/security.d.ts +794 -0
  168. package/dist/tools/security.d.ts.map +1 -0
  169. package/dist/tools/security.js +425 -0
  170. package/dist/tools/security.js.map +1 -0
  171. package/dist/tools/sys-properties.d.ts +315 -0
  172. package/dist/tools/sys-properties.d.ts.map +1 -0
  173. package/dist/tools/sys-properties.js +372 -0
  174. package/dist/tools/sys-properties.js.map +1 -0
  175. package/dist/tools/task.d.ts +82 -0
  176. package/dist/tools/task.d.ts.map +1 -0
  177. package/dist/tools/task.js +96 -0
  178. package/dist/tools/task.js.map +1 -0
  179. package/dist/tools/updateset.d.ts +159 -0
  180. package/dist/tools/updateset.d.ts.map +1 -0
  181. package/dist/tools/updateset.js +212 -0
  182. package/dist/tools/updateset.js.map +1 -0
  183. package/dist/tools/user.d.ts +206 -0
  184. package/dist/tools/user.d.ts.map +1 -0
  185. package/dist/tools/user.js +163 -0
  186. package/dist/tools/user.js.map +1 -0
  187. package/dist/tools/va.d.ts +217 -0
  188. package/dist/tools/va.d.ts.map +1 -0
  189. package/dist/tools/va.js +178 -0
  190. package/dist/tools/va.js.map +1 -0
  191. package/dist/tools/workspace.d.ts +565 -0
  192. package/dist/tools/workspace.d.ts.map +1 -0
  193. package/dist/tools/workspace.js +201 -0
  194. package/dist/tools/workspace.js.map +1 -0
  195. package/dist/tools-manifest.json +7852 -0
  196. package/dist/utils/errors.d.ts +6 -0
  197. package/dist/utils/errors.d.ts.map +1 -0
  198. package/dist/utils/errors.js +11 -0
  199. package/dist/utils/errors.js.map +1 -0
  200. package/dist/utils/logging.d.ts +7 -0
  201. package/dist/utils/logging.d.ts.map +1 -0
  202. package/dist/utils/logging.js +15 -0
  203. package/dist/utils/logging.js.map +1 -0
  204. package/dist/utils/permissions.d.ts +21 -0
  205. package/dist/utils/permissions.d.ts.map +1 -0
  206. package/dist/utils/permissions.js +54 -0
  207. package/dist/utils/permissions.js.map +1 -0
  208. package/instances.example.json +71 -0
  209. package/package.json +110 -0
@@ -0,0 +1,315 @@
1
+ /**
2
+ * System Properties tools — read and manage ServiceNow sys_properties records.
3
+ *
4
+ * Tier 0 (Read): list, get, search, bulk_get, categories
5
+ * Tier 1 (Write): set, delete, bulk_set, import
6
+ * Tier 0 (Audit): history (read-only)
7
+ *
8
+ * ServiceNow table: sys_properties, sys_audit_sys_properties
9
+ */
10
+ import type { ServiceNowClient } from '../servicenow/client.js';
11
+ export declare function getSysPropertiesToolDefinitions(): ({
12
+ name: string;
13
+ description: string;
14
+ inputSchema: {
15
+ type: string;
16
+ properties: {
17
+ name: {
18
+ type: string;
19
+ description: string;
20
+ };
21
+ value?: undefined;
22
+ description?: undefined;
23
+ type?: undefined;
24
+ query?: undefined;
25
+ category?: undefined;
26
+ limit?: undefined;
27
+ search?: undefined;
28
+ names?: undefined;
29
+ properties?: undefined;
30
+ dry_run?: undefined;
31
+ };
32
+ required: string[];
33
+ };
34
+ } | {
35
+ name: string;
36
+ description: string;
37
+ inputSchema: {
38
+ type: string;
39
+ properties: {
40
+ name: {
41
+ type: string;
42
+ description: string;
43
+ };
44
+ value: {
45
+ type: string;
46
+ description: string;
47
+ };
48
+ description: {
49
+ type: string;
50
+ description: string;
51
+ };
52
+ type: {
53
+ type: string;
54
+ description: string;
55
+ };
56
+ query?: undefined;
57
+ category?: undefined;
58
+ limit?: undefined;
59
+ search?: undefined;
60
+ names?: undefined;
61
+ properties?: undefined;
62
+ dry_run?: undefined;
63
+ };
64
+ required: string[];
65
+ };
66
+ } | {
67
+ name: string;
68
+ description: string;
69
+ inputSchema: {
70
+ type: string;
71
+ properties: {
72
+ query: {
73
+ type: string;
74
+ description: string;
75
+ };
76
+ category: {
77
+ type: string;
78
+ description: string;
79
+ };
80
+ type: {
81
+ type: string;
82
+ description: string;
83
+ };
84
+ limit: {
85
+ type: string;
86
+ description: string;
87
+ };
88
+ name?: undefined;
89
+ value?: undefined;
90
+ description?: undefined;
91
+ search?: undefined;
92
+ names?: undefined;
93
+ properties?: undefined;
94
+ dry_run?: undefined;
95
+ };
96
+ required: never[];
97
+ };
98
+ } | {
99
+ name: string;
100
+ description: string;
101
+ inputSchema: {
102
+ type: string;
103
+ properties: {
104
+ search: {
105
+ type: string;
106
+ description: string;
107
+ };
108
+ limit: {
109
+ type: string;
110
+ description: string;
111
+ };
112
+ name?: undefined;
113
+ value?: undefined;
114
+ description?: undefined;
115
+ type?: undefined;
116
+ query?: undefined;
117
+ category?: undefined;
118
+ names?: undefined;
119
+ properties?: undefined;
120
+ dry_run?: undefined;
121
+ };
122
+ required: string[];
123
+ };
124
+ } | {
125
+ name: string;
126
+ description: string;
127
+ inputSchema: {
128
+ type: string;
129
+ properties: {
130
+ names: {
131
+ type: string;
132
+ items: {
133
+ type: string;
134
+ };
135
+ description: string;
136
+ };
137
+ name?: undefined;
138
+ value?: undefined;
139
+ description?: undefined;
140
+ type?: undefined;
141
+ query?: undefined;
142
+ category?: undefined;
143
+ limit?: undefined;
144
+ search?: undefined;
145
+ properties?: undefined;
146
+ dry_run?: undefined;
147
+ };
148
+ required: string[];
149
+ };
150
+ } | {
151
+ name: string;
152
+ description: string;
153
+ inputSchema: {
154
+ type: string;
155
+ properties: {
156
+ properties: {
157
+ type: string;
158
+ description: string;
159
+ items: {
160
+ type: string;
161
+ properties: {
162
+ name: {
163
+ type: string;
164
+ };
165
+ value: {
166
+ type: string;
167
+ };
168
+ description: {
169
+ type: string;
170
+ };
171
+ };
172
+ required: string[];
173
+ };
174
+ };
175
+ name?: undefined;
176
+ value?: undefined;
177
+ description?: undefined;
178
+ type?: undefined;
179
+ query?: undefined;
180
+ category?: undefined;
181
+ limit?: undefined;
182
+ search?: undefined;
183
+ names?: undefined;
184
+ dry_run?: undefined;
185
+ };
186
+ required: string[];
187
+ };
188
+ } | {
189
+ name: string;
190
+ description: string;
191
+ inputSchema: {
192
+ type: string;
193
+ properties: {
194
+ category: {
195
+ type: string;
196
+ description: string;
197
+ };
198
+ query: {
199
+ type: string;
200
+ description: string;
201
+ };
202
+ name?: undefined;
203
+ value?: undefined;
204
+ description?: undefined;
205
+ type?: undefined;
206
+ limit?: undefined;
207
+ search?: undefined;
208
+ names?: undefined;
209
+ properties?: undefined;
210
+ dry_run?: undefined;
211
+ };
212
+ required: never[];
213
+ };
214
+ } | {
215
+ name: string;
216
+ description: string;
217
+ inputSchema: {
218
+ type: string;
219
+ properties: {
220
+ properties: {
221
+ type: string;
222
+ description: string;
223
+ items?: undefined;
224
+ };
225
+ dry_run: {
226
+ type: string;
227
+ description: string;
228
+ };
229
+ name?: undefined;
230
+ value?: undefined;
231
+ description?: undefined;
232
+ type?: undefined;
233
+ query?: undefined;
234
+ category?: undefined;
235
+ limit?: undefined;
236
+ search?: undefined;
237
+ names?: undefined;
238
+ };
239
+ required: string[];
240
+ };
241
+ } | {
242
+ name: string;
243
+ description: string;
244
+ inputSchema: {
245
+ type: string;
246
+ properties: {
247
+ name: {
248
+ type: string;
249
+ description: string;
250
+ };
251
+ value: {
252
+ type: string;
253
+ description: string;
254
+ };
255
+ description?: undefined;
256
+ type?: undefined;
257
+ query?: undefined;
258
+ category?: undefined;
259
+ limit?: undefined;
260
+ search?: undefined;
261
+ names?: undefined;
262
+ properties?: undefined;
263
+ dry_run?: undefined;
264
+ };
265
+ required: string[];
266
+ };
267
+ } | {
268
+ name: string;
269
+ description: string;
270
+ inputSchema: {
271
+ type: string;
272
+ properties: {
273
+ name?: undefined;
274
+ value?: undefined;
275
+ description?: undefined;
276
+ type?: undefined;
277
+ query?: undefined;
278
+ category?: undefined;
279
+ limit?: undefined;
280
+ search?: undefined;
281
+ names?: undefined;
282
+ properties?: undefined;
283
+ dry_run?: undefined;
284
+ };
285
+ required: never[];
286
+ };
287
+ } | {
288
+ name: string;
289
+ description: string;
290
+ inputSchema: {
291
+ type: string;
292
+ properties: {
293
+ name: {
294
+ type: string;
295
+ description: string;
296
+ };
297
+ limit: {
298
+ type: string;
299
+ description: string;
300
+ };
301
+ value?: undefined;
302
+ description?: undefined;
303
+ type?: undefined;
304
+ query?: undefined;
305
+ category?: undefined;
306
+ search?: undefined;
307
+ names?: undefined;
308
+ properties?: undefined;
309
+ dry_run?: undefined;
310
+ };
311
+ required: string[];
312
+ };
313
+ })[];
314
+ export declare function executeSysPropertiesToolCall(client: ServiceNowClient, name: string, args: Record<string, any>): Promise<any>;
315
+ //# sourceMappingURL=sys-properties.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sys-properties.d.ts","sourceRoot":"","sources":["../../src/tools/sys-properties.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAIhE,wBAAgB,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA+J9C;AAED,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACxB,OAAO,CAAC,GAAG,CAAC,CAgMd"}
@@ -0,0 +1,372 @@
1
+ import { ServiceNowError } from '../utils/errors.js';
2
+ import { requireWrite } from '../utils/permissions.js';
3
+ export function getSysPropertiesToolDefinitions() {
4
+ return [
5
+ {
6
+ name: 'get_system_property',
7
+ description: 'Get a ServiceNow system property value and metadata by name',
8
+ inputSchema: {
9
+ type: 'object',
10
+ properties: {
11
+ name: { type: 'string', description: 'Property name (e.g. "glide.smtp.host")' },
12
+ },
13
+ required: ['name'],
14
+ },
15
+ },
16
+ {
17
+ name: 'set_system_property',
18
+ description: 'Create or update a ServiceNow system property value. **[Write]**',
19
+ inputSchema: {
20
+ type: 'object',
21
+ properties: {
22
+ name: { type: 'string', description: 'Property name' },
23
+ value: { type: 'string', description: 'Property value' },
24
+ description: { type: 'string', description: 'Optional description' },
25
+ type: { type: 'string', description: 'Property type: string, integer, boolean, choice, password2, etc.' },
26
+ },
27
+ required: ['name', 'value'],
28
+ },
29
+ },
30
+ {
31
+ name: 'list_system_properties',
32
+ description: 'List system properties with optional filtering',
33
+ inputSchema: {
34
+ type: 'object',
35
+ properties: {
36
+ query: { type: 'string', description: 'Encoded query to filter properties' },
37
+ category: { type: 'string', description: 'Filter by category (e.g. "email", "security")' },
38
+ type: { type: 'string', description: 'Filter by type (e.g. "boolean", "string")' },
39
+ limit: { type: 'number', description: 'Max records (default 50)' },
40
+ },
41
+ required: [],
42
+ },
43
+ },
44
+ {
45
+ name: 'delete_system_property',
46
+ description: 'Delete a system property by name. **[Write]**',
47
+ inputSchema: {
48
+ type: 'object',
49
+ properties: {
50
+ name: { type: 'string', description: 'Property name to delete' },
51
+ },
52
+ required: ['name'],
53
+ },
54
+ },
55
+ {
56
+ name: 'search_system_properties',
57
+ description: 'Search system properties by name, value, or description',
58
+ inputSchema: {
59
+ type: 'object',
60
+ properties: {
61
+ search: { type: 'string', description: 'Search text matched against name, value, and description' },
62
+ limit: { type: 'number', description: 'Max results (default 20)' },
63
+ },
64
+ required: ['search'],
65
+ },
66
+ },
67
+ {
68
+ name: 'bulk_get_properties',
69
+ description: 'Retrieve multiple system property values in a single call',
70
+ inputSchema: {
71
+ type: 'object',
72
+ properties: {
73
+ names: { type: 'array', items: { type: 'string' }, description: 'Array of property names to retrieve' },
74
+ },
75
+ required: ['names'],
76
+ },
77
+ },
78
+ {
79
+ name: 'bulk_set_properties',
80
+ description: 'Create or update multiple system properties in a single operation. **[Write]**',
81
+ inputSchema: {
82
+ type: 'object',
83
+ properties: {
84
+ properties: {
85
+ type: 'array',
86
+ description: 'Array of {name, value, description?} objects',
87
+ items: {
88
+ type: 'object',
89
+ properties: {
90
+ name: { type: 'string' },
91
+ value: { type: 'string' },
92
+ description: { type: 'string' },
93
+ },
94
+ required: ['name', 'value'],
95
+ },
96
+ },
97
+ },
98
+ required: ['properties'],
99
+ },
100
+ },
101
+ {
102
+ name: 'export_properties',
103
+ description: 'Export system properties matching a query to a JSON object (useful for environment snapshots)',
104
+ inputSchema: {
105
+ type: 'object',
106
+ properties: {
107
+ category: { type: 'string', description: 'Filter by category' },
108
+ query: { type: 'string', description: 'Encoded query filter' },
109
+ },
110
+ required: [],
111
+ },
112
+ },
113
+ {
114
+ name: 'import_properties',
115
+ description: 'Import (create or update) system properties from a JSON object. **[Write]**',
116
+ inputSchema: {
117
+ type: 'object',
118
+ properties: {
119
+ properties: {
120
+ type: 'object',
121
+ description: 'Key-value map of property names to values (e.g. {"glide.smtp.host": "smtp.example.com"})',
122
+ },
123
+ dry_run: { type: 'boolean', description: 'If true, show what would be changed without writing (default false)' },
124
+ },
125
+ required: ['properties'],
126
+ },
127
+ },
128
+ {
129
+ name: 'validate_property',
130
+ description: 'Validate a property value against its declared type constraints without saving',
131
+ inputSchema: {
132
+ type: 'object',
133
+ properties: {
134
+ name: { type: 'string', description: 'Property name' },
135
+ value: { type: 'string', description: 'Value to validate' },
136
+ },
137
+ required: ['name', 'value'],
138
+ },
139
+ },
140
+ {
141
+ name: 'list_property_categories',
142
+ description: 'List all unique property categories with their record counts',
143
+ inputSchema: {
144
+ type: 'object',
145
+ properties: {},
146
+ required: [],
147
+ },
148
+ },
149
+ {
150
+ name: 'get_property_history',
151
+ description: 'Get audit history of changes to a system property',
152
+ inputSchema: {
153
+ type: 'object',
154
+ properties: {
155
+ name: { type: 'string', description: 'Property name' },
156
+ limit: { type: 'number', description: 'Max audit records (default 20)' },
157
+ },
158
+ required: ['name'],
159
+ },
160
+ },
161
+ ];
162
+ }
163
+ export async function executeSysPropertiesToolCall(client, name, args) {
164
+ switch (name) {
165
+ case 'get_system_property': {
166
+ if (!args.name)
167
+ throw new ServiceNowError('name is required', 'INVALID_REQUEST');
168
+ const resp = await client.queryRecords({
169
+ table: 'sys_properties',
170
+ query: `name=${args.name}`,
171
+ limit: 1,
172
+ fields: 'sys_id,name,value,description,type,category,private,read_roles,write_roles,sys_updated_on,sys_updated_by',
173
+ });
174
+ if (resp.count === 0)
175
+ return { found: false, name: args.name };
176
+ return { found: true, ...resp.records[0] };
177
+ }
178
+ case 'set_system_property': {
179
+ if (!args.name || args.value === undefined)
180
+ throw new ServiceNowError('name and value are required', 'INVALID_REQUEST');
181
+ requireWrite();
182
+ // Check if exists
183
+ const existing = await client.queryRecords({ table: 'sys_properties', query: `name=${args.name}`, limit: 1, fields: 'sys_id,value' });
184
+ if (existing.count > 0) {
185
+ const sysId = String(existing.records[0].sys_id);
186
+ const payload = { value: args.value };
187
+ if (args.description)
188
+ payload.description = args.description;
189
+ if (args.type)
190
+ payload.type = args.type;
191
+ const result = await client.updateRecord('sys_properties', sysId, payload);
192
+ return { action: 'updated', name: args.name, previous_value: existing.records[0].value, new_value: args.value, ...result };
193
+ }
194
+ else {
195
+ const payload = { name: args.name, value: args.value };
196
+ if (args.description)
197
+ payload.description = args.description;
198
+ if (args.type)
199
+ payload.type = args.type;
200
+ const result = await client.createRecord('sys_properties', payload);
201
+ return { action: 'created', name: args.name, value: args.value, ...result };
202
+ }
203
+ }
204
+ case 'list_system_properties': {
205
+ let query = '';
206
+ if (args.category)
207
+ query = `category=${args.category}`;
208
+ if (args.type)
209
+ query = query ? `${query}^type=${args.type}` : `type=${args.type}`;
210
+ if (args.query)
211
+ query = query ? `${query}^${args.query}` : args.query;
212
+ const resp = await client.queryRecords({
213
+ table: 'sys_properties',
214
+ query: query || undefined,
215
+ limit: args.limit || 50,
216
+ fields: 'sys_id,name,value,description,type,category,sys_updated_on',
217
+ });
218
+ return { count: resp.count, properties: resp.records };
219
+ }
220
+ case 'delete_system_property': {
221
+ if (!args.name)
222
+ throw new ServiceNowError('name is required', 'INVALID_REQUEST');
223
+ requireWrite();
224
+ const existing = await client.queryRecords({ table: 'sys_properties', query: `name=${args.name}`, limit: 1, fields: 'sys_id,value' });
225
+ if (existing.count === 0)
226
+ return { deleted: false, name: args.name, message: 'Property not found' };
227
+ const sysId = String(existing.records[0].sys_id);
228
+ await client.deleteRecord('sys_properties', sysId);
229
+ return { deleted: true, name: args.name, previous_value: existing.records[0].value };
230
+ }
231
+ case 'search_system_properties': {
232
+ if (!args.search)
233
+ throw new ServiceNowError('search is required', 'INVALID_REQUEST');
234
+ const q = `nameLIKE${args.search}^ORvalueLIKE${args.search}^ORdescriptionLIKE${args.search}`;
235
+ const resp = await client.queryRecords({
236
+ table: 'sys_properties',
237
+ query: q,
238
+ limit: args.limit || 20,
239
+ fields: 'sys_id,name,value,description,type,category',
240
+ });
241
+ return { count: resp.count, results: resp.records };
242
+ }
243
+ case 'bulk_get_properties': {
244
+ if (!args.names || !Array.isArray(args.names) || args.names.length === 0) {
245
+ throw new ServiceNowError('names array is required', 'INVALID_REQUEST');
246
+ }
247
+ const nameIn = args.names.join(',');
248
+ const resp = await client.queryRecords({
249
+ table: 'sys_properties',
250
+ query: `nameIN${nameIn}`,
251
+ limit: args.names.length + 10,
252
+ fields: 'name,value,type,category',
253
+ });
254
+ const result = {};
255
+ for (const rec of resp.records) {
256
+ result[String(rec.name)] = String(rec.value ?? '');
257
+ }
258
+ // Mark requested names that were not found
259
+ const notFound = args.names.filter((n) => !(n in result));
260
+ return { properties: result, not_found: notFound, found_count: resp.count };
261
+ }
262
+ case 'bulk_set_properties': {
263
+ if (!args.properties || !Array.isArray(args.properties)) {
264
+ throw new ServiceNowError('properties array is required', 'INVALID_REQUEST');
265
+ }
266
+ requireWrite();
267
+ const results = [];
268
+ for (const prop of args.properties) {
269
+ const existing = await client.queryRecords({ table: 'sys_properties', query: `name=${prop.name}`, limit: 1, fields: 'sys_id,value' });
270
+ if (existing.count > 0) {
271
+ const sysId = String(existing.records[0].sys_id);
272
+ await client.updateRecord('sys_properties', sysId, { value: prop.value, ...(prop.description ? { description: prop.description } : {}) });
273
+ results.push({ name: prop.name, action: 'updated', previous_value: existing.records[0].value });
274
+ }
275
+ else {
276
+ await client.createRecord('sys_properties', { name: prop.name, value: prop.value, ...(prop.description ? { description: prop.description } : {}) });
277
+ results.push({ name: prop.name, action: 'created' });
278
+ }
279
+ }
280
+ return { processed: results.length, results };
281
+ }
282
+ case 'export_properties': {
283
+ let query = '';
284
+ if (args.category)
285
+ query = `category=${args.category}`;
286
+ if (args.query)
287
+ query = query ? `${query}^${args.query}` : args.query;
288
+ const resp = await client.queryRecords({
289
+ table: 'sys_properties',
290
+ query: query || undefined,
291
+ limit: 500,
292
+ fields: 'name,value,type,description,category',
293
+ });
294
+ const exported = {};
295
+ for (const rec of resp.records) {
296
+ exported[String(rec.name)] = String(rec.value ?? '');
297
+ }
298
+ return { count: resp.count, properties: exported };
299
+ }
300
+ case 'import_properties': {
301
+ if (!args.properties || typeof args.properties !== 'object') {
302
+ throw new ServiceNowError('properties object is required', 'INVALID_REQUEST');
303
+ }
304
+ if (!args.dry_run)
305
+ requireWrite();
306
+ const entries = Object.entries(args.properties);
307
+ const changes = [];
308
+ for (const [propName, propValue] of entries) {
309
+ const existing = await client.queryRecords({ table: 'sys_properties', query: `name=${propName}`, limit: 1, fields: 'sys_id,value' });
310
+ if (existing.count > 0) {
311
+ if (!args.dry_run) {
312
+ await client.updateRecord('sys_properties', String(existing.records[0].sys_id), { value: String(propValue) });
313
+ }
314
+ changes.push({ name: propName, action: 'update', previous_value: existing.records[0].value, new_value: propValue });
315
+ }
316
+ else {
317
+ if (!args.dry_run) {
318
+ await client.createRecord('sys_properties', { name: propName, value: String(propValue) });
319
+ }
320
+ changes.push({ name: propName, action: 'create', value: propValue });
321
+ }
322
+ }
323
+ return { dry_run: !!args.dry_run, count: changes.length, changes };
324
+ }
325
+ case 'validate_property': {
326
+ if (!args.name || args.value === undefined)
327
+ throw new ServiceNowError('name and value are required', 'INVALID_REQUEST');
328
+ const resp = await client.queryRecords({ table: 'sys_properties', query: `name=${args.name}`, limit: 1, fields: 'name,type,value' });
329
+ if (resp.count === 0)
330
+ return { name: args.name, exists: false, validation: 'Property does not exist (would be created as new)' };
331
+ const prop = resp.records[0];
332
+ const propType = String(prop.type || 'string');
333
+ let valid = true;
334
+ let message = 'Valid';
335
+ if (propType === 'integer' && isNaN(Number(args.value))) {
336
+ valid = false;
337
+ message = `Expected integer, got "${args.value}"`;
338
+ }
339
+ if (propType === 'boolean' && !['true', 'false'].includes(String(args.value).toLowerCase())) {
340
+ valid = false;
341
+ message = `Expected boolean (true/false), got "${args.value}"`;
342
+ }
343
+ return { name: args.name, type: propType, current_value: prop.value, proposed_value: args.value, valid, message };
344
+ }
345
+ case 'list_property_categories': {
346
+ const resp = await client.queryRecords({ table: 'sys_properties', limit: 2000, fields: 'category' });
347
+ const counts = {};
348
+ for (const rec of resp.records) {
349
+ const cat = String(rec.category || '(uncategorised)');
350
+ counts[cat] = (counts[cat] || 0) + 1;
351
+ }
352
+ const categories = Object.entries(counts)
353
+ .sort((a, b) => b[1] - a[1])
354
+ .map(([category, count]) => ({ category, count }));
355
+ return { total_categories: categories.length, categories };
356
+ }
357
+ case 'get_property_history': {
358
+ if (!args.name)
359
+ throw new ServiceNowError('name is required', 'INVALID_REQUEST');
360
+ const resp = await client.queryRecords({
361
+ table: 'sys_audit',
362
+ query: `tablename=sys_properties^fieldname=value^documentkey.name=${args.name}`,
363
+ limit: args.limit || 20,
364
+ fields: 'sys_created_on,sys_created_by,oldvalue,newvalue,reason',
365
+ });
366
+ return { name: args.name, count: resp.count, history: resp.records };
367
+ }
368
+ default:
369
+ return null;
370
+ }
371
+ }
372
+ //# sourceMappingURL=sys-properties.js.map