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.
Files changed (2) hide show
  1. package/dist/main.mjs +110 -21
  2. 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
- return warning === void 0 ? [] : [{
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 input.models) aliases[model.id] = {
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 = input.models.map((model) => model.id);
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 || response.status === 403) return {
323402
- state: "DENEGADO",
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 conclusive = rows.every((row) => row.state === "MEDIDO" || row.state === "DENEGADO");
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
- const lines = [
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
- conclusive ? "Every row was measured. A DENEGADO row means the edge refused it by policy, not that the tool is broken." : "NO CONCLUYENTE: some rows could not be measured (BLOQUEADO or SIN-SONDA are never green).",
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.0",
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
+ }