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/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 setSecret6(secret) {
19721
+ function setSecret2(secret) {
19722
19722
  (0, command_1.issueCommand)("add-mask", {}, secret);
19723
19723
  }
19724
- exports.setSecret = setSecret6;
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 setOutput2(name, value2) {
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 = setOutput2;
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 saveState3(name, value2) {
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 = saveState3;
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 core12;
27624
+ var core8;
27625
27625
  if (process.platform === "win32" || global.TESTING_WINDOWS) {
27626
- core12 = require_windows();
27626
+ core8 = require_windows();
27627
27627
  } else {
27628
- core12 = require_mode();
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
- core12(path4, options || {}, function(er, is) {
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 core12.sync(path4, options || {});
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 core12 = [
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 = core12;
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 isn't indexed yet), so track ~…-latest to
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-5.6-sol",
107821
+ resolve: "openai/gpt-6-sol",
107822
107822
  effort: ["none", "low", "medium", "high", "xhigh", "max"],
107823
- openRouterResolve: "openrouter/openai/gpt-5.6-sol",
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-5.6-sol",
107833
+ resolve: "openai/gpt-6-sol",
107834
107834
  effort: ["none", "low", "medium", "high", "xhigh", "max"],
107835
- openRouterResolve: "openrouter/openai/gpt-5.6-sol-pro",
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-5.6-luna",
107848
+ resolve: "openai/gpt-6-luna",
107849
107849
  effort: ["none", "low", "medium", "high", "xhigh", "max"],
107850
- openRouterResolve: "openrouter/openai/gpt-5.6-luna"
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.6",
107944
+ resolve: "xai/grok-4.7",
107945
107945
  effort: ["low", "medium", "high", "xhigh"],
107946
- openRouterResolve: "openrouter/x-ai/grok-4.6",
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.6 for both direct-key and OpenRouter users.
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.6",
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.6",
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
- effort: ["high", "max"],
108000
- openRouterEffort: ["low", "high", "max"],
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
- // `kimi-for-coding` (api `https://api.kimi.com/coding/v1`, npm
108066
- // `@ai-sdk/anthropic`) and opencode's env loop enables it from a bare
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. The provider KEY has to stay `kimi-for-coding` — it
108080
- // is models.dev's id, so it is what `enabled_providers` and every
108081
- // `resolve` prefix must spell.
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-for-coding/k3",
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-for-coding/k3-256k",
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-for-coding/kimi-for-coding",
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-for-coding/kimi-for-coding-highspeed"
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
- // TEMPORARY — clear this ONLY when opus completes a run through opencode,
108193
- // never when the endpoint merely answers. Zen LISTS claude-opus-5 in
108194
- // /zen/v1/models, so the catalog test passes; on 2026-08-25 the endpoint
108195
- // itself answered 503 `Upstream request failed: Endpoint is unavailable.`
108196
- // (measured 5/5; claude-sonnet-5, claude-opus-4-8, claude-haiku-4-5 and
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-5.6-sol",
108222
+ resolve: "opencode/gpt-6-sol",
108221
108223
  effort: ["none", "low", "medium", "high", "xhigh", "max"],
108222
- openRouterResolve: "openrouter/openai/gpt-5.6-sol",
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-5.6-sol",
108238
+ resolve: "opencode/gpt-6-sol",
108237
108239
  effort: ["none", "low", "medium", "high", "xhigh", "max"],
108238
- openRouterResolve: "openrouter/openai/gpt-5.6-sol-pro",
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-5.6-luna",
108252
+ resolve: "opencode/gpt-6-luna",
108251
108253
  effort: ["none", "low", "medium", "high", "xhigh", "max"],
108252
- openRouterResolve: "openrouter/openai/gpt-5.6-luna"
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.6",
108353
+ resolve: "opencode/grok-4.7",
108352
108354
  effort: ["low", "medium", "high", "xhigh"],
108353
- openRouterResolve: "openrouter/x-ai/grok-4.6"
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
- effort: ["minimal", "low", "medium", "high", "xhigh", "max"],
108367
- openRouterResolve: "openrouter/meta/muse-spark-1.3"
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
- resolve: "opencode/mimo-v2.5-free",
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, six of which are served ONLY here — Zen's `/v1/models`
108427
- // does not list qwen3.7/3.8-*, mimo-v2.5-pro, longcat-2.0 or hy3. (it listed
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 provider is not a duplicate route to Zen,
108430
- // it is the only route to a large part of what they pay for.
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 — new vendor family for the catalog; Zen serves neither tier.
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.5-pro",
108534
- openRouterResolve: "openrouter/xiaomi/mimo-v2.5-pro"
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.6",
108618
+ resolve: "opencode-go/grok-4.7",
108561
108619
  effort: ["low", "medium", "high", "xhigh"],
108562
- openRouterResolve: "openrouter/x-ai/grok-4.6"
108620
+ openRouterResolve: "openrouter/x-ai/grok-4.7"
108563
108621
  },
108564
108622
  "gpt-luna": {
108565
108623
  displayName: "GPT Luna",
108566
- resolve: "opencode-go/gpt-5.6-luna",
108624
+ resolve: "opencode-go/gpt-6-luna",
108567
108625
  effort: ["none", "low", "medium", "high", "xhigh", "max"],
108568
- openRouterResolve: "openrouter/openai/gpt-5.6-luna"
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 gpt-5.6 tiers (not the ~openai/gpt-latest rolling
108671
- // alias): after the Sol/Terra/Luna rename, ~gpt-mini-latest no longer maps
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-5.6-sol",
108734
+ resolve: "openrouter/openai/gpt-6-sol",
108677
108735
  effort: ["none", "low", "medium", "high", "xhigh", "max"],
108678
- openRouterResolve: "openrouter/openai/gpt-5.6-sol",
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-5.6-sol-pro",
108750
+ resolve: "openrouter/openai/gpt-6-sol-pro",
108693
108751
  effort: ["none", "low", "medium", "high", "xhigh", "max"],
108694
- openRouterResolve: "openrouter/openai/gpt-5.6-sol-pro",
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-5.6-luna",
108764
+ resolve: "openrouter/openai/gpt-6-luna",
108707
108765
  effort: ["none", "low", "medium", "high", "xhigh", "max"],
108708
- openRouterResolve: "openrouter/openai/gpt-5.6-luna"
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.6",
108830
+ resolve: "openrouter/x-ai/grok-4.7",
108773
108831
  effort: ["low", "medium", "high", "xhigh"],
108774
- openRouterResolve: "openrouter/x-ai/grok-4.6"
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`), and effort ladders mirror that
108846
- // catalog's entries, not the upstream vendor's. deliberately no
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-5.6-sol",
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-5.6-luna",
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", "medium", "high"]
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", "medium", "high"]
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", "xhigh"]
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. the gateway publishes no
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.81",
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.150",
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, execToolDenyRules) {
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: execToolDenyRules }
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 CLAUDE_EXEC_TOOL_DENY_RULES = [
111570
+ var CLAUDE_EXEC_TOOLS = ["Bash", "PowerShell", "Monitor", "REPL", "Workflow"];
111571
+ var CLAUDE_DENIED_TOOLS = [
111511
111572
  ...CLAUDE_EXEC_TOOLS,
111512
- ...CLAUDE_EXEC_TOOLS.map((t) => `Agent(${t})`)
111573
+ "DesignSync",
111574
+ "Artifact",
111575
+ "ShareOnboardingGuide",
111576
+ "SendMessage",
111577
+ "ListAgents",
111578
+ "PushNotification",
111579
+ "RemoteTrigger"
111513
111580
  ];
111514
- var CLAUDE_DISALLOWED_TOOLS = CLAUDE_EXEC_TOOL_DENY_RULES.join(",");
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
- // native exec tools — the authoritative, bypass-immune deny.
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-5.6-sol": { input: 5, cacheRead: 0.5, cacheWrite: 6.25, output: 30 },
112803
- "gpt-5.6-luna": { input: 0.2, cacheRead: 0.02, cacheWrite: 0.25, output: 1.2 },
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
- core3.saveState(
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
- bash: "deny",
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
- core4.saveState(
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.11/node_modules/mcp-proxy/dist/startStdioServer-C4sEMMHS.mjs
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 core12 = [
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 = core12;
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 core12 = require_core$1();
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
- core12,
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 core12 = require_core4();
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
- core12,
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.11/node_modules/mcp-proxy/dist/startStdioServer-C4sEMMHS.mjs
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 core12 = [
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 = core12;
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 core12 = require_core$12();
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
- core12,
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 core12 = require_core5();
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
- core12,
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.11/node_modules/mcp-proxy/dist/startStdioServer-C4sEMMHS.mjs
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 core5 = __toESM(require_core(), 1);
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
- if (isGitHubActions) {
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 core5.getIDToken(OIDC_AUDIENCE);
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
- if (commentType === "Plan") {
193430
- if (result.data.node_id) {
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(body)}${footer}`;
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)] : void 0;
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(body);
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
- core6.setSecret(trimmed);
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) core7.setSecret(value2);
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 core8 = __toESM(require_core(), 1);
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 = core8.getInput("prompt");
199917
- const promptFile = core8.getInput("prompt_file");
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
- core8.warning(
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: core8.getInput("model") || void 0,
199960
- effort: core8.getInput("effort") || void 0,
199961
- debug: core8.getInput("debug") || void 0,
199962
- timeout: core8.getInput("timeout") || void 0,
199963
- cwd: core8.getInput("cwd") || void 0,
199964
- push: core8.getInput("push") || void 0,
199965
- shell: core8.getInput("shell") || void 0,
199966
- status_checks: warnIfDeprecatedStatusChecks(core8.getInput("status_checks") || void 0),
199967
- progress_comments: core8.getInput("progress_comments") || void 0
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 = core8.getInput("output_schema");
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 core9 = __toESM(require_core(), 1);
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 = core9.getInput("token");
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
- if (isGitHubActions) {
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
- if (isGitHubActions) {
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
- if (isGitHubActions) {
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
- if (isGitHubActions) core9.setSecret(ghToken);
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
- if (isGitHubActions) core9.setSecret(readToken);
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
- if (isGitHubActions) {
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
- if (isGitHubActions) core9.setSecret(fresh);
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
- if (isGitHubActions) core9.setSecret(fresh);
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
- core10.setSecret(key);
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
- core10.setSecret(key);
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 core11 = __toESM(require_core(), 1);
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
- core11.setOutput("result", input2.toolState.output);
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-C4sEMMHS.mjs:
202643
+ mcp-proxy/dist/startStdioServer-C9HzKfjR.mjs:
202485
202644
  (*!
202486
202645
  * content-type
202487
202646
  * Copyright(c) 2015 Douglas Christopher Wilson