nowaikit 4.1.5 → 4.4.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.
- package/README.md +4 -3
- package/dist/embed.d.ts +37 -0
- package/dist/embed.d.ts.map +1 -0
- package/dist/embed.js +75 -0
- package/dist/embed.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +52 -2
- package/dist/server.js.map +1 -1
- package/dist/servicenow/client.d.ts +13 -0
- package/dist/servicenow/client.d.ts.map +1 -1
- package/dist/servicenow/client.js +52 -1
- package/dist/servicenow/client.js.map +1 -1
- package/dist/servicenow/instances.d.ts.map +1 -1
- package/dist/servicenow/instances.js +20 -0
- package/dist/servicenow/instances.js.map +1 -1
- package/dist/tools/blast-radius.d.ts +75 -0
- package/dist/tools/blast-radius.d.ts.map +1 -0
- package/dist/tools/blast-radius.js +185 -0
- package/dist/tools/blast-radius.js.map +1 -0
- package/dist/tools/catalog.d.ts.map +1 -1
- package/dist/tools/catalog.js +20 -3
- package/dist/tools/catalog.js.map +1 -1
- package/dist/tools/core.js +2 -2
- package/dist/tools/core.js.map +1 -1
- package/dist/tools/docs.d.ts +51 -0
- package/dist/tools/docs.d.ts.map +1 -0
- package/dist/tools/docs.js +274 -0
- package/dist/tools/docs.js.map +1 -0
- package/dist/tools/index.d.ts +188 -796
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +23 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/knowledge.d.ts.map +1 -1
- package/dist/tools/knowledge.js +9 -3
- package/dist/tools/knowledge.js.map +1 -1
- package/dist/tools/local-sync.d.ts +55 -0
- package/dist/tools/local-sync.d.ts.map +1 -0
- package/dist/tools/local-sync.js +210 -0
- package/dist/tools/local-sync.js.map +1 -0
- package/dist/tools/ml.d.ts +1 -1
- package/dist/tools/now-assist.d.ts +11 -145
- package/dist/tools/now-assist.d.ts.map +1 -1
- package/dist/tools/now-assist.js +50 -110
- package/dist/tools/now-assist.js.map +1 -1
- package/dist/tools/reporting.d.ts +55 -17
- package/dist/tools/reporting.d.ts.map +1 -1
- package/dist/tools/reporting.js +24 -15
- package/dist/tools/reporting.js.map +1 -1
- package/dist/tools-manifest.json +250 -95
- package/dist/transport/index.d.ts.map +1 -1
- package/dist/transport/index.js +18 -2
- package/dist/transport/index.js.map +1 -1
- package/dist/utils/permissions.d.ts +10 -5
- package/dist/utils/permissions.d.ts.map +1 -1
- package/dist/utils/permissions.js +43 -20
- package/dist/utils/permissions.js.map +1 -1
- package/dist/utils/request-context.d.ts +28 -0
- package/dist/utils/request-context.d.ts.map +1 -0
- package/dist/utils/request-context.js +49 -0
- package/dist/utils/request-context.js.map +1 -0
- package/package.json +8 -3
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ServiceNow product-documentation tools.
|
|
3
|
+
*
|
|
4
|
+
* NowAIKit already exposes live SDK docs (fluent_explain) and instance Knowledge
|
|
5
|
+
* (search_knowledge). These tools cover the third surface developers reach for:
|
|
6
|
+
* the official ServiceNow product documentation at servicenow.com/docs — API
|
|
7
|
+
* references (GlideRecord, GlideSystem…), admin guides, encoded-query operators,
|
|
8
|
+
* release notes, etc. Lets an AI ground answers in current docs instead of
|
|
9
|
+
* training-data guesses.
|
|
10
|
+
*
|
|
11
|
+
* - search_servicenow_docs : full-text search over servicenow.com/docs
|
|
12
|
+
* - fetch_servicenow_doc : fetch the readable text of a specific docs page
|
|
13
|
+
*
|
|
14
|
+
* Backed by the public Fluid Topics REST API that powers servicenow.com/docs
|
|
15
|
+
* (POST /api/khub/clustered-search + the topic content endpoint). Both tools are
|
|
16
|
+
* read-only, reach only the public docs site (never the customer instance), need
|
|
17
|
+
* no ServiceNow credentials, and require no extra permissions.
|
|
18
|
+
*/
|
|
19
|
+
import { ServiceNowError } from '../utils/errors.js';
|
|
20
|
+
const DOCS_BASE = 'https://www.servicenow.com/docs';
|
|
21
|
+
const UA = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36';
|
|
22
|
+
/** Hosts we are willing to fetch from — keeps fetch_servicenow_doc free of SSRF risk. */
|
|
23
|
+
const ALLOWED_DOC_HOSTS = new Set(['www.servicenow.com', 'servicenow.com', 'docs.servicenow.com']);
|
|
24
|
+
export function getDocsToolDefinitions() {
|
|
25
|
+
return [
|
|
26
|
+
{
|
|
27
|
+
name: 'search_servicenow_docs',
|
|
28
|
+
description: 'Search the official ServiceNow product documentation (servicenow.com/docs) — API references ' +
|
|
29
|
+
'(GlideRecord, GlideSystem, GlideAjax…), admin & developer guides, encoded-query operators, release notes. ' +
|
|
30
|
+
'Returns ranked results with title, breadcrumb, URL, snippet, and a `ref` to read the full page with ' +
|
|
31
|
+
'fetch_servicenow_doc. Use this to ground answers in current ServiceNow docs rather than memory. ' +
|
|
32
|
+
'Read-only; uses the public docs site, not your instance.',
|
|
33
|
+
inputSchema: {
|
|
34
|
+
type: 'object',
|
|
35
|
+
properties: {
|
|
36
|
+
query: {
|
|
37
|
+
type: 'string',
|
|
38
|
+
description: 'What to look up (e.g., "GlideRecord addEncodedQuery", "flow designer rest step", "CSDM 4.0").',
|
|
39
|
+
},
|
|
40
|
+
limit: {
|
|
41
|
+
type: 'number',
|
|
42
|
+
description: 'Max results to return (default 6, max 20).',
|
|
43
|
+
},
|
|
44
|
+
product: {
|
|
45
|
+
type: 'string',
|
|
46
|
+
description: 'Optional product/area to bias the search (e.g., "ITSM", "CMDB", "Flow Designer", "Performance Analytics").',
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
required: ['query'],
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: 'fetch_servicenow_doc',
|
|
54
|
+
description: 'Fetch the full readable text of a specific ServiceNow documentation page. Pass either the `ref` returned by ' +
|
|
55
|
+
'search_servicenow_docs (fastest, exact) or a servicenow.com/docs page URL. Use after search_servicenow_docs ' +
|
|
56
|
+
'to read a result in full. Read-only; only ServiceNow docs are reachable.',
|
|
57
|
+
inputSchema: {
|
|
58
|
+
type: 'object',
|
|
59
|
+
properties: {
|
|
60
|
+
ref: {
|
|
61
|
+
type: 'string',
|
|
62
|
+
description: 'The `ref` from a search_servicenow_docs result (preferred — resolves directly to page content).',
|
|
63
|
+
},
|
|
64
|
+
url: {
|
|
65
|
+
type: 'string',
|
|
66
|
+
description: 'A servicenow.com/docs page URL (used when no ref is available; resolved via docs search).',
|
|
67
|
+
},
|
|
68
|
+
maxChars: {
|
|
69
|
+
type: 'number',
|
|
70
|
+
description: 'Truncate the returned text to this many characters (default 9000, max 30000).',
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
required: [],
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
];
|
|
77
|
+
}
|
|
78
|
+
// ─── HTML / HTTP helpers (dependency-free) ────────────────────────────────────
|
|
79
|
+
const NAMED_ENTITIES = {
|
|
80
|
+
amp: '&', lt: '<', gt: '>', quot: '"', apos: "'", nbsp: ' ', mdash: '—', ndash: '–', hellip: '…',
|
|
81
|
+
};
|
|
82
|
+
function decodeEntities(s) {
|
|
83
|
+
return s.replace(/&(#x?[0-9a-fA-F]+|[a-zA-Z]+);/g, (m, code) => {
|
|
84
|
+
if (code[0] === '#') {
|
|
85
|
+
const num = code[1] === 'x' || code[1] === 'X' ? parseInt(code.slice(2), 16) : parseInt(code.slice(1), 10);
|
|
86
|
+
return Number.isFinite(num) ? String.fromCodePoint(num) : m;
|
|
87
|
+
}
|
|
88
|
+
return NAMED_ENTITIES[code] ?? m;
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
function stripTags(html) {
|
|
92
|
+
return decodeEntities(String(html ?? '').replace(/<[^>]+>/g, ' ')).replace(/[^\S\n]+/g, ' ').trim();
|
|
93
|
+
}
|
|
94
|
+
async function http(path, init) {
|
|
95
|
+
const url = path.startsWith('http') ? path : `${DOCS_BASE}/${path.replace(/^\//, '')}`;
|
|
96
|
+
const controller = new AbortController();
|
|
97
|
+
const timer = setTimeout(() => controller.abort(), init?.timeoutMs ?? 15000);
|
|
98
|
+
try {
|
|
99
|
+
const res = await fetch(url, {
|
|
100
|
+
...init,
|
|
101
|
+
headers: { 'User-Agent': UA, Accept: 'application/json, text/html', ...(init?.headers || {}) },
|
|
102
|
+
signal: controller.signal,
|
|
103
|
+
redirect: 'follow',
|
|
104
|
+
});
|
|
105
|
+
if (!res.ok)
|
|
106
|
+
throw new ServiceNowError(`Documentation request failed (HTTP ${res.status})`, 'DOCS_HTTP_ERROR');
|
|
107
|
+
return res;
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
if (err instanceof ServiceNowError)
|
|
111
|
+
throw err;
|
|
112
|
+
if (err?.name === 'AbortError')
|
|
113
|
+
throw new ServiceNowError('Documentation request timed out', 'DOCS_TIMEOUT');
|
|
114
|
+
throw new ServiceNowError(`Documentation request error: ${err?.message || 'unknown'}`, 'DOCS_FETCH_ERROR');
|
|
115
|
+
}
|
|
116
|
+
finally {
|
|
117
|
+
clearTimeout(timer);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/** POST the Fluid Topics clustered-search and flatten its grouped result entries. */
|
|
121
|
+
async function clusteredSearch(query, perPage) {
|
|
122
|
+
const res = await http('api/khub/clustered-search', {
|
|
123
|
+
method: 'POST',
|
|
124
|
+
headers: { 'Content-Type': 'application/json' },
|
|
125
|
+
body: JSON.stringify({
|
|
126
|
+
query,
|
|
127
|
+
filters: [{ key: 'ft:locale', values: ['en-US'] }],
|
|
128
|
+
paging: { page: 1, perPage },
|
|
129
|
+
}),
|
|
130
|
+
});
|
|
131
|
+
const data = (await res.json());
|
|
132
|
+
const topics = [];
|
|
133
|
+
for (const group of data.results || []) {
|
|
134
|
+
const entry = group.entries?.[0];
|
|
135
|
+
const t = entry?.topic || entry?.map;
|
|
136
|
+
if (t && t.readerUrl)
|
|
137
|
+
topics.push(t);
|
|
138
|
+
}
|
|
139
|
+
return topics;
|
|
140
|
+
}
|
|
141
|
+
function breadcrumbOf(t) {
|
|
142
|
+
if (Array.isArray(t.breadcrumb))
|
|
143
|
+
return t.breadcrumb.map((b) => stripTags(b)).join(' / ');
|
|
144
|
+
if (t.breadcrumb)
|
|
145
|
+
return stripTags(t.breadcrumb);
|
|
146
|
+
return stripTags(t.mapTitle || '');
|
|
147
|
+
}
|
|
148
|
+
/** The page filename (case preserved) — e.g. "c_GlideRecordScopedAPI". */
|
|
149
|
+
function urlFilename(u) {
|
|
150
|
+
try {
|
|
151
|
+
const path = new URL(u).pathname.replace(/\.html?$/i, '');
|
|
152
|
+
return path.split('/').filter(Boolean).pop() || '';
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return '';
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/** Lowercased filename so two reader URLs for the same page compare equal. */
|
|
159
|
+
function urlSlug(u) {
|
|
160
|
+
return urlFilename(u).toLowerCase();
|
|
161
|
+
}
|
|
162
|
+
/** Turn a docs filename slug into a natural-language query the search index matches.
|
|
163
|
+
* e.g. "c_GlideRecordScopedAPI" -> "GlideRecord Scoped API" */
|
|
164
|
+
function humanizeSlug(slug) {
|
|
165
|
+
return slug
|
|
166
|
+
.replace(/^(c|t|r|concept|task|reference)[_-]/i, '')
|
|
167
|
+
.replace(/[_-]+/g, ' ')
|
|
168
|
+
.replace(/([a-z0-9])([A-Z])/g, '$1 $2')
|
|
169
|
+
.replace(/\s+/g, ' ')
|
|
170
|
+
.trim();
|
|
171
|
+
}
|
|
172
|
+
// ─── Execution ────────────────────────────────────────────────────────────────
|
|
173
|
+
export async function executeDocsToolCall(name, args) {
|
|
174
|
+
switch (name) {
|
|
175
|
+
case 'search_servicenow_docs': {
|
|
176
|
+
const query = (args.query || '').toString().trim();
|
|
177
|
+
if (!query)
|
|
178
|
+
throw new ServiceNowError('query is required', 'INVALID_REQUEST');
|
|
179
|
+
const limit = Math.min(Math.max(Number(args.limit) || 6, 1), 20);
|
|
180
|
+
const product = (args.product || '').toString().trim();
|
|
181
|
+
const terms = `${product ? product + ' ' : ''}${query}`.trim();
|
|
182
|
+
const topics = await clusteredSearch(terms, limit);
|
|
183
|
+
const results = topics.map((t) => ({
|
|
184
|
+
title: stripTags(t.htmlTitle || t.title || ''),
|
|
185
|
+
breadcrumb: breadcrumbOf(t),
|
|
186
|
+
url: t.readerUrl,
|
|
187
|
+
snippet: stripTags(t.htmlExcerpt || ''),
|
|
188
|
+
ref: t.mapId && t.contentId ? `${t.mapId}/${t.contentId}` : undefined,
|
|
189
|
+
}));
|
|
190
|
+
if (results.length === 0) {
|
|
191
|
+
return {
|
|
192
|
+
query: terms,
|
|
193
|
+
results: [],
|
|
194
|
+
note: `No documentation results found. Try broader terms or a specific API name, or browse https://www.servicenow.com/docs and search for "${terms}".`,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
return {
|
|
198
|
+
query: terms,
|
|
199
|
+
count: results.length,
|
|
200
|
+
results,
|
|
201
|
+
hint: 'Call fetch_servicenow_doc with a result `ref` (or `url`) to read the full page.',
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
case 'fetch_servicenow_doc': {
|
|
205
|
+
let ref = (args.ref || '').toString().trim();
|
|
206
|
+
const url = (args.url || '').toString().trim();
|
|
207
|
+
if (!ref && !url)
|
|
208
|
+
throw new ServiceNowError('Provide a `ref` (from search) or a docs `url`', 'INVALID_REQUEST');
|
|
209
|
+
const maxChars = Math.min(Math.max(Number(args.maxChars) || 9000, 500), 30000);
|
|
210
|
+
// Resolve a URL to a content ref when no ref was supplied.
|
|
211
|
+
let resolvedUrl = url || undefined;
|
|
212
|
+
if (!ref && url) {
|
|
213
|
+
let parsed;
|
|
214
|
+
try {
|
|
215
|
+
parsed = new URL(url);
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
throw new ServiceNowError('Invalid url', 'INVALID_REQUEST');
|
|
219
|
+
}
|
|
220
|
+
if (parsed.protocol !== 'https:' || !ALLOWED_DOC_HOSTS.has(parsed.hostname)) {
|
|
221
|
+
throw new ServiceNowError(`Only https servicenow.com/docs URLs are allowed (${[...ALLOWED_DOC_HOSTS].join(', ')}).`, 'DOCS_HOST_NOT_ALLOWED');
|
|
222
|
+
}
|
|
223
|
+
const slug = urlSlug(url);
|
|
224
|
+
const matches = await clusteredSearch(humanizeSlug(urlFilename(url)) || slug, 20);
|
|
225
|
+
const hit = matches.find((m) => m.mapId && m.contentId && urlSlug(m.readerUrl || '') === slug) ||
|
|
226
|
+
matches.find((m) => m.mapId && m.contentId && (m.readerUrl || '').endsWith(parsed.pathname));
|
|
227
|
+
if (!hit || !hit.mapId || !hit.contentId) {
|
|
228
|
+
// Docs search ranking is fuzzy, so an exact URL match isn't guaranteed.
|
|
229
|
+
// Return close candidates (each with a reliable `ref`) instead of failing —
|
|
230
|
+
// the caller can re-call with the right ref.
|
|
231
|
+
return {
|
|
232
|
+
resolved: false,
|
|
233
|
+
requestedUrl: url,
|
|
234
|
+
note: 'Could not match that exact URL. Re-call fetch_servicenow_doc with one of these `ref` values, or use search_servicenow_docs.',
|
|
235
|
+
candidates: matches
|
|
236
|
+
.filter((m) => m.mapId && m.contentId)
|
|
237
|
+
.slice(0, 6)
|
|
238
|
+
.map((m) => ({
|
|
239
|
+
title: stripTags(m.htmlTitle || m.title || ''),
|
|
240
|
+
url: m.readerUrl,
|
|
241
|
+
ref: `${m.mapId}/${m.contentId}`,
|
|
242
|
+
})),
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
ref = `${hit.mapId}/${hit.contentId}`;
|
|
246
|
+
resolvedUrl = hit.readerUrl;
|
|
247
|
+
}
|
|
248
|
+
const [mapId, contentId] = ref.split('/');
|
|
249
|
+
if (!mapId || !contentId) {
|
|
250
|
+
throw new ServiceNowError('Invalid `ref` — expected "<mapId>/<contentId>" from a search result.', 'INVALID_REQUEST');
|
|
251
|
+
}
|
|
252
|
+
const res = await http(`api/khub/maps/${encodeURIComponent(mapId)}/topics/${encodeURIComponent(contentId)}/content`);
|
|
253
|
+
const html = await res.text();
|
|
254
|
+
const bodyMatch = html.match(/<(?:article|main)\b[^>]*>([\s\S]*?)<\/(?:article|main)>/i);
|
|
255
|
+
const titleMatch = html.match(/<h1\b[^>]*>([\s\S]*?)<\/h1>/i);
|
|
256
|
+
const raw = (bodyMatch ? bodyMatch[1] : html)
|
|
257
|
+
.replace(/<script\b[\s\S]*?<\/script>/gi, ' ')
|
|
258
|
+
.replace(/<style\b[\s\S]*?<\/style>/gi, ' ');
|
|
259
|
+
let text = stripTags(raw).replace(/[^\S\n]*\n[^\S\n]*\n+/g, '\n\n');
|
|
260
|
+
const truncated = text.length > maxChars;
|
|
261
|
+
if (truncated)
|
|
262
|
+
text = text.slice(0, maxChars);
|
|
263
|
+
return {
|
|
264
|
+
url: resolvedUrl,
|
|
265
|
+
title: titleMatch ? stripTags(titleMatch[1]) : undefined,
|
|
266
|
+
truncated,
|
|
267
|
+
content: text,
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
default:
|
|
271
|
+
return null;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=docs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/tools/docs.ts"],"names":[],"mappings":"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"}
|