@mrciphersmith/keryx 0.2.18 → 0.2.19

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/cli.js +58 -15
  2. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -7837,6 +7837,12 @@ var init_gdgraph = __esm(() => {
7837
7837
  });
7838
7838
 
7839
7839
  // src/commands/providers.ts
7840
+ function isProviderPlatformSupported(provider, platform = process.platform) {
7841
+ if (provider.platforms === undefined || provider.platforms.length === 0) {
7842
+ return true;
7843
+ }
7844
+ return provider.platforms.includes(platform);
7845
+ }
7840
7846
  function providerByName(name) {
7841
7847
  return OPENAI_COMPAT_PROVIDERS.find((p) => p.name === name);
7842
7848
  }
@@ -7881,7 +7887,7 @@ async function resolveModelsForPicker(fetchFn, provider, env = process.env, opts
7881
7887
  return { models: [...provider.models], source: "fallback" };
7882
7888
  }
7883
7889
  const envKey = provider.envKey ?? compat.envKey;
7884
- const raw = env[envKey];
7890
+ const raw = envKey === undefined ? undefined : env[envKey];
7885
7891
  const apiKey = typeof raw === "string" && raw.length > 0 ? raw : undefined;
7886
7892
  return fetchOpenAiCompatModelsDetailed(fetchFn, compat, apiKey, opts);
7887
7893
  }
@@ -7956,6 +7962,16 @@ var init_providers = __esm(() => {
7956
7962
  models: ["llama-3.3-70b-versatile", "llama-3.1-8b-instant", "gpt-oss-120b"],
7957
7963
  note: "free tier \xB7 fast"
7958
7964
  },
7965
+ {
7966
+ name: "rapid-mlx",
7967
+ label: "Rapid-MLX (Local)",
7968
+ baseUrl: "http://127.0.0.1:8010",
7969
+ requiresApiKey: false,
7970
+ allowLoopback: true,
7971
+ platforms: ["darwin"],
7972
+ models: ["qwen3.5-9b-4bit"],
7973
+ note: "local \xB7 no key"
7974
+ },
7959
7975
  {
7960
7976
  name: "moonshot",
7961
7977
  label: "Moonshot (Kimi)",
@@ -9642,18 +9658,21 @@ function makeProvider(name, _model, opts) {
9642
9658
  }
9643
9659
  const compat = providerByName(name);
9644
9660
  if (compat !== undefined) {
9645
- const apiKey = env[compat.envKey];
9646
- if (apiKey === undefined || apiKey.length === 0) {
9661
+ const needsKey = compat.requiresApiKey !== false;
9662
+ const apiKey = compat.envKey === undefined ? undefined : env[compat.envKey];
9663
+ if (needsKey && (apiKey === undefined || apiKey.length === 0)) {
9647
9664
  return new FakeProvider([]);
9648
9665
  }
9666
+ const grant = {
9667
+ network: true,
9668
+ baseUrl: opts.baseUrl ?? compat.baseUrl,
9669
+ ...compat.allowLoopback === true ? { allowLoopback: true } : {},
9670
+ ...compat.chatPath !== undefined ? { chatPath: compat.chatPath } : {},
9671
+ ...apiKey !== undefined ? { apiKey } : {}
9672
+ };
9649
9673
  return new OllamaProvider({
9650
9674
  fetch: opts.fetch,
9651
- grant: {
9652
- network: true,
9653
- baseUrl: opts.baseUrl ?? compat.baseUrl,
9654
- apiKey,
9655
- ...compat.chatPath !== undefined ? { chatPath: compat.chatPath } : {}
9656
- }
9675
+ grant
9657
9676
  });
9658
9677
  }
9659
9678
  return new FakeProvider([]);
@@ -9770,13 +9789,22 @@ function hasCredential(provider, env) {
9770
9789
  }
9771
9790
  const compat = providerByName(provider);
9772
9791
  if (compat) {
9792
+ if (compat.requiresApiKey === false) {
9793
+ return true;
9794
+ }
9795
+ if (compat.envKey === undefined) {
9796
+ return false;
9797
+ }
9773
9798
  const key = env[compat.envKey];
9774
9799
  return key !== undefined && key.length > 0;
9775
9800
  }
9776
9801
  return false;
9777
9802
  }
9778
9803
  function keyedProviderCandidates() {
9779
- return ["anthropic", ...OPENAI_COMPAT_PROVIDERS.map((p) => p.name)];
9804
+ return [
9805
+ "anthropic",
9806
+ ...OPENAI_COMPAT_PROVIDERS.filter((provider) => provider.requiresApiKey !== false).map((p) => p.name)
9807
+ ];
9780
9808
  }
9781
9809
  function resolveAutoProvider(env, opts) {
9782
9810
  if (opts?.preferSavedShell !== false) {
@@ -36455,6 +36483,9 @@ function projectPolicyTrusted(env) {
36455
36483
  function buildDefaultMaskProviders(openaiCompat) {
36456
36484
  const out = [];
36457
36485
  for (const p of openaiCompat) {
36486
+ if (p.envKey === undefined) {
36487
+ continue;
36488
+ }
36458
36489
  out.push({ envKey: p.envKey, baseUrl: p.baseUrl });
36459
36490
  }
36460
36491
  out.push({ envKey: "ANTHROPIC_API_KEY", baseUrl: "https://api.anthropic.com" });
@@ -37097,6 +37128,13 @@ function checkApproval(input2) {
37097
37128
  }
37098
37129
 
37099
37130
  // src/commands/harness.ts
37131
+ var HARNESS_PROVIDER_OPTIONS = [
37132
+ "fake",
37133
+ "anthropic",
37134
+ "ollama",
37135
+ ...OPENAI_COMPAT_PROVIDERS.map((provider) => provider.name)
37136
+ ];
37137
+ var HARNESS_PROVIDER_USAGE = `Usage: keryx harness run --provider <${HARNESS_PROVIDER_OPTIONS.join("|")}> --model <m> [--base-url <url>] "<prompt>"`;
37100
37138
  function canonicalPath(p) {
37101
37139
  try {
37102
37140
  return realpathSync3(p);
@@ -37128,7 +37166,7 @@ function shellAllowProfile() {
37128
37166
  return resolveLocalProfile("monitored-trusted-local");
37129
37167
  }
37130
37168
  var USAGE = [
37131
- 'Usage: keryx harness run --provider <fake|anthropic|ollama> --model <m> [--base-url <url>] "<prompt>"',
37169
+ HARNESS_PROVIDER_USAGE,
37132
37170
  " keryx harness exec [--allow-env KEY]... [--max-runtime-ms N] [--allow-real-subprocess]",
37133
37171
  " [--allowed-domains a,b] [--mask-env NAME@host] [--tls-terminate] [--mask-mode auto|manual|off] [--auto-mask]",
37134
37172
  " -- <path> [args...]",
@@ -37204,7 +37242,7 @@ async function harnessCommand(args, deps) {
37204
37242
  return;
37205
37243
  }
37206
37244
  const { provider, model, baseUrl, prompt, record } = parseArgs2(args);
37207
- const validProviders = new Set(["fake", "anthropic", "ollama"]);
37245
+ const validProviders = new Set(HARNESS_PROVIDER_OPTIONS);
37208
37246
  if (!validProviders.has(provider) || prompt.length === 0) {
37209
37247
  console.log(USAGE);
37210
37248
  return;
@@ -44404,7 +44442,7 @@ init_shell_config();
44404
44442
  // package.json
44405
44443
  var package_default = {
44406
44444
  name: "@mrciphersmith/keryx",
44407
- version: "0.2.18",
44445
+ version: "0.2.19",
44408
44446
  description: "Version-controlled project context for AI coding agents: code graph, architecture wiki, project memory, relevant tests, quality signals, and task flows.",
44409
44447
  private: false,
44410
44448
  publishConfig: {
@@ -44527,6 +44565,7 @@ async function probeOllamaModels(deps, baseUrl) {
44527
44565
  }
44528
44566
  async function detectProviders(deps) {
44529
44567
  const baseUrl = deps.baseUrl ?? DEFAULT_OLLAMA_BASE_URL;
44568
+ const platform = deps.platform ?? process.platform;
44530
44569
  const detected = [];
44531
44570
  const ollamaModels = await probeOllamaModels(deps, baseUrl);
44532
44571
  if (ollamaModels !== undefined) {
@@ -44537,15 +44576,18 @@ async function detectProviders(deps) {
44537
44576
  detected.push({ name: "anthropic", models: [...ANTHROPIC_MODELS] });
44538
44577
  }
44539
44578
  for (const p of OPENAI_COMPAT_PROVIDERS) {
44579
+ if (!isProviderPlatformSupported(p, platform)) {
44580
+ continue;
44581
+ }
44540
44582
  detected.push({
44541
44583
  name: p.name,
44542
44584
  models: [...p.models],
44543
44585
  baseUrl: p.baseUrl,
44544
- envKey: p.envKey,
44545
44586
  label: p.label,
44546
44587
  ...p.chatPath !== undefined ? { chatPath: p.chatPath } : {},
44547
44588
  ...p.modelsPath !== undefined ? { modelsPath: p.modelsPath } : {},
44548
- ...p.note !== undefined ? { note: p.note } : {}
44589
+ ...p.note !== undefined ? { note: p.note } : {},
44590
+ ...p.envKey !== undefined ? { envKey: p.envKey } : {}
44549
44591
  });
44550
44592
  }
44551
44593
  detected.push({ name: "fake", models: [...FAKE_MODELS] });
@@ -44961,6 +45003,7 @@ function realSelectProviderModel(baseUrl) {
44961
45003
  const detected = await detectProviders({
44962
45004
  fetch: globalThis.fetch,
44963
45005
  env: process.env,
45006
+ platform: process.platform,
44964
45007
  ...baseUrl !== undefined ? { baseUrl } : {}
44965
45008
  });
44966
45009
  const filtered = opts?.onlyProvider !== undefined ? detected.filter((d) => d.name === opts.onlyProvider) : detected;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mrciphersmith/keryx",
3
- "version": "0.2.18",
3
+ "version": "0.2.19",
4
4
  "description": "Version-controlled project context for AI coding agents: code graph, architecture wiki, project memory, relevant tests, quality signals, and task flows.",
5
5
  "private": false,
6
6
  "publishConfig": {