nexgenk 1.2.0 → 1.2.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/dist/main.mjs +110 -21
- package/package.json +44 -44
package/dist/main.mjs
CHANGED
|
@@ -56125,7 +56125,8 @@ var init_errors$18 = __esmMin((() => {
|
|
|
56125
56125
|
init_codes();
|
|
56126
56126
|
ServerToolsErrors = { codes: {
|
|
56127
56127
|
SERVER_TOOL_NOT_IN_CATALOG: "server_tools.not_in_catalog",
|
|
56128
|
-
SERVER_TOOL_DENIED: "server_tools.denied"
|
|
56128
|
+
SERVER_TOOL_DENIED: "server_tools.denied",
|
|
56129
|
+
SERVER_TOOL_UNSUPPORTED_SURFACE: "server_tools.unsupported_surface"
|
|
56129
56130
|
} };
|
|
56130
56131
|
registerErrorDomain(ServerToolsErrors);
|
|
56131
56132
|
}));
|
|
@@ -250040,6 +250041,10 @@ var init_web_search$1 = __esmMin((() => {
|
|
|
250040
250041
|
IWebSearchTool = createDecorator("webSearchTool");
|
|
250041
250042
|
}));
|
|
250042
250043
|
// ../../packages/agent-core-v2/src/app/auth/webSearch/webSearch.ts
|
|
250044
|
+
function webSearchUnavailableMessage(diagnosis) {
|
|
250045
|
+
if (diagnosis === "missing-api-key") return "WebSearch will fail: [services.nexgen_search] has no api_key. Run `nexgenk login` to provision it.";
|
|
250046
|
+
if (diagnosis === "missing-search-service") return "WebSearch is not available: config.toml has no [services.nexgen_search]. Run `nexgenk login` to provision it.";
|
|
250047
|
+
}
|
|
250043
250048
|
var IWebSearchProviderService;
|
|
250044
250049
|
var init_webSearch = __esmMin((() => {
|
|
250045
250050
|
init_instantiation();
|
|
@@ -251188,6 +251193,12 @@ var init_webSearchService = __esmMin((() => {
|
|
|
251188
251193
|
hasWebSearchProvider() {
|
|
251189
251194
|
return this.configuredSearch() !== void 0 || this.managedTokenProvider() !== void 0;
|
|
251190
251195
|
}
|
|
251196
|
+
diagnose() {
|
|
251197
|
+
const search = this.configuredSearch();
|
|
251198
|
+
if (search === void 0) return this.managedTokenProvider() === void 0 ? "missing-search-service" : "configured";
|
|
251199
|
+
if (search.oauth !== void 0 || nonEmptyString$1(search.apiKey) !== void 0) return "configured";
|
|
251200
|
+
return nonEmptyString$1(process.env["NEXGEN_API_KEY"]) === void 0 ? "missing-api-key" : "configured";
|
|
251201
|
+
}
|
|
251191
251202
|
configuredSearch() {
|
|
251192
251203
|
const search = this.config.get(SERVICES_SECTION)?.nexgenSearch;
|
|
251193
251204
|
if (search?.baseUrl === void 0) return void 0;
|
|
@@ -268284,6 +268295,7 @@ var init_catalog$2 = __esmMin((() => {
|
|
|
268284
268295
|
SERVER_TOOL_CATALOG = [
|
|
268285
268296
|
{
|
|
268286
268297
|
type: "openrouter:web_search",
|
|
268298
|
+
surface: "chat",
|
|
268287
268299
|
description: "Search the web and return ranked results with page snippets. The provider runs the search server-side; no local network access is involved.",
|
|
268288
268300
|
parameters: {
|
|
268289
268301
|
type: "object",
|
|
@@ -268368,6 +268380,7 @@ var init_catalog$2 = __esmMin((() => {
|
|
|
268368
268380
|
},
|
|
268369
268381
|
{
|
|
268370
268382
|
type: "openrouter:web_fetch",
|
|
268383
|
+
surface: "chat",
|
|
268371
268384
|
description: "Fetch a page by URL and return its extracted content. The provider performs the request server-side.",
|
|
268372
268385
|
parameters: {
|
|
268373
268386
|
type: "object",
|
|
@@ -268401,6 +268414,7 @@ var init_catalog$2 = __esmMin((() => {
|
|
|
268401
268414
|
},
|
|
268402
268415
|
{
|
|
268403
268416
|
type: "openrouter:datetime",
|
|
268417
|
+
surface: "chat",
|
|
268404
268418
|
description: "Return the current date and time from the provider, optionally in a named time zone.",
|
|
268405
268419
|
parameters: {
|
|
268406
268420
|
type: "object",
|
|
@@ -268413,6 +268427,7 @@ var init_catalog$2 = __esmMin((() => {
|
|
|
268413
268427
|
},
|
|
268414
268428
|
{
|
|
268415
268429
|
type: "openrouter:image_generation",
|
|
268430
|
+
surface: "chat",
|
|
268416
268431
|
description: "Generate an image from a prompt. The provider produces the image server-side and returns it in the response.",
|
|
268417
268432
|
parameters: {
|
|
268418
268433
|
type: "object",
|
|
@@ -268474,6 +268489,7 @@ var init_catalog$2 = __esmMin((() => {
|
|
|
268474
268489
|
},
|
|
268475
268490
|
{
|
|
268476
268491
|
type: "openrouter:fusion",
|
|
268492
|
+
surface: "chat",
|
|
268477
268493
|
description: "Fuse several analysis models into one answer: the provider runs the listed models and merges their output.",
|
|
268478
268494
|
parameters: {
|
|
268479
268495
|
type: "object",
|
|
@@ -268521,6 +268537,7 @@ var init_catalog$2 = __esmMin((() => {
|
|
|
268521
268537
|
},
|
|
268522
268538
|
{
|
|
268523
268539
|
type: "openrouter:advisor",
|
|
268540
|
+
surface: "chat",
|
|
268524
268541
|
description: "Ask a named advisor model for a second opinion on the current request; the provider calls it server-side.",
|
|
268525
268542
|
parameters: {
|
|
268526
268543
|
type: "object",
|
|
@@ -268544,6 +268561,7 @@ var init_catalog$2 = __esmMin((() => {
|
|
|
268544
268561
|
},
|
|
268545
268562
|
{
|
|
268546
268563
|
type: "openrouter:subagent",
|
|
268564
|
+
surface: "chat",
|
|
268547
268565
|
description: "Delegate a subtask to a named subagent model; the provider runs the subagent server-side.",
|
|
268548
268566
|
parameters: {
|
|
268549
268567
|
type: "object",
|
|
@@ -268562,6 +268580,7 @@ var init_catalog$2 = __esmMin((() => {
|
|
|
268562
268580
|
},
|
|
268563
268581
|
{
|
|
268564
268582
|
type: "openrouter:tool_search",
|
|
268583
|
+
surface: "responses",
|
|
268565
268584
|
description: "Responses-only marker: lets the provider expose additional server tools to the model. It is not callable and takes no parameters.",
|
|
268566
268585
|
parameters: {
|
|
268567
268586
|
type: "object",
|
|
@@ -268571,6 +268590,7 @@ var init_catalog$2 = __esmMin((() => {
|
|
|
268571
268590
|
},
|
|
268572
268591
|
{
|
|
268573
268592
|
type: "openrouter:experimental__search_models",
|
|
268593
|
+
surface: "chat",
|
|
268574
268594
|
description: "Search the router model catalog by description and return matching model identifiers.",
|
|
268575
268595
|
parameters: {
|
|
268576
268596
|
type: "object",
|
|
@@ -268626,13 +268646,17 @@ function serverToolDescription(name) {
|
|
|
268626
268646
|
const known = SERVER_TOOL_CATALOG.map((tool) => tool.type).join(", ");
|
|
268627
268647
|
throw new Error2(ErrorCodes.SERVER_TOOL_NOT_IN_CATALOG, `Server tool "${name}" is not in the NexgenRouter server tool catalog. Known tools: ${known}.`, { details: { name } });
|
|
268628
268648
|
}
|
|
268649
|
+
if (definition.surface !== SUPPORTED_SURFACE) throw new Error2(ErrorCodes.SERVER_TOOL_UNSUPPORTED_SURFACE, `Server tool "${name}" only runs on the ${definition.surface} endpoint (/v1/${definition.surface}), and this client speaks chat completions. Remove it from [server_tools] enabled: the router answers 400 for it on /v1/chat/completions.`, { details: {
|
|
268650
|
+
name,
|
|
268651
|
+
surface: definition.surface
|
|
268652
|
+
} });
|
|
268629
268653
|
return {
|
|
268630
268654
|
name: definition.type,
|
|
268631
268655
|
description: definition.description,
|
|
268632
268656
|
parameters: definition.parameters
|
|
268633
268657
|
};
|
|
268634
268658
|
}
|
|
268635
|
-
var IServerToolsService, ServerToolsService;
|
|
268659
|
+
var SUPPORTED_SURFACE, IServerToolsService, ServerToolsService;
|
|
268636
268660
|
var init_serverToolsService = __esmMin((() => {
|
|
268637
268661
|
init_instantiation();
|
|
268638
268662
|
init_config$6();
|
|
@@ -268643,6 +268667,7 @@ var init_serverToolsService = __esmMin((() => {
|
|
|
268643
268667
|
init_flag();
|
|
268644
268668
|
init_decorateParam();
|
|
268645
268669
|
init_decorate();
|
|
268670
|
+
SUPPORTED_SURFACE = "chat";
|
|
268646
268671
|
IServerToolsService = createDecorator("serverToolsService");
|
|
268647
268672
|
ServerToolsService = class ServerToolsService {
|
|
268648
268673
|
config;
|
|
@@ -287847,11 +287872,23 @@ var init_sdk_rpc_client_v2 = __esmMin((() => {
|
|
|
287847
287872
|
homeDir: this.engineAccessor.get(IHostEnvironment).homeDir
|
|
287848
287873
|
}, session.accessor.get(ISessionContext).cwd, this.engineAccessor.get(IBootstrapService).homeDir, { additionalDirs: session.accessor.get(ISessionWorkspaceContext).additionalDirs })).agentsMdWarning;
|
|
287849
287874
|
}
|
|
287850
|
-
|
|
287875
|
+
const warnings = warning === void 0 ? [] : [{
|
|
287851
287876
|
code: "agents-md-oversized",
|
|
287852
287877
|
message: warning,
|
|
287853
287878
|
severity: "warning"
|
|
287854
287879
|
}];
|
|
287880
|
+
const searchWarning = this.webSearchWarning();
|
|
287881
|
+
if (searchWarning !== void 0) warnings.push(searchWarning);
|
|
287882
|
+
return warnings;
|
|
287883
|
+
}
|
|
287884
|
+
webSearchWarning() {
|
|
287885
|
+
if (this.engineAccessor.get(IProviderService).get("managed:nexgenk") === void 0) return void 0;
|
|
287886
|
+
const message = webSearchUnavailableMessage(this.engineAccessor.get(IWebSearchProviderService).diagnose());
|
|
287887
|
+
return message === void 0 ? void 0 : {
|
|
287888
|
+
code: "web-search-unavailable",
|
|
287889
|
+
message,
|
|
287890
|
+
severity: "warning"
|
|
287891
|
+
};
|
|
287855
287892
|
}
|
|
287856
287893
|
/**
|
|
287857
287894
|
* Through the session scope (`ISessionBtwService`) — no klient facade
|
|
@@ -315765,8 +315802,8 @@ async function fetchRouterModels(input) {
|
|
|
315765
315802
|
signal: AbortSignal.timeout(MODELS_REQUEST_TIMEOUT_MS)
|
|
315766
315803
|
});
|
|
315767
315804
|
} catch (error) {
|
|
315768
|
-
if (error instanceof Error && error.name === "TimeoutError") throw new Error(`${url} did not answer within ${MODELS_REQUEST_TIMEOUT_MS / 1e3}s
|
|
315769
|
-
throw new Error(`could not reach ${url}: ${error instanceof Error ? error.message : String(error)}
|
|
315805
|
+
if (error instanceof Error && error.name === "TimeoutError") throw new Error(`${url} did not answer within ${MODELS_REQUEST_TIMEOUT_MS / 1e3}s.`, { cause: error });
|
|
315806
|
+
throw new Error(`could not reach ${url}: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
|
|
315770
315807
|
}
|
|
315771
315808
|
if (response.status === 401 || response.status === 403) throw new Error(`${url} rejected the API key (HTTP ${response.status}). Check the key and try again.`);
|
|
315772
315809
|
if (!response.ok) {
|
|
@@ -315785,15 +315822,20 @@ async function fetchRouterModels(input) {
|
|
|
315785
315822
|
return models;
|
|
315786
315823
|
}
|
|
315787
315824
|
function buildConfigPatch(input) {
|
|
315825
|
+
const usable = input.models.filter((model) => !RESPONSES_ONLY_MODELS.has(model.id));
|
|
315826
|
+
if (usable.length === 0) {
|
|
315827
|
+
const granted = input.models.map((model) => model.id).join(", ");
|
|
315828
|
+
throw new Error(`the router granted only responses-only models (${granted}); this client speaks chat completions, so there is no usable model.`);
|
|
315829
|
+
}
|
|
315788
315830
|
const aliases = {};
|
|
315789
|
-
for (const model of
|
|
315831
|
+
for (const model of usable) aliases[model.id] = {
|
|
315790
315832
|
provider: PROVIDER_ID,
|
|
315791
315833
|
model: model.id,
|
|
315792
315834
|
maxContextSize: model.maxInputTokens ?? FALLBACK_MAX_CONTEXT_SIZE,
|
|
315793
315835
|
maxOutputSize: model.maxOutputTokens,
|
|
315794
315836
|
displayName: model.id
|
|
315795
315837
|
};
|
|
315796
|
-
const ids =
|
|
315838
|
+
const ids = usable.map((model) => model.id);
|
|
315797
315839
|
return {
|
|
315798
315840
|
providers: { [PROVIDER_ID]: {
|
|
315799
315841
|
type: "nexgenk",
|
|
@@ -315814,13 +315856,14 @@ function buildConfigPatch(input) {
|
|
|
315814
315856
|
}
|
|
315815
315857
|
};
|
|
315816
315858
|
}
|
|
315817
|
-
var DEFAULT_BASE_URL, PROVIDER_ID, PREFERRED_MODEL, FALLBACK_MAX_CONTEXT_SIZE, MODELS_REQUEST_TIMEOUT_MS;
|
|
315859
|
+
var DEFAULT_BASE_URL, PROVIDER_ID, PREFERRED_MODEL, FALLBACK_MAX_CONTEXT_SIZE, MODELS_REQUEST_TIMEOUT_MS, RESPONSES_ONLY_MODELS;
|
|
315818
315860
|
var init_provision = __esmMin((() => {
|
|
315819
315861
|
DEFAULT_BASE_URL = "https://ia.nexgen.systems/v1";
|
|
315820
315862
|
PROVIDER_ID = "nexgenk";
|
|
315821
315863
|
PREFERRED_MODEL = "nexgen-auto";
|
|
315822
315864
|
FALLBACK_MAX_CONTEXT_SIZE = 262144;
|
|
315823
315865
|
MODELS_REQUEST_TIMEOUT_MS = 2e4;
|
|
315866
|
+
RESPONSES_ONLY_MODELS = /* @__PURE__ */ new Set(["nexgen-tools-responses"]);
|
|
315824
315867
|
}));
|
|
315825
315868
|
// src/utils/process/resolve-command.ts
|
|
315826
315869
|
function pathExtensions(platform, env) {
|
|
@@ -323282,6 +323325,7 @@ async function probeRouterTools(input) {
|
|
|
323282
323325
|
if (baseUrl === void 0 || apiKey === void 0 || apiKey.length === 0) {
|
|
323283
323326
|
rows.push({
|
|
323284
323327
|
name: "credentials",
|
|
323328
|
+
kind: "probe",
|
|
323285
323329
|
state: "BLOQUEADO",
|
|
323286
323330
|
detail: "no nexgenk provider with an API key in config.toml — run `nexgenk login`"
|
|
323287
323331
|
});
|
|
@@ -323312,21 +323356,25 @@ async function probeRouterTools(input) {
|
|
|
323312
323356
|
rows.push(serverToolRow(input));
|
|
323313
323357
|
rows.push({
|
|
323314
323358
|
name: "fim",
|
|
323359
|
+
kind: "declared",
|
|
323315
323360
|
state: "SIN-SONDA",
|
|
323316
323361
|
detail: "POST /beta/completions answers 404; no public route"
|
|
323317
323362
|
});
|
|
323318
323363
|
rows.push({
|
|
323319
323364
|
name: "balance",
|
|
323365
|
+
kind: "declared",
|
|
323320
323366
|
state: "SIN-SONDA",
|
|
323321
323367
|
detail: "GET /user/balance answers 404; no public route"
|
|
323322
323368
|
});
|
|
323323
323369
|
rows.push({
|
|
323324
323370
|
name: "files",
|
|
323371
|
+
kind: "declared",
|
|
323325
323372
|
state: "SIN-SONDA",
|
|
323326
323373
|
detail: "needs a Files grant on the key, and no endpoint serves the bytes"
|
|
323327
323374
|
});
|
|
323328
323375
|
rows.push({
|
|
323329
323376
|
name: "denied:shell,bash,apply_patch",
|
|
323377
|
+
kind: "declared",
|
|
323330
323378
|
state: "SIN-SONDA",
|
|
323331
323379
|
detail: "denied by edge policy; the catalog never declares them"
|
|
323332
323380
|
});
|
|
@@ -323335,16 +323383,19 @@ async function probeRouterTools(input) {
|
|
|
323335
323383
|
function serverToolRow(input) {
|
|
323336
323384
|
if (!input.serverToolsFlagOn) return {
|
|
323337
323385
|
name: "server_tools",
|
|
323386
|
+
kind: "declared",
|
|
323338
323387
|
state: "SIN-SONDA",
|
|
323339
323388
|
detail: "feature disabled (NEXGEN_EXPERIMENTAL_SERVER_TOOLS)"
|
|
323340
323389
|
};
|
|
323341
323390
|
if (input.serverToolsEnabled.length === 0) return {
|
|
323342
323391
|
name: "server_tools",
|
|
323392
|
+
kind: "declared",
|
|
323343
323393
|
state: "SIN-SONDA",
|
|
323344
323394
|
detail: "no [server_tools] enabled entries"
|
|
323345
323395
|
};
|
|
323346
323396
|
return {
|
|
323347
323397
|
name: "server_tools",
|
|
323398
|
+
kind: "declared",
|
|
323348
323399
|
state: "SIN-SONDA",
|
|
323349
323400
|
detail: `declared on the next model turn: ${input.serverToolsEnabled.join(", ")}`
|
|
323350
323401
|
};
|
|
@@ -323352,6 +323403,7 @@ function serverToolRow(input) {
|
|
|
323352
323403
|
async function probePost(name, configuredUrl, defaultUrl, body, auth, doFetch, timeoutMs) {
|
|
323353
323404
|
if (configuredUrl === void 0) return {
|
|
323354
323405
|
name,
|
|
323406
|
+
kind: "probe",
|
|
323355
323407
|
state: "SIN-SONDA",
|
|
323356
323408
|
detail: "no [services] entry — `nexgenk login` provisions it"
|
|
323357
323409
|
};
|
|
@@ -323378,17 +323430,20 @@ async function classify$1(name, run) {
|
|
|
323378
323430
|
const { state, detail } = await run();
|
|
323379
323431
|
return {
|
|
323380
323432
|
name,
|
|
323433
|
+
kind: "probe",
|
|
323381
323434
|
state,
|
|
323382
323435
|
detail
|
|
323383
323436
|
};
|
|
323384
323437
|
} catch (error) {
|
|
323385
323438
|
if (error instanceof Error && error.name === "TimeoutError") return {
|
|
323386
323439
|
name,
|
|
323440
|
+
kind: "probe",
|
|
323387
323441
|
state: "BLOQUEADO",
|
|
323388
323442
|
detail: "probe timed out"
|
|
323389
323443
|
};
|
|
323390
323444
|
return {
|
|
323391
323445
|
name,
|
|
323446
|
+
kind: "probe",
|
|
323392
323447
|
state: "BLOQUEADO",
|
|
323393
323448
|
detail: `probe failed: ${error instanceof Error ? error.message : String(error)}`
|
|
323394
323449
|
};
|
|
@@ -323398,12 +323453,12 @@ async function failed(response) {
|
|
|
323398
323453
|
const motivo = response.headers.get("x-nexgen-motivo") ?? "";
|
|
323399
323454
|
const bodyText = (await response.text().catch(() => "")).slice(0, 160);
|
|
323400
323455
|
const detail = `HTTP ${response.status}${motivo === "" ? "" : ` ${motivo}`}${bodyText === "" ? "" : `: ${bodyText}`}`;
|
|
323401
|
-
if (response.status === 401
|
|
323402
|
-
state: "
|
|
323403
|
-
detail
|
|
323456
|
+
if (response.status === 401) return {
|
|
323457
|
+
state: "BLOQUEADO",
|
|
323458
|
+
detail: `${detail} — the key was not recognised, which is not a policy refusal`
|
|
323404
323459
|
};
|
|
323405
|
-
if (response.status === 429) return {
|
|
323406
|
-
state: "DENEGADO",
|
|
323460
|
+
if (response.status === 403 || response.status === 429) return {
|
|
323461
|
+
state: motivo.startsWith("tool_") || bodyText.includes("tool_") ? "DENEGADO" : "BLOQUEADO",
|
|
323407
323462
|
detail
|
|
323408
323463
|
};
|
|
323409
323464
|
return {
|
|
@@ -323411,6 +323466,17 @@ async function failed(response) {
|
|
|
323411
323466
|
detail
|
|
323412
323467
|
};
|
|
323413
323468
|
}
|
|
323469
|
+
function verdictOf(rows) {
|
|
323470
|
+
const probes = rows.filter((row) => row.kind === "probe");
|
|
323471
|
+
if (probes.some((row) => row.state === "BLOQUEADO" || row.state === "SIN-SONDA")) return "inconclusive";
|
|
323472
|
+
if (probes.some((row) => row.state !== "MEDIDO")) return "contradicted";
|
|
323473
|
+
return "measured";
|
|
323474
|
+
}
|
|
323475
|
+
const EXIT_CODES = {
|
|
323476
|
+
measured: 0,
|
|
323477
|
+
contradicted: 1,
|
|
323478
|
+
inconclusive: 2
|
|
323479
|
+
};
|
|
323414
323480
|
async function handleDoctorTools(deps) {
|
|
323415
323481
|
const configPath = resolveConfigPath({ homeDir: resolveNexgenHome() });
|
|
323416
323482
|
const { config, fileError } = loadRuntimeConfigSafe(configPath);
|
|
@@ -323428,19 +323494,41 @@ async function handleDoctorTools(deps) {
|
|
|
323428
323494
|
serverToolsFlagOn: readFlag("NEXGEN_EXPERIMENTAL_SERVER_TOOLS"),
|
|
323429
323495
|
fetchImpl: deps.fetchImpl
|
|
323430
323496
|
});
|
|
323431
|
-
const
|
|
323497
|
+
const verdict = verdictOf(rows);
|
|
323498
|
+
const chunk = deps.json === true ? formatJson(rows, verdict) : formatTable(rows, verdict);
|
|
323499
|
+
deps.stdout.write(chunk);
|
|
323500
|
+
deps.exit(EXIT_CODES[verdict]);
|
|
323501
|
+
}
|
|
323502
|
+
function formatJson(rows, verdict) {
|
|
323503
|
+
const report = {
|
|
323504
|
+
surface: "nexgenrouter",
|
|
323505
|
+
schema: 1,
|
|
323506
|
+
verdict,
|
|
323507
|
+
rows: rows.map((row) => ({
|
|
323508
|
+
name: row.name,
|
|
323509
|
+
kind: row.kind,
|
|
323510
|
+
state: row.state,
|
|
323511
|
+
detail: row.detail
|
|
323512
|
+
}))
|
|
323513
|
+
};
|
|
323514
|
+
return `${JSON.stringify(report, null, 2)}\n`;
|
|
323515
|
+
}
|
|
323516
|
+
function formatTable(rows, verdict) {
|
|
323432
323517
|
const width = Math.max(...rows.map((row) => row.name.length));
|
|
323433
|
-
|
|
323518
|
+
return [
|
|
323434
323519
|
"NexgenRouter tools",
|
|
323435
323520
|
"",
|
|
323436
323521
|
...rows.map((row) => ` ${row.state.padEnd(9)} ${row.name.padEnd(width)} ${row.detail}`),
|
|
323437
323522
|
"",
|
|
323438
|
-
|
|
323523
|
+
VERDICT_LINES[verdict],
|
|
323439
323524
|
""
|
|
323440
|
-
];
|
|
323441
|
-
deps.stdout.write(lines.join("\n"));
|
|
323442
|
-
deps.exit(conclusive ? 0 : 2);
|
|
323525
|
+
].join("\n");
|
|
323443
323526
|
}
|
|
323527
|
+
const VERDICT_LINES = {
|
|
323528
|
+
measured: "Every probed row answered the contract. Declared rows without a route are listed above and never count as green.",
|
|
323529
|
+
contradicted: "CONTRADICTED: a probe was measured and does not fit the contract (policy refusal or an off-shape answer).",
|
|
323530
|
+
inconclusive: "NO CONCLUYENTE: some rows could not be measured (BLOQUEADO or SIN-SONDA are never green)."
|
|
323531
|
+
};
|
|
323444
323532
|
function readFlag(envName) {
|
|
323445
323533
|
const raw = process.env[envName]?.trim().toLowerCase();
|
|
323446
323534
|
if (raw === void 0 || raw === "") return false;
|
|
@@ -323575,12 +323663,13 @@ function registerDoctorCommand(parent, deps) {
|
|
|
323575
323663
|
path
|
|
323576
323664
|
});
|
|
323577
323665
|
});
|
|
323578
|
-
doctor.command("tools").description("Probe the NexgenRouter tool surface and report measured states.").action(async () => {
|
|
323666
|
+
doctor.command("tools").description("Probe the NexgenRouter tool surface and report measured states.").option("--json", "Emit a machine-readable report instead of the table.").action(async (options) => {
|
|
323579
323667
|
const resolved = resolveDeps$1(deps);
|
|
323580
323668
|
await handleDoctorTools({
|
|
323581
323669
|
stdout: resolved.stdout,
|
|
323582
323670
|
stderr: resolved.stderr,
|
|
323583
|
-
exit: resolved.exit
|
|
323671
|
+
exit: resolved.exit,
|
|
323672
|
+
json: options.json === true
|
|
323584
323673
|
});
|
|
323585
323674
|
});
|
|
323586
323675
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nexgenk",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.1",
|
|
4
4
|
"description": "NexgenK — terminal AI coding agent",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "NexgenK",
|
|
@@ -39,51 +39,10 @@
|
|
|
39
39
|
"access": "public",
|
|
40
40
|
"provenance": false
|
|
41
41
|
},
|
|
42
|
-
"scripts": {
|
|
43
|
-
"build": "tsdown && tsdown --config tsdown.dist-worker.config.ts && node scripts/copy-native-assets.mjs && node scripts/check-web-assets.mjs",
|
|
44
|
-
"prebuild": "node scripts/build-vis-asset.mjs",
|
|
45
|
-
"catalog:update": "node scripts/update-catalog.mjs --out dist/built-in-catalog.json",
|
|
46
|
-
"smoke": "node scripts/smoke.mjs",
|
|
47
|
-
"build:native:js": "node scripts/native/01-bundle.mjs",
|
|
48
|
-
"build:native:sea": "node scripts/native/build.mjs --profile=local",
|
|
49
|
-
"build:native:release": "node scripts/native/build.mjs --profile=release",
|
|
50
|
-
"package:native": "node scripts/native/package.mjs",
|
|
51
|
-
"produce:native:manifest": "node scripts/native/produce-manifest.mjs",
|
|
52
|
-
"release:native:resolve": "node scripts/native/resolve-release.mjs",
|
|
53
|
-
"test:native:smoke": "node scripts/native/smoke.mjs",
|
|
54
|
-
"dev": "node scripts/dev.mjs",
|
|
55
|
-
"dev:cli-only": "tsx --import ../../build/register-raw-text-loader.mjs ./src/main.ts",
|
|
56
|
-
"dev:server": "NEXGEN_DEV_SERVER=1 tsx --tsconfig ./tsconfig.dev.json --import ../../build/register-raw-text-loader.mjs ./src/main.ts web --no-open --debug-endpoints",
|
|
57
|
-
"dev:kap-server": "NEXGEN_DEV_SERVER=1 tsx --tsconfig ./tsconfig.dev.json --import ../../build/register-raw-text-loader.mjs ./src/main.ts web --no-open --debug-endpoints",
|
|
58
|
-
"dev:kap-server:multi": "NEXGEN_DEV_SERVER=1 tsx --tsconfig ./tsconfig.dev.json --import ../../build/register-raw-text-loader.mjs ./src/main.ts web --no-open --debug-endpoints",
|
|
59
|
-
"dev:server:restart": "node scripts/dev-server-restart.mjs",
|
|
60
|
-
"dev:plugin-marketplace": "node scripts/dev-plugin-marketplace-server.mjs",
|
|
61
|
-
"build:plugin-marketplace": "node scripts/build-plugin-marketplace-cdn.mjs",
|
|
62
|
-
"dev:prod": "node dist/main.mjs",
|
|
63
|
-
"clean": "rm -rf dist",
|
|
64
|
-
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
65
|
-
"test": "pnpm -w run build:packages && vitest run",
|
|
66
|
-
"e2e": "pnpm -w run build:packages && NEXGEN_E2E=1 vitest run test/e2e",
|
|
67
|
-
"e2e:real": "pnpm -w run build:packages && NEXGEN_E2E_REAL=1 vitest run test/e2e/real-llm-smoke.e2e.test.ts"
|
|
68
|
-
},
|
|
69
42
|
"optionalDependencies": {
|
|
70
43
|
"@mariozechner/clipboard": "^0.3.9"
|
|
71
44
|
},
|
|
72
45
|
"devDependencies": {
|
|
73
|
-
"@nexgenk/acp-server": "workspace:^",
|
|
74
|
-
"@nexgenk/core": "workspace:^",
|
|
75
|
-
"@nexgenk/server": "workspace:^",
|
|
76
|
-
"@nexgenk/auth": "workspace:^",
|
|
77
|
-
"@nexgenk/product": "workspace:^",
|
|
78
|
-
"@nexgenk/sdk": "workspace:^",
|
|
79
|
-
"@nexgenk/telemetry": "workspace:^",
|
|
80
|
-
"@nexgenk/migration-legacy": "workspace:^",
|
|
81
|
-
"@nexgenk/minidb": "workspace:^",
|
|
82
|
-
"@nexgenk/tui": "workspace:^",
|
|
83
|
-
"@nexgenk/remote-control": "workspace:^",
|
|
84
|
-
"@nexgenk/session-import": "workspace:^",
|
|
85
|
-
"@nexgenk/vis-server": "workspace:^",
|
|
86
|
-
"@nexgenk/vis-web": "workspace:*",
|
|
87
46
|
"@types/qrcode": "^1.5.6",
|
|
88
47
|
"@types/semver": "^7.7.0",
|
|
89
48
|
"@types/ws": "^8.18.0",
|
|
@@ -99,7 +58,21 @@
|
|
|
99
58
|
"smol-toml": "^1.6.1",
|
|
100
59
|
"tsx": "^4.21.0",
|
|
101
60
|
"yazl": "^3.3.1",
|
|
102
|
-
"zod": "^4.3.6"
|
|
61
|
+
"zod": "^4.3.6",
|
|
62
|
+
"@nexgenk/acp-server": "^0.0.3",
|
|
63
|
+
"@nexgenk/auth": "^0.5.0",
|
|
64
|
+
"@nexgenk/core": "^0.6.0",
|
|
65
|
+
"@nexgenk/server": "^0.3.0",
|
|
66
|
+
"@nexgenk/sdk": "^0.22.0",
|
|
67
|
+
"@nexgenk/migration-legacy": "^0.1.18",
|
|
68
|
+
"@nexgenk/product": "^0.0.3",
|
|
69
|
+
"@nexgenk/telemetry": "^0.2.0",
|
|
70
|
+
"@nexgenk/minidb": "^0.2.0",
|
|
71
|
+
"@nexgenk/tui": "^0.86.0",
|
|
72
|
+
"@nexgenk/session-import": "^0.0.1",
|
|
73
|
+
"@nexgenk/vis-server": "^0.1.2",
|
|
74
|
+
"@nexgenk/vis-web": "0.1.1",
|
|
75
|
+
"@nexgenk/remote-control": "^0.0.3"
|
|
103
76
|
},
|
|
104
77
|
"engines": {
|
|
105
78
|
"node": ">=22.19.0"
|
|
@@ -108,5 +81,32 @@
|
|
|
108
81
|
"chokidar": "^4.0.3",
|
|
109
82
|
"qrcode": "^1.5.4",
|
|
110
83
|
"ws": "^8.18.0"
|
|
84
|
+
},
|
|
85
|
+
"scripts": {
|
|
86
|
+
"build": "tsdown && tsdown --config tsdown.dist-worker.config.ts && node scripts/copy-native-assets.mjs && node scripts/check-web-assets.mjs",
|
|
87
|
+
"prebuild": "node scripts/build-vis-asset.mjs",
|
|
88
|
+
"catalog:update": "node scripts/update-catalog.mjs --out dist/built-in-catalog.json",
|
|
89
|
+
"smoke": "node scripts/smoke.mjs",
|
|
90
|
+
"build:native:js": "node scripts/native/01-bundle.mjs",
|
|
91
|
+
"build:native:sea": "node scripts/native/build.mjs --profile=local",
|
|
92
|
+
"build:native:release": "node scripts/native/build.mjs --profile=release",
|
|
93
|
+
"package:native": "node scripts/native/package.mjs",
|
|
94
|
+
"produce:native:manifest": "node scripts/native/produce-manifest.mjs",
|
|
95
|
+
"release:native:resolve": "node scripts/native/resolve-release.mjs",
|
|
96
|
+
"test:native:smoke": "node scripts/native/smoke.mjs",
|
|
97
|
+
"dev": "node scripts/dev.mjs",
|
|
98
|
+
"dev:cli-only": "tsx --import ../../build/register-raw-text-loader.mjs ./src/main.ts",
|
|
99
|
+
"dev:server": "NEXGEN_DEV_SERVER=1 tsx --tsconfig ./tsconfig.dev.json --import ../../build/register-raw-text-loader.mjs ./src/main.ts web --no-open --debug-endpoints",
|
|
100
|
+
"dev:kap-server": "NEXGEN_DEV_SERVER=1 tsx --tsconfig ./tsconfig.dev.json --import ../../build/register-raw-text-loader.mjs ./src/main.ts web --no-open --debug-endpoints",
|
|
101
|
+
"dev:kap-server:multi": "NEXGEN_DEV_SERVER=1 tsx --tsconfig ./tsconfig.dev.json --import ../../build/register-raw-text-loader.mjs ./src/main.ts web --no-open --debug-endpoints",
|
|
102
|
+
"dev:server:restart": "node scripts/dev-server-restart.mjs",
|
|
103
|
+
"dev:plugin-marketplace": "node scripts/dev-plugin-marketplace-server.mjs",
|
|
104
|
+
"build:plugin-marketplace": "node scripts/build-plugin-marketplace-cdn.mjs",
|
|
105
|
+
"dev:prod": "node dist/main.mjs",
|
|
106
|
+
"clean": "rm -rf dist",
|
|
107
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
108
|
+
"test": "pnpm -w run build:packages && vitest run",
|
|
109
|
+
"e2e": "pnpm -w run build:packages && NEXGEN_E2E=1 vitest run test/e2e",
|
|
110
|
+
"e2e:real": "pnpm -w run build:packages && NEXGEN_E2E_REAL=1 vitest run test/e2e/real-llm-smoke.e2e.test.ts"
|
|
111
111
|
}
|
|
112
|
-
}
|
|
112
|
+
}
|