pullfrog 0.1.37 → 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.
- package/dist/agents/opencodeShared.d.ts +37 -0
- package/dist/cli.mjs +67 -11
- package/dist/index.js +66 -10
- package/dist/internal.js +27 -6
- package/dist/models.d.ts +5 -3
- package/package.json +1 -1
|
@@ -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.
|
|
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.
|
|
102229
|
-
openRouterResolve: "openrouter/minimax/minimax-m2.
|
|
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]: "
|
|
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.
|
|
103025
|
+
version: "0.1.39",
|
|
103005
103026
|
type: "module",
|
|
103006
103027
|
bin: {
|
|
103007
103028
|
pullfrog: "dist/cli.mjs",
|
|
@@ -104375,6 +104396,7 @@ async function finalizeAgentResult(params) {
|
|
|
104375
104396
|
}
|
|
104376
104397
|
var REFLECTION_SKIP_MODES = /* @__PURE__ */ new Set(["IncrementalReview"]);
|
|
104377
104398
|
function shouldRunReflection(mode) {
|
|
104399
|
+
if (process.env.PULLFROG_DISABLE_LEARNINGS_REFLECTION === "1") return false;
|
|
104378
104400
|
if (!mode) return true;
|
|
104379
104401
|
return !REFLECTION_SKIP_MODES.has(mode);
|
|
104380
104402
|
}
|
|
@@ -110226,6 +110248,19 @@ function geminiHighThinkingOverrides() {
|
|
|
110226
110248
|
])
|
|
110227
110249
|
);
|
|
110228
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
|
+
}
|
|
110229
110264
|
function buildReviewerAgentConfig(orchestratorModel) {
|
|
110230
110265
|
const overrides = deriveSubagentModels(orchestratorModel);
|
|
110231
110266
|
return {
|
|
@@ -110294,9 +110329,18 @@ function buildSecurityConfig(ctx, model) {
|
|
|
110294
110329
|
log.info(`\xBB subagent models: reviewfrog=${reviewerModel}`);
|
|
110295
110330
|
return cfg;
|
|
110296
110331
|
})(),
|
|
110297
|
-
// gemini-3 thinking pinned to high for review depth;
|
|
110298
|
-
//
|
|
110299
|
-
|
|
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
|
+
}
|
|
110300
110344
|
};
|
|
110301
110345
|
if (model) {
|
|
110302
110346
|
config3.model = model;
|
|
@@ -158384,6 +158428,14 @@ var PushBranch = type({
|
|
|
158384
158428
|
"cross-repo runs only: the writable secondary repo whose checkout to push from (bare name, from list_repos). omit for the primary repo."
|
|
158385
158429
|
)
|
|
158386
158430
|
});
|
|
158431
|
+
function assertWritableMode(ctx, toolName) {
|
|
158432
|
+
const mode = ctx.toolState?.selectedMode;
|
|
158433
|
+
if (mode && NON_COMMITTING_MODES.has(mode)) {
|
|
158434
|
+
throw new Error(
|
|
158435
|
+
`${toolName} is blocked in ${mode} mode \u2014 review and plan runs must not push or commit code. finish by submitting your review (create_pull_request_review) or plan. if this PR genuinely needs a code change, that is a separate task from reviewing it.`
|
|
158436
|
+
);
|
|
158437
|
+
}
|
|
158438
|
+
}
|
|
158387
158439
|
function assertPushTarget(ctx, params) {
|
|
158388
158440
|
const branch = params.branch;
|
|
158389
158441
|
const pushDest = params.pushDest;
|
|
@@ -158508,6 +158560,7 @@ function PushBranchTool(ctx) {
|
|
|
158508
158560
|
if (pushPermission === "disabled") {
|
|
158509
158561
|
throw new Error("Push is disabled. This repository is configured for read-only access.");
|
|
158510
158562
|
}
|
|
158563
|
+
assertWritableMode(ctx, "push_branch");
|
|
158511
158564
|
const rc = resolveRepoCtx(ctx, repo);
|
|
158512
158565
|
if (rc.access === "read") {
|
|
158513
158566
|
throw new Error(
|
|
@@ -158634,6 +158687,7 @@ function CommitChangesTool(ctx) {
|
|
|
158634
158687
|
if (pushPermission === "disabled") {
|
|
158635
158688
|
throw new Error("Push is disabled. This repository is configured for read-only access.");
|
|
158636
158689
|
}
|
|
158690
|
+
assertWritableMode(ctx, "commit_changes");
|
|
158637
158691
|
const branch = $2("git", ["rev-parse", "--abbrev-ref", "HEAD"], { log: false }).trim();
|
|
158638
158692
|
if (branch === "HEAD") {
|
|
158639
158693
|
throw new Error(
|
|
@@ -158972,6 +159026,7 @@ function DeleteBranchTool(ctx) {
|
|
|
158972
159026
|
"Branch deletion requires push: enabled permission. Current mode only allows pushing to non-protected branches."
|
|
158973
159027
|
);
|
|
158974
159028
|
}
|
|
159029
|
+
assertWritableMode(ctx, "delete_branch");
|
|
158975
159030
|
rejectSpecialRef(params.branchName, "branchName");
|
|
158976
159031
|
if (params.branchName === defaultBranch) {
|
|
158977
159032
|
throw new Error(
|
|
@@ -159005,6 +159060,7 @@ function PushTagsTool(ctx) {
|
|
|
159005
159060
|
"Tag pushing requires push: enabled permission. Current mode only allows pushing branches."
|
|
159006
159061
|
);
|
|
159007
159062
|
}
|
|
159063
|
+
assertWritableMode(ctx, "push_tags");
|
|
159008
159064
|
validateTagName(params.tag);
|
|
159009
159065
|
const pushArgs = [...params.force ? ["-f"] : [], "origin", `refs/tags/${params.tag}`];
|
|
159010
159066
|
await pushWithRetry(pushArgs, ctx.gitToken, ctx.refreshGitToken);
|
|
@@ -168461,7 +168517,7 @@ async function runCli4(input) {
|
|
|
168461
168517
|
}
|
|
168462
168518
|
|
|
168463
168519
|
// cli.ts
|
|
168464
|
-
var VERSION10 = "0.1.
|
|
168520
|
+
var VERSION10 = "0.1.39";
|
|
168465
168521
|
var bin = basename2(process.argv[1] || "");
|
|
168466
168522
|
var PROG = bin === "pf" || bin === "pullfrog" ? bin : "pullfrog";
|
|
168467
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.
|
|
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.
|
|
100300
|
-
openRouterResolve: "openrouter/minimax/minimax-m2.
|
|
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]: "
|
|
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.
|
|
101096
|
+
version: "0.1.39",
|
|
101076
101097
|
type: "module",
|
|
101077
101098
|
bin: {
|
|
101078
101099
|
pullfrog: "dist/cli.mjs",
|
|
@@ -102446,6 +102467,7 @@ async function finalizeAgentResult(params) {
|
|
|
102446
102467
|
}
|
|
102447
102468
|
var REFLECTION_SKIP_MODES = /* @__PURE__ */ new Set(["IncrementalReview"]);
|
|
102448
102469
|
function shouldRunReflection(mode) {
|
|
102470
|
+
if (process.env.PULLFROG_DISABLE_LEARNINGS_REFLECTION === "1") return false;
|
|
102449
102471
|
if (!mode) return true;
|
|
102450
102472
|
return !REFLECTION_SKIP_MODES.has(mode);
|
|
102451
102473
|
}
|
|
@@ -108339,6 +108361,19 @@ function geminiHighThinkingOverrides() {
|
|
|
108339
108361
|
])
|
|
108340
108362
|
);
|
|
108341
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
|
+
}
|
|
108342
108377
|
function buildReviewerAgentConfig(orchestratorModel) {
|
|
108343
108378
|
const overrides = deriveSubagentModels(orchestratorModel);
|
|
108344
108379
|
return {
|
|
@@ -108407,9 +108442,18 @@ function buildSecurityConfig(ctx, model) {
|
|
|
108407
108442
|
log.info(`\xBB subagent models: reviewfrog=${reviewerModel}`);
|
|
108408
108443
|
return cfg;
|
|
108409
108444
|
})(),
|
|
108410
|
-
// gemini-3 thinking pinned to high for review depth;
|
|
108411
|
-
//
|
|
108412
|
-
|
|
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
|
+
}
|
|
108413
108457
|
};
|
|
108414
108458
|
if (model) {
|
|
108415
108459
|
config3.model = model;
|
|
@@ -156497,6 +156541,14 @@ var PushBranch = type({
|
|
|
156497
156541
|
"cross-repo runs only: the writable secondary repo whose checkout to push from (bare name, from list_repos). omit for the primary repo."
|
|
156498
156542
|
)
|
|
156499
156543
|
});
|
|
156544
|
+
function assertWritableMode(ctx, toolName) {
|
|
156545
|
+
const mode = ctx.toolState?.selectedMode;
|
|
156546
|
+
if (mode && NON_COMMITTING_MODES.has(mode)) {
|
|
156547
|
+
throw new Error(
|
|
156548
|
+
`${toolName} is blocked in ${mode} mode \u2014 review and plan runs must not push or commit code. finish by submitting your review (create_pull_request_review) or plan. if this PR genuinely needs a code change, that is a separate task from reviewing it.`
|
|
156549
|
+
);
|
|
156550
|
+
}
|
|
156551
|
+
}
|
|
156500
156552
|
function assertPushTarget(ctx, params) {
|
|
156501
156553
|
const branch = params.branch;
|
|
156502
156554
|
const pushDest = params.pushDest;
|
|
@@ -156621,6 +156673,7 @@ function PushBranchTool(ctx) {
|
|
|
156621
156673
|
if (pushPermission === "disabled") {
|
|
156622
156674
|
throw new Error("Push is disabled. This repository is configured for read-only access.");
|
|
156623
156675
|
}
|
|
156676
|
+
assertWritableMode(ctx, "push_branch");
|
|
156624
156677
|
const rc = resolveRepoCtx(ctx, repo);
|
|
156625
156678
|
if (rc.access === "read") {
|
|
156626
156679
|
throw new Error(
|
|
@@ -156747,6 +156800,7 @@ function CommitChangesTool(ctx) {
|
|
|
156747
156800
|
if (pushPermission === "disabled") {
|
|
156748
156801
|
throw new Error("Push is disabled. This repository is configured for read-only access.");
|
|
156749
156802
|
}
|
|
156803
|
+
assertWritableMode(ctx, "commit_changes");
|
|
156750
156804
|
const branch = $("git", ["rev-parse", "--abbrev-ref", "HEAD"], { log: false }).trim();
|
|
156751
156805
|
if (branch === "HEAD") {
|
|
156752
156806
|
throw new Error(
|
|
@@ -157085,6 +157139,7 @@ function DeleteBranchTool(ctx) {
|
|
|
157085
157139
|
"Branch deletion requires push: enabled permission. Current mode only allows pushing to non-protected branches."
|
|
157086
157140
|
);
|
|
157087
157141
|
}
|
|
157142
|
+
assertWritableMode(ctx, "delete_branch");
|
|
157088
157143
|
rejectSpecialRef(params.branchName, "branchName");
|
|
157089
157144
|
if (params.branchName === defaultBranch) {
|
|
157090
157145
|
throw new Error(
|
|
@@ -157118,6 +157173,7 @@ function PushTagsTool(ctx) {
|
|
|
157118
157173
|
"Tag pushing requires push: enabled permission. Current mode only allows pushing branches."
|
|
157119
157174
|
);
|
|
157120
157175
|
}
|
|
157176
|
+
assertWritableMode(ctx, "push_tags");
|
|
157121
157177
|
validateTagName(params.tag);
|
|
157122
157178
|
const pushArgs = [...params.force ? ["-f"] : [], "origin", `refs/tags/${params.tag}`];
|
|
157123
157179
|
await pushWithRetry(pushArgs, ctx.gitToken, ctx.refreshGitToken);
|
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.
|
|
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.
|
|
491
|
-
openRouterResolve: "openrouter/minimax/minimax-m2.
|
|
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]: "
|
|
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 (
|
|
125
|
-
*
|
|
126
|
-
*
|
|
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";
|