pullfrog 0.1.82 → 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/internal.js CHANGED
@@ -8,7 +8,7 @@ var __export = (target, all) => {
8
8
  // package.json
9
9
  var package_default = {
10
10
  name: "pullfrog",
11
- version: "0.1.82",
11
+ version: "0.1.83",
12
12
  cliContractVersion: "1",
13
13
  type: "module",
14
14
  bin: {
@@ -25,6 +25,7 @@ var package_default = {
25
25
  typecheck: "tsc --noEmit",
26
26
  build: "node esbuild.config.js && tsc -p tsconfig.exports.json",
27
27
  "check:entrypoints": "nub scripts/check-entrypoint-imports.ts",
28
+ "check:secret-commands": "nub scripts/check-secret-commands.ts",
28
29
  docker: "nub docker.ts",
29
30
  play: "nub play.ts",
30
31
  runtest: "nub test/run.ts",
@@ -35,7 +36,7 @@ var package_default = {
35
36
  },
36
37
  devDependencies: {
37
38
  "@actions/core": "^1.11.1",
38
- "@anthropic-ai/claude-code": "2.1.150",
39
+ "@anthropic-ai/claude-code": "2.1.280",
39
40
  "@ark/fs": "0.56.0",
40
41
  "@ark/util": "0.56.0",
41
42
  "@clack/prompts": "^1.2.0",
@@ -14339,19 +14340,19 @@ var providers = {
14339
14340
  // API is the source of truth (#959).
14340
14341
  "claude-fable": {
14341
14342
  displayName: "Claude Fable",
14342
- resolve: "anthropic/claude-fable-5",
14343
+ resolve: "anthropic/claude-fable-5-1",
14343
14344
  effort: ["low", "medium", "high", "xhigh", "max"],
14344
14345
  // rolling alias: models.dev's OpenRouter mirror lags brand-new pinned
14345
- // versions (claude-fable-5 isn't indexed yet), so track ~…-latest to
14346
+ // versions (claude-fable-5 was missing there when this was added), so track ~…-latest to
14346
14347
  // stay catalog-valid and auto-follow version bumps.
14347
14348
  openRouterResolve: "openrouter/~anthropic/claude-fable-latest",
14348
14349
  subagentModel: "claude-sonnet"
14349
14350
  },
14350
14351
  "claude-opus": {
14351
14352
  displayName: "Claude Opus",
14352
- resolve: "anthropic/claude-opus-5",
14353
+ resolve: "anthropic/claude-opus-5-5",
14353
14354
  effort: ["low", "medium", "high", "xhigh", "max"],
14354
- openRouterResolve: "openrouter/anthropic/claude-opus-5",
14355
+ openRouterResolve: "openrouter/anthropic/claude-opus-5.5",
14355
14356
  preferred: true,
14356
14357
  subagentModel: "claude-sonnet"
14357
14358
  },
@@ -14386,9 +14387,9 @@ var providers = {
14386
14387
  },
14387
14388
  "gpt-sol": {
14388
14389
  displayName: "GPT Sol",
14389
- resolve: "openai/gpt-5.6-sol",
14390
+ resolve: "openai/gpt-6-sol",
14390
14391
  effort: ["none", "low", "medium", "high", "xhigh", "max"],
14391
- openRouterResolve: "openrouter/openai/gpt-5.6-sol",
14392
+ openRouterResolve: "openrouter/openai/gpt-6-sol",
14392
14393
  preferred: true,
14393
14394
  subagentModel: "gpt-terra"
14394
14395
  },
@@ -14398,9 +14399,9 @@ var providers = {
14398
14399
  "gpt-sol-pro": {
14399
14400
  displayName: "GPT Sol Pro",
14400
14401
  description: "Maximum reasoning effort",
14401
- resolve: "openai/gpt-5.6-sol",
14402
+ resolve: "openai/gpt-6-sol",
14402
14403
  effort: ["none", "low", "medium", "high", "xhigh", "max"],
14403
- openRouterResolve: "openrouter/openai/gpt-5.6-sol-pro",
14404
+ openRouterResolve: "openrouter/openai/gpt-6-sol-pro",
14404
14405
  subagentModel: "gpt-sol"
14405
14406
  },
14406
14407
  // gpt-5.6's balanced mid-tier. selectable on its own and doubles as Sol's
@@ -14413,9 +14414,9 @@ var providers = {
14413
14414
  },
14414
14415
  "gpt-luna": {
14415
14416
  displayName: "GPT Luna",
14416
- resolve: "openai/gpt-5.6-luna",
14417
+ resolve: "openai/gpt-6-luna",
14417
14418
  effort: ["none", "low", "medium", "high", "xhigh", "max"],
14418
- openRouterResolve: "openrouter/openai/gpt-5.6-luna"
14419
+ openRouterResolve: "openrouter/openai/gpt-6-luna"
14419
14420
  },
14420
14421
  // legacy aliases — openai unified the codex line into the main GPT family
14421
14422
  // and is shutting down every "-codex" snapshot on 2026-07-23. transparently
@@ -14509,9 +14510,9 @@ var providers = {
14509
14510
  models: {
14510
14511
  grok: {
14511
14512
  displayName: "Grok",
14512
- resolve: "xai/grok-4.6",
14513
+ resolve: "xai/grok-4.7",
14513
14514
  effort: ["low", "medium", "high", "xhigh"],
14514
- openRouterResolve: "openrouter/x-ai/grok-4.6",
14515
+ openRouterResolve: "openrouter/x-ai/grok-4.7",
14515
14516
  preferred: true
14516
14517
  },
14517
14518
  // the Smart ladder's cheap rung: 1.25/2.5 against 4.6's 2/6, and a 0.2
@@ -14526,17 +14527,17 @@ var providers = {
14526
14527
  // 2026-05-15 (https://docs.x.ai/developers/migration/may-15-deprecation)
14527
14528
  // and now redirects every deprecated text-model slug to grok-4.3 at
14528
14529
  // standard pricing. fall back to the live `xai/grok` so the alias
14529
- // chain resolves to grok-4.6 for both direct-key and OpenRouter users.
14530
+ // chain resolves to grok-4.7 for both direct-key and OpenRouter users.
14530
14531
  "grok-fast": {
14531
14532
  displayName: "Grok Fast",
14532
14533
  resolve: "xai/grok-4-1-fast",
14533
- openRouterResolve: "openrouter/x-ai/grok-4.6",
14534
+ openRouterResolve: "openrouter/x-ai/grok-4.7",
14534
14535
  fallback: "xai/grok"
14535
14536
  },
14536
14537
  "grok-code-fast": {
14537
14538
  displayName: "Grok Code Fast",
14538
14539
  resolve: "xai/grok-code-fast-1",
14539
- openRouterResolve: "openrouter/x-ai/grok-4.6",
14540
+ openRouterResolve: "openrouter/x-ai/grok-4.7",
14540
14541
  fallback: "xai/grok"
14541
14542
  }
14542
14543
  }
@@ -14564,8 +14565,9 @@ var providers = {
14564
14565
  "deepseek-pro": {
14565
14566
  displayName: "DeepSeek Pro",
14566
14567
  resolve: "deepseek/deepseek-v4-pro",
14567
- effort: ["high", "max"],
14568
- openRouterEffort: ["low", "high", "max"],
14568
+ // models.dev gave the direct id V4.1-Flash's ladder on 2026-09-21, which
14569
+ // is what DeepSeek now serves under it — and the same as the Router pin's.
14570
+ effort: ["low", "high", "max"],
14569
14571
  openRouterResolve: "openrouter/deepseek/deepseek-v4-pro-0813",
14570
14572
  preferred: true
14571
14573
  },
@@ -14763,24 +14765,15 @@ var providers = {
14763
14765
  },
14764
14766
  "claude-opus": {
14765
14767
  displayName: "Claude Opus",
14766
- resolve: "opencode/claude-opus-5",
14768
+ resolve: "opencode/claude-opus-5-5",
14767
14769
  effort: ["low", "medium", "high", "xhigh", "max"],
14768
- openRouterResolve: "openrouter/anthropic/claude-opus-5",
14769
- subagentModel: "claude-sonnet",
14770
- // TEMPORARY — clear this ONLY when opus completes a run through opencode,
14771
- // never when the endpoint merely answers. Zen LISTS claude-opus-5 in
14772
- // /zen/v1/models, so the catalog test passes; on 2026-08-25 the endpoint
14773
- // itself answered 503 `Upstream request failed: Endpoint is unavailable.`
14774
- // (measured 5/5; claude-sonnet-5, claude-opus-4-8, claude-haiku-4-5 and
14775
- // claude-fable-5 all 200 on the same key). opencode retries above the AI
14776
- // SDK emitting no part.updated, so a run just produces nothing until it is
14777
- // killed — metaideas/init logged six zero-output failures from 2026-08-23.
14778
- // The 503 has since cleared and the model is STILL unusable: re-measured
14779
- // 2026-08-26, direct POST /zen/v1/messages is 10/10 200 at 1.3-4.1s while
14780
- // `opencode run --model opencode/claude-opus-5` on the same trivial prompt
14781
- // emitted nothing for 240s in CI. A raw-endpoint 200 is not runtime
14782
- // availability. see wiki/opencode-silent-stall.md
14783
- fallback: "opencode/claude-sonnet"
14770
+ openRouterResolve: "openrouter/anthropic/claude-opus-5.5",
14771
+ subagentModel: "claude-sonnet"
14772
+ // fell back to Sonnet from 2026-08-25 to 2026-09-25: Zen listed
14773
+ // claude-opus-5 while `opencode run` on it emitted nothing for 240s. A
14774
+ // raw-endpoint 200 is not runtime availability — the fallback was cleared
14775
+ // only once `opencode run` completed on both claude-opus-5 and 5-5. see
14776
+ // wiki/opencode-silent-stall.md
14784
14777
  },
14785
14778
  "claude-sonnet": {
14786
14779
  displayName: "Claude Sonnet",
@@ -14795,9 +14788,9 @@ var providers = {
14795
14788
  },
14796
14789
  "gpt-sol": {
14797
14790
  displayName: "GPT Sol",
14798
- resolve: "opencode/gpt-5.6-sol",
14791
+ resolve: "opencode/gpt-6-sol",
14799
14792
  effort: ["none", "low", "medium", "high", "xhigh", "max"],
14800
- openRouterResolve: "openrouter/openai/gpt-5.6-sol",
14793
+ openRouterResolve: "openrouter/openai/gpt-6-sol",
14801
14794
  subagentModel: "gpt-terra"
14802
14795
  },
14803
14796
  "gpt-astra": {
@@ -14811,9 +14804,9 @@ var providers = {
14811
14804
  "gpt-sol-pro": {
14812
14805
  displayName: "GPT Sol Pro",
14813
14806
  description: "Maximum reasoning effort",
14814
- resolve: "opencode/gpt-5.6-sol",
14807
+ resolve: "opencode/gpt-6-sol",
14815
14808
  effort: ["none", "low", "medium", "high", "xhigh", "max"],
14816
- openRouterResolve: "openrouter/openai/gpt-5.6-sol-pro",
14809
+ openRouterResolve: "openrouter/openai/gpt-6-sol-pro",
14817
14810
  subagentModel: "gpt-sol"
14818
14811
  },
14819
14812
  // gpt-5.6 balanced mid-tier — selectable + Sol's subagent. see openai above.
@@ -14825,9 +14818,9 @@ var providers = {
14825
14818
  },
14826
14819
  "gpt-luna": {
14827
14820
  displayName: "GPT Luna",
14828
- resolve: "opencode/gpt-5.6-luna",
14821
+ resolve: "opencode/gpt-6-luna",
14829
14822
  effort: ["none", "low", "medium", "high", "xhigh", "max"],
14830
- openRouterResolve: "openrouter/openai/gpt-5.6-luna"
14823
+ openRouterResolve: "openrouter/openai/gpt-6-luna"
14831
14824
  },
14832
14825
  // legacy aliases — see openai provider above for context.
14833
14826
  "gpt-codex": {
@@ -14926,9 +14919,34 @@ var providers = {
14926
14919
  },
14927
14920
  grok: {
14928
14921
  displayName: "Grok",
14929
- resolve: "opencode/grok-4.6",
14922
+ resolve: "opencode/grok-4.7",
14930
14923
  effort: ["low", "medium", "high", "xhigh"],
14931
- openRouterResolve: "openrouter/x-ai/grok-4.6"
14924
+ openRouterResolve: "openrouter/x-ai/grok-4.7"
14925
+ },
14926
+ // Zen began listing Qwen's Max and Flash tiers in late 2026-09 (Max on
14927
+ // 09-25); until then `opencode-go` was the only Qwen route, so a Zen
14928
+ // subscriber without Go had none. Plus is still Go-only. Zen's Max entry
14929
+ // publishes a reasoning toggle but no effort rungs.
14930
+ "qwen-max": {
14931
+ displayName: "Qwen Max",
14932
+ resolve: "opencode/qwen3.8-max",
14933
+ openRouterEffort: ["minimal", "low", "medium", "high", "xhigh"],
14934
+ openRouterResolve: "openrouter/qwen/qwen3.8-max-0902",
14935
+ // unlisted until a published `pullfrog` carries this alias (the
14936
+ // merge-vs-publish rule in wiki/models-catalog.md). unhide in the release
14937
+ // that ships it.
14938
+ hidden: true
14939
+ },
14940
+ "qwen-flash": {
14941
+ displayName: "Qwen Flash",
14942
+ resolve: "opencode/qwen3.8-flash",
14943
+ effort: ["low", "medium", "xhigh"],
14944
+ openRouterEffort: [],
14945
+ openRouterResolve: "openrouter/qwen/qwen3.8-flash",
14946
+ // unlisted until a published `pullfrog` carries this alias (the
14947
+ // merge-vs-publish rule in wiki/models-catalog.md). unhide in the release
14948
+ // that ships it.
14949
+ hidden: true
14932
14950
  },
14933
14951
  "gpt-5-nano": {
14934
14952
  displayName: "GPT Nano",
@@ -14977,11 +14995,31 @@ var providers = {
14977
14995
  // model, as `minimax-m2.5-free` does.
14978
14996
  fallback: "opencode/big-pickle"
14979
14997
  },
14998
+ // Zen's FREE stealth preview (listed 2026-09-23), the third after
14999
+ // big-pickle and union-alpha. OpenRouter's listing: prompts and
15000
+ // completions may be retained by the provider, not trained on. unlike the
15001
+ // first two it publishes an effort ladder, so the gate mirrors one here.
15002
+ "space-bunny": {
15003
+ displayName: "Space Bunny",
15004
+ description: "Stealth preview; prompts may be retained",
15005
+ resolve: "opencode/space-bunny-free",
15006
+ effort: ["low", "medium", "high", "xhigh", "max"],
15007
+ // free to run, still gated on the provider's own OPENCODE_API_KEY —
15008
+ // see the big-pickle note above (#1077).
15009
+ isFree: true,
15010
+ // unlisted until a published `pullfrog` carries this alias: 0.1.82
15011
+ // predates it, so a run passes `opencode/space-bunny` through raw and
15012
+ // Zen answers a 500. unhide in the release that ships it.
15013
+ hidden: true
15014
+ },
14980
15015
  // Zen's live free MiMo, and the second free row in a menu that big-pickle
14981
15016
  // was alone in since `mimo-v2-pro-free` lost its model.
14982
15017
  mimo: {
14983
15018
  displayName: "MiMo",
14984
- resolve: "opencode/mimo-v2.5-free",
15019
+ // models.dev deprecated `mimo-v2.5-free` on 2026-09-22. V2.6-Flash is
15020
+ // the only other MiMo Zen serves, so the slug follows it across the
15021
+ // tier rather than leaving stored picks on a dying id.
15022
+ resolve: "opencode/mimo-v2.6-flash-free",
14985
15023
  // free to run, still gated on the provider's own OPENCODE_API_KEY —
14986
15024
  // see the big-pickle note above (#1077).
14987
15025
  isFree: true
@@ -15010,11 +15048,12 @@ var providers = {
15010
15048
  // OpenCode Go is a separate $10/mo subscription from Zen, served on its own
15011
15049
  // base URL (`https://opencode.ai/zen/go/v1`) but authenticated with the SAME
15012
15050
  // `OPENCODE_API_KEY`. it carries the open-weight coding models plus a couple
15013
- // of frontier ones, six of which are served ONLY here — Zen's `/v1/models`
15014
- // does not list qwen3.7/3.8-*, mimo-v2.5-pro, longcat-2.0 or hy3. (it listed
15051
+ // of frontier ones, four of which are served ONLY here — Zen's `/v1/models`
15052
+ // does not list qwen3.7-plus, mimo-v2.6-pro, longcat-2.0 or hy3. (it listed
15015
15053
  // no glm-5.3* either until 2026-09, which is why `opencode/glm` trailed on
15016
- // 5.2.) so for a Go subscriber this provider is not a duplicate route to Zen,
15017
- // it is the only route to a large part of what they pay for.
15054
+ // 5.2, and no qwen3.8-* until late 2026-09.) so for a Go subscriber this
15055
+ // provider is not a duplicate route to Zen, it is the only route to a large
15056
+ // part of what they pay for.
15018
15057
  // like `opencode` and `openrouter` this is a ROUTER, not a vendor: slugs and
15019
15058
  // display names mirror the upstream brand tier, and the picker groups them
15020
15059
  // under the upstream vendor.
@@ -15074,7 +15113,8 @@ var providers = {
15074
15113
  // picker row that fails for almost everyone is worse than none. DeepSeek
15075
15114
  // stays reachable ungated via `deepseek/*`, `opencode/*` and
15076
15115
  // `openrouter/*`; both remain runnable by full specifier once opted in.
15077
- // Alibaba — new vendor family for the catalog; Zen serves neither tier.
15116
+ // Alibaba — Zen serves Max and Flash too (see `opencode/qwen-max`); Plus
15117
+ // is Go-only.
15078
15118
  "qwen-max": {
15079
15119
  displayName: "Qwen Max",
15080
15120
  resolve: "opencode-go/qwen3.8-max",
@@ -15117,8 +15157,8 @@ var providers = {
15117
15157
  // Xiaomi — Go-only; Zen serves the free `mimo-v2-pro-free` promo instead.
15118
15158
  "mimo-pro": {
15119
15159
  displayName: "MiMo Pro",
15120
- resolve: "opencode-go/mimo-v2.5-pro",
15121
- openRouterResolve: "openrouter/xiaomi/mimo-v2.5-pro"
15160
+ resolve: "opencode-go/mimo-v2.6-pro",
15161
+ openRouterResolve: "openrouter/xiaomi/mimo-v2.6-pro"
15122
15162
  },
15123
15163
  // Meituan — Go-only.
15124
15164
  longcat: {
@@ -15144,15 +15184,15 @@ var providers = {
15144
15184
  // wiki/models-catalog.md on `opencode/kimi-k2`.
15145
15185
  grok: {
15146
15186
  displayName: "Grok",
15147
- resolve: "opencode-go/grok-4.6",
15187
+ resolve: "opencode-go/grok-4.7",
15148
15188
  effort: ["low", "medium", "high", "xhigh"],
15149
- openRouterResolve: "openrouter/x-ai/grok-4.6"
15189
+ openRouterResolve: "openrouter/x-ai/grok-4.7"
15150
15190
  },
15151
15191
  "gpt-luna": {
15152
15192
  displayName: "GPT Luna",
15153
- resolve: "opencode-go/gpt-5.6-luna",
15193
+ resolve: "opencode-go/gpt-6-luna",
15154
15194
  effort: ["none", "low", "medium", "high", "xhigh", "max"],
15155
- openRouterResolve: "openrouter/openai/gpt-5.6-luna"
15195
+ openRouterResolve: "openrouter/openai/gpt-6-luna"
15156
15196
  }
15157
15197
  }
15158
15198
  }),
@@ -15254,15 +15294,15 @@ var providers = {
15254
15294
  resolve: "openrouter/~anthropic/claude-haiku-latest",
15255
15295
  openRouterResolve: "openrouter/~anthropic/claude-haiku-latest"
15256
15296
  },
15257
- // pinned to the explicit gpt-5.6 tiers (not the ~openai/gpt-latest rolling
15258
- // alias): after the Sol/Terra/Luna rename, ~gpt-mini-latest no longer maps
15297
+ // pinned to the explicit Sol/Terra/Luna tiers (not the ~openai/gpt-latest
15298
+ // rolling alias): after that rename, ~gpt-mini-latest no longer maps
15259
15299
  // to Luna, so rolling aliases would silently diverge `gpt`/`gpt-mini` from
15260
15300
  // the chosen tiers across funding paths.
15261
15301
  "gpt-sol": {
15262
15302
  displayName: "GPT Sol",
15263
- resolve: "openrouter/openai/gpt-5.6-sol",
15303
+ resolve: "openrouter/openai/gpt-6-sol",
15264
15304
  effort: ["none", "low", "medium", "high", "xhigh", "max"],
15265
- openRouterResolve: "openrouter/openai/gpt-5.6-sol",
15305
+ openRouterResolve: "openrouter/openai/gpt-6-sol",
15266
15306
  subagentModel: "gpt-terra"
15267
15307
  },
15268
15308
  "gpt-astra": {
@@ -15276,9 +15316,9 @@ var providers = {
15276
15316
  "gpt-sol-pro": {
15277
15317
  displayName: "GPT Sol Pro",
15278
15318
  description: "Maximum reasoning effort",
15279
- resolve: "openrouter/openai/gpt-5.6-sol-pro",
15319
+ resolve: "openrouter/openai/gpt-6-sol-pro",
15280
15320
  effort: ["none", "low", "medium", "high", "xhigh", "max"],
15281
- openRouterResolve: "openrouter/openai/gpt-5.6-sol-pro",
15321
+ openRouterResolve: "openrouter/openai/gpt-6-sol-pro",
15282
15322
  subagentModel: "gpt-sol"
15283
15323
  },
15284
15324
  // gpt-5.6 balanced mid-tier — selectable + Sol's subagent. see openai above.
@@ -15290,9 +15330,9 @@ var providers = {
15290
15330
  },
15291
15331
  "gpt-luna": {
15292
15332
  displayName: "GPT Luna",
15293
- resolve: "openrouter/openai/gpt-5.6-luna",
15333
+ resolve: "openrouter/openai/gpt-6-luna",
15294
15334
  effort: ["none", "low", "medium", "high", "xhigh", "max"],
15295
- openRouterResolve: "openrouter/openai/gpt-5.6-luna"
15335
+ openRouterResolve: "openrouter/openai/gpt-6-luna"
15296
15336
  },
15297
15337
  // legacy aliases — see openai provider for context.
15298
15338
  "gpt-codex": {
@@ -15356,9 +15396,9 @@ var providers = {
15356
15396
  },
15357
15397
  grok: {
15358
15398
  displayName: "Grok",
15359
- resolve: "openrouter/x-ai/grok-4.6",
15399
+ resolve: "openrouter/x-ai/grok-4.7",
15360
15400
  effort: ["low", "medium", "high", "xhigh"],
15361
- openRouterResolve: "openrouter/x-ai/grok-4.6"
15401
+ openRouterResolve: "openrouter/x-ai/grok-4.7"
15362
15402
  },
15363
15403
  // dated pin, not the bare id — see `deepseek/deepseek-pro` for why
15364
15404
  // OpenRouter's unversioned `deepseek-v4-pro` is the stale April preview.
@@ -15429,8 +15469,10 @@ var providers = {
15429
15469
  vercel: provider({
15430
15470
  // Vercel AI Gateway — one key serves every model it fronts. model IDs use
15431
15471
  // the models.dev `vercel` catalog's own naming (dotted versions, e.g.
15432
- // `anthropic/claude-opus-5`, `zai/glm-5.3`), and effort ladders mirror that
15433
- // catalog's entries, not the upstream vendor's. deliberately no
15472
+ // `anthropic/claude-opus-5.5`, `zai/glm-5.3`). effort ladders come from the
15473
+ // gateway's OWN `/v1/models`, not models.dev — the two disagree routinely
15474
+ // (on 2026-09-22 they disagreed on all ten entries that drifted), and the
15475
+ // drift test reads the gateway for that reason. deliberately no
15434
15476
  // `openRouterResolve`: a gateway pick is BYOK-only — silently rerouting it
15435
15477
  // over the Router proxy would bill the wallet for traffic the user pointed
15436
15478
  // at their own gateway.
@@ -15439,7 +15481,7 @@ var providers = {
15439
15481
  models: {
15440
15482
  "claude-opus": {
15441
15483
  displayName: "Claude Opus",
15442
- resolve: "vercel/anthropic/claude-opus-5",
15484
+ resolve: "vercel/anthropic/claude-opus-5.5",
15443
15485
  effort: ["low", "medium", "high", "xhigh", "max"],
15444
15486
  preferred: true,
15445
15487
  subagentModel: "claude-sonnet"
@@ -15447,7 +15489,7 @@ var providers = {
15447
15489
  "claude-sonnet": {
15448
15490
  displayName: "Claude Sonnet",
15449
15491
  resolve: "vercel/anthropic/claude-sonnet-5",
15450
- effort: ["low", "medium", "high", "xhigh"]
15492
+ effort: ["none", "low", "medium", "high", "xhigh", "max"]
15451
15493
  },
15452
15494
  "claude-haiku": {
15453
15495
  displayName: "Claude Haiku",
@@ -15455,7 +15497,7 @@ var providers = {
15455
15497
  },
15456
15498
  "gpt-sol": {
15457
15499
  displayName: "GPT Sol",
15458
- resolve: "vercel/openai/gpt-5.6-sol",
15500
+ resolve: "vercel/openai/gpt-6-sol",
15459
15501
  effort: ["none", "low", "medium", "high", "xhigh", "max"],
15460
15502
  subagentModel: "gpt-terra"
15461
15503
  },
@@ -15468,35 +15510,35 @@ var providers = {
15468
15510
  "gpt-terra": {
15469
15511
  displayName: "GPT Terra",
15470
15512
  resolve: "vercel/openai/gpt-5.6-terra",
15471
- effort: ["none", "low", "medium", "high", "xhigh", "max"]
15513
+ effort: ["none", "minimal", "low", "medium", "high", "xhigh", "max"]
15472
15514
  },
15473
15515
  "gpt-luna": {
15474
15516
  displayName: "GPT Luna",
15475
- resolve: "vercel/openai/gpt-5.6-luna",
15517
+ resolve: "vercel/openai/gpt-6-luna",
15476
15518
  effort: ["none", "low", "medium", "high", "xhigh", "max"]
15477
15519
  },
15478
15520
  "gemini-pro": {
15479
15521
  displayName: "Gemini Pro",
15480
15522
  resolve: "vercel/google/gemini-3.1-pro-preview",
15481
- effort: ["low", "medium", "high"]
15523
+ effort: ["low", "high"]
15482
15524
  },
15483
15525
  "gemini-flash": {
15484
15526
  displayName: "Gemini Flash",
15485
15527
  resolve: "vercel/google/gemini-3.8-flash",
15486
- effort: ["low", "medium", "high"]
15528
+ effort: ["low", "high"]
15487
15529
  },
15488
15530
  "deepseek-pro": {
15489
15531
  displayName: "DeepSeek Pro",
15490
15532
  resolve: "vercel/deepseek/deepseek-v4-pro-0813",
15491
- effort: ["high", "xhigh"]
15533
+ effort: ["none", "high", "max"]
15492
15534
  },
15493
15535
  // the gateway's bare `deepseek-v4-flash` is the April preview — the same
15494
15536
  // fork trap as OpenRouter, with `deepseek-v4-flash-0731` beside it — so
15495
- // this entry sat on the preview until V4.1. the gateway publishes no
15496
- // effort ladder for the V4.1 id.
15537
+ // this entry sat on the preview until V4.1.
15497
15538
  "deepseek-flash": {
15498
15539
  displayName: "DeepSeek Flash",
15499
- resolve: "vercel/deepseek/deepseek-v4.1-flash"
15540
+ resolve: "vercel/deepseek/deepseek-v4.1-flash",
15541
+ effort: ["none", "high", "max"]
15500
15542
  },
15501
15543
  glm: {
15502
15544
  displayName: "GLM",
@@ -15506,12 +15548,12 @@ var providers = {
15506
15548
  "kimi-k3": {
15507
15549
  displayName: "Kimi K3",
15508
15550
  resolve: "vercel/moonshotai/kimi-k3",
15509
- effort: ["low", "high", "max"]
15551
+ effort: ["none", "low", "high", "max"]
15510
15552
  },
15511
- // the gateway publishes no effort ladder for this id.
15512
15553
  "muse-spark": {
15513
15554
  displayName: "Muse Spark",
15514
- resolve: "vercel/meta/muse-spark-1.3"
15555
+ resolve: "vercel/meta/muse-spark-1.3",
15556
+ effort: ["minimal", "low", "medium", "high", "xhigh"]
15515
15557
  }
15516
15558
  }
15517
15559
  })
@@ -0,0 +1,8 @@
1
+ import type { ToolContext } from "./server.ts";
2
+ export declare function SearchIssuesTool(ctx: ToolContext): import("fastmcp").Tool<any, import("@standard-schema/spec").StandardSchemaV1<{
3
+ terms: string[];
4
+ }, {
5
+ terms: string[];
6
+ }>> & {
7
+ mutates?: boolean;
8
+ };
@@ -23,6 +23,7 @@ export interface ToolContext {
23
23
  postCheckoutScript: string | null;
24
24
  prepushScript: string | null;
25
25
  prApproveEnabled: boolean;
26
+ reviewDrafts: boolean;
26
27
  autoMergeEnabled: boolean;
27
28
  signedCommits: boolean;
28
29
  repoIntelligence: boolean;
@@ -5,7 +5,7 @@
5
5
  * that re-emits parts of it leaks the unmasked tail. Trimming canonicalises
6
6
  * the value so the mask matches exactly what downstream tools will print.
7
7
  *
8
- * Masking is delegated to `core.setSecret` (not raw `console.log`) so the
8
+ * Masking is delegated to `maskSecret` (not raw `console.log`) so the
9
9
  * toolkit percent-encodes `\r`/`\n`; the runner V2 parser decodes them and
10
10
  * registers the full value plus every non-empty line as separate masks. That
11
11
  * keeps us safe for embedded-newline values (PEMs, kubeconfigs, JSON blobs)
@@ -27,7 +27,7 @@ export declare function parseOverrides(raw: string): Record<string, string>;
27
27
  /**
28
28
  * Mutate `params.env` in place with the supplied JSON overrides, skipping any
29
29
  * names in `DENIED_OVERRIDE_NAMES`. Each applied value is registered with
30
- * `core.setSecret` so the runner masks it in subsequent log output, and the
30
+ * `maskSecret` so the runner masks it in subsequent log output, and the
31
31
  * raw `UNSAFE_OVERRIDES` env var is deleted so spawned subprocesses don't
32
32
  * inherit the original JSON (which would defeat both the deny-list and the
33
33
  * masking by exposing the values verbatim).
@@ -34,6 +34,7 @@ export interface RepoSettings {
34
34
  push: PushPermission;
35
35
  shell: ShellPermission;
36
36
  prApproveEnabled: boolean;
37
+ reviewDrafts: boolean;
37
38
  autoMergeEnabled: boolean;
38
39
  codexAgent: boolean;
39
40
  signedCommits: boolean;
@@ -0,0 +1,20 @@
1
+ /**
2
+ * `@actions/core` workflow commands that carry a credential, gated on actually
3
+ * running under a runner.
4
+ *
5
+ * Off a runner nothing consumes these commands and `@actions/core` writes the
6
+ * raw value to stdout instead — `setSecret` always, `saveState` / `setOutput`
7
+ * whenever `GITHUB_STATE` / `GITHUB_OUTPUT` are unset. That is a plaintext
8
+ * credential on whatever terminal is running the action, which is how an OpenAI
9
+ * key reached local Codex transcripts and was disabled (2026-09).
10
+ *
11
+ * Route every credential-bearing call through here instead of calling `core`
12
+ * directly — `nub run check:secret-commands` enforces it. Non-credential output
13
+ * (the agent's own `result` text) stays ungated, because the test harness reads
14
+ * it back through `GITHUB_OUTPUT` on a host with no runner.
15
+ */
16
+ export declare function maskSecret(value: string): void;
17
+ /** @see maskSecret — same gate, for state the `post:` hook reads back. */
18
+ export declare function saveSecretState(name: string, value: string): void;
19
+ /** @see maskSecret — same gate, for a step output carrying a credential. */
20
+ export declare function setSecretOutput(name: string, value: string): void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pullfrog",
3
- "version": "0.1.82",
3
+ "version": "0.1.83",
4
4
  "cliContractVersion": "1",
5
5
  "type": "module",
6
6
  "bin": {
@@ -17,6 +17,7 @@
17
17
  "typecheck": "tsc --noEmit",
18
18
  "build": "node esbuild.config.js && tsc -p tsconfig.exports.json",
19
19
  "check:entrypoints": "nub scripts/check-entrypoint-imports.ts",
20
+ "check:secret-commands": "nub scripts/check-secret-commands.ts",
20
21
  "docker": "nub docker.ts",
21
22
  "play": "nub play.ts",
22
23
  "runtest": "nub test/run.ts",
@@ -27,7 +28,7 @@
27
28
  },
28
29
  "devDependencies": {
29
30
  "@actions/core": "^1.11.1",
30
- "@anthropic-ai/claude-code": "2.1.150",
31
+ "@anthropic-ai/claude-code": "2.1.280",
31
32
  "@ark/fs": "0.56.0",
32
33
  "@ark/util": "0.56.0",
33
34
  "@clack/prompts": "^1.2.0",