pullfrog 0.1.81 → 0.1.83
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/claudePretoolGate.d.ts +6 -6
- package/dist/agents/opencodePlugin.d.ts +5 -0
- package/dist/cli.mjs +376 -214
- package/dist/index.js +361 -202
- package/dist/internal.js +156 -95
- package/dist/mcp/searchIssues.d.ts +8 -0
- package/dist/mcp/server.d.ts +1 -0
- package/dist/utils/normalizeEnv.d.ts +1 -1
- package/dist/utils/overrides.d.ts +1 -1
- package/dist/utils/runContext.d.ts +1 -0
- package/dist/utils/runErrorRenderer.d.ts +5 -0
- package/dist/utils/secretCommands.d.ts +20 -0
- package/package.json +3 -2
package/dist/index.js
CHANGED
|
@@ -19718,10 +19718,10 @@ var require_core = __commonJS({
|
|
|
19718
19718
|
(0, command_1.issueCommand)("set-env", { name }, convertedVal);
|
|
19719
19719
|
}
|
|
19720
19720
|
exports.exportVariable = exportVariable;
|
|
19721
|
-
function
|
|
19721
|
+
function setSecret2(secret) {
|
|
19722
19722
|
(0, command_1.issueCommand)("add-mask", {}, secret);
|
|
19723
19723
|
}
|
|
19724
|
-
exports.setSecret =
|
|
19724
|
+
exports.setSecret = setSecret2;
|
|
19725
19725
|
function addPath(inputPath) {
|
|
19726
19726
|
const filePath = process.env["GITHUB_PATH"] || "";
|
|
19727
19727
|
if (filePath) {
|
|
@@ -19763,7 +19763,7 @@ var require_core = __commonJS({
|
|
|
19763
19763
|
Support boolean input list: \`true | True | TRUE | false | False | FALSE\``);
|
|
19764
19764
|
}
|
|
19765
19765
|
exports.getBooleanInput = getBooleanInput;
|
|
19766
|
-
function
|
|
19766
|
+
function setOutput3(name, value2) {
|
|
19767
19767
|
const filePath = process.env["GITHUB_OUTPUT"] || "";
|
|
19768
19768
|
if (filePath) {
|
|
19769
19769
|
return (0, file_command_1.issueFileCommand)("OUTPUT", (0, file_command_1.prepareKeyValueMessage)(name, value2));
|
|
@@ -19771,7 +19771,7 @@ Support boolean input list: \`true | True | TRUE | false | False | FALSE\``);
|
|
|
19771
19771
|
process.stdout.write(os2.EOL);
|
|
19772
19772
|
(0, command_1.issueCommand)("set-output", { name }, (0, utils_1.toCommandValue)(value2));
|
|
19773
19773
|
}
|
|
19774
|
-
exports.setOutput =
|
|
19774
|
+
exports.setOutput = setOutput3;
|
|
19775
19775
|
function setCommandEcho(enabled) {
|
|
19776
19776
|
(0, command_1.issue)("echo", enabled ? "on" : "off");
|
|
19777
19777
|
}
|
|
@@ -19826,14 +19826,14 @@ Support boolean input list: \`true | True | TRUE | false | False | FALSE\``);
|
|
|
19826
19826
|
});
|
|
19827
19827
|
}
|
|
19828
19828
|
exports.group = group2;
|
|
19829
|
-
function
|
|
19829
|
+
function saveState2(name, value2) {
|
|
19830
19830
|
const filePath = process.env["GITHUB_STATE"] || "";
|
|
19831
19831
|
if (filePath) {
|
|
19832
19832
|
return (0, file_command_1.issueFileCommand)("STATE", (0, file_command_1.prepareKeyValueMessage)(name, value2));
|
|
19833
19833
|
}
|
|
19834
19834
|
(0, command_1.issueCommand)("save-state", { name }, (0, utils_1.toCommandValue)(value2));
|
|
19835
19835
|
}
|
|
19836
|
-
exports.saveState =
|
|
19836
|
+
exports.saveState = saveState2;
|
|
19837
19837
|
function getState2(name) {
|
|
19838
19838
|
return process.env[`STATE_${name}`] || "";
|
|
19839
19839
|
}
|
|
@@ -27621,11 +27621,11 @@ var require_mode = __commonJS({
|
|
|
27621
27621
|
var require_isexe = __commonJS({
|
|
27622
27622
|
"node_modules/.pnpm/isexe@2.0.0/node_modules/isexe/index.js"(exports, module) {
|
|
27623
27623
|
var fs5 = __require("fs");
|
|
27624
|
-
var
|
|
27624
|
+
var core8;
|
|
27625
27625
|
if (process.platform === "win32" || global.TESTING_WINDOWS) {
|
|
27626
|
-
|
|
27626
|
+
core8 = require_windows();
|
|
27627
27627
|
} else {
|
|
27628
|
-
|
|
27628
|
+
core8 = require_mode();
|
|
27629
27629
|
}
|
|
27630
27630
|
module.exports = isexe;
|
|
27631
27631
|
isexe.sync = sync;
|
|
@@ -27648,7 +27648,7 @@ var require_isexe = __commonJS({
|
|
|
27648
27648
|
});
|
|
27649
27649
|
});
|
|
27650
27650
|
}
|
|
27651
|
-
|
|
27651
|
+
core8(path4, options || {}, function(er, is) {
|
|
27652
27652
|
if (er) {
|
|
27653
27653
|
if (er.code === "EACCES" || options && options.ignoreErrors) {
|
|
27654
27654
|
er = null;
|
|
@@ -27660,7 +27660,7 @@ var require_isexe = __commonJS({
|
|
|
27660
27660
|
}
|
|
27661
27661
|
function sync(path4, options) {
|
|
27662
27662
|
try {
|
|
27663
|
-
return
|
|
27663
|
+
return core8.sync(path4, options || {});
|
|
27664
27664
|
} catch (er) {
|
|
27665
27665
|
if (options && options.ignoreErrors || er.code === "EACCES") {
|
|
27666
27666
|
return false;
|
|
@@ -80800,7 +80800,7 @@ var require_core3 = __commonJS({
|
|
|
80800
80800
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
80801
80801
|
var id_1 = require_id();
|
|
80802
80802
|
var ref_1 = require_ref();
|
|
80803
|
-
var
|
|
80803
|
+
var core8 = [
|
|
80804
80804
|
"$schema",
|
|
80805
80805
|
"$id",
|
|
80806
80806
|
"$defs",
|
|
@@ -80810,7 +80810,7 @@ var require_core3 = __commonJS({
|
|
|
80810
80810
|
id_1.default,
|
|
80811
80811
|
ref_1.default
|
|
80812
80812
|
];
|
|
80813
|
-
exports.default =
|
|
80813
|
+
exports.default = core8;
|
|
80814
80814
|
}
|
|
80815
80815
|
});
|
|
80816
80816
|
|
|
@@ -107771,19 +107771,19 @@ var providers = {
|
|
|
107771
107771
|
// API is the source of truth (#959).
|
|
107772
107772
|
"claude-fable": {
|
|
107773
107773
|
displayName: "Claude Fable",
|
|
107774
|
-
resolve: "anthropic/claude-fable-5",
|
|
107774
|
+
resolve: "anthropic/claude-fable-5-1",
|
|
107775
107775
|
effort: ["low", "medium", "high", "xhigh", "max"],
|
|
107776
107776
|
// rolling alias: models.dev's OpenRouter mirror lags brand-new pinned
|
|
107777
|
-
// versions (claude-fable-5
|
|
107777
|
+
// versions (claude-fable-5 was missing there when this was added), so track ~…-latest to
|
|
107778
107778
|
// stay catalog-valid and auto-follow version bumps.
|
|
107779
107779
|
openRouterResolve: "openrouter/~anthropic/claude-fable-latest",
|
|
107780
107780
|
subagentModel: "claude-sonnet"
|
|
107781
107781
|
},
|
|
107782
107782
|
"claude-opus": {
|
|
107783
107783
|
displayName: "Claude Opus",
|
|
107784
|
-
resolve: "anthropic/claude-opus-5",
|
|
107784
|
+
resolve: "anthropic/claude-opus-5-5",
|
|
107785
107785
|
effort: ["low", "medium", "high", "xhigh", "max"],
|
|
107786
|
-
openRouterResolve: "openrouter/anthropic/claude-opus-5",
|
|
107786
|
+
openRouterResolve: "openrouter/anthropic/claude-opus-5.5",
|
|
107787
107787
|
preferred: true,
|
|
107788
107788
|
subagentModel: "claude-sonnet"
|
|
107789
107789
|
},
|
|
@@ -107818,9 +107818,9 @@ var providers = {
|
|
|
107818
107818
|
},
|
|
107819
107819
|
"gpt-sol": {
|
|
107820
107820
|
displayName: "GPT Sol",
|
|
107821
|
-
resolve: "openai/gpt-
|
|
107821
|
+
resolve: "openai/gpt-6-sol",
|
|
107822
107822
|
effort: ["none", "low", "medium", "high", "xhigh", "max"],
|
|
107823
|
-
openRouterResolve: "openrouter/openai/gpt-
|
|
107823
|
+
openRouterResolve: "openrouter/openai/gpt-6-sol",
|
|
107824
107824
|
preferred: true,
|
|
107825
107825
|
subagentModel: "gpt-terra"
|
|
107826
107826
|
},
|
|
@@ -107830,9 +107830,9 @@ var providers = {
|
|
|
107830
107830
|
"gpt-sol-pro": {
|
|
107831
107831
|
displayName: "GPT Sol Pro",
|
|
107832
107832
|
description: "Maximum reasoning effort",
|
|
107833
|
-
resolve: "openai/gpt-
|
|
107833
|
+
resolve: "openai/gpt-6-sol",
|
|
107834
107834
|
effort: ["none", "low", "medium", "high", "xhigh", "max"],
|
|
107835
|
-
openRouterResolve: "openrouter/openai/gpt-
|
|
107835
|
+
openRouterResolve: "openrouter/openai/gpt-6-sol-pro",
|
|
107836
107836
|
subagentModel: "gpt-sol"
|
|
107837
107837
|
},
|
|
107838
107838
|
// gpt-5.6's balanced mid-tier. selectable on its own and doubles as Sol's
|
|
@@ -107845,9 +107845,9 @@ var providers = {
|
|
|
107845
107845
|
},
|
|
107846
107846
|
"gpt-luna": {
|
|
107847
107847
|
displayName: "GPT Luna",
|
|
107848
|
-
resolve: "openai/gpt-
|
|
107848
|
+
resolve: "openai/gpt-6-luna",
|
|
107849
107849
|
effort: ["none", "low", "medium", "high", "xhigh", "max"],
|
|
107850
|
-
openRouterResolve: "openrouter/openai/gpt-
|
|
107850
|
+
openRouterResolve: "openrouter/openai/gpt-6-luna"
|
|
107851
107851
|
},
|
|
107852
107852
|
// legacy aliases — openai unified the codex line into the main GPT family
|
|
107853
107853
|
// and is shutting down every "-codex" snapshot on 2026-07-23. transparently
|
|
@@ -107941,9 +107941,9 @@ var providers = {
|
|
|
107941
107941
|
models: {
|
|
107942
107942
|
grok: {
|
|
107943
107943
|
displayName: "Grok",
|
|
107944
|
-
resolve: "xai/grok-4.
|
|
107944
|
+
resolve: "xai/grok-4.7",
|
|
107945
107945
|
effort: ["low", "medium", "high", "xhigh"],
|
|
107946
|
-
openRouterResolve: "openrouter/x-ai/grok-4.
|
|
107946
|
+
openRouterResolve: "openrouter/x-ai/grok-4.7",
|
|
107947
107947
|
preferred: true
|
|
107948
107948
|
},
|
|
107949
107949
|
// the Smart ladder's cheap rung: 1.25/2.5 against 4.6's 2/6, and a 0.2
|
|
@@ -107958,17 +107958,17 @@ var providers = {
|
|
|
107958
107958
|
// 2026-05-15 (https://docs.x.ai/developers/migration/may-15-deprecation)
|
|
107959
107959
|
// and now redirects every deprecated text-model slug to grok-4.3 at
|
|
107960
107960
|
// standard pricing. fall back to the live `xai/grok` so the alias
|
|
107961
|
-
// chain resolves to grok-4.
|
|
107961
|
+
// chain resolves to grok-4.7 for both direct-key and OpenRouter users.
|
|
107962
107962
|
"grok-fast": {
|
|
107963
107963
|
displayName: "Grok Fast",
|
|
107964
107964
|
resolve: "xai/grok-4-1-fast",
|
|
107965
|
-
openRouterResolve: "openrouter/x-ai/grok-4.
|
|
107965
|
+
openRouterResolve: "openrouter/x-ai/grok-4.7",
|
|
107966
107966
|
fallback: "xai/grok"
|
|
107967
107967
|
},
|
|
107968
107968
|
"grok-code-fast": {
|
|
107969
107969
|
displayName: "Grok Code Fast",
|
|
107970
107970
|
resolve: "xai/grok-code-fast-1",
|
|
107971
|
-
openRouterResolve: "openrouter/x-ai/grok-4.
|
|
107971
|
+
openRouterResolve: "openrouter/x-ai/grok-4.7",
|
|
107972
107972
|
fallback: "xai/grok"
|
|
107973
107973
|
}
|
|
107974
107974
|
}
|
|
@@ -107996,8 +107996,9 @@ var providers = {
|
|
|
107996
107996
|
"deepseek-pro": {
|
|
107997
107997
|
displayName: "DeepSeek Pro",
|
|
107998
107998
|
resolve: "deepseek/deepseek-v4-pro",
|
|
107999
|
-
|
|
108000
|
-
|
|
107999
|
+
// models.dev gave the direct id V4.1-Flash's ladder on 2026-09-21, which
|
|
108000
|
+
// is what DeepSeek now serves under it — and the same as the Router pin's.
|
|
108001
|
+
effort: ["low", "high", "max"],
|
|
108001
108002
|
openRouterResolve: "openrouter/deepseek/deepseek-v4-pro-0813",
|
|
108002
108003
|
preferred: true
|
|
108003
108004
|
},
|
|
@@ -108061,12 +108062,20 @@ var providers = {
|
|
|
108061
108062
|
// the same models as `moonshotai` above, billed against a Kimi membership
|
|
108062
108063
|
// instead of a Moonshot API balance — a separate endpoint, separate model
|
|
108063
108064
|
// ids and a separate key, which is why it is a provider rather than a second
|
|
108064
|
-
// `envVars` entry. no provider injection is needed: models.dev carries
|
|
108065
|
-
//
|
|
108066
|
-
// `@ai-sdk/
|
|
108065
|
+
// `envVars` entry. no provider injection is needed: models.dev carries the
|
|
108066
|
+
// provider (api `https://api.kimi.com/coding/v1`, npm
|
|
108067
|
+
// `@ai-sdk/openai-compatible`) and opencode's env loop enables it from a bare
|
|
108067
108068
|
// `KIMI_API_KEY`, verified against our pinned opencode-ai@1.18.5 — all four
|
|
108068
108069
|
// ids list in `opencode models` and a run reaches Kimi's own auth check.
|
|
108069
108070
|
//
|
|
108071
|
+
// models.dev renamed that provider on 2026-09-18: `kimi-for-coding` became
|
|
108072
|
+
// `kimi-code-plan-cn` (api.kimi.com — where the console mints the key) and
|
|
108073
|
+
// `kimi-code-plan-global` (api.kimi.ai). opencode resolves providers from
|
|
108074
|
+
// its models.dev cache, so a `resolve` still spelling the old key names a
|
|
108075
|
+
// provider it does not know. the `resolve` targets track models.dev's key;
|
|
108076
|
+
// the provider KEY below is Pullfrog's slug and stays put. see
|
|
108077
|
+
// wiki/kimi-code.md.
|
|
108078
|
+
//
|
|
108070
108079
|
// NO `openRouterResolve` ON PURPOSE. OpenRouter cannot serve a Kimi
|
|
108071
108080
|
// membership, so a Router path here would silently bill the wallet for
|
|
108072
108081
|
// Moonshot pay-as-you-go under a slug picked for the opposite reason. The
|
|
@@ -108076,9 +108085,11 @@ var providers = {
|
|
|
108076
108085
|
// keyless Router pick to the default subsidy model with `noRouterPath`.
|
|
108077
108086
|
"kimi-for-coding": provider({
|
|
108078
108087
|
// "Kimi Code" is the product name on kimi.com/code and in the console the
|
|
108079
|
-
// key is minted from.
|
|
108080
|
-
//
|
|
108081
|
-
// `
|
|
108088
|
+
// key is minted from. the provider KEY stays `kimi-for-coding`: it is the
|
|
108089
|
+
// slug prefix every stored pick, `--model` flag and BYOK card spells, and
|
|
108090
|
+
// it is not what reaches opencode — `enabled_providers` is derived from
|
|
108091
|
+
// the `resolve` prefix (`action/agents/opencode.ts`), which is why the
|
|
108092
|
+
// two may differ here and nowhere else in this file.
|
|
108082
108093
|
displayName: "Kimi Code",
|
|
108083
108094
|
envVars: ["KIMI_API_KEY"],
|
|
108084
108095
|
models: {
|
|
@@ -108089,7 +108100,7 @@ var providers = {
|
|
|
108089
108100
|
"kimi-k3": {
|
|
108090
108101
|
displayName: "Kimi K3",
|
|
108091
108102
|
description: "1M context, but only on Allegretto and above \xB7 Moderato caps it at 256K",
|
|
108092
|
-
resolve: "kimi-
|
|
108103
|
+
resolve: "kimi-code-plan-cn/k3",
|
|
108093
108104
|
effort: ["low", "high", "max"],
|
|
108094
108105
|
subagentModel: "kimi-k2"
|
|
108095
108106
|
},
|
|
@@ -108104,7 +108115,7 @@ var providers = {
|
|
|
108104
108115
|
"kimi-k3-256k": {
|
|
108105
108116
|
displayName: "Kimi K3 256K",
|
|
108106
108117
|
description: "Same model at 256K for ~half the quota \xB7 Moderato or above",
|
|
108107
|
-
resolve: "kimi-
|
|
108118
|
+
resolve: "kimi-code-plan-cn/k3-256k",
|
|
108108
108119
|
effort: ["low", "high", "max"],
|
|
108109
108120
|
preferred: true,
|
|
108110
108121
|
subagentModel: "kimi-k2"
|
|
@@ -108112,7 +108123,7 @@ var providers = {
|
|
|
108112
108123
|
"kimi-k2": {
|
|
108113
108124
|
displayName: "Kimi K2",
|
|
108114
108125
|
description: "Included in every Kimi membership tier",
|
|
108115
|
-
resolve: "kimi-
|
|
108126
|
+
resolve: "kimi-code-plan-cn/kimi-for-coding",
|
|
108116
108127
|
// models.dev published this ladder on 2026-09-14; the catalog gate
|
|
108117
108128
|
// mirrors it, so main was red until the alias carried it too.
|
|
108118
108129
|
effort: ["low", "high", "max"]
|
|
@@ -108120,7 +108131,7 @@ var providers = {
|
|
|
108120
108131
|
"kimi-k2-highspeed": {
|
|
108121
108132
|
displayName: "Kimi K2 HighSpeed",
|
|
108122
108133
|
description: "~6x output speed for ~3x quota \xB7 needs Allegretto or above",
|
|
108123
|
-
resolve: "kimi-
|
|
108134
|
+
resolve: "kimi-code-plan-cn/kimi-for-coding-highspeed"
|
|
108124
108135
|
}
|
|
108125
108136
|
}
|
|
108126
108137
|
}),
|
|
@@ -108185,24 +108196,15 @@ var providers = {
|
|
|
108185
108196
|
},
|
|
108186
108197
|
"claude-opus": {
|
|
108187
108198
|
displayName: "Claude Opus",
|
|
108188
|
-
resolve: "opencode/claude-opus-5",
|
|
108199
|
+
resolve: "opencode/claude-opus-5-5",
|
|
108189
108200
|
effort: ["low", "medium", "high", "xhigh", "max"],
|
|
108190
|
-
openRouterResolve: "openrouter/anthropic/claude-opus-5",
|
|
108191
|
-
subagentModel: "claude-sonnet"
|
|
108192
|
-
//
|
|
108193
|
-
//
|
|
108194
|
-
//
|
|
108195
|
-
//
|
|
108196
|
-
//
|
|
108197
|
-
// claude-fable-5 all 200 on the same key). opencode retries above the AI
|
|
108198
|
-
// SDK emitting no part.updated, so a run just produces nothing until it is
|
|
108199
|
-
// killed — metaideas/init logged six zero-output failures from 2026-08-23.
|
|
108200
|
-
// The 503 has since cleared and the model is STILL unusable: re-measured
|
|
108201
|
-
// 2026-08-26, direct POST /zen/v1/messages is 10/10 200 at 1.3-4.1s while
|
|
108202
|
-
// `opencode run --model opencode/claude-opus-5` on the same trivial prompt
|
|
108203
|
-
// emitted nothing for 240s in CI. A raw-endpoint 200 is not runtime
|
|
108204
|
-
// availability. see wiki/opencode-silent-stall.md
|
|
108205
|
-
fallback: "opencode/claude-sonnet"
|
|
108201
|
+
openRouterResolve: "openrouter/anthropic/claude-opus-5.5",
|
|
108202
|
+
subagentModel: "claude-sonnet"
|
|
108203
|
+
// fell back to Sonnet from 2026-08-25 to 2026-09-25: Zen listed
|
|
108204
|
+
// claude-opus-5 while `opencode run` on it emitted nothing for 240s. A
|
|
108205
|
+
// raw-endpoint 200 is not runtime availability — the fallback was cleared
|
|
108206
|
+
// only once `opencode run` completed on both claude-opus-5 and 5-5. see
|
|
108207
|
+
// wiki/opencode-silent-stall.md
|
|
108206
108208
|
},
|
|
108207
108209
|
"claude-sonnet": {
|
|
108208
108210
|
displayName: "Claude Sonnet",
|
|
@@ -108217,9 +108219,9 @@ var providers = {
|
|
|
108217
108219
|
},
|
|
108218
108220
|
"gpt-sol": {
|
|
108219
108221
|
displayName: "GPT Sol",
|
|
108220
|
-
resolve: "opencode/gpt-
|
|
108222
|
+
resolve: "opencode/gpt-6-sol",
|
|
108221
108223
|
effort: ["none", "low", "medium", "high", "xhigh", "max"],
|
|
108222
|
-
openRouterResolve: "openrouter/openai/gpt-
|
|
108224
|
+
openRouterResolve: "openrouter/openai/gpt-6-sol",
|
|
108223
108225
|
subagentModel: "gpt-terra"
|
|
108224
108226
|
},
|
|
108225
108227
|
"gpt-astra": {
|
|
@@ -108233,9 +108235,9 @@ var providers = {
|
|
|
108233
108235
|
"gpt-sol-pro": {
|
|
108234
108236
|
displayName: "GPT Sol Pro",
|
|
108235
108237
|
description: "Maximum reasoning effort",
|
|
108236
|
-
resolve: "opencode/gpt-
|
|
108238
|
+
resolve: "opencode/gpt-6-sol",
|
|
108237
108239
|
effort: ["none", "low", "medium", "high", "xhigh", "max"],
|
|
108238
|
-
openRouterResolve: "openrouter/openai/gpt-
|
|
108240
|
+
openRouterResolve: "openrouter/openai/gpt-6-sol-pro",
|
|
108239
108241
|
subagentModel: "gpt-sol"
|
|
108240
108242
|
},
|
|
108241
108243
|
// gpt-5.6 balanced mid-tier — selectable + Sol's subagent. see openai above.
|
|
@@ -108247,9 +108249,9 @@ var providers = {
|
|
|
108247
108249
|
},
|
|
108248
108250
|
"gpt-luna": {
|
|
108249
108251
|
displayName: "GPT Luna",
|
|
108250
|
-
resolve: "opencode/gpt-
|
|
108252
|
+
resolve: "opencode/gpt-6-luna",
|
|
108251
108253
|
effort: ["none", "low", "medium", "high", "xhigh", "max"],
|
|
108252
|
-
openRouterResolve: "openrouter/openai/gpt-
|
|
108254
|
+
openRouterResolve: "openrouter/openai/gpt-6-luna"
|
|
108253
108255
|
},
|
|
108254
108256
|
// legacy aliases — see openai provider above for context.
|
|
108255
108257
|
"gpt-codex": {
|
|
@@ -108348,9 +108350,34 @@ var providers = {
|
|
|
108348
108350
|
},
|
|
108349
108351
|
grok: {
|
|
108350
108352
|
displayName: "Grok",
|
|
108351
|
-
resolve: "opencode/grok-4.
|
|
108353
|
+
resolve: "opencode/grok-4.7",
|
|
108352
108354
|
effort: ["low", "medium", "high", "xhigh"],
|
|
108353
|
-
openRouterResolve: "openrouter/x-ai/grok-4.
|
|
108355
|
+
openRouterResolve: "openrouter/x-ai/grok-4.7"
|
|
108356
|
+
},
|
|
108357
|
+
// Zen began listing Qwen's Max and Flash tiers in late 2026-09 (Max on
|
|
108358
|
+
// 09-25); until then `opencode-go` was the only Qwen route, so a Zen
|
|
108359
|
+
// subscriber without Go had none. Plus is still Go-only. Zen's Max entry
|
|
108360
|
+
// publishes a reasoning toggle but no effort rungs.
|
|
108361
|
+
"qwen-max": {
|
|
108362
|
+
displayName: "Qwen Max",
|
|
108363
|
+
resolve: "opencode/qwen3.8-max",
|
|
108364
|
+
openRouterEffort: ["minimal", "low", "medium", "high", "xhigh"],
|
|
108365
|
+
openRouterResolve: "openrouter/qwen/qwen3.8-max-0902",
|
|
108366
|
+
// unlisted until a published `pullfrog` carries this alias (the
|
|
108367
|
+
// merge-vs-publish rule in wiki/models-catalog.md). unhide in the release
|
|
108368
|
+
// that ships it.
|
|
108369
|
+
hidden: true
|
|
108370
|
+
},
|
|
108371
|
+
"qwen-flash": {
|
|
108372
|
+
displayName: "Qwen Flash",
|
|
108373
|
+
resolve: "opencode/qwen3.8-flash",
|
|
108374
|
+
effort: ["low", "medium", "xhigh"],
|
|
108375
|
+
openRouterEffort: [],
|
|
108376
|
+
openRouterResolve: "openrouter/qwen/qwen3.8-flash",
|
|
108377
|
+
// unlisted until a published `pullfrog` carries this alias (the
|
|
108378
|
+
// merge-vs-publish rule in wiki/models-catalog.md). unhide in the release
|
|
108379
|
+
// that ships it.
|
|
108380
|
+
hidden: true
|
|
108354
108381
|
},
|
|
108355
108382
|
"gpt-5-nano": {
|
|
108356
108383
|
displayName: "GPT Nano",
|
|
@@ -108363,8 +108390,12 @@ var providers = {
|
|
|
108363
108390
|
"muse-spark": {
|
|
108364
108391
|
displayName: "Muse Spark",
|
|
108365
108392
|
resolve: "opencode/muse-spark-1.3",
|
|
108366
|
-
|
|
108367
|
-
|
|
108393
|
+
// models.dev dropped `max` from Zen's ladder on 2026-09-19 while the
|
|
108394
|
+
// OpenRouter and direct `meta/` routes kept it; the catalog gate
|
|
108395
|
+
// mirrors what is published per route.
|
|
108396
|
+
effort: ["minimal", "low", "medium", "high", "xhigh"],
|
|
108397
|
+
openRouterResolve: "openrouter/meta/muse-spark-1.3",
|
|
108398
|
+
openRouterEffort: ["minimal", "low", "medium", "high", "xhigh", "max"]
|
|
108368
108399
|
},
|
|
108369
108400
|
// Zen's FREE contributor tier: the same model at $0 because Meta trains
|
|
108370
108401
|
// on the prompts and completions. Zen served it to our key on 2026-09-12
|
|
@@ -108388,13 +108419,38 @@ var providers = {
|
|
|
108388
108419
|
resolve: "opencode/union-alpha",
|
|
108389
108420
|
// free to run, still gated on the provider's own OPENCODE_API_KEY —
|
|
108390
108421
|
// see the big-pickle note above (#1077).
|
|
108391
|
-
isFree: true
|
|
108422
|
+
isFree: true,
|
|
108423
|
+
// Zen dropped the id from `/v1/models` on 2026-09-18, two days after it
|
|
108424
|
+
// listed it, and answers a 500 for it. a stealth preview has no same-
|
|
108425
|
+
// family successor, so stored picks land on the other free stealth
|
|
108426
|
+
// model, as `minimax-m2.5-free` does.
|
|
108427
|
+
fallback: "opencode/big-pickle"
|
|
108428
|
+
},
|
|
108429
|
+
// Zen's FREE stealth preview (listed 2026-09-23), the third after
|
|
108430
|
+
// big-pickle and union-alpha. OpenRouter's listing: prompts and
|
|
108431
|
+
// completions may be retained by the provider, not trained on. unlike the
|
|
108432
|
+
// first two it publishes an effort ladder, so the gate mirrors one here.
|
|
108433
|
+
"space-bunny": {
|
|
108434
|
+
displayName: "Space Bunny",
|
|
108435
|
+
description: "Stealth preview; prompts may be retained",
|
|
108436
|
+
resolve: "opencode/space-bunny-free",
|
|
108437
|
+
effort: ["low", "medium", "high", "xhigh", "max"],
|
|
108438
|
+
// free to run, still gated on the provider's own OPENCODE_API_KEY —
|
|
108439
|
+
// see the big-pickle note above (#1077).
|
|
108440
|
+
isFree: true,
|
|
108441
|
+
// unlisted until a published `pullfrog` carries this alias: 0.1.82
|
|
108442
|
+
// predates it, so a run passes `opencode/space-bunny` through raw and
|
|
108443
|
+
// Zen answers a 500. unhide in the release that ships it.
|
|
108444
|
+
hidden: true
|
|
108392
108445
|
},
|
|
108393
108446
|
// Zen's live free MiMo, and the second free row in a menu that big-pickle
|
|
108394
108447
|
// was alone in since `mimo-v2-pro-free` lost its model.
|
|
108395
108448
|
mimo: {
|
|
108396
108449
|
displayName: "MiMo",
|
|
108397
|
-
|
|
108450
|
+
// models.dev deprecated `mimo-v2.5-free` on 2026-09-22. V2.6-Flash is
|
|
108451
|
+
// the only other MiMo Zen serves, so the slug follows it across the
|
|
108452
|
+
// tier rather than leaving stored picks on a dying id.
|
|
108453
|
+
resolve: "opencode/mimo-v2.6-flash-free",
|
|
108398
108454
|
// free to run, still gated on the provider's own OPENCODE_API_KEY —
|
|
108399
108455
|
// see the big-pickle note above (#1077).
|
|
108400
108456
|
isFree: true
|
|
@@ -108423,11 +108479,12 @@ var providers = {
|
|
|
108423
108479
|
// OpenCode Go is a separate $10/mo subscription from Zen, served on its own
|
|
108424
108480
|
// base URL (`https://opencode.ai/zen/go/v1`) but authenticated with the SAME
|
|
108425
108481
|
// `OPENCODE_API_KEY`. it carries the open-weight coding models plus a couple
|
|
108426
|
-
// of frontier ones,
|
|
108427
|
-
// does not list qwen3.7
|
|
108482
|
+
// of frontier ones, four of which are served ONLY here — Zen's `/v1/models`
|
|
108483
|
+
// does not list qwen3.7-plus, mimo-v2.6-pro, longcat-2.0 or hy3. (it listed
|
|
108428
108484
|
// no glm-5.3* either until 2026-09, which is why `opencode/glm` trailed on
|
|
108429
|
-
// 5.2.) so for a Go subscriber this
|
|
108430
|
-
//
|
|
108485
|
+
// 5.2, and no qwen3.8-* until late 2026-09.) so for a Go subscriber this
|
|
108486
|
+
// provider is not a duplicate route to Zen, it is the only route to a large
|
|
108487
|
+
// part of what they pay for.
|
|
108431
108488
|
// like `opencode` and `openrouter` this is a ROUTER, not a vendor: slugs and
|
|
108432
108489
|
// display names mirror the upstream brand tier, and the picker groups them
|
|
108433
108490
|
// under the upstream vendor.
|
|
@@ -108487,7 +108544,8 @@ var providers = {
|
|
|
108487
108544
|
// picker row that fails for almost everyone is worse than none. DeepSeek
|
|
108488
108545
|
// stays reachable ungated via `deepseek/*`, `opencode/*` and
|
|
108489
108546
|
// `openrouter/*`; both remain runnable by full specifier once opted in.
|
|
108490
|
-
// Alibaba —
|
|
108547
|
+
// Alibaba — Zen serves Max and Flash too (see `opencode/qwen-max`); Plus
|
|
108548
|
+
// is Go-only.
|
|
108491
108549
|
"qwen-max": {
|
|
108492
108550
|
displayName: "Qwen Max",
|
|
108493
108551
|
resolve: "opencode-go/qwen3.8-max",
|
|
@@ -108530,8 +108588,8 @@ var providers = {
|
|
|
108530
108588
|
// Xiaomi — Go-only; Zen serves the free `mimo-v2-pro-free` promo instead.
|
|
108531
108589
|
"mimo-pro": {
|
|
108532
108590
|
displayName: "MiMo Pro",
|
|
108533
|
-
resolve: "opencode-go/mimo-v2.
|
|
108534
|
-
openRouterResolve: "openrouter/xiaomi/mimo-v2.
|
|
108591
|
+
resolve: "opencode-go/mimo-v2.6-pro",
|
|
108592
|
+
openRouterResolve: "openrouter/xiaomi/mimo-v2.6-pro"
|
|
108535
108593
|
},
|
|
108536
108594
|
// Meituan — Go-only.
|
|
108537
108595
|
longcat: {
|
|
@@ -108557,15 +108615,15 @@ var providers = {
|
|
|
108557
108615
|
// wiki/models-catalog.md on `opencode/kimi-k2`.
|
|
108558
108616
|
grok: {
|
|
108559
108617
|
displayName: "Grok",
|
|
108560
|
-
resolve: "opencode-go/grok-4.
|
|
108618
|
+
resolve: "opencode-go/grok-4.7",
|
|
108561
108619
|
effort: ["low", "medium", "high", "xhigh"],
|
|
108562
|
-
openRouterResolve: "openrouter/x-ai/grok-4.
|
|
108620
|
+
openRouterResolve: "openrouter/x-ai/grok-4.7"
|
|
108563
108621
|
},
|
|
108564
108622
|
"gpt-luna": {
|
|
108565
108623
|
displayName: "GPT Luna",
|
|
108566
|
-
resolve: "opencode-go/gpt-
|
|
108624
|
+
resolve: "opencode-go/gpt-6-luna",
|
|
108567
108625
|
effort: ["none", "low", "medium", "high", "xhigh", "max"],
|
|
108568
|
-
openRouterResolve: "openrouter/openai/gpt-
|
|
108626
|
+
openRouterResolve: "openrouter/openai/gpt-6-luna"
|
|
108569
108627
|
}
|
|
108570
108628
|
}
|
|
108571
108629
|
}),
|
|
@@ -108667,15 +108725,15 @@ var providers = {
|
|
|
108667
108725
|
resolve: "openrouter/~anthropic/claude-haiku-latest",
|
|
108668
108726
|
openRouterResolve: "openrouter/~anthropic/claude-haiku-latest"
|
|
108669
108727
|
},
|
|
108670
|
-
// pinned to the explicit
|
|
108671
|
-
// alias): after
|
|
108728
|
+
// pinned to the explicit Sol/Terra/Luna tiers (not the ~openai/gpt-latest
|
|
108729
|
+
// rolling alias): after that rename, ~gpt-mini-latest no longer maps
|
|
108672
108730
|
// to Luna, so rolling aliases would silently diverge `gpt`/`gpt-mini` from
|
|
108673
108731
|
// the chosen tiers across funding paths.
|
|
108674
108732
|
"gpt-sol": {
|
|
108675
108733
|
displayName: "GPT Sol",
|
|
108676
|
-
resolve: "openrouter/openai/gpt-
|
|
108734
|
+
resolve: "openrouter/openai/gpt-6-sol",
|
|
108677
108735
|
effort: ["none", "low", "medium", "high", "xhigh", "max"],
|
|
108678
|
-
openRouterResolve: "openrouter/openai/gpt-
|
|
108736
|
+
openRouterResolve: "openrouter/openai/gpt-6-sol",
|
|
108679
108737
|
subagentModel: "gpt-terra"
|
|
108680
108738
|
},
|
|
108681
108739
|
"gpt-astra": {
|
|
@@ -108689,9 +108747,9 @@ var providers = {
|
|
|
108689
108747
|
"gpt-sol-pro": {
|
|
108690
108748
|
displayName: "GPT Sol Pro",
|
|
108691
108749
|
description: "Maximum reasoning effort",
|
|
108692
|
-
resolve: "openrouter/openai/gpt-
|
|
108750
|
+
resolve: "openrouter/openai/gpt-6-sol-pro",
|
|
108693
108751
|
effort: ["none", "low", "medium", "high", "xhigh", "max"],
|
|
108694
|
-
openRouterResolve: "openrouter/openai/gpt-
|
|
108752
|
+
openRouterResolve: "openrouter/openai/gpt-6-sol-pro",
|
|
108695
108753
|
subagentModel: "gpt-sol"
|
|
108696
108754
|
},
|
|
108697
108755
|
// gpt-5.6 balanced mid-tier — selectable + Sol's subagent. see openai above.
|
|
@@ -108703,9 +108761,9 @@ var providers = {
|
|
|
108703
108761
|
},
|
|
108704
108762
|
"gpt-luna": {
|
|
108705
108763
|
displayName: "GPT Luna",
|
|
108706
|
-
resolve: "openrouter/openai/gpt-
|
|
108764
|
+
resolve: "openrouter/openai/gpt-6-luna",
|
|
108707
108765
|
effort: ["none", "low", "medium", "high", "xhigh", "max"],
|
|
108708
|
-
openRouterResolve: "openrouter/openai/gpt-
|
|
108766
|
+
openRouterResolve: "openrouter/openai/gpt-6-luna"
|
|
108709
108767
|
},
|
|
108710
108768
|
// legacy aliases — see openai provider for context.
|
|
108711
108769
|
"gpt-codex": {
|
|
@@ -108769,9 +108827,9 @@ var providers = {
|
|
|
108769
108827
|
},
|
|
108770
108828
|
grok: {
|
|
108771
108829
|
displayName: "Grok",
|
|
108772
|
-
resolve: "openrouter/x-ai/grok-4.
|
|
108830
|
+
resolve: "openrouter/x-ai/grok-4.7",
|
|
108773
108831
|
effort: ["low", "medium", "high", "xhigh"],
|
|
108774
|
-
openRouterResolve: "openrouter/x-ai/grok-4.
|
|
108832
|
+
openRouterResolve: "openrouter/x-ai/grok-4.7"
|
|
108775
108833
|
},
|
|
108776
108834
|
// dated pin, not the bare id — see `deepseek/deepseek-pro` for why
|
|
108777
108835
|
// OpenRouter's unversioned `deepseek-v4-pro` is the stale April preview.
|
|
@@ -108842,8 +108900,10 @@ var providers = {
|
|
|
108842
108900
|
vercel: provider({
|
|
108843
108901
|
// Vercel AI Gateway — one key serves every model it fronts. model IDs use
|
|
108844
108902
|
// the models.dev `vercel` catalog's own naming (dotted versions, e.g.
|
|
108845
|
-
// `anthropic/claude-opus-5`, `zai/glm-5.3`)
|
|
108846
|
-
//
|
|
108903
|
+
// `anthropic/claude-opus-5.5`, `zai/glm-5.3`). effort ladders come from the
|
|
108904
|
+
// gateway's OWN `/v1/models`, not models.dev — the two disagree routinely
|
|
108905
|
+
// (on 2026-09-22 they disagreed on all ten entries that drifted), and the
|
|
108906
|
+
// drift test reads the gateway for that reason. deliberately no
|
|
108847
108907
|
// `openRouterResolve`: a gateway pick is BYOK-only — silently rerouting it
|
|
108848
108908
|
// over the Router proxy would bill the wallet for traffic the user pointed
|
|
108849
108909
|
// at their own gateway.
|
|
@@ -108852,7 +108912,7 @@ var providers = {
|
|
|
108852
108912
|
models: {
|
|
108853
108913
|
"claude-opus": {
|
|
108854
108914
|
displayName: "Claude Opus",
|
|
108855
|
-
resolve: "vercel/anthropic/claude-opus-5",
|
|
108915
|
+
resolve: "vercel/anthropic/claude-opus-5.5",
|
|
108856
108916
|
effort: ["low", "medium", "high", "xhigh", "max"],
|
|
108857
108917
|
preferred: true,
|
|
108858
108918
|
subagentModel: "claude-sonnet"
|
|
@@ -108860,7 +108920,7 @@ var providers = {
|
|
|
108860
108920
|
"claude-sonnet": {
|
|
108861
108921
|
displayName: "Claude Sonnet",
|
|
108862
108922
|
resolve: "vercel/anthropic/claude-sonnet-5",
|
|
108863
|
-
effort: ["low", "medium", "high", "xhigh"]
|
|
108923
|
+
effort: ["none", "low", "medium", "high", "xhigh", "max"]
|
|
108864
108924
|
},
|
|
108865
108925
|
"claude-haiku": {
|
|
108866
108926
|
displayName: "Claude Haiku",
|
|
@@ -108868,7 +108928,7 @@ var providers = {
|
|
|
108868
108928
|
},
|
|
108869
108929
|
"gpt-sol": {
|
|
108870
108930
|
displayName: "GPT Sol",
|
|
108871
|
-
resolve: "vercel/openai/gpt-
|
|
108931
|
+
resolve: "vercel/openai/gpt-6-sol",
|
|
108872
108932
|
effort: ["none", "low", "medium", "high", "xhigh", "max"],
|
|
108873
108933
|
subagentModel: "gpt-terra"
|
|
108874
108934
|
},
|
|
@@ -108881,35 +108941,35 @@ var providers = {
|
|
|
108881
108941
|
"gpt-terra": {
|
|
108882
108942
|
displayName: "GPT Terra",
|
|
108883
108943
|
resolve: "vercel/openai/gpt-5.6-terra",
|
|
108884
|
-
effort: ["none", "low", "medium", "high", "xhigh", "max"]
|
|
108944
|
+
effort: ["none", "minimal", "low", "medium", "high", "xhigh", "max"]
|
|
108885
108945
|
},
|
|
108886
108946
|
"gpt-luna": {
|
|
108887
108947
|
displayName: "GPT Luna",
|
|
108888
|
-
resolve: "vercel/openai/gpt-
|
|
108948
|
+
resolve: "vercel/openai/gpt-6-luna",
|
|
108889
108949
|
effort: ["none", "low", "medium", "high", "xhigh", "max"]
|
|
108890
108950
|
},
|
|
108891
108951
|
"gemini-pro": {
|
|
108892
108952
|
displayName: "Gemini Pro",
|
|
108893
108953
|
resolve: "vercel/google/gemini-3.1-pro-preview",
|
|
108894
|
-
effort: ["low", "
|
|
108954
|
+
effort: ["low", "high"]
|
|
108895
108955
|
},
|
|
108896
108956
|
"gemini-flash": {
|
|
108897
108957
|
displayName: "Gemini Flash",
|
|
108898
108958
|
resolve: "vercel/google/gemini-3.8-flash",
|
|
108899
|
-
effort: ["low", "
|
|
108959
|
+
effort: ["low", "high"]
|
|
108900
108960
|
},
|
|
108901
108961
|
"deepseek-pro": {
|
|
108902
108962
|
displayName: "DeepSeek Pro",
|
|
108903
108963
|
resolve: "vercel/deepseek/deepseek-v4-pro-0813",
|
|
108904
|
-
effort: ["high", "
|
|
108964
|
+
effort: ["none", "high", "max"]
|
|
108905
108965
|
},
|
|
108906
108966
|
// the gateway's bare `deepseek-v4-flash` is the April preview — the same
|
|
108907
108967
|
// fork trap as OpenRouter, with `deepseek-v4-flash-0731` beside it — so
|
|
108908
|
-
// this entry sat on the preview until V4.1.
|
|
108909
|
-
// effort ladder for the V4.1 id.
|
|
108968
|
+
// this entry sat on the preview until V4.1.
|
|
108910
108969
|
"deepseek-flash": {
|
|
108911
108970
|
displayName: "DeepSeek Flash",
|
|
108912
|
-
resolve: "vercel/deepseek/deepseek-v4.1-flash"
|
|
108971
|
+
resolve: "vercel/deepseek/deepseek-v4.1-flash",
|
|
108972
|
+
effort: ["none", "high", "max"]
|
|
108913
108973
|
},
|
|
108914
108974
|
glm: {
|
|
108915
108975
|
displayName: "GLM",
|
|
@@ -108919,12 +108979,12 @@ var providers = {
|
|
|
108919
108979
|
"kimi-k3": {
|
|
108920
108980
|
displayName: "Kimi K3",
|
|
108921
108981
|
resolve: "vercel/moonshotai/kimi-k3",
|
|
108922
|
-
effort: ["low", "high", "max"]
|
|
108982
|
+
effort: ["none", "low", "high", "max"]
|
|
108923
108983
|
},
|
|
108924
|
-
// the gateway publishes no effort ladder for this id.
|
|
108925
108984
|
"muse-spark": {
|
|
108926
108985
|
displayName: "Muse Spark",
|
|
108927
|
-
resolve: "vercel/meta/muse-spark-1.3"
|
|
108986
|
+
resolve: "vercel/meta/muse-spark-1.3",
|
|
108987
|
+
effort: ["minimal", "low", "medium", "high", "xhigh"]
|
|
108928
108988
|
}
|
|
108929
108989
|
}
|
|
108930
108990
|
})
|
|
@@ -109986,7 +110046,7 @@ var import_semver = __toESM(require_semver2(), 1);
|
|
|
109986
110046
|
// package.json
|
|
109987
110047
|
var package_default = {
|
|
109988
110048
|
name: "pullfrog",
|
|
109989
|
-
version: "0.1.
|
|
110049
|
+
version: "0.1.83",
|
|
109990
110050
|
cliContractVersion: "1",
|
|
109991
110051
|
type: "module",
|
|
109992
110052
|
bin: {
|
|
@@ -110003,6 +110063,7 @@ var package_default = {
|
|
|
110003
110063
|
typecheck: "tsc --noEmit",
|
|
110004
110064
|
build: "node esbuild.config.js && tsc -p tsconfig.exports.json",
|
|
110005
110065
|
"check:entrypoints": "nub scripts/check-entrypoint-imports.ts",
|
|
110066
|
+
"check:secret-commands": "nub scripts/check-secret-commands.ts",
|
|
110006
110067
|
docker: "nub docker.ts",
|
|
110007
110068
|
play: "nub play.ts",
|
|
110008
110069
|
runtest: "nub test/run.ts",
|
|
@@ -110013,7 +110074,7 @@ var package_default = {
|
|
|
110013
110074
|
},
|
|
110014
110075
|
devDependencies: {
|
|
110015
110076
|
"@actions/core": "^1.11.1",
|
|
110016
|
-
"@anthropic-ai/claude-code": "2.1.
|
|
110077
|
+
"@anthropic-ai/claude-code": "2.1.280",
|
|
110017
110078
|
"@ark/fs": "0.56.0",
|
|
110018
110079
|
"@ark/util": "0.56.0",
|
|
110019
110080
|
"@clack/prompts": "^1.2.0",
|
|
@@ -110623,7 +110684,7 @@ process.stdin.on("end", () => {
|
|
|
110623
110684
|
});
|
|
110624
110685
|
`;
|
|
110625
110686
|
}
|
|
110626
|
-
function buildClaudePretoolGateSettings(scriptAbsolutePath,
|
|
110687
|
+
function buildClaudePretoolGateSettings(scriptAbsolutePath, denyRules) {
|
|
110627
110688
|
return {
|
|
110628
110689
|
hooks: {
|
|
110629
110690
|
PreToolUse: [
|
|
@@ -110643,7 +110704,7 @@ function buildClaudePretoolGateSettings(scriptAbsolutePath, execToolDenyRules) {
|
|
|
110643
110704
|
}
|
|
110644
110705
|
]
|
|
110645
110706
|
},
|
|
110646
|
-
permissions: { deny:
|
|
110707
|
+
permissions: { deny: denyRules }
|
|
110647
110708
|
};
|
|
110648
110709
|
}
|
|
110649
110710
|
|
|
@@ -111506,12 +111567,22 @@ async function installClaudeCli() {
|
|
|
111506
111567
|
installDependencies: true
|
|
111507
111568
|
});
|
|
111508
111569
|
}
|
|
111509
|
-
var CLAUDE_EXEC_TOOLS = ["Bash", "Monitor", "REPL", "Workflow"];
|
|
111510
|
-
var
|
|
111570
|
+
var CLAUDE_EXEC_TOOLS = ["Bash", "PowerShell", "Monitor", "REPL", "Workflow"];
|
|
111571
|
+
var CLAUDE_DENIED_TOOLS = [
|
|
111511
111572
|
...CLAUDE_EXEC_TOOLS,
|
|
111512
|
-
|
|
111573
|
+
"DesignSync",
|
|
111574
|
+
"Artifact",
|
|
111575
|
+
"ShareOnboardingGuide",
|
|
111576
|
+
"SendMessage",
|
|
111577
|
+
"ListAgents",
|
|
111578
|
+
"PushNotification",
|
|
111579
|
+
"RemoteTrigger"
|
|
111513
111580
|
];
|
|
111514
|
-
var
|
|
111581
|
+
var CLAUDE_DENY_RULES = [
|
|
111582
|
+
...CLAUDE_DENIED_TOOLS,
|
|
111583
|
+
...CLAUDE_DENIED_TOOLS.map((t) => `Agent(${t})`)
|
|
111584
|
+
];
|
|
111585
|
+
var CLAUDE_DISALLOWED_TOOLS = CLAUDE_DENY_RULES.join(",");
|
|
111515
111586
|
function writeMcpConfig(ctx) {
|
|
111516
111587
|
const configDir = join4(ctx.tmpdir, ".claude");
|
|
111517
111588
|
mkdirSync4(configDir, { recursive: true });
|
|
@@ -111944,14 +112015,11 @@ function buildClaudeSettings(params) {
|
|
|
111944
112015
|
`Glob(${path4}/**)`,
|
|
111945
112016
|
`Glob(/${path4}/**)`
|
|
111946
112017
|
]);
|
|
111947
|
-
const gate = buildClaudePretoolGateSettings(
|
|
111948
|
-
params.pretoolGateScriptPath,
|
|
111949
|
-
CLAUDE_EXEC_TOOL_DENY_RULES
|
|
111950
|
-
);
|
|
112018
|
+
const gate = buildClaudePretoolGateSettings(params.pretoolGateScriptPath, CLAUDE_DENY_RULES);
|
|
111951
112019
|
const base = {
|
|
111952
112020
|
permissions: {
|
|
111953
112021
|
deny: [
|
|
111954
|
-
//
|
|
112022
|
+
// CLAUDE_DENIED_TOOLS — the authoritative, bypass-immune deny.
|
|
111955
112023
|
// `--disallowedTools` (a cliArg-source deny) leaked under
|
|
111956
112024
|
// `--dangerously-skip-permissions`; policySettings denies survive
|
|
111957
112025
|
// bypassPermissions mode. covers top-level + Agent(...) subagent use.
|
|
@@ -112165,7 +112233,6 @@ var claude = agent({
|
|
|
112165
112233
|
});
|
|
112166
112234
|
|
|
112167
112235
|
// agents/codex.ts
|
|
112168
|
-
var core3 = __toESM(require_core(), 1);
|
|
112169
112236
|
import { existsSync as existsSync5, mkdirSync as mkdirSync6, readFileSync as readFileSync3, writeFileSync as writeFileSync5 } from "node:fs";
|
|
112170
112237
|
import { join as join6 } from "node:path";
|
|
112171
112238
|
import { performance as performance6 } from "node:perf_hooks";
|
|
@@ -112451,6 +112518,15 @@ async function apiFetch(options) {
|
|
|
112451
112518
|
// utils/oauthWriteback.ts
|
|
112452
112519
|
var OAUTH_WRITEBACK_STATE = "oauth_writeback";
|
|
112453
112520
|
|
|
112521
|
+
// utils/secretCommands.ts
|
|
112522
|
+
var core3 = __toESM(require_core(), 1);
|
|
112523
|
+
function maskSecret(value2) {
|
|
112524
|
+
if (isGitHubActions) core3.setSecret(value2);
|
|
112525
|
+
}
|
|
112526
|
+
function saveSecretState(name, value2) {
|
|
112527
|
+
if (isGitHubActions) core3.saveState(name, value2);
|
|
112528
|
+
}
|
|
112529
|
+
|
|
112454
112530
|
// utils/secrets.ts
|
|
112455
112531
|
var SENSITIVE_PATTERNS = [
|
|
112456
112532
|
/_KEY$/i,
|
|
@@ -112799,8 +112875,8 @@ function toTodoWriteInput(item) {
|
|
|
112799
112875
|
}
|
|
112800
112876
|
var CODEX_MODEL_PRICING = {
|
|
112801
112877
|
"gpt-6-astra": { input: 10, cacheRead: 1, cacheWrite: 12.5, output: 50 },
|
|
112802
|
-
"gpt-
|
|
112803
|
-
"gpt-
|
|
112878
|
+
"gpt-6-sol": { input: 2, cacheRead: 0.2, cacheWrite: 2.5, output: 10 },
|
|
112879
|
+
"gpt-6-luna": { input: 0.1, cacheRead: 0.01, cacheWrite: 0.125, output: 0.5 },
|
|
112804
112880
|
"gpt-5.6-terra": { input: 2, cacheRead: 0.2, cacheWrite: 2.5, output: 12 }
|
|
112805
112881
|
};
|
|
112806
112882
|
function codexCostUsd(params) {
|
|
@@ -113038,7 +113114,7 @@ var codex = agent({
|
|
|
113038
113114
|
gatewayUrl: codexHomeAuth ? void 0 : getProviderGatewayUrl("openai/")
|
|
113039
113115
|
});
|
|
113040
113116
|
if (codexHomeAuth) {
|
|
113041
|
-
|
|
113117
|
+
saveSecretState(
|
|
113042
113118
|
OAUTH_WRITEBACK_STATE,
|
|
113043
113119
|
JSON.stringify({
|
|
113044
113120
|
apiToken: ctx.apiToken,
|
|
@@ -113123,7 +113199,6 @@ var codex = agent({
|
|
|
113123
113199
|
});
|
|
113124
113200
|
|
|
113125
113201
|
// agents/opencode.ts
|
|
113126
|
-
var core4 = __toESM(require_core(), 1);
|
|
113127
113202
|
import { spawn as nodeSpawn2 } from "node:child_process";
|
|
113128
113203
|
import { mkdirSync as mkdirSync7, writeFileSync as writeFileSync6 } from "node:fs";
|
|
113129
113204
|
import { join as join7 } from "node:path";
|
|
@@ -118695,6 +118770,11 @@ export default async function pullfrogSubagentGatePlugin() {
|
|
|
118695
118770
|
// pick a different action.
|
|
118696
118771
|
const sessionID = typeof input?.sessionID === "string" ? input.sessionID : "";
|
|
118697
118772
|
const tool = typeof input?.tool === "string" ? input.tool : "";
|
|
118773
|
+
// above the sessionID check: the bash block must never depend on a
|
|
118774
|
+
// session id being present.
|
|
118775
|
+
if (tool === "bash") {
|
|
118776
|
+
throw new Error("the native bash tool is disabled in Pullfrog runs.");
|
|
118777
|
+
}
|
|
118698
118778
|
if (!sessionID || !tool) return;
|
|
118699
118779
|
if (orchestratorSessionID === undefined) orchestratorSessionID = sessionID;
|
|
118700
118780
|
if (sessionID === orchestratorSessionID) return;
|
|
@@ -118907,7 +118987,11 @@ var installCli = () => installOpencodeCli({ binPath: "bin/opencode.exe" });
|
|
|
118907
118987
|
function buildSecurityConfig(ctx, model) {
|
|
118908
118988
|
const config3 = {
|
|
118909
118989
|
permission: {
|
|
118910
|
-
|
|
118990
|
+
// listed but never run: Zen's free tier 403s a tool list missing `bash`,
|
|
118991
|
+
// `glob`, `grep` or `read` (2026-09-17), so the gate plugin throws on
|
|
118992
|
+
// every bash call and "ask" (no responder in serve mode) fails closed.
|
|
118993
|
+
// never switch one of those four to "deny". see wiki/security.md.
|
|
118994
|
+
bash: "ask",
|
|
118911
118995
|
edit: "allow",
|
|
118912
118996
|
read: "allow",
|
|
118913
118997
|
webfetch: "allow",
|
|
@@ -119556,7 +119640,7 @@ var opencode = agent({
|
|
|
119556
119640
|
});
|
|
119557
119641
|
}
|
|
119558
119642
|
if (writebacks.length > 0) {
|
|
119559
|
-
|
|
119643
|
+
saveSecretState(
|
|
119560
119644
|
OAUTH_WRITEBACK_STATE,
|
|
119561
119645
|
JSON.stringify({ apiToken: ctx.apiToken, entries: writebacks })
|
|
119562
119646
|
);
|
|
@@ -130651,7 +130735,7 @@ var Hono2 = class extends Hono {
|
|
|
130651
130735
|
}
|
|
130652
130736
|
};
|
|
130653
130737
|
|
|
130654
|
-
// node_modules/.pnpm/mcp-proxy@6.7.
|
|
130738
|
+
// node_modules/.pnpm/mcp-proxy@6.7.12/node_modules/mcp-proxy/dist/startStdioServer-C9HzKfjR.mjs
|
|
130655
130739
|
import { createRequire } from "node:module";
|
|
130656
130740
|
import { randomUUID as randomUUID2, timingSafeEqual } from "node:crypto";
|
|
130657
130741
|
|
|
@@ -140424,7 +140508,7 @@ var require_core$2 = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
|
140424
140508
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
140425
140509
|
const id_1 = require_id2();
|
|
140426
140510
|
const ref_1 = require_ref2();
|
|
140427
|
-
const
|
|
140511
|
+
const core8 = [
|
|
140428
140512
|
"$schema",
|
|
140429
140513
|
"$id",
|
|
140430
140514
|
"$defs",
|
|
@@ -140434,7 +140518,7 @@ var require_core$2 = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
|
140434
140518
|
id_1.default,
|
|
140435
140519
|
ref_1.default
|
|
140436
140520
|
];
|
|
140437
|
-
exports.default =
|
|
140521
|
+
exports.default = core8;
|
|
140438
140522
|
}));
|
|
140439
140523
|
var require_limitNumber2 = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
140440
140524
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -142572,7 +142656,7 @@ var require_json_schema_2019_09 = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
|
142572
142656
|
const metaSchema = require_schema$1();
|
|
142573
142657
|
const applicator = require_applicator$1();
|
|
142574
142658
|
const content = require_content$1();
|
|
142575
|
-
const
|
|
142659
|
+
const core8 = require_core$1();
|
|
142576
142660
|
const format2 = require_format3();
|
|
142577
142661
|
const metadata = require_meta_data$1();
|
|
142578
142662
|
const validation = require_validation$1();
|
|
@@ -142582,7 +142666,7 @@ var require_json_schema_2019_09 = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
|
142582
142666
|
metaSchema,
|
|
142583
142667
|
applicator,
|
|
142584
142668
|
content,
|
|
142585
|
-
|
|
142669
|
+
core8,
|
|
142586
142670
|
with$data(this, format2),
|
|
142587
142671
|
metadata,
|
|
142588
142672
|
with$data(this, validation)
|
|
@@ -143022,7 +143106,7 @@ var require_json_schema_2020_12 = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
|
143022
143106
|
const applicator = require_applicator2();
|
|
143023
143107
|
const unevaluated = require_unevaluated();
|
|
143024
143108
|
const content = require_content();
|
|
143025
|
-
const
|
|
143109
|
+
const core8 = require_core4();
|
|
143026
143110
|
const format2 = require_format_annotation();
|
|
143027
143111
|
const metadata = require_meta_data();
|
|
143028
143112
|
const validation = require_validation2();
|
|
@@ -143033,7 +143117,7 @@ var require_json_schema_2020_12 = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
|
143033
143117
|
applicator,
|
|
143034
143118
|
unevaluated,
|
|
143035
143119
|
content,
|
|
143036
|
-
|
|
143120
|
+
core8,
|
|
143037
143121
|
with$data(this, format2),
|
|
143038
143122
|
metadata,
|
|
143039
143123
|
with$data(this, validation)
|
|
@@ -146250,7 +146334,7 @@ function createMcpHandler(factory, options = {}) {
|
|
|
146250
146334
|
};
|
|
146251
146335
|
}
|
|
146252
146336
|
|
|
146253
|
-
// node_modules/.pnpm/mcp-proxy@6.7.
|
|
146337
|
+
// node_modules/.pnpm/mcp-proxy@6.7.12/node_modules/mcp-proxy/dist/startStdioServer-C9HzKfjR.mjs
|
|
146254
146338
|
import http from "http";
|
|
146255
146339
|
import { Http2ServerRequest } from "http2";
|
|
146256
146340
|
import { Readable } from "stream";
|
|
@@ -154475,7 +154559,7 @@ var require_core$22 = /* @__PURE__ */ __commonJSMin2(((exports) => {
|
|
|
154475
154559
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
154476
154560
|
const id_1 = require_id3();
|
|
154477
154561
|
const ref_1 = require_ref3();
|
|
154478
|
-
const
|
|
154562
|
+
const core8 = [
|
|
154479
154563
|
"$schema",
|
|
154480
154564
|
"$id",
|
|
154481
154565
|
"$defs",
|
|
@@ -154485,7 +154569,7 @@ var require_core$22 = /* @__PURE__ */ __commonJSMin2(((exports) => {
|
|
|
154485
154569
|
id_1.default,
|
|
154486
154570
|
ref_1.default
|
|
154487
154571
|
];
|
|
154488
|
-
exports.default =
|
|
154572
|
+
exports.default = core8;
|
|
154489
154573
|
}));
|
|
154490
154574
|
var require_limitNumber3 = /* @__PURE__ */ __commonJSMin2(((exports) => {
|
|
154491
154575
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -156623,7 +156707,7 @@ var require_json_schema_2019_092 = /* @__PURE__ */ __commonJSMin2(((exports) =>
|
|
|
156623
156707
|
const metaSchema = require_schema$12();
|
|
156624
156708
|
const applicator = require_applicator$12();
|
|
156625
156709
|
const content = require_content$12();
|
|
156626
|
-
const
|
|
156710
|
+
const core8 = require_core$12();
|
|
156627
156711
|
const format2 = require_format4();
|
|
156628
156712
|
const metadata = require_meta_data$12();
|
|
156629
156713
|
const validation = require_validation$12();
|
|
@@ -156633,7 +156717,7 @@ var require_json_schema_2019_092 = /* @__PURE__ */ __commonJSMin2(((exports) =>
|
|
|
156633
156717
|
metaSchema,
|
|
156634
156718
|
applicator,
|
|
156635
156719
|
content,
|
|
156636
|
-
|
|
156720
|
+
core8,
|
|
156637
156721
|
with$data(this, format2),
|
|
156638
156722
|
metadata,
|
|
156639
156723
|
with$data(this, validation)
|
|
@@ -157073,7 +157157,7 @@ var require_json_schema_2020_122 = /* @__PURE__ */ __commonJSMin2(((exports) =>
|
|
|
157073
157157
|
const applicator = require_applicator3();
|
|
157074
157158
|
const unevaluated = require_unevaluated2();
|
|
157075
157159
|
const content = require_content2();
|
|
157076
|
-
const
|
|
157160
|
+
const core8 = require_core5();
|
|
157077
157161
|
const format2 = require_format_annotation2();
|
|
157078
157162
|
const metadata = require_meta_data2();
|
|
157079
157163
|
const validation = require_validation3();
|
|
@@ -157084,7 +157168,7 @@ var require_json_schema_2020_122 = /* @__PURE__ */ __commonJSMin2(((exports) =>
|
|
|
157084
157168
|
applicator,
|
|
157085
157169
|
unevaluated,
|
|
157086
157170
|
content,
|
|
157087
|
-
|
|
157171
|
+
core8,
|
|
157088
157172
|
with$data(this, format2),
|
|
157089
157173
|
metadata,
|
|
157090
157174
|
with$data(this, validation)
|
|
@@ -157655,7 +157739,7 @@ var SseError = class extends Error {
|
|
|
157655
157739
|
}
|
|
157656
157740
|
};
|
|
157657
157741
|
|
|
157658
|
-
// node_modules/.pnpm/mcp-proxy@6.7.
|
|
157742
|
+
// node_modules/.pnpm/mcp-proxy@6.7.12/node_modules/mcp-proxy/dist/startStdioServer-C9HzKfjR.mjs
|
|
157659
157743
|
var __create4 = Object.create;
|
|
157660
157744
|
var __defProp$1 = Object.defineProperty;
|
|
157661
157745
|
var __getOwnPropDesc4 = Object.getOwnPropertyDescriptor;
|
|
@@ -174668,6 +174752,10 @@ var applyCorsHeaders = (req, res, corsOptions) => {
|
|
|
174668
174752
|
console.error("[mcp-proxy] error parsing origin", error62);
|
|
174669
174753
|
}
|
|
174670
174754
|
};
|
|
174755
|
+
var canServeModernRoute = (server) => {
|
|
174756
|
+
const target = server instanceof McpServer ? server.server : server;
|
|
174757
|
+
return Array.isArray(target._supportedProtocolVersions);
|
|
174758
|
+
};
|
|
174671
174759
|
var createModernLeg = ({ createServer: createServer4, onClose, onConnect, onListenSubscriptions }) => {
|
|
174672
174760
|
const requestContext = new AsyncLocalStorage2();
|
|
174673
174761
|
const createInstance = async ({ authResult, body, req }) => {
|
|
@@ -174687,6 +174775,18 @@ var createModernLeg = ({ createServer: createServer4, onClose, onConnect, onList
|
|
|
174687
174775
|
};
|
|
174688
174776
|
target.onclose = teardown;
|
|
174689
174777
|
try {
|
|
174778
|
+
if (!canServeModernRoute(server)) throw new Response(JSON.stringify({
|
|
174779
|
+
error: {
|
|
174780
|
+
code: -32e3,
|
|
174781
|
+
data: { reason: "server_missing_modern_protocol_support" },
|
|
174782
|
+
message: "Unsupported protocol version: the server instance cannot serve the 2026-07-28 protocol revision. It was built by the 1.x MCP SDK (e.g. fastmcp <=4.x pulling mcp-proxy through its `^6.4.6` range), which does not declare `_supportedProtocolVersions`. Upgrade the framework that builds it, or serve only 2025-era clients (`modern: false`)."
|
|
174783
|
+
},
|
|
174784
|
+
id: getRequestId(body),
|
|
174785
|
+
jsonrpc: "2.0"
|
|
174786
|
+
}), {
|
|
174787
|
+
headers: { "content-type": "application/json" },
|
|
174788
|
+
status: 400
|
|
174789
|
+
});
|
|
174690
174790
|
if (onListenSubscriptions) {
|
|
174691
174791
|
const listenUris = readListenSubscriptions(body);
|
|
174692
174792
|
if (listenUris.length > 0) releaseSubscriptions = await onListenSubscriptions(listenUris);
|
|
@@ -187789,7 +187889,7 @@ this usually means your local branch has commits that were never pushed \u2014 s
|
|
|
187789
187889
|
}
|
|
187790
187890
|
|
|
187791
187891
|
// utils/github.ts
|
|
187792
|
-
var
|
|
187892
|
+
var core4 = __toESM(require_core(), 1);
|
|
187793
187893
|
import { createSign } from "node:crypto";
|
|
187794
187894
|
import { rename, writeFile } from "node:fs/promises";
|
|
187795
187895
|
import { dirname as dirname3, join as join12 } from "node:path";
|
|
@@ -192038,9 +192138,7 @@ async function fetchIdTokenFromStash(creds) {
|
|
|
192038
192138
|
if (!body.value) {
|
|
192039
192139
|
throw new Error("ID token response has no value field");
|
|
192040
192140
|
}
|
|
192041
|
-
|
|
192042
|
-
core5.setSecret(body.value);
|
|
192043
|
-
}
|
|
192141
|
+
maskSecret(body.value);
|
|
192044
192142
|
return body.value;
|
|
192045
192143
|
}
|
|
192046
192144
|
function translateIdTokenError(error62) {
|
|
@@ -192052,7 +192150,7 @@ function translateIdTokenError(error62) {
|
|
|
192052
192150
|
var mintIdToken = op(
|
|
192053
192151
|
async () => {
|
|
192054
192152
|
try {
|
|
192055
|
-
return await
|
|
192153
|
+
return await core4.getIDToken(OIDC_AUDIENCE);
|
|
192056
192154
|
} catch (error62) {
|
|
192057
192155
|
throw translateIdTokenError(error62);
|
|
192058
192156
|
}
|
|
@@ -193390,6 +193488,15 @@ function buildImplementPlanLink(ctx, issueNumber, commentId) {
|
|
|
193390
193488
|
const apiUrl = getApiUrl();
|
|
193391
193489
|
return `[Implement plan \u2794](${apiUrl}/trigger/${ctx.repo.owner}/${ctx.repo.name}/${issueNumber}?action=implement&comment_id=${commentId})`;
|
|
193392
193490
|
}
|
|
193491
|
+
function buildEnrichmentLinks(ctx) {
|
|
193492
|
+
const event = ctx.payload.event;
|
|
193493
|
+
if (event.trigger !== "issues_opened" || event.is_pr || ctx.payload.prompt || ctx.toolState.selectedMode === "Build") {
|
|
193494
|
+
return [];
|
|
193495
|
+
}
|
|
193496
|
+
return [
|
|
193497
|
+
`[Implement a fix \u2794](${getApiUrl()}/trigger/${ctx.repo.owner}/${ctx.repo.name}/${event.issue_number}?action=build)`
|
|
193498
|
+
];
|
|
193499
|
+
}
|
|
193393
193500
|
function addFooter(ctx, body) {
|
|
193394
193501
|
if (/<br\s*\/?>[ \t]*\n(?!\s*\n)/i.test(body)) {
|
|
193395
193502
|
throw new Error(
|
|
@@ -193426,13 +193533,14 @@ function CreateCommentTool(ctx) {
|
|
|
193426
193533
|
if (issueNumber === ctx.payload.event.issue_number) {
|
|
193427
193534
|
ctx.toolState.standaloneCommentId = result.data.id;
|
|
193428
193535
|
}
|
|
193429
|
-
|
|
193430
|
-
|
|
193536
|
+
const enrichmentLinks = issueNumber === ctx.payload.event.issue_number ? buildEnrichmentLinks(ctx) : [];
|
|
193537
|
+
if (commentType === "Plan" || enrichmentLinks.length > 0) {
|
|
193538
|
+
if (commentType === "Plan" && result.data.node_id) {
|
|
193431
193539
|
await patchWorkflowRunFields(ctx, { planCommentNodeId: result.data.node_id });
|
|
193432
193540
|
}
|
|
193433
|
-
const customParts = [buildImplementPlanLink(ctx, issueNumber, result.data.id)];
|
|
193541
|
+
const customParts = commentType === "Plan" ? [buildImplementPlanLink(ctx, issueNumber, result.data.id)] : enrichmentLinks;
|
|
193434
193542
|
const footer = buildCommentFooter(ctx, customParts);
|
|
193435
|
-
const bodyWithPlanLink = `${stripExistingFooter(
|
|
193543
|
+
const bodyWithPlanLink = `${stripExistingFooter(bodyWithFooter)}${footer}`;
|
|
193436
193544
|
const updateResult = await ctx.octokit.rest.issues.updateComment({
|
|
193437
193545
|
owner: ctx.repo.owner,
|
|
193438
193546
|
repo: ctx.repo.name,
|
|
@@ -193504,6 +193612,7 @@ async function reportProgress(ctx, params) {
|
|
|
193504
193612
|
}
|
|
193505
193613
|
const issueNumber = ctx.payload.event.issue_number ?? primaryRepoState(ctx.toolState).issueNumber;
|
|
193506
193614
|
const isPlanMode = ctx.toolState.selectedMode === "Plan";
|
|
193615
|
+
const enrichmentLinks = params.liveProgress ? [] : buildEnrichmentLinks(ctx);
|
|
193507
193616
|
const apiCtx = { octokit: ctx.octokit, owner: ctx.repo.owner, repo: ctx.repo.name };
|
|
193508
193617
|
if (target_plan_comment === true && ctx.toolState.existingPlanCommentId === void 0) {
|
|
193509
193618
|
log.warning("target_plan_comment requested but no existingPlanCommentId in tool state");
|
|
@@ -193511,7 +193620,7 @@ async function reportProgress(ctx, params) {
|
|
|
193511
193620
|
if (target_plan_comment === true && ctx.toolState.existingPlanCommentId !== void 0) {
|
|
193512
193621
|
const commentId = ctx.toolState.existingPlanCommentId;
|
|
193513
193622
|
const customParts = issueNumber !== void 0 ? [buildImplementPlanLink(ctx, issueNumber, commentId)] : void 0;
|
|
193514
|
-
const bodyWithoutFooter = stripExistingFooter(body);
|
|
193623
|
+
const bodyWithoutFooter = stripExistingFooter(fixDoubleEscapedString(body));
|
|
193515
193624
|
const footer = buildCommentFooter(ctx, customParts);
|
|
193516
193625
|
const bodyWithFooter = `${bodyWithoutFooter}${footer}`;
|
|
193517
193626
|
const result = await updateProgressComment(
|
|
@@ -193532,8 +193641,8 @@ async function reportProgress(ctx, params) {
|
|
|
193532
193641
|
}
|
|
193533
193642
|
const existingComment = ctx.toolState.progressComment;
|
|
193534
193643
|
if (existingComment) {
|
|
193535
|
-
const customParts = isPlanMode && issueNumber !== void 0 ? [buildImplementPlanLink(ctx, issueNumber, existingComment.id)] :
|
|
193536
|
-
const bodyWithoutFooter = stripExistingFooter(body);
|
|
193644
|
+
const customParts = isPlanMode && issueNumber !== void 0 ? [buildImplementPlanLink(ctx, issueNumber, existingComment.id)] : enrichmentLinks;
|
|
193645
|
+
const bodyWithoutFooter = stripExistingFooter(fixDoubleEscapedString(body));
|
|
193537
193646
|
const footer = buildCommentFooter(ctx, customParts);
|
|
193538
193647
|
const bodyWithFooter = `${bodyWithoutFooter}${footer}`;
|
|
193539
193648
|
let result;
|
|
@@ -193585,13 +193694,13 @@ async function reportProgress(ctx, params) {
|
|
|
193585
193694
|
);
|
|
193586
193695
|
ctx.toolState.progressComment = created.comment;
|
|
193587
193696
|
if (!params.liveProgress) ctx.toolState.wasUpdated = true;
|
|
193588
|
-
if (isPlanMode) {
|
|
193589
|
-
const customParts = [buildImplementPlanLink(ctx, issueNumber, created.comment.id)];
|
|
193590
|
-
const bodyWithoutFooter = stripExistingFooter(
|
|
193697
|
+
if (isPlanMode || enrichmentLinks.length > 0) {
|
|
193698
|
+
const customParts = isPlanMode ? [buildImplementPlanLink(ctx, issueNumber, created.comment.id)] : enrichmentLinks;
|
|
193699
|
+
const bodyWithoutFooter = stripExistingFooter(initialBody);
|
|
193591
193700
|
const footer = buildCommentFooter(ctx, customParts);
|
|
193592
193701
|
const bodyWithPlanLink = `${bodyWithoutFooter}${footer}`;
|
|
193593
193702
|
const updateResult = await updateProgressComment(apiCtx, created.comment, bodyWithPlanLink);
|
|
193594
|
-
if (updateResult.node_id) {
|
|
193703
|
+
if (isPlanMode && updateResult.node_id) {
|
|
193595
193704
|
await patchWorkflowRunFields(ctx, { planCommentNodeId: updateResult.node_id });
|
|
193596
193705
|
}
|
|
193597
193706
|
return {
|
|
@@ -197506,6 +197615,37 @@ function ResolveReviewThreadTool(ctx) {
|
|
|
197506
197615
|
});
|
|
197507
197616
|
}
|
|
197508
197617
|
|
|
197618
|
+
// mcp/searchIssues.ts
|
|
197619
|
+
var SearchIssues = type({
|
|
197620
|
+
terms: type.string.matching(/^[\p{L}\p{N}_./-]+$/u).atMostLength(40).array().atLeastLength(1).atMostLength(5).describe("1-5 keywords from the issue; no GitHub qualifiers or query operators")
|
|
197621
|
+
});
|
|
197622
|
+
function SearchIssuesTool(ctx) {
|
|
197623
|
+
return tool({
|
|
197624
|
+
name: "search_issues",
|
|
197625
|
+
description: "Find open or closed issues in this repository by keyword. Inspect promising matches with get_issue before deciding whether they are duplicates or related. Results are bounded, not an exhaustive duplicate check.",
|
|
197626
|
+
parameters: SearchIssues,
|
|
197627
|
+
execute: execute(async (params) => {
|
|
197628
|
+
const repoPath = `/repos/${ctx.repo.owner}/${ctx.repo.name}`.toLowerCase();
|
|
197629
|
+
const terms = params.terms.map((term) => `"${term}"`).join(" ");
|
|
197630
|
+
const response = await ctx.octokit.rest.search.issuesAndPullRequests({
|
|
197631
|
+
q: `repo:${ctx.repo.owner}/${ctx.repo.name} is:issue ${terms}`,
|
|
197632
|
+
per_page: 20
|
|
197633
|
+
});
|
|
197634
|
+
return {
|
|
197635
|
+
incomplete: response.data.incomplete_results || response.data.total_count > 20,
|
|
197636
|
+
issues: response.data.items.filter(
|
|
197637
|
+
(issue3) => new URL(issue3.repository_url).pathname.toLowerCase() === repoPath && !issue3.pull_request && issue3.number !== ctx.payload.event.issue_number
|
|
197638
|
+
).map((issue3) => ({
|
|
197639
|
+
number: issue3.number,
|
|
197640
|
+
title: issue3.title,
|
|
197641
|
+
url: issue3.html_url,
|
|
197642
|
+
state: issue3.state
|
|
197643
|
+
}))
|
|
197644
|
+
};
|
|
197645
|
+
})
|
|
197646
|
+
});
|
|
197647
|
+
}
|
|
197648
|
+
|
|
197509
197649
|
// mcp/selectMode.ts
|
|
197510
197650
|
var SelectModeParams = type({
|
|
197511
197651
|
mode: type.string.describe(
|
|
@@ -197920,6 +198060,9 @@ function buildCommonTools(ctx, outputSchema) {
|
|
|
197920
198060
|
if (hasSimilarIssues({ repoIntelligence: ctx.repoIntelligence, event: ctx.payload.event })) {
|
|
197921
198061
|
tools.push(SimilarIssuesTool(ctx));
|
|
197922
198062
|
}
|
|
198063
|
+
if (ctx.payload.event.issue_number !== void 0 && !ctx.payload.event.is_pr) {
|
|
198064
|
+
tools.push(SearchIssuesTool(ctx));
|
|
198065
|
+
}
|
|
197923
198066
|
const isStandalone = ctx.payload.event.trigger === "unknown";
|
|
197924
198067
|
if (isStandalone || outputSchema) {
|
|
197925
198068
|
tools.push(SetOutputTool(ctx, outputSchema));
|
|
@@ -199645,7 +199788,6 @@ function buildModelAccessError(input2) {
|
|
|
199645
199788
|
}
|
|
199646
199789
|
|
|
199647
199790
|
// utils/normalizeEnv.ts
|
|
199648
|
-
var core6 = __toESM(require_core(), 1);
|
|
199649
199791
|
function hasControlCharacter(value2) {
|
|
199650
199792
|
return [...value2].some((ch) => {
|
|
199651
199793
|
const code = ch.charCodeAt(0);
|
|
@@ -199671,7 +199813,7 @@ function sanitizeSecret(key, value2) {
|
|
|
199671
199813
|
`\xBB stripped whitespace from ${key} (whitespace in secret values breaks GitHub Actions log masking)`
|
|
199672
199814
|
);
|
|
199673
199815
|
}
|
|
199674
|
-
|
|
199816
|
+
maskSecret(trimmed);
|
|
199675
199817
|
return trimmed;
|
|
199676
199818
|
}
|
|
199677
199819
|
function normalizeEnv() {
|
|
@@ -199715,7 +199857,6 @@ function normalizeEnv() {
|
|
|
199715
199857
|
}
|
|
199716
199858
|
|
|
199717
199859
|
// utils/overrides.ts
|
|
199718
|
-
var core7 = __toESM(require_core(), 1);
|
|
199719
199860
|
var DENIED_OVERRIDE_NAMES = /* @__PURE__ */ new Set([
|
|
199720
199861
|
"GITHUB_TOKEN",
|
|
199721
199862
|
"GH_TOKEN",
|
|
@@ -199761,7 +199902,7 @@ function applyOverrides(params) {
|
|
|
199761
199902
|
denied.push(key);
|
|
199762
199903
|
continue;
|
|
199763
199904
|
}
|
|
199764
|
-
if (value2.length > 0)
|
|
199905
|
+
if (value2.length > 0) maskSecret(value2);
|
|
199765
199906
|
params.env[key] = value2;
|
|
199766
199907
|
applied.push(key);
|
|
199767
199908
|
}
|
|
@@ -199770,7 +199911,7 @@ function applyOverrides(params) {
|
|
|
199770
199911
|
}
|
|
199771
199912
|
|
|
199772
199913
|
// utils/payload.ts
|
|
199773
|
-
var
|
|
199914
|
+
var core5 = __toESM(require_core(), 1);
|
|
199774
199915
|
import { readFileSync as readFileSync7 } from "node:fs";
|
|
199775
199916
|
import { isAbsolute as isAbsolute2, resolve as resolve2 } from "node:path";
|
|
199776
199917
|
|
|
@@ -199913,8 +200054,8 @@ function assertDispatchPayloadIntact(promptInput) {
|
|
|
199913
200054
|
);
|
|
199914
200055
|
}
|
|
199915
200056
|
function resolvePromptInput() {
|
|
199916
|
-
const promptInput =
|
|
199917
|
-
const promptFile =
|
|
200057
|
+
const promptInput = core5.getInput("prompt");
|
|
200058
|
+
const promptFile = core5.getInput("prompt_file");
|
|
199918
200059
|
if (promptInput && promptFile) {
|
|
199919
200060
|
throw new Error("set exactly one of 'prompt' or 'prompt_file' inputs, not both.");
|
|
199920
200061
|
}
|
|
@@ -199948,7 +200089,7 @@ function resolvePromptFile(input2) {
|
|
|
199948
200089
|
}
|
|
199949
200090
|
function warnIfDeprecatedStatusChecks(value2) {
|
|
199950
200091
|
if (value2 !== void 0) {
|
|
199951
|
-
|
|
200092
|
+
core5.warning(
|
|
199952
200093
|
"`status_checks` is deprecated. Both checks are now repository settings \u2014 open the Pullfrog console for this repo (Automations \u2192 Review PRs) and set them there, then remove `status_checks` from your workflow. It keeps working until you do."
|
|
199953
200094
|
);
|
|
199954
200095
|
}
|
|
@@ -199956,15 +200097,15 @@ function warnIfDeprecatedStatusChecks(value2) {
|
|
|
199956
200097
|
}
|
|
199957
200098
|
function resolveNonPromptInputs() {
|
|
199958
200099
|
return Inputs.omit("prompt", "prompt_file").assert({
|
|
199959
|
-
model:
|
|
199960
|
-
effort:
|
|
199961
|
-
debug:
|
|
199962
|
-
timeout:
|
|
199963
|
-
cwd:
|
|
199964
|
-
push:
|
|
199965
|
-
shell:
|
|
199966
|
-
status_checks: warnIfDeprecatedStatusChecks(
|
|
199967
|
-
progress_comments:
|
|
200100
|
+
model: core5.getInput("model") || void 0,
|
|
200101
|
+
effort: core5.getInput("effort") || void 0,
|
|
200102
|
+
debug: core5.getInput("debug") || void 0,
|
|
200103
|
+
timeout: core5.getInput("timeout") || void 0,
|
|
200104
|
+
cwd: core5.getInput("cwd") || void 0,
|
|
200105
|
+
push: core5.getInput("push") || void 0,
|
|
200106
|
+
shell: core5.getInput("shell") || void 0,
|
|
200107
|
+
status_checks: warnIfDeprecatedStatusChecks(core5.getInput("status_checks") || void 0),
|
|
200108
|
+
progress_comments: core5.getInput("progress_comments") || void 0
|
|
199968
200109
|
});
|
|
199969
200110
|
}
|
|
199970
200111
|
function resolvePayload(resolvedPromptInput, repoSettings) {
|
|
@@ -200035,7 +200176,7 @@ function resolvePayload(resolvedPromptInput, repoSettings) {
|
|
|
200035
200176
|
};
|
|
200036
200177
|
}
|
|
200037
200178
|
function resolveOutputSchema() {
|
|
200038
|
-
const raw2 =
|
|
200179
|
+
const raw2 = core5.getInput("output_schema");
|
|
200039
200180
|
if (!raw2) return void 0;
|
|
200040
200181
|
let parsed2;
|
|
200041
200182
|
try {
|
|
@@ -200050,11 +200191,8 @@ function resolveOutputSchema() {
|
|
|
200050
200191
|
return parsed2;
|
|
200051
200192
|
}
|
|
200052
200193
|
|
|
200053
|
-
// utils/proxy.ts
|
|
200054
|
-
var core10 = __toESM(require_core(), 1);
|
|
200055
|
-
|
|
200056
200194
|
// utils/token.ts
|
|
200057
|
-
var
|
|
200195
|
+
var core6 = __toESM(require_core(), 1);
|
|
200058
200196
|
import assert2 from "node:assert/strict";
|
|
200059
200197
|
var mcpTokenValue;
|
|
200060
200198
|
var refreshMcpTokenFn;
|
|
@@ -200062,7 +200200,7 @@ function getMcpTokenRefresh() {
|
|
|
200062
200200
|
return refreshMcpTokenFn;
|
|
200063
200201
|
}
|
|
200064
200202
|
function getJobToken() {
|
|
200065
|
-
const inputToken =
|
|
200203
|
+
const inputToken = core6.getInput("token");
|
|
200066
200204
|
if (inputToken) {
|
|
200067
200205
|
return inputToken;
|
|
200068
200206
|
}
|
|
@@ -200077,9 +200215,7 @@ async function resolveTokens(params) {
|
|
|
200077
200215
|
const externalToken = process.env.GH_TOKEN;
|
|
200078
200216
|
if (externalToken) {
|
|
200079
200217
|
mcpTokenValue = externalToken;
|
|
200080
|
-
|
|
200081
|
-
core9.setSecret(externalToken);
|
|
200082
|
-
}
|
|
200218
|
+
maskSecret(externalToken);
|
|
200083
200219
|
log.info("\xBB using external GH_TOKEN for both git and MCP");
|
|
200084
200220
|
return {
|
|
200085
200221
|
gitToken: externalToken,
|
|
@@ -200101,9 +200237,7 @@ async function resolveTokens(params) {
|
|
|
200101
200237
|
xrepoGrant: params.xrepoGrant,
|
|
200102
200238
|
permissions: gitPermissions
|
|
200103
200239
|
});
|
|
200104
|
-
|
|
200105
|
-
core9.setSecret(gitToken);
|
|
200106
|
-
}
|
|
200240
|
+
maskSecret(gitToken);
|
|
200107
200241
|
log.info(
|
|
200108
200242
|
`\xBB acquired git token (${Object.entries(gitPermissions).map((e) => e.join(":")).join(", ")})`
|
|
200109
200243
|
);
|
|
@@ -200122,9 +200256,7 @@ async function resolveTokens(params) {
|
|
|
200122
200256
|
xrepoGrant: params.xrepoGrant,
|
|
200123
200257
|
permissions: mcpPermissions
|
|
200124
200258
|
});
|
|
200125
|
-
|
|
200126
|
-
core9.setSecret(mcpToken);
|
|
200127
|
-
}
|
|
200259
|
+
maskSecret(mcpToken);
|
|
200128
200260
|
log.info(
|
|
200129
200261
|
`\xBB acquired scoped MCP token (${Object.entries(mcpPermissions).map((e) => e.join(":")).join(", ")})`
|
|
200130
200262
|
);
|
|
@@ -200132,7 +200264,7 @@ async function resolveTokens(params) {
|
|
|
200132
200264
|
let ghToken;
|
|
200133
200265
|
if (ghPermissions) {
|
|
200134
200266
|
ghToken = await acquireNewToken({ permissions: ghPermissions });
|
|
200135
|
-
|
|
200267
|
+
maskSecret(ghToken);
|
|
200136
200268
|
log.info(
|
|
200137
200269
|
`\xBB acquired gh token mirroring ${params.authorPermission} (${formatPermissions(ghPermissions)})`
|
|
200138
200270
|
);
|
|
@@ -200144,7 +200276,7 @@ async function resolveTokens(params) {
|
|
|
200144
200276
|
xrepoGrant: params.xrepoGrant,
|
|
200145
200277
|
permissions: { contents: "read" }
|
|
200146
200278
|
});
|
|
200147
|
-
|
|
200279
|
+
maskSecret(readToken);
|
|
200148
200280
|
log.info(`\xBB acquired cross-repo read token (contents:read, ${params.xrepo.read.length} repos)`);
|
|
200149
200281
|
}
|
|
200150
200282
|
mcpTokenValue = mcpToken;
|
|
@@ -200163,9 +200295,7 @@ async function resolveTokens(params) {
|
|
|
200163
200295
|
permissions: mcpPermissions,
|
|
200164
200296
|
oidc: params.oidc ?? void 0
|
|
200165
200297
|
}).then((fresh) => {
|
|
200166
|
-
|
|
200167
|
-
core9.setSecret(fresh);
|
|
200168
|
-
}
|
|
200298
|
+
maskSecret(fresh);
|
|
200169
200299
|
mcpTokenValue = fresh;
|
|
200170
200300
|
currentMcpToken = fresh;
|
|
200171
200301
|
log.warning("\xBB GitHub rejected the MCP token; re-acquired a fresh scoped MCP token");
|
|
@@ -200186,7 +200316,7 @@ async function resolveTokens(params) {
|
|
|
200186
200316
|
permissions: gitPermissions,
|
|
200187
200317
|
oidc: params.oidc ?? void 0
|
|
200188
200318
|
}).then((fresh) => {
|
|
200189
|
-
|
|
200319
|
+
maskSecret(fresh);
|
|
200190
200320
|
void revokeGitHubInstallationToken(currentGitToken);
|
|
200191
200321
|
currentGitToken = fresh;
|
|
200192
200322
|
log.warning("\xBB GitHub rejected the git token; re-acquired a fresh git token");
|
|
@@ -200204,7 +200334,7 @@ async function resolveTokens(params) {
|
|
|
200204
200334
|
permissions: { contents: "read" },
|
|
200205
200335
|
oidc: params.oidc ?? void 0
|
|
200206
200336
|
}).then((fresh) => {
|
|
200207
|
-
|
|
200337
|
+
maskSecret(fresh);
|
|
200208
200338
|
void revokeGitHubInstallationToken(read2);
|
|
200209
200339
|
currentReadToken = fresh;
|
|
200210
200340
|
log.warning("\xBB GitHub rejected the read token; re-acquired a fresh read token");
|
|
@@ -200418,7 +200548,7 @@ async function resolveProxyModel(ctx) {
|
|
|
200418
200548
|
});
|
|
200419
200549
|
if (!key) return;
|
|
200420
200550
|
process.env.OPENROUTER_API_KEY = key;
|
|
200421
|
-
|
|
200551
|
+
maskSecret(key);
|
|
200422
200552
|
ctx.payload.proxyModel = ctx.proxyModel;
|
|
200423
200553
|
ctx.toolState.model = ctx.proxyModel;
|
|
200424
200554
|
const label = ctx.oss ? "oss" : "router";
|
|
@@ -200496,7 +200626,7 @@ async function resolveTrialFallback(ctx) {
|
|
|
200496
200626
|
});
|
|
200497
200627
|
if (!key) return false;
|
|
200498
200628
|
process.env.OPENROUTER_API_KEY = key;
|
|
200499
|
-
|
|
200629
|
+
maskSecret(key);
|
|
200500
200630
|
ctx.payload.proxyModel = DEFAULT_PROXY_MODEL;
|
|
200501
200631
|
ctx.toolState.model = DEFAULT_PROXY_MODEL;
|
|
200502
200632
|
ctx.toolState.modelClamped = {
|
|
@@ -200647,6 +200777,7 @@ var defaultSettings = {
|
|
|
200647
200777
|
push: "restricted",
|
|
200648
200778
|
shell: "restricted",
|
|
200649
200779
|
prApproveEnabled: false,
|
|
200780
|
+
reviewDrafts: false,
|
|
200650
200781
|
autoMergeEnabled: false,
|
|
200651
200782
|
codexAgent: false,
|
|
200652
200783
|
signedCommits: false,
|
|
@@ -200893,6 +201024,23 @@ function isContextOverflowError(message) {
|
|
|
200893
201024
|
function isNoProviderAvailableError(message) {
|
|
200894
201025
|
return /\bNo provider available\b/i.test(message);
|
|
200895
201026
|
}
|
|
201027
|
+
function isZenFreeTierGateError(message) {
|
|
201028
|
+
return /free tier can only be used from within OpenCode/i.test(message);
|
|
201029
|
+
}
|
|
201030
|
+
function formatZenFreeTierGateSummary(input2) {
|
|
201031
|
+
const settingsUrl = `${getApiUrl()}/console/${input2.owner}/${input2.name}`;
|
|
201032
|
+
return [
|
|
201033
|
+
"**Zen's free tier refused a request this run made.** OpenCode Zen currently rejects free-model requests whose tool list is missing one of the built-in tools it expects ([upstream issue](https://github.com/anomalyco/opencode/issues/49587)). Pullfrog sends all of them, but opencode's mid-run context-compaction request carries no tools at all, and a repo-level `opencode.json` that denies `bash`, `glob`, `grep` or `read` strips that tool from every request.",
|
|
201034
|
+
"",
|
|
201035
|
+
'Pick a paid model for this repo, drop any `"deny"` on `bash`, `glob`, `grep` or `read` from the repo\'s `opencode.json` if it sets one, or split the PR so the run stays under the compaction threshold and re-trigger.',
|
|
201036
|
+
"",
|
|
201037
|
+
`[Model settings \u2192](${settingsUrl}) \xB7 [Ask in Discord \u2192](https://discord.gg/8y96raFg8e)`,
|
|
201038
|
+
"",
|
|
201039
|
+
`\`\`\`
|
|
201040
|
+
${input2.raw}
|
|
201041
|
+
\`\`\``
|
|
201042
|
+
].join("\n");
|
|
201043
|
+
}
|
|
200896
201044
|
function formatNoProviderAvailableSummary(input2) {
|
|
200897
201045
|
const settingsUrl = `${getApiUrl()}/console/${input2.owner}/${input2.name}`;
|
|
200898
201046
|
return [
|
|
@@ -201136,6 +201284,16 @@ ${body}`, comment: body };
|
|
|
201136
201284
|
});
|
|
201137
201285
|
return { summary: `### \u274C Pullfrog failed
|
|
201138
201286
|
|
|
201287
|
+
${body}`, comment: body };
|
|
201288
|
+
}
|
|
201289
|
+
if (isZenFreeTierGateError(input2.errorMessage)) {
|
|
201290
|
+
const body = formatZenFreeTierGateSummary({
|
|
201291
|
+
owner: input2.repo.owner,
|
|
201292
|
+
name: input2.repo.name,
|
|
201293
|
+
raw: input2.errorMessage
|
|
201294
|
+
});
|
|
201295
|
+
return { summary: `### \u274C Pullfrog failed
|
|
201296
|
+
|
|
201139
201297
|
${body}`, comment: body };
|
|
201140
201298
|
}
|
|
201141
201299
|
if (isContextOverflowError(input2.errorMessage)) {
|
|
@@ -201173,7 +201331,7 @@ ${genericBody}`,
|
|
|
201173
201331
|
}
|
|
201174
201332
|
|
|
201175
201333
|
// utils/runLifecycle.ts
|
|
201176
|
-
var
|
|
201334
|
+
var core7 = __toESM(require_core(), 1);
|
|
201177
201335
|
|
|
201178
201336
|
// utils/autoMerge.ts
|
|
201179
201337
|
function hasBlockingHumanReview(reviews) {
|
|
@@ -201317,7 +201475,7 @@ async function dispatchFollowUpReReview(ctx, reviewedSha) {
|
|
|
201317
201475
|
});
|
|
201318
201476
|
if (pr.data.head.sha === reviewedSha) return;
|
|
201319
201477
|
if (pr.data.state !== "open") return;
|
|
201320
|
-
if (pr.data.draft) return;
|
|
201478
|
+
if (pr.data.draft && !ctx.reviewDrafts) return;
|
|
201321
201479
|
log.info(
|
|
201322
201480
|
`safety net: pr HEAD moved from ${reviewedSha.slice(0, 7)} to ${pr.data.head.sha.slice(0, 7)} and agent did not review inline \u2014 dispatching follow-up re-review`
|
|
201323
201481
|
);
|
|
@@ -201569,7 +201727,7 @@ async function finalizeSuccessRun(input2) {
|
|
|
201569
201727
|
}
|
|
201570
201728
|
if (input2.toolState.output) {
|
|
201571
201729
|
log.info(`::pullfrog-output::${Buffer.from(input2.toolState.output).toString("base64")}`);
|
|
201572
|
-
|
|
201730
|
+
core7.setOutput("result", input2.toolState.output);
|
|
201573
201731
|
}
|
|
201574
201732
|
if (input2.result.success) {
|
|
201575
201733
|
await approveAfterFix(input2.toolContext).catch((error62) => {
|
|
@@ -202150,6 +202308,7 @@ async function main() {
|
|
|
202150
202308
|
postCheckoutScript: runContext.repoSettings.postCheckoutScript,
|
|
202151
202309
|
prepushScript: runContext.repoSettings.prepushScript,
|
|
202152
202310
|
prApproveEnabled: runContext.repoSettings.prApproveEnabled,
|
|
202311
|
+
reviewDrafts: runContext.repoSettings.reviewDrafts,
|
|
202153
202312
|
autoMergeEnabled: runContext.repoSettings.autoMergeEnabled,
|
|
202154
202313
|
signedCommits: runContext.repoSettings.signedCommits,
|
|
202155
202314
|
repoIntelligence: runContext.repoSettings.repoIntelligence,
|
|
@@ -202481,7 +202640,7 @@ ieee754/index.js:
|
|
|
202481
202640
|
* MIT Licensed
|
|
202482
202641
|
*)
|
|
202483
202642
|
|
|
202484
|
-
mcp-proxy/dist/startStdioServer-
|
|
202643
|
+
mcp-proxy/dist/startStdioServer-C9HzKfjR.mjs:
|
|
202485
202644
|
(*!
|
|
202486
202645
|
* content-type
|
|
202487
202646
|
* Copyright(c) 2015 Douglas Christopher Wilson
|