pullfrog 0.1.82 → 0.1.84
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/claudePretoolGate.d.ts +6 -6
- package/dist/cli.mjs +111141 -129270
- package/dist/external.d.ts +2 -2
- package/dist/index.js +6954 -11334
- package/dist/internal/index.d.ts +1 -0
- package/dist/internal.js +152 -85
- package/dist/mcp/review.d.ts +0 -14
- package/dist/mcp/searchIssues.d.ts +8 -0
- package/dist/mcp/server.d.ts +1 -0
- package/dist/utils/normalizeEnv.d.ts +1 -1
- package/dist/utils/outstandingThreads.d.ts +25 -0
- package/dist/utils/overrides.d.ts +1 -1
- package/dist/utils/payload.d.ts +2 -2
- package/dist/utils/runContext.d.ts +1 -0
- package/dist/utils/secretCommands.d.ts +20 -0
- package/dist/yes.js +1 -1
- package/package.json +5 -4
package/dist/internal/index.d.ts
CHANGED
|
@@ -20,6 +20,7 @@ export type { ResourceUsage, UsageSummary } from "../utils/github.ts";
|
|
|
20
20
|
export { isPullfrog } from "../utils/isPullfrog.ts";
|
|
21
21
|
export { isLeapingIntoActionCommentBody, LEAPING_INTO_ACTION_PREFIX, } from "../utils/leapingComment.ts";
|
|
22
22
|
export { MAX_LEARNINGS_LENGTH, truncateAtLineBoundary } from "../utils/learningsTruncate.ts";
|
|
23
|
+
export { countOutstandingPullfrogThreads } from "../utils/outstandingThreads.ts";
|
|
23
24
|
export type { CreateProgressCommentTarget, ProgressComment, ProgressCommentType, } from "../utils/progressComment.ts";
|
|
24
25
|
export { createLeapingProgressComment, deleteProgressCommentApi, getProgressComment, updateProgressComment, } from "../utils/progressComment.ts";
|
|
25
26
|
export { PROVIDER_DASHBOARDS, type ProviderDashboard } from "../utils/providerDashboards.ts";
|
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.
|
|
11
|
+
version: "0.1.84",
|
|
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.
|
|
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",
|
|
@@ -43,8 +44,8 @@ var package_default = {
|
|
|
43
44
|
"@octokit/plugin-throttling": "^11.0.3",
|
|
44
45
|
"@octokit/rest": "^22.0.0",
|
|
45
46
|
"@octokit/webhooks-types": "^7.6.1",
|
|
46
|
-
"@openai/codex": "0.
|
|
47
|
-
"@openai/codex-sdk": "0.
|
|
47
|
+
"@openai/codex": "0.157.0",
|
|
48
|
+
"@openai/codex-sdk": "0.157.0",
|
|
48
49
|
"@opencode-ai/sdk": "1.18.29",
|
|
49
50
|
"@standard-schema/spec": "1.1.0",
|
|
50
51
|
"@toon-format/toon": "^1.0.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
|
|
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-
|
|
14390
|
+
resolve: "openai/gpt-6-sol",
|
|
14390
14391
|
effort: ["none", "low", "medium", "high", "xhigh", "max"],
|
|
14391
|
-
openRouterResolve: "openrouter/openai/gpt-
|
|
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-
|
|
14402
|
+
resolve: "openai/gpt-6-sol",
|
|
14402
14403
|
effort: ["none", "low", "medium", "high", "xhigh", "max"],
|
|
14403
|
-
openRouterResolve: "openrouter/openai/gpt-
|
|
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-
|
|
14417
|
+
resolve: "openai/gpt-6-luna",
|
|
14417
14418
|
effort: ["none", "low", "medium", "high", "xhigh", "max"],
|
|
14418
|
-
openRouterResolve: "openrouter/openai/gpt-
|
|
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.
|
|
14513
|
+
resolve: "xai/grok-4.7",
|
|
14513
14514
|
effort: ["low", "medium", "high", "xhigh"],
|
|
14514
|
-
openRouterResolve: "openrouter/x-ai/grok-4.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
14568
|
-
|
|
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
|
-
//
|
|
14771
|
-
//
|
|
14772
|
-
//
|
|
14773
|
-
//
|
|
14774
|
-
//
|
|
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-
|
|
14791
|
+
resolve: "opencode/gpt-6-sol",
|
|
14799
14792
|
effort: ["none", "low", "medium", "high", "xhigh", "max"],
|
|
14800
|
-
openRouterResolve: "openrouter/openai/gpt-
|
|
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-
|
|
14807
|
+
resolve: "opencode/gpt-6-sol",
|
|
14815
14808
|
effort: ["none", "low", "medium", "high", "xhigh", "max"],
|
|
14816
|
-
openRouterResolve: "openrouter/openai/gpt-
|
|
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-
|
|
14821
|
+
resolve: "opencode/gpt-6-luna",
|
|
14829
14822
|
effort: ["none", "low", "medium", "high", "xhigh", "max"],
|
|
14830
|
-
openRouterResolve: "openrouter/openai/gpt-
|
|
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,26 @@ var providers = {
|
|
|
14926
14919
|
},
|
|
14927
14920
|
grok: {
|
|
14928
14921
|
displayName: "Grok",
|
|
14929
|
-
resolve: "opencode/grok-4.
|
|
14922
|
+
resolve: "opencode/grok-4.7",
|
|
14930
14923
|
effort: ["low", "medium", "high", "xhigh"],
|
|
14931
|
-
openRouterResolve: "openrouter/x-ai/grok-4.
|
|
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
|
+
},
|
|
14936
|
+
"qwen-flash": {
|
|
14937
|
+
displayName: "Qwen Flash",
|
|
14938
|
+
resolve: "opencode/qwen3.8-flash",
|
|
14939
|
+
effort: ["low", "medium", "xhigh"],
|
|
14940
|
+
openRouterEffort: [],
|
|
14941
|
+
openRouterResolve: "openrouter/qwen/qwen3.8-flash"
|
|
14932
14942
|
},
|
|
14933
14943
|
"gpt-5-nano": {
|
|
14934
14944
|
displayName: "GPT Nano",
|
|
@@ -14977,11 +14987,27 @@ var providers = {
|
|
|
14977
14987
|
// model, as `minimax-m2.5-free` does.
|
|
14978
14988
|
fallback: "opencode/big-pickle"
|
|
14979
14989
|
},
|
|
14990
|
+
// Zen's FREE stealth preview (listed 2026-09-23), the third after
|
|
14991
|
+
// big-pickle and union-alpha. OpenRouter's listing: prompts and
|
|
14992
|
+
// completions may be retained by the provider, not trained on. unlike the
|
|
14993
|
+
// first two it publishes an effort ladder, so the gate mirrors one here.
|
|
14994
|
+
"space-bunny": {
|
|
14995
|
+
displayName: "Space Bunny",
|
|
14996
|
+
description: "Stealth preview; prompts may be retained",
|
|
14997
|
+
resolve: "opencode/space-bunny-free",
|
|
14998
|
+
effort: ["low", "medium", "high", "xhigh", "max"],
|
|
14999
|
+
// free to run, still gated on the provider's own OPENCODE_API_KEY —
|
|
15000
|
+
// see the big-pickle note above (#1077).
|
|
15001
|
+
isFree: true
|
|
15002
|
+
},
|
|
14980
15003
|
// Zen's live free MiMo, and the second free row in a menu that big-pickle
|
|
14981
15004
|
// was alone in since `mimo-v2-pro-free` lost its model.
|
|
14982
15005
|
mimo: {
|
|
14983
15006
|
displayName: "MiMo",
|
|
14984
|
-
|
|
15007
|
+
// models.dev deprecated `mimo-v2.5-free` on 2026-09-22. V2.6-Flash is
|
|
15008
|
+
// the only other MiMo Zen serves, so the slug follows it across the
|
|
15009
|
+
// tier rather than leaving stored picks on a dying id.
|
|
15010
|
+
resolve: "opencode/mimo-v2.6-flash-free",
|
|
14985
15011
|
// free to run, still gated on the provider's own OPENCODE_API_KEY —
|
|
14986
15012
|
// see the big-pickle note above (#1077).
|
|
14987
15013
|
isFree: true
|
|
@@ -15010,11 +15036,12 @@ var providers = {
|
|
|
15010
15036
|
// OpenCode Go is a separate $10/mo subscription from Zen, served on its own
|
|
15011
15037
|
// base URL (`https://opencode.ai/zen/go/v1`) but authenticated with the SAME
|
|
15012
15038
|
// `OPENCODE_API_KEY`. it carries the open-weight coding models plus a couple
|
|
15013
|
-
// of frontier ones,
|
|
15014
|
-
// does not list qwen3.7
|
|
15039
|
+
// of frontier ones, four of which are served ONLY here — Zen's `/v1/models`
|
|
15040
|
+
// does not list qwen3.7-plus, mimo-v2.6-pro, longcat-2.0 or hy3. (it listed
|
|
15015
15041
|
// no glm-5.3* either until 2026-09, which is why `opencode/glm` trailed on
|
|
15016
|
-
// 5.2.) so for a Go subscriber this
|
|
15017
|
-
//
|
|
15042
|
+
// 5.2, and no qwen3.8-* until late 2026-09.) so for a Go subscriber this
|
|
15043
|
+
// provider is not a duplicate route to Zen, it is the only route to a large
|
|
15044
|
+
// part of what they pay for.
|
|
15018
15045
|
// like `opencode` and `openrouter` this is a ROUTER, not a vendor: slugs and
|
|
15019
15046
|
// display names mirror the upstream brand tier, and the picker groups them
|
|
15020
15047
|
// under the upstream vendor.
|
|
@@ -15074,7 +15101,8 @@ var providers = {
|
|
|
15074
15101
|
// picker row that fails for almost everyone is worse than none. DeepSeek
|
|
15075
15102
|
// stays reachable ungated via `deepseek/*`, `opencode/*` and
|
|
15076
15103
|
// `openrouter/*`; both remain runnable by full specifier once opted in.
|
|
15077
|
-
// Alibaba —
|
|
15104
|
+
// Alibaba — Zen serves Max and Flash too (see `opencode/qwen-max`); Plus
|
|
15105
|
+
// is Go-only.
|
|
15078
15106
|
"qwen-max": {
|
|
15079
15107
|
displayName: "Qwen Max",
|
|
15080
15108
|
resolve: "opencode-go/qwen3.8-max",
|
|
@@ -15117,8 +15145,8 @@ var providers = {
|
|
|
15117
15145
|
// Xiaomi — Go-only; Zen serves the free `mimo-v2-pro-free` promo instead.
|
|
15118
15146
|
"mimo-pro": {
|
|
15119
15147
|
displayName: "MiMo Pro",
|
|
15120
|
-
resolve: "opencode-go/mimo-v2.
|
|
15121
|
-
openRouterResolve: "openrouter/xiaomi/mimo-v2.
|
|
15148
|
+
resolve: "opencode-go/mimo-v2.6-pro",
|
|
15149
|
+
openRouterResolve: "openrouter/xiaomi/mimo-v2.6-pro"
|
|
15122
15150
|
},
|
|
15123
15151
|
// Meituan — Go-only.
|
|
15124
15152
|
longcat: {
|
|
@@ -15144,15 +15172,15 @@ var providers = {
|
|
|
15144
15172
|
// wiki/models-catalog.md on `opencode/kimi-k2`.
|
|
15145
15173
|
grok: {
|
|
15146
15174
|
displayName: "Grok",
|
|
15147
|
-
resolve: "opencode-go/grok-4.
|
|
15175
|
+
resolve: "opencode-go/grok-4.7",
|
|
15148
15176
|
effort: ["low", "medium", "high", "xhigh"],
|
|
15149
|
-
openRouterResolve: "openrouter/x-ai/grok-4.
|
|
15177
|
+
openRouterResolve: "openrouter/x-ai/grok-4.7"
|
|
15150
15178
|
},
|
|
15151
15179
|
"gpt-luna": {
|
|
15152
15180
|
displayName: "GPT Luna",
|
|
15153
|
-
resolve: "opencode-go/gpt-
|
|
15181
|
+
resolve: "opencode-go/gpt-6-luna",
|
|
15154
15182
|
effort: ["none", "low", "medium", "high", "xhigh", "max"],
|
|
15155
|
-
openRouterResolve: "openrouter/openai/gpt-
|
|
15183
|
+
openRouterResolve: "openrouter/openai/gpt-6-luna"
|
|
15156
15184
|
}
|
|
15157
15185
|
}
|
|
15158
15186
|
}),
|
|
@@ -15254,15 +15282,15 @@ var providers = {
|
|
|
15254
15282
|
resolve: "openrouter/~anthropic/claude-haiku-latest",
|
|
15255
15283
|
openRouterResolve: "openrouter/~anthropic/claude-haiku-latest"
|
|
15256
15284
|
},
|
|
15257
|
-
// pinned to the explicit
|
|
15258
|
-
// alias): after
|
|
15285
|
+
// pinned to the explicit Sol/Terra/Luna tiers (not the ~openai/gpt-latest
|
|
15286
|
+
// rolling alias): after that rename, ~gpt-mini-latest no longer maps
|
|
15259
15287
|
// to Luna, so rolling aliases would silently diverge `gpt`/`gpt-mini` from
|
|
15260
15288
|
// the chosen tiers across funding paths.
|
|
15261
15289
|
"gpt-sol": {
|
|
15262
15290
|
displayName: "GPT Sol",
|
|
15263
|
-
resolve: "openrouter/openai/gpt-
|
|
15291
|
+
resolve: "openrouter/openai/gpt-6-sol",
|
|
15264
15292
|
effort: ["none", "low", "medium", "high", "xhigh", "max"],
|
|
15265
|
-
openRouterResolve: "openrouter/openai/gpt-
|
|
15293
|
+
openRouterResolve: "openrouter/openai/gpt-6-sol",
|
|
15266
15294
|
subagentModel: "gpt-terra"
|
|
15267
15295
|
},
|
|
15268
15296
|
"gpt-astra": {
|
|
@@ -15276,9 +15304,9 @@ var providers = {
|
|
|
15276
15304
|
"gpt-sol-pro": {
|
|
15277
15305
|
displayName: "GPT Sol Pro",
|
|
15278
15306
|
description: "Maximum reasoning effort",
|
|
15279
|
-
resolve: "openrouter/openai/gpt-
|
|
15307
|
+
resolve: "openrouter/openai/gpt-6-sol-pro",
|
|
15280
15308
|
effort: ["none", "low", "medium", "high", "xhigh", "max"],
|
|
15281
|
-
openRouterResolve: "openrouter/openai/gpt-
|
|
15309
|
+
openRouterResolve: "openrouter/openai/gpt-6-sol-pro",
|
|
15282
15310
|
subagentModel: "gpt-sol"
|
|
15283
15311
|
},
|
|
15284
15312
|
// gpt-5.6 balanced mid-tier — selectable + Sol's subagent. see openai above.
|
|
@@ -15290,9 +15318,9 @@ var providers = {
|
|
|
15290
15318
|
},
|
|
15291
15319
|
"gpt-luna": {
|
|
15292
15320
|
displayName: "GPT Luna",
|
|
15293
|
-
resolve: "openrouter/openai/gpt-
|
|
15321
|
+
resolve: "openrouter/openai/gpt-6-luna",
|
|
15294
15322
|
effort: ["none", "low", "medium", "high", "xhigh", "max"],
|
|
15295
|
-
openRouterResolve: "openrouter/openai/gpt-
|
|
15323
|
+
openRouterResolve: "openrouter/openai/gpt-6-luna"
|
|
15296
15324
|
},
|
|
15297
15325
|
// legacy aliases — see openai provider for context.
|
|
15298
15326
|
"gpt-codex": {
|
|
@@ -15356,9 +15384,9 @@ var providers = {
|
|
|
15356
15384
|
},
|
|
15357
15385
|
grok: {
|
|
15358
15386
|
displayName: "Grok",
|
|
15359
|
-
resolve: "openrouter/x-ai/grok-4.
|
|
15387
|
+
resolve: "openrouter/x-ai/grok-4.7",
|
|
15360
15388
|
effort: ["low", "medium", "high", "xhigh"],
|
|
15361
|
-
openRouterResolve: "openrouter/x-ai/grok-4.
|
|
15389
|
+
openRouterResolve: "openrouter/x-ai/grok-4.7"
|
|
15362
15390
|
},
|
|
15363
15391
|
// dated pin, not the bare id — see `deepseek/deepseek-pro` for why
|
|
15364
15392
|
// OpenRouter's unversioned `deepseek-v4-pro` is the stale April preview.
|
|
@@ -15429,8 +15457,10 @@ var providers = {
|
|
|
15429
15457
|
vercel: provider({
|
|
15430
15458
|
// Vercel AI Gateway — one key serves every model it fronts. model IDs use
|
|
15431
15459
|
// the models.dev `vercel` catalog's own naming (dotted versions, e.g.
|
|
15432
|
-
// `anthropic/claude-opus-5`, `zai/glm-5.3`)
|
|
15433
|
-
//
|
|
15460
|
+
// `anthropic/claude-opus-5.5`, `zai/glm-5.3`). effort ladders come from the
|
|
15461
|
+
// gateway's OWN `/v1/models`, not models.dev — the two disagree routinely
|
|
15462
|
+
// (on 2026-09-22 they disagreed on all ten entries that drifted), and the
|
|
15463
|
+
// drift test reads the gateway for that reason. deliberately no
|
|
15434
15464
|
// `openRouterResolve`: a gateway pick is BYOK-only — silently rerouting it
|
|
15435
15465
|
// over the Router proxy would bill the wallet for traffic the user pointed
|
|
15436
15466
|
// at their own gateway.
|
|
@@ -15439,7 +15469,7 @@ var providers = {
|
|
|
15439
15469
|
models: {
|
|
15440
15470
|
"claude-opus": {
|
|
15441
15471
|
displayName: "Claude Opus",
|
|
15442
|
-
resolve: "vercel/anthropic/claude-opus-5",
|
|
15472
|
+
resolve: "vercel/anthropic/claude-opus-5.5",
|
|
15443
15473
|
effort: ["low", "medium", "high", "xhigh", "max"],
|
|
15444
15474
|
preferred: true,
|
|
15445
15475
|
subagentModel: "claude-sonnet"
|
|
@@ -15447,7 +15477,7 @@ var providers = {
|
|
|
15447
15477
|
"claude-sonnet": {
|
|
15448
15478
|
displayName: "Claude Sonnet",
|
|
15449
15479
|
resolve: "vercel/anthropic/claude-sonnet-5",
|
|
15450
|
-
effort: ["low", "medium", "high", "xhigh"]
|
|
15480
|
+
effort: ["none", "low", "medium", "high", "xhigh", "max"]
|
|
15451
15481
|
},
|
|
15452
15482
|
"claude-haiku": {
|
|
15453
15483
|
displayName: "Claude Haiku",
|
|
@@ -15455,7 +15485,7 @@ var providers = {
|
|
|
15455
15485
|
},
|
|
15456
15486
|
"gpt-sol": {
|
|
15457
15487
|
displayName: "GPT Sol",
|
|
15458
|
-
resolve: "vercel/openai/gpt-
|
|
15488
|
+
resolve: "vercel/openai/gpt-6-sol",
|
|
15459
15489
|
effort: ["none", "low", "medium", "high", "xhigh", "max"],
|
|
15460
15490
|
subagentModel: "gpt-terra"
|
|
15461
15491
|
},
|
|
@@ -15468,35 +15498,35 @@ var providers = {
|
|
|
15468
15498
|
"gpt-terra": {
|
|
15469
15499
|
displayName: "GPT Terra",
|
|
15470
15500
|
resolve: "vercel/openai/gpt-5.6-terra",
|
|
15471
|
-
effort: ["none", "low", "medium", "high", "xhigh", "max"]
|
|
15501
|
+
effort: ["none", "minimal", "low", "medium", "high", "xhigh", "max"]
|
|
15472
15502
|
},
|
|
15473
15503
|
"gpt-luna": {
|
|
15474
15504
|
displayName: "GPT Luna",
|
|
15475
|
-
resolve: "vercel/openai/gpt-
|
|
15505
|
+
resolve: "vercel/openai/gpt-6-luna",
|
|
15476
15506
|
effort: ["none", "low", "medium", "high", "xhigh", "max"]
|
|
15477
15507
|
},
|
|
15478
15508
|
"gemini-pro": {
|
|
15479
15509
|
displayName: "Gemini Pro",
|
|
15480
15510
|
resolve: "vercel/google/gemini-3.1-pro-preview",
|
|
15481
|
-
effort: ["low", "
|
|
15511
|
+
effort: ["low", "high"]
|
|
15482
15512
|
},
|
|
15483
15513
|
"gemini-flash": {
|
|
15484
15514
|
displayName: "Gemini Flash",
|
|
15485
15515
|
resolve: "vercel/google/gemini-3.8-flash",
|
|
15486
|
-
effort: ["low", "
|
|
15516
|
+
effort: ["low", "high"]
|
|
15487
15517
|
},
|
|
15488
15518
|
"deepseek-pro": {
|
|
15489
15519
|
displayName: "DeepSeek Pro",
|
|
15490
15520
|
resolve: "vercel/deepseek/deepseek-v4-pro-0813",
|
|
15491
|
-
effort: ["high", "
|
|
15521
|
+
effort: ["none", "high", "max"]
|
|
15492
15522
|
},
|
|
15493
15523
|
// the gateway's bare `deepseek-v4-flash` is the April preview — the same
|
|
15494
15524
|
// fork trap as OpenRouter, with `deepseek-v4-flash-0731` beside it — so
|
|
15495
|
-
// this entry sat on the preview until V4.1.
|
|
15496
|
-
// effort ladder for the V4.1 id.
|
|
15525
|
+
// this entry sat on the preview until V4.1.
|
|
15497
15526
|
"deepseek-flash": {
|
|
15498
15527
|
displayName: "DeepSeek Flash",
|
|
15499
|
-
resolve: "vercel/deepseek/deepseek-v4.1-flash"
|
|
15528
|
+
resolve: "vercel/deepseek/deepseek-v4.1-flash",
|
|
15529
|
+
effort: ["none", "high", "max"]
|
|
15500
15530
|
},
|
|
15501
15531
|
glm: {
|
|
15502
15532
|
displayName: "GLM",
|
|
@@ -15506,12 +15536,12 @@ var providers = {
|
|
|
15506
15536
|
"kimi-k3": {
|
|
15507
15537
|
displayName: "Kimi K3",
|
|
15508
15538
|
resolve: "vercel/moonshotai/kimi-k3",
|
|
15509
|
-
effort: ["low", "high", "max"]
|
|
15539
|
+
effort: ["none", "low", "high", "max"]
|
|
15510
15540
|
},
|
|
15511
|
-
// the gateway publishes no effort ladder for this id.
|
|
15512
15541
|
"muse-spark": {
|
|
15513
15542
|
displayName: "Muse Spark",
|
|
15514
|
-
resolve: "vercel/meta/muse-spark-1.3"
|
|
15543
|
+
resolve: "vercel/meta/muse-spark-1.3",
|
|
15544
|
+
effort: ["minimal", "low", "medium", "high", "xhigh"]
|
|
15515
15545
|
}
|
|
15516
15546
|
}
|
|
15517
15547
|
})
|
|
@@ -15921,7 +15951,7 @@ For simple, well-defined tasks, skip the plan phase and go straight to build.`
|
|
|
15921
15951
|
6. Finalize:
|
|
15922
15952
|
- **only if code changed**, ${finalizeStep} (same push/prepush guidance as Build mode in *SYSTEM*). If push/commit fails, report the exact error and STOP without claiming a fix or resolving its threads.
|
|
15923
15953
|
- reply ONCE per relevant thread via \`${t("reply_to_review_comment")}\`, including when no code changed. The \`comment_id\` is the root comment's numeric \`id=\`, NOT the \`thread=\` value from \`${t("get_review_comments")}\`. The runtime dedupes identical bodies within a session.
|
|
15924
|
-
- resolve a thread via \`${t("resolve_review_thread")}\` (using \`thread=\` as \`thread_id\`) only after its requested fix is fully on the remote,
|
|
15954
|
+
- resolve a thread via \`${t("resolve_review_thread")}\` (using \`thread=\` as \`thread_id\`) only after its requested fix is fully on the remote, the user explicitly asks to resolve it, or it is a Pullfrog finding you agree to withdraw. Leave other discussion-only replies, partial fixes, and disagreements open.
|
|
15925
15955
|
- call \`${t("report_progress")}\` with a brief summary. If your last \`${t("get_review_comments")}\` turned up threads you did not address, name them there \u2014 a review arriving this late is suppressed as a duplicate and nothing else will pick it up.`
|
|
15926
15956
|
},
|
|
15927
15957
|
// Review and IncrementalReview route the minimum reviewfrog specialists
|
|
@@ -16548,6 +16578,42 @@ function truncateAtLineBoundary(body, cap) {
|
|
|
16548
16578
|
return head.slice(0, lastNewline);
|
|
16549
16579
|
}
|
|
16550
16580
|
|
|
16581
|
+
// utils/outstandingThreads.ts
|
|
16582
|
+
var OUTSTANDING_THREADS_QUERY = `
|
|
16583
|
+
query ($owner: String!, $name: String!, $prNumber: Int!, $cursor: String) {
|
|
16584
|
+
repository(owner: $owner, name: $name) {
|
|
16585
|
+
pullRequest(number: $prNumber) {
|
|
16586
|
+
reviewThreads(first: 100, after: $cursor) {
|
|
16587
|
+
pageInfo { hasNextPage endCursor }
|
|
16588
|
+
nodes {
|
|
16589
|
+
isResolved
|
|
16590
|
+
comments(first: 1) { nodes { author { login } } }
|
|
16591
|
+
}
|
|
16592
|
+
}
|
|
16593
|
+
}
|
|
16594
|
+
}
|
|
16595
|
+
}
|
|
16596
|
+
`;
|
|
16597
|
+
async function countOutstandingPullfrogThreads(ctx, pullNumber) {
|
|
16598
|
+
let count = 0;
|
|
16599
|
+
let cursor = null;
|
|
16600
|
+
for (let page = 0; page < 50; page += 1) {
|
|
16601
|
+
const response = await ctx.octokit.graphql(
|
|
16602
|
+
OUTSTANDING_THREADS_QUERY,
|
|
16603
|
+
{ owner: ctx.repo.owner, name: ctx.repo.name, prNumber: pullNumber, cursor }
|
|
16604
|
+
);
|
|
16605
|
+
const conn = response.repository?.pullRequest?.reviewThreads;
|
|
16606
|
+
for (const thread of conn?.nodes ?? []) {
|
|
16607
|
+
if (!thread || thread.isResolved) continue;
|
|
16608
|
+
const root = thread.comments?.nodes?.find((c) => c != null);
|
|
16609
|
+
if (root && isPullfrog(root.author?.login)) count += 1;
|
|
16610
|
+
}
|
|
16611
|
+
if (!conn?.pageInfo.hasNextPage) break;
|
|
16612
|
+
cursor = conn.pageInfo.endCursor;
|
|
16613
|
+
}
|
|
16614
|
+
return count;
|
|
16615
|
+
}
|
|
16616
|
+
|
|
16551
16617
|
// utils/progressComment.ts
|
|
16552
16618
|
async function getProgressComment(ctx, comment) {
|
|
16553
16619
|
const result = await (comment.type === "review" ? ctx.octokit.rest.pulls.getReviewComment({
|
|
@@ -16979,6 +17045,7 @@ export {
|
|
|
16979
17045
|
configFields,
|
|
16980
17046
|
configResponseSchema,
|
|
16981
17047
|
configValueSchema,
|
|
17048
|
+
countOutstandingPullfrogThreads,
|
|
16982
17049
|
createLeapingProgressComment,
|
|
16983
17050
|
createRunStatusCheck,
|
|
16984
17051
|
decodeJwtExpMs,
|
package/dist/mcp/review.d.ts
CHANGED
|
@@ -23,20 +23,6 @@ export declare const TRANSIENT_REVIEW_RETRY_DELAYS_MS: number[];
|
|
|
23
23
|
*/
|
|
24
24
|
export declare function commentableLinesForFile(patch: string | undefined): CommentableLines;
|
|
25
25
|
export declare function buildCommentableMap(ctx: ToolContext, pullNumber: number): Promise<Map<string, CommentableLines>>;
|
|
26
|
-
/**
|
|
27
|
-
* count unresolved review threads on a PR whose root comment was authored by
|
|
28
|
-
* Pullfrog's bot. this is the full set of open Pullfrog findings on the PR —
|
|
29
|
-
* the basis for both the never-approve-with-outstanding-issues invariant (the
|
|
30
|
-
* approval gate below) and the `pullfrog-approval` status verdict. it is a
|
|
31
|
-
* function of all open findings, NOT just the latest commit's delta.
|
|
32
|
-
*
|
|
33
|
-
* outdated-but-unresolved threads still count — GitHub marks a thread
|
|
34
|
-
* `[OUTDATED]` when the anchor line moved (reformat, rename, force-push), which
|
|
35
|
-
* is not the same as the concern being addressed. human-reviewer threads are
|
|
36
|
-
* excluded: they belong to those reviewers to resolve. walks every page so a
|
|
37
|
-
* long-lived PR with >100 threads can't hide an outstanding finding.
|
|
38
|
-
*/
|
|
39
|
-
export declare function countOutstandingPullfrogThreads(ctx: ToolContext, pullNumber: number): Promise<number>;
|
|
40
26
|
/**
|
|
41
27
|
* proactive approve-when-clean for the Fix-all / Fix-👍s flow (`fix_review`
|
|
42
28
|
* trigger). when such a run completes successfully and every Pullfrog-originated
|
|
@@ -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
|
+
};
|
package/dist/mcp/server.d.ts
CHANGED
|
@@ -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 `
|
|
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)
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** the slice of a run or webhook context the query needs — shared by the action and the server. */
|
|
2
|
+
export type OutstandingThreadsCtx = {
|
|
3
|
+
octokit: {
|
|
4
|
+
graphql: <T>(query: string, variables: Record<string, unknown>) => Promise<T>;
|
|
5
|
+
};
|
|
6
|
+
repo: {
|
|
7
|
+
owner: string;
|
|
8
|
+
name: string;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* count unresolved review threads on a PR whose root comment was authored by
|
|
13
|
+
* Pullfrog's bot. this is the full set of open Pullfrog findings on the PR —
|
|
14
|
+
* the basis for both the never-approve-with-outstanding-issues invariant (the
|
|
15
|
+
* approval gate in create_pull_request_review) and the `pullfrog-approval`
|
|
16
|
+
* status verdict. it is a function of all open findings, NOT just the latest
|
|
17
|
+
* commit's delta.
|
|
18
|
+
*
|
|
19
|
+
* outdated-but-unresolved threads still count — GitHub marks a thread
|
|
20
|
+
* `[OUTDATED]` when the anchor line moved (reformat, rename, force-push), which
|
|
21
|
+
* is not the same as the concern being addressed. human-reviewer threads are
|
|
22
|
+
* excluded: they belong to those reviewers to resolve. walks every page so a
|
|
23
|
+
* long-lived PR with >100 threads can't hide an outstanding finding.
|
|
24
|
+
*/
|
|
25
|
+
export declare function countOutstandingPullfrogThreads(ctx: OutstandingThreadsCtx, pullNumber: number): Promise<number>;
|
|
@@ -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
|
-
* `
|
|
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).
|