nowaikit 2.5.1

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 (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.cjs +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