pullfrog 0.1.69 → 0.1.71

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/cli.mjs CHANGED
@@ -110299,6 +110299,13 @@ var providers = {
110299
110299
  // brand-tier names the slug convention asks for — the pre-5.6 `gpt` /
110300
110300
  // `gpt-pro` / `gpt-mini` slugs are holdovers from the retired GPT / GPT Pro
110301
110301
  // / GPT Mini tiering and are carried below as deprecated aliases.
110302
+ "gpt-astra": {
110303
+ displayName: "GPT Astra",
110304
+ resolve: "openai/gpt-6-astra",
110305
+ effort: ["low", "medium", "high", "xhigh", "max"],
110306
+ openRouterResolve: "openrouter/openai/gpt-6-astra",
110307
+ subagentModel: "gpt-sol"
110308
+ },
110302
110309
  "gpt-sol": {
110303
110310
  displayName: "GPT Sol",
110304
110311
  resolve: "openai/gpt-5.6-sol",
@@ -110407,9 +110414,9 @@ var providers = {
110407
110414
  },
110408
110415
  "gemini-flash": {
110409
110416
  displayName: "Gemini Flash",
110410
- resolve: "google/gemini-3.6-flash",
110411
- effort: ["minimal", "low", "medium", "high"],
110412
- openRouterResolve: "openrouter/google/gemini-3.6-flash"
110417
+ resolve: "google/gemini-3.8-flash",
110418
+ effort: ["low", "medium", "high"],
110419
+ openRouterResolve: "openrouter/google/gemini-3.8-flash"
110413
110420
  }
110414
110421
  }
110415
110422
  }),
@@ -110660,6 +110667,13 @@ var providers = {
110660
110667
  openRouterResolve: "openrouter/openai/gpt-5.6-sol",
110661
110668
  subagentModel: "gpt-terra"
110662
110669
  },
110670
+ "gpt-astra": {
110671
+ displayName: "GPT Astra",
110672
+ resolve: "opencode/gpt-6-astra",
110673
+ effort: ["low", "medium", "high", "xhigh", "max"],
110674
+ openRouterResolve: "openrouter/openai/gpt-6-astra",
110675
+ subagentModel: "gpt-sol"
110676
+ },
110663
110677
  // see openai/gpt-sol-pro — Zen has no -pro id, so direct resolves to plain Sol.
110664
110678
  "gpt-sol-pro": {
110665
110679
  displayName: "GPT Sol Pro",
@@ -110730,9 +110744,9 @@ var providers = {
110730
110744
  },
110731
110745
  "gemini-flash": {
110732
110746
  displayName: "Gemini Flash",
110733
- resolve: "opencode/gemini-3.6-flash",
110734
- effort: ["minimal", "low", "medium", "high"],
110735
- openRouterResolve: "openrouter/google/gemini-3.6-flash"
110747
+ resolve: "opencode/gemini-3.8-flash",
110748
+ effort: ["low", "medium", "high"],
110749
+ openRouterResolve: "openrouter/google/gemini-3.8-flash"
110736
110750
  },
110737
110751
  // Zen serves K3, but rule 7 can only move a mirror when its upstream moves,
110738
110752
  // so the K3 generation could never reach this block by bumping `kimi-k2`.
@@ -111077,6 +111091,13 @@ var providers = {
111077
111091
  openRouterResolve: "openrouter/openai/gpt-5.6-sol",
111078
111092
  subagentModel: "gpt-terra"
111079
111093
  },
111094
+ "gpt-astra": {
111095
+ displayName: "GPT Astra",
111096
+ resolve: "openrouter/openai/gpt-6-astra",
111097
+ effort: ["low", "medium", "high", "xhigh", "max"],
111098
+ openRouterResolve: "openrouter/openai/gpt-6-astra",
111099
+ subagentModel: "gpt-sol"
111100
+ },
111080
111101
  // see openai/gpt-sol-pro. openrouter serves sol-pro directly on both routes.
111081
111102
  "gpt-sol-pro": {
111082
111103
  displayName: "GPT Sol Pro",
@@ -111153,10 +111174,9 @@ var providers = {
111153
111174
  "gemini-flash": {
111154
111175
  displayName: "Gemini Flash",
111155
111176
  resolve: "openrouter/~google/gemini-flash-latest",
111156
- // no `minimal` here, unlike the google/ and opencode/ entries for the
111157
- // same model: OpenRouter's floating `~google/gemini-flash-latest` stopped
111158
- // publishing that rung. mirroring it is not cosmetic — claude-code
111159
- // hard-errors on an out-of-range `--effort` before it calls the API.
111177
+ // a floating pointer, not a pinned id — it already serves 3.8, so this
111178
+ // entry tracks its siblings' generation bumps for free. the ladder still
111179
+ // mirrors exactly: claude-code hard-errors on an out-of-range `--effort`.
111160
111180
  effort: ["low", "medium", "high"],
111161
111181
  openRouterResolve: "openrouter/~google/gemini-flash-latest"
111162
111182
  },
@@ -111247,6 +111267,12 @@ var providers = {
111247
111267
  effort: ["none", "low", "medium", "high", "xhigh", "max"],
111248
111268
  subagentModel: "gpt-terra"
111249
111269
  },
111270
+ "gpt-astra": {
111271
+ displayName: "GPT Astra",
111272
+ resolve: "vercel/openai/gpt-6-astra",
111273
+ effort: ["low", "medium", "high", "xhigh", "max"],
111274
+ subagentModel: "gpt-sol"
111275
+ },
111250
111276
  "gpt-terra": {
111251
111277
  displayName: "GPT Terra",
111252
111278
  resolve: "vercel/openai/gpt-5.6-terra",
@@ -111264,8 +111290,8 @@ var providers = {
111264
111290
  },
111265
111291
  "gemini-flash": {
111266
111292
  displayName: "Gemini Flash",
111267
- resolve: "vercel/google/gemini-3.6-flash",
111268
- effort: ["minimal", "low", "medium", "high"]
111293
+ resolve: "vercel/google/gemini-3.8-flash",
111294
+ effort: ["low", "medium", "high"]
111269
111295
  },
111270
111296
  "deepseek-pro": {
111271
111297
  displayName: "DeepSeek Pro",
@@ -111284,7 +111310,8 @@ var providers = {
111284
111310
  },
111285
111311
  "kimi-k3": {
111286
111312
  displayName: "Kimi K3",
111287
- resolve: "vercel/moonshotai/kimi-k3"
111313
+ resolve: "vercel/moonshotai/kimi-k3",
111314
+ effort: ["low", "high", "max"]
111288
111315
  }
111289
111316
  }
111290
111317
  })
@@ -112254,7 +112281,7 @@ var import_semver = __toESM(require_semver2(), 1);
112254
112281
  // package.json
112255
112282
  var package_default = {
112256
112283
  name: "pullfrog",
112257
- version: "0.1.69",
112284
+ version: "0.1.71",
112258
112285
  type: "module",
112259
112286
  bin: {
112260
112287
  pullfrog: "dist/cli.mjs",
@@ -112285,12 +112312,12 @@ var package_default = {
112285
112312
  "@ark/util": "0.56.0",
112286
112313
  "@clack/prompts": "^1.2.0",
112287
112314
  "@modelcontextprotocol/sdk": "^1.26.0",
112288
- "@opencode-ai/sdk": "1.18.5",
112289
- "@openai/codex": "0.147.0",
112290
- "@openai/codex-sdk": "0.147.0",
112291
112315
  "@octokit/plugin-throttling": "^11.0.3",
112292
112316
  "@octokit/rest": "^22.0.0",
112293
112317
  "@octokit/webhooks-types": "^7.6.1",
112318
+ "@openai/codex": "0.153.4",
112319
+ "@openai/codex-sdk": "0.153.4",
112320
+ "@opencode-ai/sdk": "1.18.29",
112294
112321
  "@standard-schema/spec": "1.1.0",
112295
112322
  "@toon-format/toon": "^1.0.0",
112296
112323
  "@types/node": "^24.7.2",
@@ -112310,7 +112337,7 @@ var package_default = {
112310
112337
  husky: "^9.0.0",
112311
112338
  "lru-cache": "^11.0.0",
112312
112339
  "object-hash": "^3.0.0",
112313
- "opencode-ai": "1.18.5",
112340
+ "opencode-ai": "1.18.29",
112314
112341
  "package-manager-detector": "^1.6.0",
112315
112342
  picocolors: "^1.1.1",
112316
112343
  semver: "^7.7.3",
@@ -114911,6 +114938,7 @@ function toTodoWriteInput(item) {
114911
114938
  };
114912
114939
  }
114913
114940
  var CODEX_MODEL_PRICING = {
114941
+ "gpt-6-astra": { input: 10, cacheRead: 1, cacheWrite: 12.5, output: 50 },
114914
114942
  "gpt-5.6-sol": { input: 5, cacheRead: 0.5, cacheWrite: 6.25, output: 30 },
114915
114943
  "gpt-5.6-luna": { input: 0.2, cacheRead: 0.02, cacheWrite: 0.25, output: 1.2 },
114916
114944
  "gpt-5.6-terra": { input: 2, cacheRead: 0.2, cacheWrite: 2.5, output: 12 }
@@ -115237,7 +115265,7 @@ import { mkdirSync as mkdirSync7, writeFileSync as writeFileSync7 } from "node:f
115237
115265
  import { join as join8 } from "node:path";
115238
115266
  import { performance as performance7 } from "node:perf_hooks";
115239
115267
 
115240
- // node_modules/.pnpm/@opencode-ai+sdk@1.18.5/node_modules/@opencode-ai/sdk/dist/v2/gen/core/serverSentEvents.gen.js
115268
+ // node_modules/.pnpm/@opencode-ai+sdk@1.18.29/node_modules/@opencode-ai/sdk/dist/v2/gen/core/serverSentEvents.gen.js
115241
115269
  var createSseClient = ({ onRequest, onSseError, onSseEvent, responseTransformer, responseValidator, sseDefaultRetryDelay, sseMaxRetryAttempts, sseMaxRetryDelay, sseSleepFn, url: url4, ...options }) => {
115242
115270
  let lastEventId;
115243
115271
  const sleep5 = sseSleepFn ?? ((ms) => new Promise((resolve3) => setTimeout(resolve3, ms)));
@@ -115356,7 +115384,7 @@ var createSseClient = ({ onRequest, onSseError, onSseEvent, responseTransformer,
115356
115384
  return { stream };
115357
115385
  };
115358
115386
 
115359
- // node_modules/.pnpm/@opencode-ai+sdk@1.18.5/node_modules/@opencode-ai/sdk/dist/v2/gen/core/pathSerializer.gen.js
115387
+ // node_modules/.pnpm/@opencode-ai+sdk@1.18.29/node_modules/@opencode-ai/sdk/dist/v2/gen/core/pathSerializer.gen.js
115360
115388
  var separatorArrayExplode = (style) => {
115361
115389
  switch (style) {
115362
115390
  case "label":
@@ -115459,7 +115487,7 @@ var serializeObjectParam = ({ allowReserved, explode, name, style, value: value2
115459
115487
  return style === "label" || style === "matrix" ? separator2 + joinedValues : joinedValues;
115460
115488
  };
115461
115489
 
115462
- // node_modules/.pnpm/@opencode-ai+sdk@1.18.5/node_modules/@opencode-ai/sdk/dist/v2/gen/core/utils.gen.js
115490
+ // node_modules/.pnpm/@opencode-ai+sdk@1.18.29/node_modules/@opencode-ai/sdk/dist/v2/gen/core/utils.gen.js
115463
115491
  var PATH_PARAM_RE = /\{[^{}]+\}/g;
115464
115492
  var defaultPathSerializer = ({ path: path4, url: _url3 }) => {
115465
115493
  let url4 = _url3;
@@ -115542,7 +115570,7 @@ function getValidRequestBody(options) {
115542
115570
  return void 0;
115543
115571
  }
115544
115572
 
115545
- // node_modules/.pnpm/@opencode-ai+sdk@1.18.5/node_modules/@opencode-ai/sdk/dist/v2/gen/core/auth.gen.js
115573
+ // node_modules/.pnpm/@opencode-ai+sdk@1.18.29/node_modules/@opencode-ai/sdk/dist/v2/gen/core/auth.gen.js
115546
115574
  var getAuthToken = async (auth2, callback) => {
115547
115575
  const token = typeof callback === "function" ? await callback(auth2) : callback;
115548
115576
  if (!token) {
@@ -115557,12 +115585,12 @@ var getAuthToken = async (auth2, callback) => {
115557
115585
  return token;
115558
115586
  };
115559
115587
 
115560
- // node_modules/.pnpm/@opencode-ai+sdk@1.18.5/node_modules/@opencode-ai/sdk/dist/v2/gen/core/bodySerializer.gen.js
115588
+ // node_modules/.pnpm/@opencode-ai+sdk@1.18.29/node_modules/@opencode-ai/sdk/dist/v2/gen/core/bodySerializer.gen.js
115561
115589
  var jsonBodySerializer = {
115562
115590
  bodySerializer: (body) => JSON.stringify(body, (_key, value2) => typeof value2 === "bigint" ? value2.toString() : value2)
115563
115591
  };
115564
115592
 
115565
- // node_modules/.pnpm/@opencode-ai+sdk@1.18.5/node_modules/@opencode-ai/sdk/dist/v2/gen/client/utils.gen.js
115593
+ // node_modules/.pnpm/@opencode-ai+sdk@1.18.29/node_modules/@opencode-ai/sdk/dist/v2/gen/client/utils.gen.js
115566
115594
  var createQuerySerializer = ({ parameters = {}, ...args2 } = {}) => {
115567
115595
  const querySerializer = (queryParams) => {
115568
115596
  const search2 = [];
@@ -115772,7 +115800,7 @@ var createConfig = (override = {}) => ({
115772
115800
  ...override
115773
115801
  });
115774
115802
 
115775
- // node_modules/.pnpm/@opencode-ai+sdk@1.18.5/node_modules/@opencode-ai/sdk/dist/v2/gen/client/client.gen.js
115803
+ // node_modules/.pnpm/@opencode-ai+sdk@1.18.29/node_modules/@opencode-ai/sdk/dist/v2/gen/client/client.gen.js
115776
115804
  var createClient = (config3 = {}) => {
115777
115805
  let _config = mergeConfigs(createConfig(), config3);
115778
115806
  const getConfig = () => ({ ..._config });
@@ -115980,7 +116008,7 @@ var createClient = (config3 = {}) => {
115980
116008
  };
115981
116009
  };
115982
116010
 
115983
- // node_modules/.pnpm/@opencode-ai+sdk@1.18.5/node_modules/@opencode-ai/sdk/dist/v2/gen/core/params.gen.js
116011
+ // node_modules/.pnpm/@opencode-ai+sdk@1.18.29/node_modules/@opencode-ai/sdk/dist/v2/gen/core/params.gen.js
115984
116012
  var extraPrefixesMap = {
115985
116013
  $body_: "body",
115986
116014
  $headers_: "headers",
@@ -116076,10 +116104,10 @@ var buildClientParams = (args2, fields) => {
116076
116104
  return params;
116077
116105
  };
116078
116106
 
116079
- // node_modules/.pnpm/@opencode-ai+sdk@1.18.5/node_modules/@opencode-ai/sdk/dist/v2/gen/client.gen.js
116107
+ // node_modules/.pnpm/@opencode-ai+sdk@1.18.29/node_modules/@opencode-ai/sdk/dist/v2/gen/client.gen.js
116080
116108
  var client = createClient(createConfig({ baseUrl: "http://localhost:4096" }));
116081
116109
 
116082
- // node_modules/.pnpm/@opencode-ai+sdk@1.18.5/node_modules/@opencode-ai/sdk/dist/v2/gen/sdk.gen.js
116110
+ // node_modules/.pnpm/@opencode-ai+sdk@1.18.29/node_modules/@opencode-ai/sdk/dist/v2/gen/sdk.gen.js
116083
116111
  var HeyApiClient = class {
116084
116112
  client;
116085
116113
  constructor(args2) {
@@ -116694,7 +116722,7 @@ var Global = class extends HeyApiClient {
116694
116722
  /**
116695
116723
  * Upgrade opencode
116696
116724
  *
116697
- * Upgrade opencode to the specified version or latest if not specified.
116725
+ * Upgrade opencode to the specified version.
116698
116726
  */
116699
116727
  upgrade(parameters, options) {
116700
116728
  const params = buildClientParams([parameters], [{ args: [{ in: "body", key: "target" }] }]);
@@ -120534,7 +120562,7 @@ var OpencodeClient = class _OpencodeClient extends HeyApiClient {
120534
120562
  }
120535
120563
  };
120536
120564
 
120537
- // node_modules/.pnpm/@opencode-ai+sdk@1.18.5/node_modules/@opencode-ai/sdk/dist/error-interceptor.js
120565
+ // node_modules/.pnpm/@opencode-ai+sdk@1.18.29/node_modules/@opencode-ai/sdk/dist/error-interceptor.js
120538
120566
  function wrapClientError(error62, response, request2, opts) {
120539
120567
  if (!opts?.throwOnError)
120540
120568
  return error62;
@@ -120561,7 +120589,7 @@ function describe(request2, response) {
120561
120589
  return `${method} ${url4}${status ? " \u2192 " + status : ""}${statusText ? " " + statusText : ""}`;
120562
120590
  }
120563
120591
 
120564
- // node_modules/.pnpm/@opencode-ai+sdk@1.18.5/node_modules/@opencode-ai/sdk/dist/v2/client.js
120592
+ // node_modules/.pnpm/@opencode-ai+sdk@1.18.29/node_modules/@opencode-ai/sdk/dist/v2/client.js
120565
120593
  function pick(value2, fallback, encode5) {
120566
120594
  if (!value2)
120567
120595
  return;
@@ -120637,7 +120665,7 @@ function createOpencodeClient(config3) {
120637
120665
  return new OpencodeClient({ client: client2 });
120638
120666
  }
120639
120667
 
120640
- // node_modules/.pnpm/@opencode-ai+sdk@1.18.5/node_modules/@opencode-ai/sdk/dist/v2/server.js
120668
+ // node_modules/.pnpm/@opencode-ai+sdk@1.18.29/node_modules/@opencode-ai/sdk/dist/v2/server.js
120641
120669
  var import_cross_spawn = __toESM(require_cross_spawn(), 1);
120642
120670
 
120643
120671
  // agents/opencode.ts
@@ -194867,7 +194895,7 @@ function formatModelLabel(params) {
194867
194895
  return `${base} (credentials for ${providerDisplayName(params.fallbackFrom)} were rejected by the provider)`;
194868
194896
  }
194869
194897
  if (params.clamped?.reason === "trial") {
194870
- return `${base} (free trial)`;
194898
+ return `${base} (model usage covered by Pullfrog)`;
194871
194899
  }
194872
194900
  if (params.clamped) {
194873
194901
  const target = isAutoTier(params.clamped.from) ? "the intelligent tier" : `\`${resolveDisplayAlias(params.clamped.from)?.displayName ?? params.clamped.from}\``;
@@ -194884,7 +194912,7 @@ function buildTrialDisclosure(owner) {
194884
194912
  "---",
194885
194913
  "",
194886
194914
  "> [!IMPORTANT]",
194887
- `> **This run used the free trial model.** \`DeepSeek Flash\` is fast and cheap \u2014 expect lighter work than a frontier model. [Connect a subscription or API key \u2192](${consoleUrl2})`
194915
+ `> **Pullfrog covered this run's model usage.** \`DeepSeek Flash\` is fast and cheap \u2014 expect lighter work than a frontier model. This model allowance is temporary and separate from your Pullfrog plan. [Connect a model-provider subscription or API key \u2192](${consoleUrl2})`
194888
194916
  ].join("\n");
194889
194917
  }
194890
194918
  function buildPullfrogFooter(params) {
@@ -200206,7 +200234,7 @@ function buildMissingApiKeyError(params) {
200206
200234
  const envVars = params.model?.includes("/") ? getModelEnvVars(params.model) : [];
200207
200235
  const [primary, ...alternates] = envVars;
200208
200236
  const envVarList = primary ? `\`${primary}\`${alternates.length > 0 ? ` (or ${alternates.map((v) => `\`${v}\``).join(" / ")})` : ""}` : void 0;
200209
- const lead = envVarList ? `**${MISSING_KEY_MARKER}** \u2014 this repo is configured to use \`${params.model}\`, which needs ${envVarList}, but the runner has no key for it.` : `**${MISSING_KEY_MARKER}** \u2014 Pullfrog needs at least one LLM provider API key (e.g. \`ANTHROPIC_API_KEY\`, \`OPENAI_API_KEY\`, \`GEMINI_API_KEY\`) configured as a GitHub Actions secret.`;
200237
+ const lead = envVarList ? `**${MISSING_KEY_MARKER}** \u2014 this run used \`${params.model}\`, which needs ${envVarList}, but the runner has no key for it.` : `**${MISSING_KEY_MARKER}** \u2014 Pullfrog needs at least one LLM provider API key (e.g. \`ANTHROPIC_API_KEY\`, \`OPENAI_API_KEY\`, \`GEMINI_API_KEY\`) configured as a GitHub Actions secret.`;
200210
200238
  return [
200211
200239
  lead,
200212
200240
  "",
@@ -200682,11 +200710,11 @@ function billingConsoleUrl(owner) {
200682
200710
  function commercialPaywallBody(params) {
200683
200711
  if (params.reason === "commercial") {
200684
200712
  return [
200685
- `**Pullfrog needs a confirmed Pro plan for ${params.ownerLogin}, so this run paused.**`,
200713
+ `**Pullfrog needs Pro on ${params.ownerLogin}, so this run didn't start.**`,
200686
200714
  "",
200687
- "Open Plan and payment to confirm Pro or review the organization's billing status.",
200715
+ "Pro is $30/month per organization and covers private repositories. Public repos and personal accounts keep running free.",
200688
200716
  "",
200689
- `[Review plan and payment \u2192](${params.url})`
200717
+ `[Upgrade to Pro \u2192](${params.url})`
200690
200718
  ].join("\n");
200691
200719
  }
200692
200720
  params.reason;
@@ -204956,7 +204984,7 @@ function resolveTarget(repo) {
204956
204984
  return { owner: match3[1], repo: match3[2] };
204957
204985
  }
204958
204986
  function cliVersion() {
204959
- const parts = /^(\d+)\.(\d+)\.(\d+)$/.exec("0.1.69");
204987
+ const parts = /^(\d+)\.(\d+)\.(\d+)$/.exec("0.1.71");
204960
204988
  if (!parts) return "0.0.0";
204961
204989
  return `${Number(parts[1])}.${Number(parts[2])}.${Number(parts[3])}`;
204962
204990
  }
@@ -205123,7 +205151,7 @@ async function runCli5(input2) {
205123
205151
  }
205124
205152
 
205125
205153
  // cli.ts
205126
- var VERSION10 = "0.1.69";
205154
+ var VERSION10 = "0.1.71";
205127
205155
  var bin = basename2(process.argv[1] || "");
205128
205156
  var PROG = bin === "pf" || bin === "pullfrog" ? bin : "pullfrog";
205129
205157
  var rawArgs = process.argv.slice(2);
package/dist/index.js CHANGED
@@ -107809,6 +107809,13 @@ var providers = {
107809
107809
  // brand-tier names the slug convention asks for — the pre-5.6 `gpt` /
107810
107810
  // `gpt-pro` / `gpt-mini` slugs are holdovers from the retired GPT / GPT Pro
107811
107811
  // / GPT Mini tiering and are carried below as deprecated aliases.
107812
+ "gpt-astra": {
107813
+ displayName: "GPT Astra",
107814
+ resolve: "openai/gpt-6-astra",
107815
+ effort: ["low", "medium", "high", "xhigh", "max"],
107816
+ openRouterResolve: "openrouter/openai/gpt-6-astra",
107817
+ subagentModel: "gpt-sol"
107818
+ },
107812
107819
  "gpt-sol": {
107813
107820
  displayName: "GPT Sol",
107814
107821
  resolve: "openai/gpt-5.6-sol",
@@ -107917,9 +107924,9 @@ var providers = {
107917
107924
  },
107918
107925
  "gemini-flash": {
107919
107926
  displayName: "Gemini Flash",
107920
- resolve: "google/gemini-3.6-flash",
107921
- effort: ["minimal", "low", "medium", "high"],
107922
- openRouterResolve: "openrouter/google/gemini-3.6-flash"
107927
+ resolve: "google/gemini-3.8-flash",
107928
+ effort: ["low", "medium", "high"],
107929
+ openRouterResolve: "openrouter/google/gemini-3.8-flash"
107923
107930
  }
107924
107931
  }
107925
107932
  }),
@@ -108170,6 +108177,13 @@ var providers = {
108170
108177
  openRouterResolve: "openrouter/openai/gpt-5.6-sol",
108171
108178
  subagentModel: "gpt-terra"
108172
108179
  },
108180
+ "gpt-astra": {
108181
+ displayName: "GPT Astra",
108182
+ resolve: "opencode/gpt-6-astra",
108183
+ effort: ["low", "medium", "high", "xhigh", "max"],
108184
+ openRouterResolve: "openrouter/openai/gpt-6-astra",
108185
+ subagentModel: "gpt-sol"
108186
+ },
108173
108187
  // see openai/gpt-sol-pro — Zen has no -pro id, so direct resolves to plain Sol.
108174
108188
  "gpt-sol-pro": {
108175
108189
  displayName: "GPT Sol Pro",
@@ -108240,9 +108254,9 @@ var providers = {
108240
108254
  },
108241
108255
  "gemini-flash": {
108242
108256
  displayName: "Gemini Flash",
108243
- resolve: "opencode/gemini-3.6-flash",
108244
- effort: ["minimal", "low", "medium", "high"],
108245
- openRouterResolve: "openrouter/google/gemini-3.6-flash"
108257
+ resolve: "opencode/gemini-3.8-flash",
108258
+ effort: ["low", "medium", "high"],
108259
+ openRouterResolve: "openrouter/google/gemini-3.8-flash"
108246
108260
  },
108247
108261
  // Zen serves K3, but rule 7 can only move a mirror when its upstream moves,
108248
108262
  // so the K3 generation could never reach this block by bumping `kimi-k2`.
@@ -108587,6 +108601,13 @@ var providers = {
108587
108601
  openRouterResolve: "openrouter/openai/gpt-5.6-sol",
108588
108602
  subagentModel: "gpt-terra"
108589
108603
  },
108604
+ "gpt-astra": {
108605
+ displayName: "GPT Astra",
108606
+ resolve: "openrouter/openai/gpt-6-astra",
108607
+ effort: ["low", "medium", "high", "xhigh", "max"],
108608
+ openRouterResolve: "openrouter/openai/gpt-6-astra",
108609
+ subagentModel: "gpt-sol"
108610
+ },
108590
108611
  // see openai/gpt-sol-pro. openrouter serves sol-pro directly on both routes.
108591
108612
  "gpt-sol-pro": {
108592
108613
  displayName: "GPT Sol Pro",
@@ -108663,10 +108684,9 @@ var providers = {
108663
108684
  "gemini-flash": {
108664
108685
  displayName: "Gemini Flash",
108665
108686
  resolve: "openrouter/~google/gemini-flash-latest",
108666
- // no `minimal` here, unlike the google/ and opencode/ entries for the
108667
- // same model: OpenRouter's floating `~google/gemini-flash-latest` stopped
108668
- // publishing that rung. mirroring it is not cosmetic — claude-code
108669
- // hard-errors on an out-of-range `--effort` before it calls the API.
108687
+ // a floating pointer, not a pinned id — it already serves 3.8, so this
108688
+ // entry tracks its siblings' generation bumps for free. the ladder still
108689
+ // mirrors exactly: claude-code hard-errors on an out-of-range `--effort`.
108670
108690
  effort: ["low", "medium", "high"],
108671
108691
  openRouterResolve: "openrouter/~google/gemini-flash-latest"
108672
108692
  },
@@ -108757,6 +108777,12 @@ var providers = {
108757
108777
  effort: ["none", "low", "medium", "high", "xhigh", "max"],
108758
108778
  subagentModel: "gpt-terra"
108759
108779
  },
108780
+ "gpt-astra": {
108781
+ displayName: "GPT Astra",
108782
+ resolve: "vercel/openai/gpt-6-astra",
108783
+ effort: ["low", "medium", "high", "xhigh", "max"],
108784
+ subagentModel: "gpt-sol"
108785
+ },
108760
108786
  "gpt-terra": {
108761
108787
  displayName: "GPT Terra",
108762
108788
  resolve: "vercel/openai/gpt-5.6-terra",
@@ -108774,8 +108800,8 @@ var providers = {
108774
108800
  },
108775
108801
  "gemini-flash": {
108776
108802
  displayName: "Gemini Flash",
108777
- resolve: "vercel/google/gemini-3.6-flash",
108778
- effort: ["minimal", "low", "medium", "high"]
108803
+ resolve: "vercel/google/gemini-3.8-flash",
108804
+ effort: ["low", "medium", "high"]
108779
108805
  },
108780
108806
  "deepseek-pro": {
108781
108807
  displayName: "DeepSeek Pro",
@@ -108794,7 +108820,8 @@ var providers = {
108794
108820
  },
108795
108821
  "kimi-k3": {
108796
108822
  displayName: "Kimi K3",
108797
- resolve: "vercel/moonshotai/kimi-k3"
108823
+ resolve: "vercel/moonshotai/kimi-k3",
108824
+ effort: ["low", "high", "max"]
108798
108825
  }
108799
108826
  }
108800
108827
  })
@@ -109764,7 +109791,7 @@ var import_semver = __toESM(require_semver2(), 1);
109764
109791
  // package.json
109765
109792
  var package_default = {
109766
109793
  name: "pullfrog",
109767
- version: "0.1.69",
109794
+ version: "0.1.71",
109768
109795
  type: "module",
109769
109796
  bin: {
109770
109797
  pullfrog: "dist/cli.mjs",
@@ -109795,12 +109822,12 @@ var package_default = {
109795
109822
  "@ark/util": "0.56.0",
109796
109823
  "@clack/prompts": "^1.2.0",
109797
109824
  "@modelcontextprotocol/sdk": "^1.26.0",
109798
- "@opencode-ai/sdk": "1.18.5",
109799
- "@openai/codex": "0.147.0",
109800
- "@openai/codex-sdk": "0.147.0",
109801
109825
  "@octokit/plugin-throttling": "^11.0.3",
109802
109826
  "@octokit/rest": "^22.0.0",
109803
109827
  "@octokit/webhooks-types": "^7.6.1",
109828
+ "@openai/codex": "0.153.4",
109829
+ "@openai/codex-sdk": "0.153.4",
109830
+ "@opencode-ai/sdk": "1.18.29",
109804
109831
  "@standard-schema/spec": "1.1.0",
109805
109832
  "@toon-format/toon": "^1.0.0",
109806
109833
  "@types/node": "^24.7.2",
@@ -109820,7 +109847,7 @@ var package_default = {
109820
109847
  husky: "^9.0.0",
109821
109848
  "lru-cache": "^11.0.0",
109822
109849
  "object-hash": "^3.0.0",
109823
- "opencode-ai": "1.18.5",
109850
+ "opencode-ai": "1.18.29",
109824
109851
  "package-manager-detector": "^1.6.0",
109825
109852
  picocolors: "^1.1.1",
109826
109853
  semver: "^7.7.3",
@@ -112494,6 +112521,7 @@ function toTodoWriteInput(item) {
112494
112521
  };
112495
112522
  }
112496
112523
  var CODEX_MODEL_PRICING = {
112524
+ "gpt-6-astra": { input: 10, cacheRead: 1, cacheWrite: 12.5, output: 50 },
112497
112525
  "gpt-5.6-sol": { input: 5, cacheRead: 0.5, cacheWrite: 6.25, output: 30 },
112498
112526
  "gpt-5.6-luna": { input: 0.2, cacheRead: 0.02, cacheWrite: 0.25, output: 1.2 },
112499
112527
  "gpt-5.6-terra": { input: 2, cacheRead: 0.2, cacheWrite: 2.5, output: 12 }
@@ -112820,7 +112848,7 @@ import { mkdirSync as mkdirSync7, writeFileSync as writeFileSync6 } from "node:f
112820
112848
  import { join as join7 } from "node:path";
112821
112849
  import { performance as performance7 } from "node:perf_hooks";
112822
112850
 
112823
- // node_modules/.pnpm/@opencode-ai+sdk@1.18.5/node_modules/@opencode-ai/sdk/dist/v2/gen/core/serverSentEvents.gen.js
112851
+ // node_modules/.pnpm/@opencode-ai+sdk@1.18.29/node_modules/@opencode-ai/sdk/dist/v2/gen/core/serverSentEvents.gen.js
112824
112852
  var createSseClient = ({ onRequest, onSseError, onSseEvent, responseTransformer, responseValidator, sseDefaultRetryDelay, sseMaxRetryAttempts, sseMaxRetryDelay, sseSleepFn, url: url4, ...options }) => {
112825
112853
  let lastEventId;
112826
112854
  const sleep5 = sseSleepFn ?? ((ms) => new Promise((resolve3) => setTimeout(resolve3, ms)));
@@ -112939,7 +112967,7 @@ var createSseClient = ({ onRequest, onSseError, onSseEvent, responseTransformer,
112939
112967
  return { stream };
112940
112968
  };
112941
112969
 
112942
- // node_modules/.pnpm/@opencode-ai+sdk@1.18.5/node_modules/@opencode-ai/sdk/dist/v2/gen/core/pathSerializer.gen.js
112970
+ // node_modules/.pnpm/@opencode-ai+sdk@1.18.29/node_modules/@opencode-ai/sdk/dist/v2/gen/core/pathSerializer.gen.js
112943
112971
  var separatorArrayExplode = (style) => {
112944
112972
  switch (style) {
112945
112973
  case "label":
@@ -113042,7 +113070,7 @@ var serializeObjectParam = ({ allowReserved, explode, name, style, value: value2
113042
113070
  return style === "label" || style === "matrix" ? separator2 + joinedValues : joinedValues;
113043
113071
  };
113044
113072
 
113045
- // node_modules/.pnpm/@opencode-ai+sdk@1.18.5/node_modules/@opencode-ai/sdk/dist/v2/gen/core/utils.gen.js
113073
+ // node_modules/.pnpm/@opencode-ai+sdk@1.18.29/node_modules/@opencode-ai/sdk/dist/v2/gen/core/utils.gen.js
113046
113074
  var PATH_PARAM_RE = /\{[^{}]+\}/g;
113047
113075
  var defaultPathSerializer = ({ path: path4, url: _url3 }) => {
113048
113076
  let url4 = _url3;
@@ -113125,7 +113153,7 @@ function getValidRequestBody(options) {
113125
113153
  return void 0;
113126
113154
  }
113127
113155
 
113128
- // node_modules/.pnpm/@opencode-ai+sdk@1.18.5/node_modules/@opencode-ai/sdk/dist/v2/gen/core/auth.gen.js
113156
+ // node_modules/.pnpm/@opencode-ai+sdk@1.18.29/node_modules/@opencode-ai/sdk/dist/v2/gen/core/auth.gen.js
113129
113157
  var getAuthToken = async (auth2, callback) => {
113130
113158
  const token = typeof callback === "function" ? await callback(auth2) : callback;
113131
113159
  if (!token) {
@@ -113140,12 +113168,12 @@ var getAuthToken = async (auth2, callback) => {
113140
113168
  return token;
113141
113169
  };
113142
113170
 
113143
- // node_modules/.pnpm/@opencode-ai+sdk@1.18.5/node_modules/@opencode-ai/sdk/dist/v2/gen/core/bodySerializer.gen.js
113171
+ // node_modules/.pnpm/@opencode-ai+sdk@1.18.29/node_modules/@opencode-ai/sdk/dist/v2/gen/core/bodySerializer.gen.js
113144
113172
  var jsonBodySerializer = {
113145
113173
  bodySerializer: (body) => JSON.stringify(body, (_key, value2) => typeof value2 === "bigint" ? value2.toString() : value2)
113146
113174
  };
113147
113175
 
113148
- // node_modules/.pnpm/@opencode-ai+sdk@1.18.5/node_modules/@opencode-ai/sdk/dist/v2/gen/client/utils.gen.js
113176
+ // node_modules/.pnpm/@opencode-ai+sdk@1.18.29/node_modules/@opencode-ai/sdk/dist/v2/gen/client/utils.gen.js
113149
113177
  var createQuerySerializer = ({ parameters = {}, ...args2 } = {}) => {
113150
113178
  const querySerializer = (queryParams) => {
113151
113179
  const search2 = [];
@@ -113355,7 +113383,7 @@ var createConfig = (override = {}) => ({
113355
113383
  ...override
113356
113384
  });
113357
113385
 
113358
- // node_modules/.pnpm/@opencode-ai+sdk@1.18.5/node_modules/@opencode-ai/sdk/dist/v2/gen/client/client.gen.js
113386
+ // node_modules/.pnpm/@opencode-ai+sdk@1.18.29/node_modules/@opencode-ai/sdk/dist/v2/gen/client/client.gen.js
113359
113387
  var createClient = (config3 = {}) => {
113360
113388
  let _config = mergeConfigs(createConfig(), config3);
113361
113389
  const getConfig = () => ({ ..._config });
@@ -113563,7 +113591,7 @@ var createClient = (config3 = {}) => {
113563
113591
  };
113564
113592
  };
113565
113593
 
113566
- // node_modules/.pnpm/@opencode-ai+sdk@1.18.5/node_modules/@opencode-ai/sdk/dist/v2/gen/core/params.gen.js
113594
+ // node_modules/.pnpm/@opencode-ai+sdk@1.18.29/node_modules/@opencode-ai/sdk/dist/v2/gen/core/params.gen.js
113567
113595
  var extraPrefixesMap = {
113568
113596
  $body_: "body",
113569
113597
  $headers_: "headers",
@@ -113659,10 +113687,10 @@ var buildClientParams = (args2, fields) => {
113659
113687
  return params;
113660
113688
  };
113661
113689
 
113662
- // node_modules/.pnpm/@opencode-ai+sdk@1.18.5/node_modules/@opencode-ai/sdk/dist/v2/gen/client.gen.js
113690
+ // node_modules/.pnpm/@opencode-ai+sdk@1.18.29/node_modules/@opencode-ai/sdk/dist/v2/gen/client.gen.js
113663
113691
  var client = createClient(createConfig({ baseUrl: "http://localhost:4096" }));
113664
113692
 
113665
- // node_modules/.pnpm/@opencode-ai+sdk@1.18.5/node_modules/@opencode-ai/sdk/dist/v2/gen/sdk.gen.js
113693
+ // node_modules/.pnpm/@opencode-ai+sdk@1.18.29/node_modules/@opencode-ai/sdk/dist/v2/gen/sdk.gen.js
113666
113694
  var HeyApiClient = class {
113667
113695
  client;
113668
113696
  constructor(args2) {
@@ -114277,7 +114305,7 @@ var Global = class extends HeyApiClient {
114277
114305
  /**
114278
114306
  * Upgrade opencode
114279
114307
  *
114280
- * Upgrade opencode to the specified version or latest if not specified.
114308
+ * Upgrade opencode to the specified version.
114281
114309
  */
114282
114310
  upgrade(parameters, options) {
114283
114311
  const params = buildClientParams([parameters], [{ args: [{ in: "body", key: "target" }] }]);
@@ -118117,7 +118145,7 @@ var OpencodeClient = class _OpencodeClient extends HeyApiClient {
118117
118145
  }
118118
118146
  };
118119
118147
 
118120
- // node_modules/.pnpm/@opencode-ai+sdk@1.18.5/node_modules/@opencode-ai/sdk/dist/error-interceptor.js
118148
+ // node_modules/.pnpm/@opencode-ai+sdk@1.18.29/node_modules/@opencode-ai/sdk/dist/error-interceptor.js
118121
118149
  function wrapClientError(error62, response, request2, opts) {
118122
118150
  if (!opts?.throwOnError)
118123
118151
  return error62;
@@ -118144,7 +118172,7 @@ function describe(request2, response) {
118144
118172
  return `${method} ${url4}${status ? " \u2192 " + status : ""}${statusText ? " " + statusText : ""}`;
118145
118173
  }
118146
118174
 
118147
- // node_modules/.pnpm/@opencode-ai+sdk@1.18.5/node_modules/@opencode-ai/sdk/dist/v2/client.js
118175
+ // node_modules/.pnpm/@opencode-ai+sdk@1.18.29/node_modules/@opencode-ai/sdk/dist/v2/client.js
118148
118176
  function pick(value2, fallback, encode5) {
118149
118177
  if (!value2)
118150
118178
  return;
@@ -118220,7 +118248,7 @@ function createOpencodeClient(config3) {
118220
118248
  return new OpencodeClient({ client: client2 });
118221
118249
  }
118222
118250
 
118223
- // node_modules/.pnpm/@opencode-ai+sdk@1.18.5/node_modules/@opencode-ai/sdk/dist/v2/server.js
118251
+ // node_modules/.pnpm/@opencode-ai+sdk@1.18.29/node_modules/@opencode-ai/sdk/dist/v2/server.js
118224
118252
  var import_cross_spawn = __toESM(require_cross_spawn(), 1);
118225
118253
 
118226
118254
  // agents/opencode.ts
@@ -192450,7 +192478,7 @@ function formatModelLabel(params) {
192450
192478
  return `${base} (credentials for ${providerDisplayName(params.fallbackFrom)} were rejected by the provider)`;
192451
192479
  }
192452
192480
  if (params.clamped?.reason === "trial") {
192453
- return `${base} (free trial)`;
192481
+ return `${base} (model usage covered by Pullfrog)`;
192454
192482
  }
192455
192483
  if (params.clamped) {
192456
192484
  const target = isAutoTier(params.clamped.from) ? "the intelligent tier" : `\`${resolveDisplayAlias(params.clamped.from)?.displayName ?? params.clamped.from}\``;
@@ -192467,7 +192495,7 @@ function buildTrialDisclosure(owner) {
192467
192495
  "---",
192468
192496
  "",
192469
192497
  "> [!IMPORTANT]",
192470
- `> **This run used the free trial model.** \`DeepSeek Flash\` is fast and cheap \u2014 expect lighter work than a frontier model. [Connect a subscription or API key \u2192](${consoleUrl})`
192498
+ `> **Pullfrog covered this run's model usage.** \`DeepSeek Flash\` is fast and cheap \u2014 expect lighter work than a frontier model. This model allowance is temporary and separate from your Pullfrog plan. [Connect a model-provider subscription or API key \u2192](${consoleUrl})`
192471
192499
  ].join("\n");
192472
192500
  }
192473
192501
  function buildPullfrogFooter(params) {
@@ -197789,7 +197817,7 @@ function buildMissingApiKeyError(params) {
197789
197817
  const envVars = params.model?.includes("/") ? getModelEnvVars(params.model) : [];
197790
197818
  const [primary, ...alternates] = envVars;
197791
197819
  const envVarList = primary ? `\`${primary}\`${alternates.length > 0 ? ` (or ${alternates.map((v) => `\`${v}\``).join(" / ")})` : ""}` : void 0;
197792
- const lead = envVarList ? `**${MISSING_KEY_MARKER}** \u2014 this repo is configured to use \`${params.model}\`, which needs ${envVarList}, but the runner has no key for it.` : `**${MISSING_KEY_MARKER}** \u2014 Pullfrog needs at least one LLM provider API key (e.g. \`ANTHROPIC_API_KEY\`, \`OPENAI_API_KEY\`, \`GEMINI_API_KEY\`) configured as a GitHub Actions secret.`;
197820
+ const lead = envVarList ? `**${MISSING_KEY_MARKER}** \u2014 this run used \`${params.model}\`, which needs ${envVarList}, but the runner has no key for it.` : `**${MISSING_KEY_MARKER}** \u2014 Pullfrog needs at least one LLM provider API key (e.g. \`ANTHROPIC_API_KEY\`, \`OPENAI_API_KEY\`, \`GEMINI_API_KEY\`) configured as a GitHub Actions secret.`;
197793
197821
  return [
197794
197822
  lead,
197795
197823
  "",
@@ -198265,11 +198293,11 @@ function billingConsoleUrl(owner) {
198265
198293
  function commercialPaywallBody(params) {
198266
198294
  if (params.reason === "commercial") {
198267
198295
  return [
198268
- `**Pullfrog needs a confirmed Pro plan for ${params.ownerLogin}, so this run paused.**`,
198296
+ `**Pullfrog needs Pro on ${params.ownerLogin}, so this run didn't start.**`,
198269
198297
  "",
198270
- "Open Plan and payment to confirm Pro or review the organization's billing status.",
198298
+ "Pro is $30/month per organization and covers private repositories. Public repos and personal accounts keep running free.",
198271
198299
  "",
198272
- `[Review plan and payment \u2192](${params.url})`
198300
+ `[Upgrade to Pro \u2192](${params.url})`
198273
198301
  ].join("\n");
198274
198302
  }
198275
198303
  params.reason;
package/dist/internal.js CHANGED
@@ -105,6 +105,13 @@ var providers = {
105
105
  // brand-tier names the slug convention asks for — the pre-5.6 `gpt` /
106
106
  // `gpt-pro` / `gpt-mini` slugs are holdovers from the retired GPT / GPT Pro
107
107
  // / GPT Mini tiering and are carried below as deprecated aliases.
108
+ "gpt-astra": {
109
+ displayName: "GPT Astra",
110
+ resolve: "openai/gpt-6-astra",
111
+ effort: ["low", "medium", "high", "xhigh", "max"],
112
+ openRouterResolve: "openrouter/openai/gpt-6-astra",
113
+ subagentModel: "gpt-sol"
114
+ },
108
115
  "gpt-sol": {
109
116
  displayName: "GPT Sol",
110
117
  resolve: "openai/gpt-5.6-sol",
@@ -213,9 +220,9 @@ var providers = {
213
220
  },
214
221
  "gemini-flash": {
215
222
  displayName: "Gemini Flash",
216
- resolve: "google/gemini-3.6-flash",
217
- effort: ["minimal", "low", "medium", "high"],
218
- openRouterResolve: "openrouter/google/gemini-3.6-flash"
223
+ resolve: "google/gemini-3.8-flash",
224
+ effort: ["low", "medium", "high"],
225
+ openRouterResolve: "openrouter/google/gemini-3.8-flash"
219
226
  }
220
227
  }
221
228
  }),
@@ -466,6 +473,13 @@ var providers = {
466
473
  openRouterResolve: "openrouter/openai/gpt-5.6-sol",
467
474
  subagentModel: "gpt-terra"
468
475
  },
476
+ "gpt-astra": {
477
+ displayName: "GPT Astra",
478
+ resolve: "opencode/gpt-6-astra",
479
+ effort: ["low", "medium", "high", "xhigh", "max"],
480
+ openRouterResolve: "openrouter/openai/gpt-6-astra",
481
+ subagentModel: "gpt-sol"
482
+ },
469
483
  // see openai/gpt-sol-pro — Zen has no -pro id, so direct resolves to plain Sol.
470
484
  "gpt-sol-pro": {
471
485
  displayName: "GPT Sol Pro",
@@ -536,9 +550,9 @@ var providers = {
536
550
  },
537
551
  "gemini-flash": {
538
552
  displayName: "Gemini Flash",
539
- resolve: "opencode/gemini-3.6-flash",
540
- effort: ["minimal", "low", "medium", "high"],
541
- openRouterResolve: "openrouter/google/gemini-3.6-flash"
553
+ resolve: "opencode/gemini-3.8-flash",
554
+ effort: ["low", "medium", "high"],
555
+ openRouterResolve: "openrouter/google/gemini-3.8-flash"
542
556
  },
543
557
  // Zen serves K3, but rule 7 can only move a mirror when its upstream moves,
544
558
  // so the K3 generation could never reach this block by bumping `kimi-k2`.
@@ -883,6 +897,13 @@ var providers = {
883
897
  openRouterResolve: "openrouter/openai/gpt-5.6-sol",
884
898
  subagentModel: "gpt-terra"
885
899
  },
900
+ "gpt-astra": {
901
+ displayName: "GPT Astra",
902
+ resolve: "openrouter/openai/gpt-6-astra",
903
+ effort: ["low", "medium", "high", "xhigh", "max"],
904
+ openRouterResolve: "openrouter/openai/gpt-6-astra",
905
+ subagentModel: "gpt-sol"
906
+ },
886
907
  // see openai/gpt-sol-pro. openrouter serves sol-pro directly on both routes.
887
908
  "gpt-sol-pro": {
888
909
  displayName: "GPT Sol Pro",
@@ -959,10 +980,9 @@ var providers = {
959
980
  "gemini-flash": {
960
981
  displayName: "Gemini Flash",
961
982
  resolve: "openrouter/~google/gemini-flash-latest",
962
- // no `minimal` here, unlike the google/ and opencode/ entries for the
963
- // same model: OpenRouter's floating `~google/gemini-flash-latest` stopped
964
- // publishing that rung. mirroring it is not cosmetic — claude-code
965
- // hard-errors on an out-of-range `--effort` before it calls the API.
983
+ // a floating pointer, not a pinned id — it already serves 3.8, so this
984
+ // entry tracks its siblings' generation bumps for free. the ladder still
985
+ // mirrors exactly: claude-code hard-errors on an out-of-range `--effort`.
966
986
  effort: ["low", "medium", "high"],
967
987
  openRouterResolve: "openrouter/~google/gemini-flash-latest"
968
988
  },
@@ -1053,6 +1073,12 @@ var providers = {
1053
1073
  effort: ["none", "low", "medium", "high", "xhigh", "max"],
1054
1074
  subagentModel: "gpt-terra"
1055
1075
  },
1076
+ "gpt-astra": {
1077
+ displayName: "GPT Astra",
1078
+ resolve: "vercel/openai/gpt-6-astra",
1079
+ effort: ["low", "medium", "high", "xhigh", "max"],
1080
+ subagentModel: "gpt-sol"
1081
+ },
1056
1082
  "gpt-terra": {
1057
1083
  displayName: "GPT Terra",
1058
1084
  resolve: "vercel/openai/gpt-5.6-terra",
@@ -1070,8 +1096,8 @@ var providers = {
1070
1096
  },
1071
1097
  "gemini-flash": {
1072
1098
  displayName: "Gemini Flash",
1073
- resolve: "vercel/google/gemini-3.6-flash",
1074
- effort: ["minimal", "low", "medium", "high"]
1099
+ resolve: "vercel/google/gemini-3.8-flash",
1100
+ effort: ["low", "medium", "high"]
1075
1101
  },
1076
1102
  "deepseek-pro": {
1077
1103
  displayName: "DeepSeek Pro",
@@ -1090,7 +1116,8 @@ var providers = {
1090
1116
  },
1091
1117
  "kimi-k3": {
1092
1118
  displayName: "Kimi K3",
1093
- resolve: "vercel/moonshotai/kimi-k3"
1119
+ resolve: "vercel/moonshotai/kimi-k3",
1120
+ effort: ["low", "high", "max"]
1094
1121
  }
1095
1122
  }
1096
1123
  })
@@ -1656,11 +1683,11 @@ var modes = computeModes("opencode");
1656
1683
  function commercialPaywallBody(params) {
1657
1684
  if (params.reason === "commercial") {
1658
1685
  return [
1659
- `**Pullfrog needs a confirmed Pro plan for ${params.ownerLogin}, so this run paused.**`,
1686
+ `**Pullfrog needs Pro on ${params.ownerLogin}, so this run didn't start.**`,
1660
1687
  "",
1661
- "Open Plan and payment to confirm Pro or review the organization's billing status.",
1688
+ "Pro is $30/month per organization and covers private repositories. Public repos and personal accounts keep running free.",
1662
1689
  "",
1663
- `[Review plan and payment \u2192](${params.url})`
1690
+ `[Upgrade to Pro \u2192](${params.url})`
1664
1691
  ].join("\n");
1665
1692
  }
1666
1693
  params.reason;
@@ -1703,7 +1730,7 @@ function formatModelLabel(params) {
1703
1730
  return `${base} (credentials for ${providerDisplayName(params.fallbackFrom)} were rejected by the provider)`;
1704
1731
  }
1705
1732
  if (params.clamped?.reason === "trial") {
1706
- return `${base} (free trial)`;
1733
+ return `${base} (model usage covered by Pullfrog)`;
1707
1734
  }
1708
1735
  if (params.clamped) {
1709
1736
  const target = isAutoTier(params.clamped.from) ? "the intelligent tier" : `\`${resolveDisplayAlias(params.clamped.from)?.displayName ?? params.clamped.from}\``;
@@ -1720,7 +1747,7 @@ function buildTrialDisclosure(owner) {
1720
1747
  "---",
1721
1748
  "",
1722
1749
  "> [!IMPORTANT]",
1723
- `> **This run used the free trial model.** \`DeepSeek Flash\` is fast and cheap \u2014 expect lighter work than a frontier model. [Connect a subscription or API key \u2192](${consoleUrl})`
1750
+ `> **Pullfrog covered this run's model usage.** \`DeepSeek Flash\` is fast and cheap \u2014 expect lighter work than a frontier model. This model allowance is temporary and separate from your Pullfrog plan. [Connect a model-provider subscription or API key \u2192](${consoleUrl})`
1724
1751
  ].join("\n");
1725
1752
  }
1726
1753
  function buildPullfrogFooter(params) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pullfrog",
3
- "version": "0.1.69",
3
+ "version": "0.1.71",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "pullfrog": "dist/cli.mjs",
@@ -31,12 +31,12 @@
31
31
  "@ark/util": "0.56.0",
32
32
  "@clack/prompts": "^1.2.0",
33
33
  "@modelcontextprotocol/sdk": "^1.26.0",
34
- "@opencode-ai/sdk": "1.18.5",
35
- "@openai/codex": "0.147.0",
36
- "@openai/codex-sdk": "0.147.0",
37
34
  "@octokit/plugin-throttling": "^11.0.3",
38
35
  "@octokit/rest": "^22.0.0",
39
36
  "@octokit/webhooks-types": "^7.6.1",
37
+ "@openai/codex": "0.153.4",
38
+ "@openai/codex-sdk": "0.153.4",
39
+ "@opencode-ai/sdk": "1.18.29",
40
40
  "@standard-schema/spec": "1.1.0",
41
41
  "@toon-format/toon": "^1.0.0",
42
42
  "@types/node": "^24.7.2",
@@ -56,7 +56,7 @@
56
56
  "husky": "^9.0.0",
57
57
  "lru-cache": "^11.0.0",
58
58
  "object-hash": "^3.0.0",
59
- "opencode-ai": "1.18.5",
59
+ "opencode-ai": "1.18.29",
60
60
  "package-manager-detector": "^1.6.0",
61
61
  "picocolors": "^1.1.1",
62
62
  "semver": "^7.7.3",