pullfrog 0.1.38 → 0.1.39

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.
@@ -16,6 +16,43 @@ export type OpenCodeConfig = {
16
16
  export declare function geminiHighThinkingOverrides(): Record<string, {
17
17
  options: object;
18
18
  }>;
19
+ /**
20
+ * Build the `provider.openrouter.models[id].options` map that pins every Kimi
21
+ * K2 OpenRouter alias away from the Enforcer-less providers via OpenRouter's
22
+ * `provider: {ignore:[...]}` routing directive. Sourced from the model registry
23
+ * so a Kimi alias/route change in `action/models.ts` flows through automatically.
24
+ *
25
+ * Wiring: the per-model `options` object merges into the request options
26
+ * (opencode `session/llm/request.ts` `mergeOptions(base, model.options)`),
27
+ * gets wrapped under `providerOptions.openrouter` (`provider/transform.ts`
28
+ * `sdkKey("@openrouter/ai-sdk-provider") === "openrouter"`), and the OpenRouter
29
+ * AI-SDK provider spreads everything under `providerOptions.openrouter` straight
30
+ * into the request body (`@openrouter/ai-sdk-provider` `doStream`/`doGenerate`),
31
+ * so `provider` lands as the top-level routing object OpenRouter expects.
32
+ */
33
+ export declare function kimiOpenRouterProviderOverrides(): Record<string, {
34
+ options: object;
35
+ }>;
36
+ /**
37
+ * Build the `provider.openrouter.models[id].options` map that pins the
38
+ * efficient-tier DeepSeek model to high reasoning effort on the OpenRouter
39
+ * route — the funded/OSS default path. The shape must nest under `options`
40
+ * (opencode builds `Model.options` only from the entry's `options` sub-object —
41
+ * `provider.ts` `mergeDeep(existingModel.options, model.options)`) and use a
42
+ * `reasoning` record (the openrouter provider forwards only `usage`/`reasoning`/
43
+ * `promptCacheKey`); a bare `reasoningEffort` sibling is silently dropped.
44
+ * Sourced from the registry so a resolve bump carries the override forward.
45
+ * `high` is the ceiling OpenRouter's unified `reasoning.effort` exposes
46
+ * (low/medium/high); DeepSeek's native `max` is only reachable via a direct
47
+ * DeepSeek key, not the OpenRouter route.
48
+ */
49
+ export declare function deepseekHighEffortOverrides(): Record<string, {
50
+ options: {
51
+ reasoning: {
52
+ effort: string;
53
+ };
54
+ };
55
+ }>;
19
56
  /**
20
57
  * Read-only `reviewfrog` subagent for lens-based review. Non-mutative +
21
58
  * non-recursive — enforced by the system prompt in reviewer.ts.
package/dist/cli.mjs CHANGED
@@ -101934,11 +101934,20 @@ var providers = {
101934
101934
  displayName: "Moonshot AI",
101935
101935
  envVars: ["MOONSHOT_API_KEY"],
101936
101936
  models: {
101937
+ // Moonshot's premium 1M-context multimodal reasoning flagship — pricier
101938
+ // than K2.7-code, so it's the preferred BYOK pick but NOT the subsidized
101939
+ // efficient default (that stays K2 via AUTO_EFFICIENT).
101940
+ "kimi-k3": {
101941
+ displayName: "Kimi K3",
101942
+ resolve: "moonshotai/kimi-k3",
101943
+ openRouterResolve: "openrouter/moonshotai/kimi-k3",
101944
+ preferred: true,
101945
+ subagentModel: "kimi-k2"
101946
+ },
101937
101947
  "kimi-k2": {
101938
101948
  displayName: "Kimi K2",
101939
101949
  resolve: "moonshotai/kimi-k2.7-code",
101940
- openRouterResolve: "openrouter/moonshotai/kimi-k2.7-code",
101941
- preferred: true
101950
+ openRouterResolve: "openrouter/moonshotai/kimi-k2.7-code"
101942
101951
  }
101943
101952
  }
101944
101953
  }),
@@ -102032,10 +102041,11 @@ var providers = {
102032
102041
  resolve: "opencode/kimi-k2.6",
102033
102042
  openRouterResolve: "openrouter/moonshotai/kimi-k2.7-code"
102034
102043
  },
102044
+ // Zen serves m2.5; the funded OpenRouter path tracks the current m2.7.
102035
102045
  "minimax-m2.5": {
102036
102046
  displayName: "MiniMax M2",
102037
102047
  resolve: "opencode/minimax-m2.5",
102038
- openRouterResolve: "openrouter/minimax/minimax-m2.5"
102048
+ openRouterResolve: "openrouter/minimax/minimax-m2.7"
102039
102049
  },
102040
102050
  "gpt-5-nano": {
102041
102051
  displayName: "GPT Nano",
@@ -102223,10 +102233,21 @@ var providers = {
102223
102233
  resolve: "openrouter/moonshotai/kimi-k2.7-code",
102224
102234
  openRouterResolve: "openrouter/moonshotai/kimi-k2.7-code"
102225
102235
  },
102236
+ "kimi-k3": {
102237
+ displayName: "Kimi K3",
102238
+ resolve: "openrouter/moonshotai/kimi-k3",
102239
+ openRouterResolve: "openrouter/moonshotai/kimi-k3"
102240
+ },
102241
+ // slug pins the m2 line for DB stability; resolve tracks the current m2.7.
102226
102242
  "minimax-m2.5": {
102227
102243
  displayName: "MiniMax M2",
102228
- resolve: "openrouter/minimax/minimax-m2.5",
102229
- openRouterResolve: "openrouter/minimax/minimax-m2.5"
102244
+ resolve: "openrouter/minimax/minimax-m2.7",
102245
+ openRouterResolve: "openrouter/minimax/minimax-m2.7"
102246
+ },
102247
+ "minimax-m3": {
102248
+ displayName: "MiniMax M3",
102249
+ resolve: "openrouter/minimax/minimax-m3",
102250
+ openRouterResolve: "openrouter/minimax/minimax-m3"
102230
102251
  }
102231
102252
  }
102232
102253
  })
@@ -102275,7 +102296,7 @@ var modelAliases = Object.entries(providers).flatMap(
102275
102296
  var AUTO_EFFICIENT = "auto/efficient";
102276
102297
  var AUTO_INTELLIGENT = "auto/intelligent";
102277
102298
  var AUTO_TIER_TARGET = {
102278
- [AUTO_EFFICIENT]: "moonshotai/kimi-k2",
102299
+ [AUTO_EFFICIENT]: "deepseek/deepseek-pro",
102279
102300
  [AUTO_INTELLIGENT]: "anthropic/claude-opus"
102280
102301
  };
102281
102302
  function isAutoTier(slug2) {
@@ -103001,7 +103022,7 @@ var import_semver = __toESM(require_semver2(), 1);
103001
103022
  // package.json
103002
103023
  var package_default = {
103003
103024
  name: "pullfrog",
103004
- version: "0.1.38",
103025
+ version: "0.1.39",
103005
103026
  type: "module",
103006
103027
  bin: {
103007
103028
  pullfrog: "dist/cli.mjs",
@@ -110227,6 +110248,19 @@ function geminiHighThinkingOverrides() {
110227
110248
  ])
110228
110249
  );
110229
110250
  }
110251
+ var KIMI_ENFORCERLESS_PROVIDERS = ["siliconflow", "together"];
110252
+ function kimiOpenRouterProviderOverrides() {
110253
+ return Object.fromEntries(
110254
+ modelAliases.map((a) => a.openRouterResolve).filter((r) => r?.includes("kimi") ?? false).map((r) => [
110255
+ r.replace(/^openrouter\//, ""),
110256
+ { options: { provider: { ignore: KIMI_ENFORCERLESS_PROVIDERS } } }
110257
+ ])
110258
+ );
110259
+ }
110260
+ function deepseekHighEffortOverrides() {
110261
+ const orModel = modelAliases.find((a) => a.slug === "deepseek/deepseek-pro")?.openRouterResolve?.replace(/^openrouter\//, "");
110262
+ return orModel ? { [orModel]: { options: { reasoning: { effort: "high" } } } } : {};
110263
+ }
110230
110264
  function buildReviewerAgentConfig(orchestratorModel) {
110231
110265
  const overrides = deriveSubagentModels(orchestratorModel);
110232
110266
  return {
@@ -110295,9 +110329,18 @@ function buildSecurityConfig(ctx, model) {
110295
110329
  log.info(`\xBB subagent models: reviewfrog=${reviewerModel}`);
110296
110330
  return cfg;
110297
110331
  })(),
110298
- // gemini-3 thinking pinned to high for review depth; gpt and anthropic
110299
- // effort set elsewhere (gpt: upstream default, anthropic: --effort flag in claude.ts).
110300
- provider: { google: { models: geminiHighThinkingOverrides() } }
110332
+ // gemini-3 thinking pinned to high for review depth; deepseek (funded
110333
+ // efficient tier) pinned to high reasoning effort, and kimi pinned away
110334
+ // from Enforcer-less openrouter providers (siliconflow / together) that
110335
+ // drop optional tool-call params — both per-model on the openrouter route,
110336
+ // so other models are unaffected. gpt/anthropic effort set elsewhere (gpt:
110337
+ // upstream default, anthropic: --effort flag in claude.ts). see opencodeShared.ts.
110338
+ provider: {
110339
+ google: { models: geminiHighThinkingOverrides() },
110340
+ openrouter: {
110341
+ models: { ...deepseekHighEffortOverrides(), ...kimiOpenRouterProviderOverrides() }
110342
+ }
110343
+ }
110301
110344
  };
110302
110345
  if (model) {
110303
110346
  config3.model = model;
@@ -168474,7 +168517,7 @@ async function runCli4(input) {
168474
168517
  }
168475
168518
 
168476
168519
  // cli.ts
168477
- var VERSION10 = "0.1.38";
168520
+ var VERSION10 = "0.1.39";
168478
168521
  var bin = basename2(process.argv[1] || "");
168479
168522
  var PROG = bin === "pf" || bin === "pullfrog" ? bin : "pullfrog";
168480
168523
  var rawArgs = process.argv.slice(2);
package/dist/index.js CHANGED
@@ -100005,11 +100005,20 @@ var providers = {
100005
100005
  displayName: "Moonshot AI",
100006
100006
  envVars: ["MOONSHOT_API_KEY"],
100007
100007
  models: {
100008
+ // Moonshot's premium 1M-context multimodal reasoning flagship — pricier
100009
+ // than K2.7-code, so it's the preferred BYOK pick but NOT the subsidized
100010
+ // efficient default (that stays K2 via AUTO_EFFICIENT).
100011
+ "kimi-k3": {
100012
+ displayName: "Kimi K3",
100013
+ resolve: "moonshotai/kimi-k3",
100014
+ openRouterResolve: "openrouter/moonshotai/kimi-k3",
100015
+ preferred: true,
100016
+ subagentModel: "kimi-k2"
100017
+ },
100008
100018
  "kimi-k2": {
100009
100019
  displayName: "Kimi K2",
100010
100020
  resolve: "moonshotai/kimi-k2.7-code",
100011
- openRouterResolve: "openrouter/moonshotai/kimi-k2.7-code",
100012
- preferred: true
100021
+ openRouterResolve: "openrouter/moonshotai/kimi-k2.7-code"
100013
100022
  }
100014
100023
  }
100015
100024
  }),
@@ -100103,10 +100112,11 @@ var providers = {
100103
100112
  resolve: "opencode/kimi-k2.6",
100104
100113
  openRouterResolve: "openrouter/moonshotai/kimi-k2.7-code"
100105
100114
  },
100115
+ // Zen serves m2.5; the funded OpenRouter path tracks the current m2.7.
100106
100116
  "minimax-m2.5": {
100107
100117
  displayName: "MiniMax M2",
100108
100118
  resolve: "opencode/minimax-m2.5",
100109
- openRouterResolve: "openrouter/minimax/minimax-m2.5"
100119
+ openRouterResolve: "openrouter/minimax/minimax-m2.7"
100110
100120
  },
100111
100121
  "gpt-5-nano": {
100112
100122
  displayName: "GPT Nano",
@@ -100294,10 +100304,21 @@ var providers = {
100294
100304
  resolve: "openrouter/moonshotai/kimi-k2.7-code",
100295
100305
  openRouterResolve: "openrouter/moonshotai/kimi-k2.7-code"
100296
100306
  },
100307
+ "kimi-k3": {
100308
+ displayName: "Kimi K3",
100309
+ resolve: "openrouter/moonshotai/kimi-k3",
100310
+ openRouterResolve: "openrouter/moonshotai/kimi-k3"
100311
+ },
100312
+ // slug pins the m2 line for DB stability; resolve tracks the current m2.7.
100297
100313
  "minimax-m2.5": {
100298
100314
  displayName: "MiniMax M2",
100299
- resolve: "openrouter/minimax/minimax-m2.5",
100300
- openRouterResolve: "openrouter/minimax/minimax-m2.5"
100315
+ resolve: "openrouter/minimax/minimax-m2.7",
100316
+ openRouterResolve: "openrouter/minimax/minimax-m2.7"
100317
+ },
100318
+ "minimax-m3": {
100319
+ displayName: "MiniMax M3",
100320
+ resolve: "openrouter/minimax/minimax-m3",
100321
+ openRouterResolve: "openrouter/minimax/minimax-m3"
100301
100322
  }
100302
100323
  }
100303
100324
  })
@@ -100346,7 +100367,7 @@ var modelAliases = Object.entries(providers).flatMap(
100346
100367
  var AUTO_EFFICIENT = "auto/efficient";
100347
100368
  var AUTO_INTELLIGENT = "auto/intelligent";
100348
100369
  var AUTO_TIER_TARGET = {
100349
- [AUTO_EFFICIENT]: "moonshotai/kimi-k2",
100370
+ [AUTO_EFFICIENT]: "deepseek/deepseek-pro",
100350
100371
  [AUTO_INTELLIGENT]: "anthropic/claude-opus"
100351
100372
  };
100352
100373
  function isAutoTier(slug2) {
@@ -101072,7 +101093,7 @@ var import_semver = __toESM(require_semver2(), 1);
101072
101093
  // package.json
101073
101094
  var package_default = {
101074
101095
  name: "pullfrog",
101075
- version: "0.1.38",
101096
+ version: "0.1.39",
101076
101097
  type: "module",
101077
101098
  bin: {
101078
101099
  pullfrog: "dist/cli.mjs",
@@ -108340,6 +108361,19 @@ function geminiHighThinkingOverrides() {
108340
108361
  ])
108341
108362
  );
108342
108363
  }
108364
+ var KIMI_ENFORCERLESS_PROVIDERS = ["siliconflow", "together"];
108365
+ function kimiOpenRouterProviderOverrides() {
108366
+ return Object.fromEntries(
108367
+ modelAliases.map((a) => a.openRouterResolve).filter((r) => r?.includes("kimi") ?? false).map((r) => [
108368
+ r.replace(/^openrouter\//, ""),
108369
+ { options: { provider: { ignore: KIMI_ENFORCERLESS_PROVIDERS } } }
108370
+ ])
108371
+ );
108372
+ }
108373
+ function deepseekHighEffortOverrides() {
108374
+ const orModel = modelAliases.find((a) => a.slug === "deepseek/deepseek-pro")?.openRouterResolve?.replace(/^openrouter\//, "");
108375
+ return orModel ? { [orModel]: { options: { reasoning: { effort: "high" } } } } : {};
108376
+ }
108343
108377
  function buildReviewerAgentConfig(orchestratorModel) {
108344
108378
  const overrides = deriveSubagentModels(orchestratorModel);
108345
108379
  return {
@@ -108408,9 +108442,18 @@ function buildSecurityConfig(ctx, model) {
108408
108442
  log.info(`\xBB subagent models: reviewfrog=${reviewerModel}`);
108409
108443
  return cfg;
108410
108444
  })(),
108411
- // gemini-3 thinking pinned to high for review depth; gpt and anthropic
108412
- // effort set elsewhere (gpt: upstream default, anthropic: --effort flag in claude.ts).
108413
- provider: { google: { models: geminiHighThinkingOverrides() } }
108445
+ // gemini-3 thinking pinned to high for review depth; deepseek (funded
108446
+ // efficient tier) pinned to high reasoning effort, and kimi pinned away
108447
+ // from Enforcer-less openrouter providers (siliconflow / together) that
108448
+ // drop optional tool-call params — both per-model on the openrouter route,
108449
+ // so other models are unaffected. gpt/anthropic effort set elsewhere (gpt:
108450
+ // upstream default, anthropic: --effort flag in claude.ts). see opencodeShared.ts.
108451
+ provider: {
108452
+ google: { models: geminiHighThinkingOverrides() },
108453
+ openrouter: {
108454
+ models: { ...deepseekHighEffortOverrides(), ...kimiOpenRouterProviderOverrides() }
108455
+ }
108456
+ }
108414
108457
  };
108415
108458
  if (model) {
108416
108459
  config3.model = model;
package/dist/internal.js CHANGED
@@ -196,11 +196,20 @@ var providers = {
196
196
  displayName: "Moonshot AI",
197
197
  envVars: ["MOONSHOT_API_KEY"],
198
198
  models: {
199
+ // Moonshot's premium 1M-context multimodal reasoning flagship — pricier
200
+ // than K2.7-code, so it's the preferred BYOK pick but NOT the subsidized
201
+ // efficient default (that stays K2 via AUTO_EFFICIENT).
202
+ "kimi-k3": {
203
+ displayName: "Kimi K3",
204
+ resolve: "moonshotai/kimi-k3",
205
+ openRouterResolve: "openrouter/moonshotai/kimi-k3",
206
+ preferred: true,
207
+ subagentModel: "kimi-k2"
208
+ },
199
209
  "kimi-k2": {
200
210
  displayName: "Kimi K2",
201
211
  resolve: "moonshotai/kimi-k2.7-code",
202
- openRouterResolve: "openrouter/moonshotai/kimi-k2.7-code",
203
- preferred: true
212
+ openRouterResolve: "openrouter/moonshotai/kimi-k2.7-code"
204
213
  }
205
214
  }
206
215
  }),
@@ -294,10 +303,11 @@ var providers = {
294
303
  resolve: "opencode/kimi-k2.6",
295
304
  openRouterResolve: "openrouter/moonshotai/kimi-k2.7-code"
296
305
  },
306
+ // Zen serves m2.5; the funded OpenRouter path tracks the current m2.7.
297
307
  "minimax-m2.5": {
298
308
  displayName: "MiniMax M2",
299
309
  resolve: "opencode/minimax-m2.5",
300
- openRouterResolve: "openrouter/minimax/minimax-m2.5"
310
+ openRouterResolve: "openrouter/minimax/minimax-m2.7"
301
311
  },
302
312
  "gpt-5-nano": {
303
313
  displayName: "GPT Nano",
@@ -485,10 +495,21 @@ var providers = {
485
495
  resolve: "openrouter/moonshotai/kimi-k2.7-code",
486
496
  openRouterResolve: "openrouter/moonshotai/kimi-k2.7-code"
487
497
  },
498
+ "kimi-k3": {
499
+ displayName: "Kimi K3",
500
+ resolve: "openrouter/moonshotai/kimi-k3",
501
+ openRouterResolve: "openrouter/moonshotai/kimi-k3"
502
+ },
503
+ // slug pins the m2 line for DB stability; resolve tracks the current m2.7.
488
504
  "minimax-m2.5": {
489
505
  displayName: "MiniMax M2",
490
- resolve: "openrouter/minimax/minimax-m2.5",
491
- openRouterResolve: "openrouter/minimax/minimax-m2.5"
506
+ resolve: "openrouter/minimax/minimax-m2.7",
507
+ openRouterResolve: "openrouter/minimax/minimax-m2.7"
508
+ },
509
+ "minimax-m3": {
510
+ displayName: "MiniMax M3",
511
+ resolve: "openrouter/minimax/minimax-m3",
512
+ openRouterResolve: "openrouter/minimax/minimax-m3"
492
513
  }
493
514
  }
494
515
  })
@@ -546,7 +567,7 @@ var modelAliases = Object.entries(providers).flatMap(
546
567
  var AUTO_EFFICIENT = "auto/efficient";
547
568
  var AUTO_INTELLIGENT = "auto/intelligent";
548
569
  var AUTO_TIER_TARGET = {
549
- [AUTO_EFFICIENT]: "moonshotai/kimi-k2",
570
+ [AUTO_EFFICIENT]: "deepseek/deepseek-pro",
550
571
  [AUTO_INTELLIGENT]: "anthropic/claude-opus"
551
572
  };
552
573
  function isAutoTier(slug) {
package/dist/models.d.ts CHANGED
@@ -121,9 +121,11 @@ export declare const modelAliases: ModelAlias[];
121
121
  * concrete alias by `resolveDisplayAlias` below, so every downstream consumer
122
122
  * (CLI resolve, OpenRouter resolve, footer label) handles them transparently.
123
123
  *
124
- * `efficient` mirrors the OSS/default subsidy model (Kimi K2fast + cheap);
125
- * `intelligent` is the frontier pick (Claude Opus). a `null` model means the
126
- * tier hasn't been pinned: callers default by card status via `defaultAutoTier`.
124
+ * `efficient` mirrors the OSS/default subsidy model (DeepSeek V4 Pro beats
125
+ * Kimi K2.7 on agentic-review quality at ~4-5x lower cost, run at high
126
+ * reasoning effort via `deepseekHighEffortOverrides`); `intelligent` is the
127
+ * frontier pick (Claude Opus). a `null` model means the tier hasn't been
128
+ * pinned: callers default by card status via `defaultAutoTier`.
127
129
  */
128
130
  export declare const AUTO_EFFICIENT = "auto/efficient";
129
131
  export declare const AUTO_INTELLIGENT = "auto/intelligent";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pullfrog",
3
- "version": "0.1.38",
3
+ "version": "0.1.39",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "pullfrog": "dist/cli.mjs",