nowaikit 4.12.1 → 4.15.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.
- package/README.md +12 -5
- package/dist/cli/auth.d.ts +13 -0
- package/dist/cli/auth.d.ts.map +1 -1
- package/dist/cli/auth.js +257 -54
- package/dist/cli/auth.js.map +1 -1
- package/dist/cli/detect-clients.d.ts.map +1 -1
- package/dist/cli/detect-clients.js +78 -2
- package/dist/cli/detect-clients.js.map +1 -1
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +243 -45
- package/dist/cli/setup.js.map +1 -1
- package/dist/servicenow/client.d.ts +49 -1
- package/dist/servicenow/client.d.ts.map +1 -1
- package/dist/servicenow/client.js +346 -40
- package/dist/servicenow/client.js.map +1 -1
- package/dist/servicenow/instances.d.ts.map +1 -1
- package/dist/servicenow/instances.js +56 -4
- package/dist/servicenow/instances.js.map +1 -1
- package/dist/servicenow/types.d.ts +17 -0
- package/dist/servicenow/types.d.ts.map +1 -1
- package/dist/tools/app-studio.d.ts.map +1 -1
- package/dist/tools/app-studio.js +80 -9
- package/dist/tools/app-studio.js.map +1 -1
- package/dist/tools/change.d.ts.map +1 -1
- package/dist/tools/change.js +3 -1
- package/dist/tools/change.js.map +1 -1
- package/dist/tools/core.d.ts.map +1 -1
- package/dist/tools/core.js +28 -2
- package/dist/tools/core.js.map +1 -1
- package/dist/tools/decision.d.ts.map +1 -1
- package/dist/tools/decision.js +19 -0
- package/dist/tools/decision.js.map +1 -1
- package/dist/tools/incident.d.ts.map +1 -1
- package/dist/tools/incident.js +5 -3
- package/dist/tools/incident.js.map +1 -1
- package/dist/tools/index.d.ts +159 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +2 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/knowledge.d.ts.map +1 -1
- package/dist/tools/knowledge.js +12 -1
- package/dist/tools/knowledge.js.map +1 -1
- package/dist/tools/notification.d.ts +169 -0
- package/dist/tools/notification.d.ts.map +1 -1
- package/dist/tools/notification.js +88 -9
- package/dist/tools/notification.js.map +1 -1
- package/dist/tools/problem.d.ts.map +1 -1
- package/dist/tools/problem.js +3 -1
- package/dist/tools/problem.js.map +1 -1
- package/dist/tools/updateset.d.ts.map +1 -1
- package/dist/tools/updateset.js +62 -38
- package/dist/tools/updateset.js.map +1 -1
- package/dist/tools-manifest.json +98 -11
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect-clients.js","sourceRoot":"","sources":["../../src/cli/detect-clients.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAkBzC,SAAS,KAAK,CAAC,GAAW;IACxB,IAAI,CAAC;QACH,0CAA0C;QAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC;QAC3E,QAAQ,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,OAAe,EAAE,MAAc,EAAE,QAAgB;IAClE,MAAM,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;IAC3B,IAAI,CAAC,KAAK,QAAQ;QAAE,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC;IAC/C,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC;QAClB,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QACvD,OAAO,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,KAAK,CAAC,QAAQ,CAAC,CAAC;AACzB,CAAC;AAED;;;;GAIG;AACH,SAAS,qBAAqB,CAAC,UAAkB;IAC/C,MAAM,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;IAC3B,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3E,IAAI,CAAC,KAAK,QAAQ;QAAE,OAAO,UAAU,CAAC,0BAA0B,CAAC,CAAC;IAClE,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC;QAClB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAC9C,MAAM,UAAU,GAAG;YACjB,IAAI,CAAC,GAAG,EAAE,iBAAiB,EAAE,YAAY,CAAC;YAC1C,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,CAAC;YAC7C,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,iBAAiB,EAAE,YAAY,CAAC;SACvD,CAAC;QACF,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1D,gFAAgF;QAChF,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;YAC1C,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC;QACrF,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;;GAMG;AACH,SAAS,qBAAqB;IAC5B,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IAC9C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACvC,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;QACnC,wEAAwE;QACxE,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/F,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC3E,+EAA+E;QAC/E,IAAI,UAAU,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;YAC5D,OAAO,IAAI,CAAC,SAAS,EAAE,4BAA4B,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACxB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;IAC3B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAC3E,mFAAmF;IACnF,MAAM,mBAAmB,GACvB,CAAC,KAAK,OAAO;QACX,CAAC,CAAC,qBAAqB,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,4BAA4B,CAAC;QAClF,CAAC,CAAC,CAAC,KAAK,QAAQ;YAChB,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,qBAAqB,EAAE,QAAQ,EAAE,4BAA4B,CAAC;YACtF,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,4BAA4B,CAAC,CAAC;IAEpE,MAAM,OAAO,GAAqB;QAChC;YACE,EAAE,EAAE,gBAAgB;YACpB,IAAI,EAAE,gBAAgB;YACtB,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,mBAAmB;YAC/B,SAAS,EAAE,YAAY;YACvB,WAAW,EAAE,iBAAiB;YAC9B,eAAe,EAAE,IAAI;YACrB,IAAI,EAAE,kGAAkG;SACzG;QACD;YACE,EAAE,EAAE,QAAQ;YACZ,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,KAAK;YACf,2EAA2E;YAC3E,2DAA2D;YAC3D,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC;YAC7C,SAAS,EAAE,YAAY;YACvB,WAAW,EAAE,iBAAiB;YAC9B,eAAe,EAAE,IAAI;YACrB,IAAI,EAAE,sEAAsE;SAC7E;QACD;YACE,EAAE,EAAE,QAAQ;YACZ,IAAI,EAAE,0BAA0B;YAChC,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"detect-clients.js","sourceRoot":"","sources":["../../src/cli/detect-clients.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/setup.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"AA8fA,wBAAsB,QAAQ,CAAC,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAs2B7E"}
|
package/dist/cli/setup.js
CHANGED
|
@@ -346,6 +346,125 @@ async function fetchOpenAIModels(apiKey) {
|
|
|
346
346
|
return [];
|
|
347
347
|
}
|
|
348
348
|
}
|
|
349
|
+
/**
|
|
350
|
+
* Print the exact steps to register the NowAIKit OAuth app on the instance. For the CLI the redirect
|
|
351
|
+
* is the local loopback the login listens on; the gateway path uses one HTTPS redirect instead
|
|
352
|
+
* (see AUTH-MODES.md). Kept as concrete, do-able steps so setup never assumes an app that isn't there.
|
|
353
|
+
*/
|
|
354
|
+
function printOAuthAppSteps(instanceUrl) {
|
|
355
|
+
console.log('');
|
|
356
|
+
box([
|
|
357
|
+
accent('Create an OAuth app (one time, ~2 minutes)'),
|
|
358
|
+
dim('Any OAuth app works — it does not have to be a NowAIKit one.'),
|
|
359
|
+
], accent);
|
|
360
|
+
console.log('');
|
|
361
|
+
console.log(' ' + brand('1.') + ' Open ' + accent(`${instanceUrl}/nav_to.do?uri=oauth_entity_list.do`));
|
|
362
|
+
console.log(' ' + dim('System OAuth > Application Registry'));
|
|
363
|
+
console.log(' ' + brand('2.') + ' New > ' + accent('Create an OAuth API endpoint for external clients'));
|
|
364
|
+
console.log(' ' + brand('3.') + ' Name: ' + accent('NowAIKit') + dim(' (any name) Grant type: ') + accent('Authorization Code'));
|
|
365
|
+
console.log(' ' + brand('4.') + ' Redirect URL: ' + accent('http://localhost:8765/callback'));
|
|
366
|
+
console.log(' ' + dim('(this is the CLI loopback; the gateway path uses its own https callback)'));
|
|
367
|
+
console.log(' ' + brand('5.') + ' Save, then open the record and copy the ' + accent('Client ID') + ' and ' + accent('Client Secret') + '.');
|
|
368
|
+
console.log('');
|
|
369
|
+
console.log(' ' + dim('Already have an OAuth app? Just add the redirect URL above to it and reuse its Client ID / Secret.'));
|
|
370
|
+
console.log('');
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Look for an OAuth app already registered on the instance for the CLI loopback, so the user does not
|
|
374
|
+
* have to know whether an admin created one. Returns the app if found, 'forbidden' when the account
|
|
375
|
+
* cannot read oauth_entity (i.e. not an admin, so we cannot detect), or null when none exists.
|
|
376
|
+
* oauth_entity is admin-only, so this only detects for privileged accounts — regular users cannot.
|
|
377
|
+
*/
|
|
378
|
+
async function findExistingOAuthApp(instanceUrl, user, pass) {
|
|
379
|
+
const authz = 'Basic ' + Buffer.from(`${user}:${pass}`).toString('base64');
|
|
380
|
+
const q = encodeURIComponent('type=client^active=true^redirect_urlLIKElocalhost:8765');
|
|
381
|
+
const resp = await fetch(`${instanceUrl}/api/now/table/oauth_entity?sysparm_query=${q}&sysparm_fields=client_id,client_secret&sysparm_limit=1`, { headers: { Authorization: authz, Accept: 'application/json' } });
|
|
382
|
+
if (resp.status === 401)
|
|
383
|
+
throw new Error('Sign-in failed (401). Check the username and password.');
|
|
384
|
+
if (resp.status === 403)
|
|
385
|
+
return 'forbidden';
|
|
386
|
+
if (!resp.ok)
|
|
387
|
+
return null;
|
|
388
|
+
const data = await resp.json();
|
|
389
|
+
const r = data.result?.[0];
|
|
390
|
+
if (!r || !r.client_id)
|
|
391
|
+
return null;
|
|
392
|
+
return { clientId: r.client_id, clientSecret: r.client_secret || '' };
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Auto-provision an OAuth app on the instance via the Table API so the customer never opens the OAuth
|
|
396
|
+
* UI. Needs a one-time admin sign-in. Creates an Authorization Code client with the redirect pre-set,
|
|
397
|
+
* then reads back the generated client id/secret. Throws a readable reason (bad login, missing role,
|
|
398
|
+
* masked secret) so the caller can fall back to the manual steps.
|
|
399
|
+
*/
|
|
400
|
+
/**
|
|
401
|
+
* Detect whether the instance supports modern OAuth (public client + PKCE, and CIMD) by probing the
|
|
402
|
+
* dictionary for the oauth_entity fields present on Australia+ releases. Returns all-false on any error
|
|
403
|
+
* so setup safely uses the older confidential-client path on instances that predate this.
|
|
404
|
+
*/
|
|
405
|
+
async function detectModernOAuth(instanceUrl, user, pass) {
|
|
406
|
+
const authz = 'Basic ' + Buffer.from(`${user}:${pass}`).toString('base64');
|
|
407
|
+
try {
|
|
408
|
+
const q = encodeURIComponent('name=oauth_entity^elementINuse_pkce,public_client,auth_cimd_client');
|
|
409
|
+
const resp = await fetch(`${instanceUrl}/api/now/table/sys_dictionary?sysparm_query=${q}&sysparm_fields=element&sysparm_limit=5`, { headers: { Authorization: authz, Accept: 'application/json' } });
|
|
410
|
+
if (!resp.ok)
|
|
411
|
+
return { publicPkce: false, cimd: false };
|
|
412
|
+
const data = await resp.json();
|
|
413
|
+
const els = new Set((data.result || []).map(r => r.element));
|
|
414
|
+
return { publicPkce: els.has('use_pkce') && els.has('public_client'), cimd: els.has('auth_cimd_client') };
|
|
415
|
+
}
|
|
416
|
+
catch {
|
|
417
|
+
return { publicPkce: false, cimd: false };
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
async function provisionOAuthApp(instanceUrl, adminUser, adminPass, redirectUrl, opts = {}) {
|
|
421
|
+
const authz = 'Basic ' + Buffer.from(`${adminUser}:${adminPass}`).toString('base64');
|
|
422
|
+
// On instances with modern OAuth (public client + PKCE), create a PUBLIC client with no secret. That
|
|
423
|
+
// removes the masked-secret readback problem entirely and matches how CIMD/MCP clients authenticate.
|
|
424
|
+
const body = {
|
|
425
|
+
name: 'NowAIKit',
|
|
426
|
+
type: 'client',
|
|
427
|
+
active: 'true',
|
|
428
|
+
default_grant_type: 'authorization_code',
|
|
429
|
+
redirect_url: redirectUrl,
|
|
430
|
+
access_token_lifespan: '1800',
|
|
431
|
+
refresh_token_lifespan: '8640000',
|
|
432
|
+
};
|
|
433
|
+
if (opts.publicPkce) {
|
|
434
|
+
body.public_client = 'true';
|
|
435
|
+
body.use_pkce = 'true';
|
|
436
|
+
}
|
|
437
|
+
const resp = await fetch(`${instanceUrl}/api/now/table/oauth_entity?sysparm_fields=sys_id,client_id,client_secret`, {
|
|
438
|
+
method: 'POST',
|
|
439
|
+
headers: { Authorization: authz, 'Content-Type': 'application/json', Accept: 'application/json' },
|
|
440
|
+
body: JSON.stringify(body),
|
|
441
|
+
});
|
|
442
|
+
if (resp.status === 401)
|
|
443
|
+
throw new Error('Admin sign-in failed (401). Check the username and password.');
|
|
444
|
+
if (resp.status === 403)
|
|
445
|
+
throw new Error('This account cannot create OAuth apps (403). It needs admin with security_admin elevation.');
|
|
446
|
+
if (!resp.ok)
|
|
447
|
+
throw new Error(`Could not create the OAuth app: ${resp.status} ${resp.statusText}`);
|
|
448
|
+
const data = await resp.json();
|
|
449
|
+
const clientId = data.result?.client_id || '';
|
|
450
|
+
let clientSecret = data.result?.client_secret || '';
|
|
451
|
+
if (!clientId)
|
|
452
|
+
throw new Error('The instance did not return a client id for the new app.');
|
|
453
|
+
// Public + PKCE client: no secret needed, the CLI login uses PKCE.
|
|
454
|
+
if (opts.publicPkce)
|
|
455
|
+
return { clientId, clientSecret: '' };
|
|
456
|
+
// Confidential client: some instances mask client_secret in the create response; re-read it by sys_id.
|
|
457
|
+
if (!clientSecret && data.result?.sys_id) {
|
|
458
|
+
const re = await fetch(`${instanceUrl}/api/now/table/oauth_entity/${data.result.sys_id}?sysparm_fields=client_secret`, { headers: { Authorization: authz, Accept: 'application/json' } });
|
|
459
|
+
if (re.ok) {
|
|
460
|
+
const d = await re.json();
|
|
461
|
+
clientSecret = d.result?.client_secret || '';
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
if (!clientSecret)
|
|
465
|
+
throw new Error('Created the app but could not read its client secret. Open the record and copy it, then re-run and paste it.');
|
|
466
|
+
return { clientId, clientSecret };
|
|
467
|
+
}
|
|
349
468
|
// ═══════════════════════════════════════════════════════════════════════════════
|
|
350
469
|
// MAIN SETUP FLOW
|
|
351
470
|
// ═══════════════════════════════════════════════════════════════════════════════
|
|
@@ -479,7 +598,7 @@ export async function runSetup(options = {}) {
|
|
|
479
598
|
step(2, 'Authentication');
|
|
480
599
|
sectionLabel('Choose how to authenticate with ServiceNow');
|
|
481
600
|
console.log('');
|
|
482
|
-
|
|
601
|
+
let authMethod = await select({
|
|
483
602
|
message: brand('?') + ' Auth method' + brand(':'),
|
|
484
603
|
choices: [
|
|
485
604
|
{ name: `${brand('🔑')} Basic ${dim('(username + password) — good for dev/PDI')}`, value: 'basic' },
|
|
@@ -509,6 +628,9 @@ export async function runSetup(options = {}) {
|
|
|
509
628
|
let userPassword;
|
|
510
629
|
let clientId;
|
|
511
630
|
let clientSecret;
|
|
631
|
+
// True once we've already made a successful authenticated call during OAuth setup (provisioning or
|
|
632
|
+
// reading an existing app), so the separate "Testing Connection" step is redundant and can be skipped.
|
|
633
|
+
let connectionVerified = false;
|
|
512
634
|
if (authMode === 'per-user') {
|
|
513
635
|
box([
|
|
514
636
|
warn('Per-user mode selected'),
|
|
@@ -522,21 +644,122 @@ export async function runSetup(options = {}) {
|
|
|
522
644
|
userPassword = await password({ message: brand('?') + ' Password' + brand(':'), mask: '•' });
|
|
523
645
|
}
|
|
524
646
|
else {
|
|
525
|
-
sectionLabel('OAuth 2.0
|
|
526
|
-
console.log('');
|
|
527
|
-
clientId = await input({ message: brand('?') + ' Client ID' + brand(':') });
|
|
528
|
-
clientSecret = await password({ message: brand('?') + ' Client Secret' + brand(':'), mask: '•' });
|
|
647
|
+
sectionLabel('OAuth 2.0 sign-in');
|
|
648
|
+
console.log(' ' + dim('NowAIKit checks the instance for an OAuth app, so you do not have to know if one exists.'));
|
|
529
649
|
console.log('');
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
650
|
+
// Detection-first: sign in once, then look for an existing app. This sign-in doubles as the
|
|
651
|
+
// setup connection-test account and, if the account is an admin, is used to create the app.
|
|
652
|
+
const signInUser = await input({ message: brand('?') + ' ServiceNow username' + brand(':') });
|
|
653
|
+
const signInPass = await password({ message: brand('?') + ' ServiceNow password' + brand(':'), mask: '•' });
|
|
654
|
+
// Detect modern OAuth (public client + PKCE, CIMD) so we can provision a secret-less client where
|
|
655
|
+
// supported, and point the customer at the zero-registration CIMD path on newer releases.
|
|
656
|
+
const caps = await detectModernOAuth(instanceUrl, signInUser, signInPass);
|
|
657
|
+
if (caps.cimd) {
|
|
658
|
+
console.log(' ' + dim('This instance supports CIMD (zero-registration OAuth). See OAUTH-ARCHITECTURE.md for the gateway path.'));
|
|
659
|
+
}
|
|
660
|
+
const detect = ora(' Checking the instance for an OAuth app…').start();
|
|
661
|
+
let found = null;
|
|
662
|
+
try {
|
|
663
|
+
found = await findExistingOAuthApp(instanceUrl, signInUser, signInPass);
|
|
664
|
+
}
|
|
665
|
+
catch (e) {
|
|
666
|
+
detect.fail(err(' ' + (e instanceof Error ? e.message : String(e))));
|
|
667
|
+
}
|
|
668
|
+
if (found && found !== 'forbidden' && found.clientId) {
|
|
669
|
+
clientId = found.clientId;
|
|
670
|
+
clientSecret = found.clientSecret;
|
|
671
|
+
username = signInUser;
|
|
672
|
+
userPassword = signInPass;
|
|
673
|
+
connectionVerified = true; // findExistingOAuthApp already made an authenticated call with these creds
|
|
674
|
+
if (clientSecret) {
|
|
675
|
+
detect.succeed(success(' Found an existing OAuth app — using it ') + dim(`(Client ID ${clientId})`));
|
|
676
|
+
}
|
|
677
|
+
else if (caps.publicPkce) {
|
|
678
|
+
detect.succeed(success(' Found a public OAuth app — using it with PKCE ') + dim(`(Client ID ${clientId})`));
|
|
679
|
+
}
|
|
680
|
+
else {
|
|
681
|
+
detect.succeed(success(' Found an OAuth app ') + dim(`(Client ID ${clientId})`));
|
|
682
|
+
console.log(' ' + dim('Could not read its secret over the API. Paste it, or leave blank to use PKCE.'));
|
|
683
|
+
clientSecret = await password({ message: brand('?') + ' Client Secret (blank = PKCE)' + brand(':'), mask: '•' });
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
else {
|
|
687
|
+
if (found === 'forbidden') {
|
|
688
|
+
detect.info(dim(' This account cannot list OAuth apps (not an admin), so auto-detection is off.'));
|
|
689
|
+
}
|
|
690
|
+
else {
|
|
691
|
+
detect.info(dim(' No OAuth app found on the instance.'));
|
|
692
|
+
}
|
|
693
|
+
console.log('');
|
|
694
|
+
const how = await select({
|
|
695
|
+
message: brand('?') + ' How do you want to set up OAuth' + brand('?'),
|
|
696
|
+
choices: [
|
|
697
|
+
{ name: `${success('✨')} Create it for me ${dim('— needs the sign-in above to be an ADMIN')}`, value: 'auto' },
|
|
698
|
+
{ name: `${accent('🔑')} I have the Client ID and Secret ${dim('— enter them')}`, value: 'have' },
|
|
699
|
+
{ name: `${accent('🔧')} Show me the manual steps ${dim('(needs an admin)')}`, value: 'manual' },
|
|
700
|
+
{ name: `${brand('🔒')} Skip OAuth — username/password ${dim('(no app, any user)')}`, value: 'basic' },
|
|
701
|
+
],
|
|
702
|
+
});
|
|
703
|
+
if (how === 'auto') {
|
|
704
|
+
const spin = ora(' Creating the OAuth app on the instance…').start();
|
|
705
|
+
try {
|
|
706
|
+
const app = await provisionOAuthApp(instanceUrl, signInUser, signInPass, 'http://localhost:8765/callback', { publicPkce: caps.publicPkce });
|
|
707
|
+
clientId = app.clientId;
|
|
708
|
+
clientSecret = app.clientSecret;
|
|
709
|
+
spin.succeed(success(' OAuth app created — Client ID ') + accent(clientId) + (caps.publicPkce ? dim(' (public client, PKCE)') : ''));
|
|
710
|
+
username = signInUser;
|
|
711
|
+
userPassword = signInPass;
|
|
712
|
+
connectionVerified = true; // the create call itself proved the instance + admin creds work
|
|
713
|
+
}
|
|
714
|
+
catch (e) {
|
|
715
|
+
spin.fail(err(' ' + (e instanceof Error ? e.message : String(e))));
|
|
716
|
+
console.log('');
|
|
717
|
+
console.log(' ' + dim('Create it by hand with these steps, then enter the Client ID / Secret below:'));
|
|
718
|
+
printOAuthAppSteps(instanceUrl);
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
else if (how === 'manual') {
|
|
722
|
+
printOAuthAppSteps(instanceUrl);
|
|
723
|
+
}
|
|
724
|
+
else if (how === 'basic') {
|
|
725
|
+
console.log('');
|
|
726
|
+
box([
|
|
727
|
+
warn('Skipping OAuth, using username/password (works without an app).'),
|
|
728
|
+
dim('On SSO-only instances you will need the OAuth app or Entra instead — see AUTH-MODES.md.'),
|
|
729
|
+
], warn);
|
|
730
|
+
console.log('');
|
|
731
|
+
authMethod = 'basic';
|
|
732
|
+
username = signInUser;
|
|
733
|
+
userPassword = signInPass;
|
|
734
|
+
}
|
|
735
|
+
// 'have' falls through to the Client ID / Secret prompt below.
|
|
736
|
+
}
|
|
737
|
+
if (authMethod === 'oauth') {
|
|
738
|
+
if (!clientId) {
|
|
739
|
+
clientId = await input({ message: brand('?') + ' Client ID' + brand(':') });
|
|
740
|
+
clientSecret = await password({ message: brand('?') + ' Client Secret' + brand(':'), mask: '•' });
|
|
741
|
+
}
|
|
742
|
+
// The sign-in above already serves as the setup-test / service account for per-user mode.
|
|
743
|
+
if (!username) {
|
|
744
|
+
username = signInUser;
|
|
745
|
+
userPassword = signInPass;
|
|
746
|
+
}
|
|
747
|
+
}
|
|
534
748
|
}
|
|
535
749
|
// ─── Step 4: Test Connection ──────────────────────────────────────────────
|
|
536
750
|
step(4, 'Testing Connection');
|
|
537
751
|
let connected = false;
|
|
752
|
+
// Already proven during OAuth setup (we provisioned or read an app with these creds) — no re-test.
|
|
753
|
+
if (connectionVerified) {
|
|
754
|
+
console.log(' ' + success('✓') + dim(' Connection already verified during sign-in.'));
|
|
755
|
+
connected = true;
|
|
756
|
+
}
|
|
538
757
|
while (!connected) {
|
|
539
|
-
|
|
758
|
+
// A public OAuth client (PKCE, no secret) can't be exercised by the setup-time password grant —
|
|
759
|
+
// the per-user token comes later from `nowaikit auth login`. Verify the instance and the
|
|
760
|
+
// service-account credentials with basic auth instead. The saved config stays OAuth.
|
|
761
|
+
const testMethod = (authMethod === 'oauth' && !clientSecret) ? 'basic' : authMethod;
|
|
762
|
+
const { ok } = await testConnection(instanceUrl, testMethod, {
|
|
540
763
|
username,
|
|
541
764
|
password: userPassword,
|
|
542
765
|
clientId,
|
|
@@ -773,7 +996,7 @@ export async function runSetup(options = {}) {
|
|
|
773
996
|
choices: providerChoices,
|
|
774
997
|
default: localProviders.ollama.running ? 'ollama'
|
|
775
998
|
: localProviders.lmstudio.running ? 'lmstudio'
|
|
776
|
-
:
|
|
999
|
+
: 'skip',
|
|
777
1000
|
});
|
|
778
1001
|
if (selectedProvider !== 'skip') {
|
|
779
1002
|
aiProvider = selectedProvider;
|
|
@@ -869,16 +1092,10 @@ export async function runSetup(options = {}) {
|
|
|
869
1092
|
});
|
|
870
1093
|
console.log(` ${success('✓')} Google Gemini configured with ${accent(aiModel)}`);
|
|
871
1094
|
}
|
|
872
|
-
//
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
});
|
|
877
|
-
if (useCustomUrl) {
|
|
878
|
-
aiBaseUrl = await input({
|
|
879
|
-
message: brand('?') + ' Custom endpoint URL' + brand(':'),
|
|
880
|
-
});
|
|
881
|
-
}
|
|
1095
|
+
// Advanced: a custom AI base URL (proxy / OpenAI-compatible endpoint) can be set via
|
|
1096
|
+
// NOWAIKIT_AI_BASE_URL. No prompt here — it keeps setup short for the common case.
|
|
1097
|
+
if (process.env.NOWAIKIT_AI_BASE_URL)
|
|
1098
|
+
aiBaseUrl = process.env.NOWAIKIT_AI_BASE_URL;
|
|
882
1099
|
}
|
|
883
1100
|
else {
|
|
884
1101
|
console.log(` ${dim('→')} AI provider skipped — use --provider flag or environment variables when running capabilities.`);
|
|
@@ -920,24 +1137,8 @@ export async function runSetup(options = {}) {
|
|
|
920
1137
|
console.log(dim(' Generate reports: ') + brand('npx nowaikit report scan-health --format pdf'));
|
|
921
1138
|
console.log(dim(' Supports: ') + accent('Anthropic') + dim(', ') + accent('OpenAI') + dim(', ') + accent('Ollama') + dim(' (BYOK — bring your own key)'));
|
|
922
1139
|
console.log('');
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
default: false,
|
|
926
|
-
});
|
|
927
|
-
if (showMoreCaps) {
|
|
928
|
-
console.log('');
|
|
929
|
-
try {
|
|
930
|
-
const { getCapabilityMeta } = await import('../prompts/index.js');
|
|
931
|
-
const caps = getCapabilityMeta();
|
|
932
|
-
for (const c of caps) {
|
|
933
|
-
console.log(` ${brand('/' + c.name.padEnd(24))} ${dim(c.description)}`);
|
|
934
|
-
}
|
|
935
|
-
}
|
|
936
|
-
catch {
|
|
937
|
-
console.log(dim(' (Capability metadata not available — run ') + brand('npx nowaikit capabilities') + dim(' to see the full list)'));
|
|
938
|
-
}
|
|
939
|
-
console.log('');
|
|
940
|
-
}
|
|
1140
|
+
console.log(dim(' See all 26 in detail any time: ') + brand('npx nowaikit capabilities'));
|
|
1141
|
+
console.log('');
|
|
941
1142
|
}
|
|
942
1143
|
else {
|
|
943
1144
|
console.log(` ${dim('▸')} ${dim('Apex AI Skills disabled — 26 capabilities not loaded.')}`);
|
|
@@ -1129,11 +1330,8 @@ async function runAutoConfiguration(instance, mcpEnabled, sdkEnabled, chosenClie
|
|
|
1129
1330
|
console.log(` ${dim('→')} ${dim('Starter file already exists:')} ${accent(examplePath)}`);
|
|
1130
1331
|
}
|
|
1131
1332
|
else {
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
default: true,
|
|
1135
|
-
});
|
|
1136
|
-
if (shouldCreate) {
|
|
1333
|
+
// Just create it (no prompt) — it's harmless, never overwrites, and only runs when SDK is enabled.
|
|
1334
|
+
{
|
|
1137
1335
|
const instanceUrl = instance.instanceUrl;
|
|
1138
1336
|
const starter = [
|
|
1139
1337
|
`/**`,
|
|
@@ -1172,7 +1370,7 @@ async function runAutoConfiguration(instance, mcpEnabled, sdkEnabled, chosenClie
|
|
|
1172
1370
|
`console.log('Created incident:', newIncident.sys_id);`,
|
|
1173
1371
|
].join('\n');
|
|
1174
1372
|
writeFileSync(examplePath, starter, 'utf8');
|
|
1175
|
-
console.log(` ${success('✓')} Created starter file: ${accent(examplePath)}`);
|
|
1373
|
+
console.log(` ${success('✓')} Created starter file: ${accent(examplePath)} ${dim('(delete if you do not need it)')}`);
|
|
1176
1374
|
}
|
|
1177
1375
|
}
|
|
1178
1376
|
console.log('');
|