pullfrog 0.1.75 → 0.1.77

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -108891,6 +108891,71 @@ var AUTO_TIER_TARGET = {
108891
108891
  function isAutoTier(slug2) {
108892
108892
  return slug2 === AUTO_EFFICIENT || slug2 === AUTO_INTELLIGENT;
108893
108893
  }
108894
+ var PROVIDER_LADDERS = {
108895
+ anthropic: {
108896
+ minimal: "anthropic/claude-haiku",
108897
+ light: "anthropic/claude-sonnet",
108898
+ standard: "anthropic/claude-opus",
108899
+ deep: "anthropic/claude-opus"
108900
+ },
108901
+ openai: {
108902
+ minimal: "openai/gpt-luna",
108903
+ light: "openai/gpt-terra",
108904
+ standard: "openai/gpt-sol",
108905
+ deep: "openai/gpt-astra"
108906
+ },
108907
+ google: {
108908
+ minimal: "google/gemini-flash",
108909
+ light: "google/gemini-flash",
108910
+ standard: "google/gemini-pro",
108911
+ deep: "google/gemini-pro"
108912
+ },
108913
+ deepseek: {
108914
+ minimal: "deepseek/deepseek-flash",
108915
+ light: "deepseek/deepseek-flash",
108916
+ standard: "deepseek/deepseek-pro",
108917
+ deep: "deepseek/deepseek-pro"
108918
+ },
108919
+ xai: {
108920
+ minimal: "xai/grok-fast",
108921
+ light: "xai/grok-fast",
108922
+ standard: "xai/grok",
108923
+ deep: "xai/grok"
108924
+ },
108925
+ moonshotai: {
108926
+ minimal: "moonshotai/kimi-k2",
108927
+ light: "moonshotai/kimi-k2",
108928
+ standard: "moonshotai/kimi-k3",
108929
+ deep: "moonshotai/kimi-k3"
108930
+ },
108931
+ openrouter: {
108932
+ minimal: "openrouter/deepseek-flash",
108933
+ light: "openrouter/gpt-luna",
108934
+ standard: "openrouter/gpt-sol",
108935
+ deep: "openrouter/claude-opus"
108936
+ },
108937
+ opencode: {
108938
+ minimal: "opencode/gpt-luna",
108939
+ light: "opencode/gpt-luna",
108940
+ standard: "opencode/gpt-sol",
108941
+ deep: "opencode/claude-opus"
108942
+ }
108943
+ };
108944
+ var ROUTER_LADDER = {
108945
+ minimal: "deepseek/deepseek-flash",
108946
+ light: "openai/gpt-luna",
108947
+ standard: "openai/gpt-sol",
108948
+ deep: "anthropic/claude-opus"
108949
+ };
108950
+ var AUTO_PREFIX = "auto/";
108951
+ function autoLadder(slug2) {
108952
+ if (!slug2 || !slug2.startsWith(AUTO_PREFIX) || isAutoTier(slug2)) return void 0;
108953
+ const target = slug2.slice(AUTO_PREFIX.length);
108954
+ return target === "router" ? ROUTER_LADDER : PROVIDER_LADDERS[target];
108955
+ }
108956
+ var ROUTED_PROVIDERS = Object.keys(
108957
+ PROVIDER_LADDERS
108958
+ ).map((key) => ({ key, displayName: providers[key].displayName }));
108894
108959
  function isCardGatedModel(slug2) {
108895
108960
  return resolveOpenRouterModel(slug2) !== void 0;
108896
108961
  }
@@ -108899,7 +108964,7 @@ function resolveModelSlug(slug2) {
108899
108964
  }
108900
108965
  var MAX_FALLBACK_DEPTH = 10;
108901
108966
  function resolveDisplayAlias(slug2) {
108902
- let current = isAutoTier(slug2) ? AUTO_TIER_TARGET[slug2] : slug2;
108967
+ let current = isAutoTier(slug2) ? AUTO_TIER_TARGET[slug2] : autoLadder(slug2)?.standard ?? slug2;
108903
108968
  const visited = /* @__PURE__ */ new Set();
108904
108969
  for (let i = 0; i < MAX_FALLBACK_DEPTH; i++) {
108905
108970
  if (visited.has(current)) return void 0;
@@ -108934,6 +108999,11 @@ if (!defaultProxyAlias?.openRouterResolve) {
108934
108999
  }
108935
109000
  var DEFAULT_PROXY_MODEL = defaultProxyAlias.openRouterResolve;
108936
109001
  var defaultProxyDisplayName = defaultProxyAlias.displayName;
109002
+ for (const [name, ladder] of Object.entries({ ...PROVIDER_LADDERS, router: ROUTER_LADDER })) {
109003
+ for (const slug2 of Object.values(ladder)) {
109004
+ if (!resolveDisplayAlias(slug2)) throw new Error(`${name} ladder names unknown alias ${slug2}`);
109005
+ }
109006
+ }
108937
109007
  var OSS_MODEL_ALLOWLIST = [
108938
109008
  "deepseek/deepseek-flash",
108939
109009
  "deepseek/deepseek-pro",
@@ -108971,6 +109041,17 @@ var OPENAI_COMPATIBLE_API_KEY_ENV = "OPENAI_COMPATIBLE_API_KEY";
108971
109041
  var OPENAI_COMPATIBLE_MODEL_ENV = "OPENAI_COMPATIBLE_MODEL";
108972
109042
  var OPENAI_COMPATIBLE_CONTEXT_ENV = "OPENAI_COMPATIBLE_CONTEXT";
108973
109043
  var OPENAI_COMPATIBLE_MAX_OUTPUT_ENV = "OPENAI_COMPATIBLE_MAX_OUTPUT";
109044
+ var PROVIDER_GATEWAY_URL_ENV = {
109045
+ anthropic: "ANTHROPIC_BASE_URL",
109046
+ openai: "OPENAI_BASE_URL"
109047
+ };
109048
+ function getProviderGatewayUrl(specifier) {
109049
+ const slashIndex = specifier?.indexOf("/") ?? -1;
109050
+ if (!specifier || slashIndex <= 0) return void 0;
109051
+ const envVar = PROVIDER_GATEWAY_URL_ENV[specifier.slice(0, slashIndex)];
109052
+ if (!envVar) return void 0;
109053
+ return process.env[envVar]?.trim().replace(/\/$/, "") || void 0;
109054
+ }
108974
109055
  function isBedrockAnthropicId(bedrockModelId) {
108975
109056
  return bedrockModelId.toLowerCase().split(/[./:]/).includes("anthropic");
108976
109057
  }
@@ -109795,7 +109876,7 @@ var import_semver = __toESM(require_semver2(), 1);
109795
109876
  // package.json
109796
109877
  var package_default = {
109797
109878
  name: "pullfrog",
109798
- version: "0.1.75",
109879
+ version: "0.1.77",
109799
109880
  cliContractVersion: "1",
109800
109881
  type: "module",
109801
109882
  bin: {
@@ -110594,26 +110675,24 @@ For simple, well-defined tasks, skip the plan phase and go straight to build.`
110594
110675
 
110595
110676
  2. Checkout the PR branch via \`${t("checkout_pr")}\`.
110596
110677
 
110597
- 3. Fetch review comments via \`${t("get_review_comments")}\`.
110678
+ 3. Fetch review comments via \`${t("get_review_comments")}\` and read the full conversation in each relevant thread.
110598
110679
 
110599
- 4. For each comment:
110600
- - understand the feedback
110680
+ 4. For each thread:
110681
+ - **check intent first**: questions, explanations, and disagreement call for a reply, not a code change. Change code only when explicitly requested. Automatic review feedback on Pullfrog-authored PRs (\`address_scope: all\`) remains actionable without a separate request; later replies can narrow or withdraw that permission.
110682
+ - under \`address_scope: mentions\`, unmentioned threads are context only unless the user's review-body request explicitly includes them
110601
110683
  - **verify the finding yourself** against the actual code before deciding whether to apply \u2014 every comment (human or agent) is a hypothesis, not a directive. agent reviewers especially are fallible.
110602
- - you are searching for a solution that is **complete, minimal, and elegant** \u2014 you may need to think hard to find it. do not over-engineer, do not be over-defensive, **do not write AI slop**. reviewers bias toward *recommending additions*, and that bias has a recognizable slop texture: defensive checks for impossible cases, extra abstractions used once, comments restating obvious code, tests asserting tautologies, "just-in-case" guards, error handlers for cases the type system already rules out. reject those. evaluate whether applying the finding would leave the code more **sound, correct, AND elegant**; two-out-of-three is a signal to look harder for a fix that gets all three. if a request would add bloat \u2014 ceremony without commensurate correctness benefit \u2014 push back in your reply rather than mechanically applying it.
110603
- - if the request stands, make the code change using your native tools; otherwise reply explaining why
110684
+ - keep requested changes **sound, minimal, and elegant**. Reject defensive checks for impossible cases, single-use abstractions, redundant comments, and tautological tests rather than mechanically applying reviewer suggestions.
110685
+ - if intent permits a code change and the finding stands, implement it using your native tools; otherwise reply without editing
110604
110686
  - record what was done (or why nothing was done)
110605
110687
 
110606
110688
  5. Quality check:
110607
- - re-call \`${t("get_review_comments")}\` with \`fresh: true\` before committing: reviewers keep commenting while you work, and any thread it now returns that you have not addressed is in scope for this run.
110608
- - test changes, then review the diff before committing \u2014 verify only intended changes are present, no debug artifacts remain, no fix turned out to be bloat in context (revert any that did), and the changes are clean enough that a senior engineer would approve without hesitation
110609
- - ${commitStep}
110689
+ - re-call \`${t("get_review_comments")}\` with \`fresh: true\` before finishing, even when only replying. Apply the same scope and intent checks to new comments; respect requests to stop or change direction before committing.
110690
+ - if code changed, test and review the diff, remove unintended changes or bloat, then ${commitStep}
110610
110691
 
110611
- 6. Finalize. Reply + resolve are paired write actions: do BOTH or NEITHER for each thread.
110612
- - ${finalizeStep} (same push/prepush guidance as Build mode in *SYSTEM*)
110613
- - **if the push/commit fails**, call \`${t("report_progress")}\` with the exact error and STOP \u2014 do NOT reply or resolve any thread until the fix is live on the remote. Resolving a thread without the fix landing misleads the reviewer.
110614
- - **once the fix is live on the remote**, for each thread you acted on:
110615
- - reply ONCE via \`${t("reply_to_review_comment")}\`. The \`comment_id\` parameter takes the root comment's numeric \`id=\` (from the first \`comment author=...\` tag in the \`${t("get_review_comments")}\` output) \u2014 NOT the \`thread=\` value; that's a separate GraphQL ID used by resolve. The runtime dedupes identical bodies within a session.
110616
- - **immediately** call \`${t("resolve_review_thread")}\` with that thread's \`thread=\` value as \`thread_id\`. Resolve every thread where you (a) made the requested code change in full \u2014 partial fixes leave the thread open \u2014 OR (b) replied with a substantive answer the user explicitly asked for. Do NOT resolve threads where you pushed back on the request and the disagreement is unresolved; leave those open for the human to mediate.
110692
+ 6. Finalize:
110693
+ - **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.
110694
+ - 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.
110695
+ - resolve a thread via \`${t("resolve_review_thread")}\` (using \`thread=\` as \`thread_id\`) only after its requested fix is fully on the remote, or the user explicitly asks to resolve it. Leave discussion-only replies, partial fixes, and disagreements open.
110617
110696
  - 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.`
110618
110697
  },
110619
110698
  // Review and IncrementalReview route the minimum reviewfrog specialists
@@ -112514,6 +112593,19 @@ function warnIfNativeEditsUnavailable(ctx) {
112514
112593
  "\xBB this run cannot change files: codex's native write tool depends on bubblewrap, which Ubuntu 24.04 blocks (https://github.com/openai/codex/issues/29908), and the MCP shell is disabled for this repo. read-only work is unaffected \u2014 set `shell: restricted` if the agent needs to edit anything."
112515
112594
  );
112516
112595
  }
112596
+ var CODEX_GATEWAY_PROVIDER = "pullfrog-gateway";
112597
+ function gatewayProvider(gatewayUrl) {
112598
+ if (!gatewayUrl) return [];
112599
+ return [
112600
+ `[model_providers.${CODEX_GATEWAY_PROVIDER}]`,
112601
+ 'name = "OpenAI gateway"',
112602
+ `base_url = ${JSON.stringify(gatewayUrl)}`,
112603
+ 'wire_api = "responses"',
112604
+ // where the harness puts the run's OPENAI_API_KEY
112605
+ 'env_key = "CODEX_API_KEY"',
112606
+ ""
112607
+ ];
112608
+ }
112517
112609
  function writeCodexConfig(params) {
112518
112610
  const shellEnabled = params.ctx.payload.shell === "enabled";
112519
112611
  const sandboxMode = params.ctx.payload.push === "disabled" ? "read-only" : "workspace-write";
@@ -112530,6 +112622,7 @@ function writeCodexConfig(params) {
112530
112622
  'web_search = "live"',
112531
112623
  ...params.model ? [`model = ${JSON.stringify(params.model)}`] : [],
112532
112624
  ...params.effortRung ? [`model_reasoning_effort = ${JSON.stringify(params.effortRung)}`] : [],
112625
+ ...params.gatewayUrl ? [`model_provider = ${JSON.stringify(CODEX_GATEWAY_PROVIDER)}`] : [],
112533
112626
  "",
112534
112627
  "[features]",
112535
112628
  tomlBool(CODEX_DISABLED_FEATURES, false),
@@ -112559,6 +112652,7 @@ function writeCodexConfig(params) {
112559
112652
  "tool_timeout_sec = 660",
112560
112653
  "",
112561
112654
  ...repoMcpApprovals(repoDir),
112655
+ ...gatewayProvider(params.gatewayUrl),
112562
112656
  // UNTRUSTED, deliberately, and this one line is the whole config-precedence
112563
112657
  // boundary. Codex loads `<repo>/.codex/config.toml` as a layer that
112564
112658
  // OUTRANKS ours (project 25 vs user 20), and its denylist strips none of
@@ -112827,7 +112921,11 @@ var codex = agent({
112827
112921
  ctx,
112828
112922
  codexHome,
112829
112923
  model: resolveCodexModel(ctx),
112830
- effortRung: effort.rung && CODEX_EFFORTS.includes(effort.rung) ? effort.rung : void 0
112924
+ effortRung: effort.rung && CODEX_EFFORTS.includes(effort.rung) ? effort.rung : void 0,
112925
+ // keyed off OpenAI, not the resolved model: codex serves nothing else, an
112926
+ // auto-selected run has no model, and a ChatGPT-subscription token is
112927
+ // valid only at ChatGPT's own backend
112928
+ gatewayUrl: codexHomeAuth ? void 0 : getProviderGatewayUrl("openai/")
112831
112929
  });
112832
112930
  if (codexHomeAuth) {
112833
112931
  core3.saveState(
@@ -118594,6 +118692,14 @@ function openAICompatibleProvider(model) {
118594
118692
  }
118595
118693
  };
118596
118694
  }
118695
+ var OPENCODE_GATEWAY_PATH = { anthropic: "/v1" };
118696
+ function providerGatewayOverride(model) {
118697
+ const gatewayUrl = getProviderGatewayUrl(model);
118698
+ if (!model || !gatewayUrl) return {};
118699
+ const provider2 = model.slice(0, model.indexOf("/"));
118700
+ const baseURL = `${gatewayUrl}${OPENCODE_GATEWAY_PATH[provider2] ?? ""}`;
118701
+ return { [provider2]: { options: { baseURL } } };
118702
+ }
118597
118703
  function azureProvider(model) {
118598
118704
  const prefix = `${AZURE_PROVIDER}/`;
118599
118705
  if (!model?.startsWith(prefix)) return {};
@@ -118709,7 +118815,8 @@ function buildSecurityConfig(ctx, model) {
118709
118815
  provider: {
118710
118816
  openrouter: { models: kimiOpenRouterProviderOverrides() },
118711
118817
  ...openAICompatibleProvider(model),
118712
- ...azureProvider(model)
118818
+ ...azureProvider(model),
118819
+ ...providerGatewayOverride(model)
118713
118820
  }
118714
118821
  };
118715
118822
  if (model) {
@@ -197180,7 +197287,7 @@ function GetReviewCommentsTool(ctx) {
197180
197287
  threadCount: threadBlocks.length,
197181
197288
  commentsPath,
197182
197289
  toc: formatted.toc,
197183
- instructions: `the file at commentsPath contains ${threadBlocks.length} review threads with full conversation history. comments marked with * are from the target review (${params.review_id}); any other thread is open feedback on this PR that is also yours to address, including comments that landed after this run started. the TOC shows each thread's file:line and the line number where it appears in the file. to read a specific thread, use: grep -A 50 "^## <file:line>" ${commentsPath} (replace <file:line> with the path from the TOC, e.g. "^## action/utils/foo.ts:42"). address each thread in order, working through one file at a time.`
197290
+ instructions: `the file at commentsPath contains ${threadBlocks.length} review threads with full conversation history. comments marked with * are from the target review (${params.review_id}); any other thread is open feedback on this PR, including comments that landed after this run started. Being returned does not authorize a code change; follow the task's scope and each thread's latest request. the TOC shows each thread's file:line and the line number where it appears in the file. to read a specific thread, use: grep -A 50 "^## <file:line>" ${commentsPath} (replace <file:line> with the path from the TOC, e.g. "^## action/utils/foo.ts:42"). read each full thread before deciding whether it calls for a reply or a code change.`
197184
197291
  };
197185
197292
  })
197186
197293
  });
@@ -197303,8 +197410,7 @@ An existing plan comment was found for this issue. Update that comment with the
197303
197410
  };
197304
197411
  }
197305
197412
  var modeInstructionParent = {
197306
- IncrementalReview: "Review",
197307
- Fix: "Build"
197413
+ IncrementalReview: "Review"
197308
197414
  };
197309
197415
  function buildOrchestratorGuidance(ctx, mode, overrideGuidance) {
197310
197416
  const hardcoded = overrideGuidance ?? mode.prompt ?? "";
@@ -198516,18 +198622,13 @@ function hasEnvVar4(name) {
198516
198622
  const value2 = process.env[name];
198517
198623
  return typeof value2 === "string" && value2.length > 0;
198518
198624
  }
198519
- var HOST_OVERRIDES = {
198520
- ANTHROPIC_API_KEY: "ANTHROPIC_BASE_URL",
198521
- CLAUDE_CODE_OAUTH_TOKEN: "ANTHROPIC_BASE_URL"
198522
- };
198523
198625
  function envVarsFor(model) {
198524
198626
  return model.includes("/") ? getModelEnvVars(model) : [];
198525
198627
  }
198526
198628
  async function checkOne(params) {
198527
198629
  const value2 = process.env[params.envVar];
198528
198630
  if (!value2) return null;
198529
- const hostOverride = HOST_OVERRIDES[params.envVar];
198530
- if (hostOverride && hasEnvVar4(hostOverride)) return null;
198631
+ if (getProviderGatewayUrl(params.model)) return null;
198531
198632
  if (params.envVar === "CLAUDE_CODE_OAUTH_TOKEN") {
198532
198633
  const preflight = await preflightClaudeSubscription({
198533
198634
  token: value2,
@@ -199445,6 +199546,15 @@ var JsonPayload = type({
199445
199546
  "type?": "string | undefined",
199446
199547
  "model?": "string | undefined",
199447
199548
  "modelExplicit?": "boolean | undefined",
199549
+ // optional so a payload from a pre-router server build still parses against a
199550
+ // newer action across a rolling deploy.
199551
+ "routing?": type({
199552
+ tier: "'minimal' | 'light' | 'standard' | 'deep'",
199553
+ stakes: "number",
199554
+ workload: "number",
199555
+ source: "'scorer' | 'heuristic' | 'fixed'",
199556
+ rationale: "string"
199557
+ }).or("undefined"),
199448
199558
  "effort?": "number | string | undefined",
199449
199559
  "debug?": "boolean | undefined",
199450
199560
  prompt: "string",
@@ -199626,6 +199736,7 @@ function resolvePayload(resolvedPromptInput, repoSettings) {
199626
199736
  // explicit only when the model came from a per-run override flag (carried on
199627
199737
  // the JSON payload). a GHA `model` input or the repo default is not explicit.
199628
199738
  modelExplicit: jsonPayload?.modelExplicit ?? false,
199739
+ routing: jsonPayload?.routing,
199629
199740
  effort,
199630
199741
  debug: debug3 || void 0,
199631
199742
  prompt,
@@ -200312,9 +200423,12 @@ async function fetchRunContext(params) {
200312
200423
  if (params.oidcToken) {
200313
200424
  headers["X-GitHub-OIDC-Token"] = params.oidcToken;
200314
200425
  }
200315
- const query = params.runType ? `?type=${encodeURIComponent(params.runType)}` : "";
200426
+ const query = new URLSearchParams();
200427
+ if (params.runType) query.set("type", params.runType);
200428
+ if (params.routedTier) query.set("tier", params.routedTier);
200429
+ const search2 = query.toString();
200316
200430
  const response = await apiFetch({
200317
- path: `/api/repo/${params.repoContext.owner}/${params.repoContext.name}/run-context${query}`,
200431
+ path: `/api/repo/${params.repoContext.owner}/${params.repoContext.name}/run-context${search2 ? `?${search2}` : ""}`,
200318
200432
  headers,
200319
200433
  signal: controller.signal
200320
200434
  });
@@ -200381,7 +200495,13 @@ async function resolveRunContextData(params) {
200381
200495
  retries: [100, 500],
200382
200496
  bail: (error62) => !isTransientOctokitError(error62)
200383
200497
  })(),
200384
- fetchRunContext({ token: params.token, repoContext, oidcToken, runType: params.runType })
200498
+ fetchRunContext({
200499
+ token: params.token,
200500
+ repoContext,
200501
+ oidcToken,
200502
+ runType: params.runType,
200503
+ routedTier: params.routedTier
200504
+ })
200385
200505
  ]);
200386
200506
  return {
200387
200507
  repo: {
@@ -201289,6 +201409,12 @@ function logRunStartup(ctx) {
201289
201409
  log.info(
201290
201410
  `\xBB effort: ${resolveEffortForLog({ payload: ctx.payload, resolvedModel: ctx.resolvedModel })}`
201291
201411
  );
201412
+ const routing = ctx.payload.routing;
201413
+ if (routing) {
201414
+ log.info(
201415
+ `\xBB routed: ${routing.tier} (${routing.source}: stakes ${routing.stakes}, workload ${routing.workload}) \u2014 ${routing.rationale}`
201416
+ );
201417
+ }
201292
201418
  log.info(
201293
201419
  `\xBB agent: ${resolveAgentForLog({ agentName: ctx.agentName, resolvedModel: ctx.resolvedModel })}`
201294
201420
  );
@@ -201483,7 +201609,8 @@ async function main() {
201483
201609
  const runContext = await resolveRunContextData({
201484
201610
  octokit: initialOctokit,
201485
201611
  token: jobToken,
201486
- runType: typeof resolvedPromptInput === "string" ? void 0 : resolvedPromptInput.type
201612
+ runType: typeof resolvedPromptInput === "string" ? void 0 : resolvedPromptInput.type,
201613
+ routedTier: typeof resolvedPromptInput === "string" ? void 0 : resolvedPromptInput.routing?.tier
201487
201614
  });
201488
201615
  timer.checkpoint("runContextData");
201489
201616
  const payload = resolvePayload(resolvedPromptInput, runContext.repoSettings);
@@ -5,8 +5,8 @@
5
5
  export { CLI_CONTRACT_HEADER, CLI_CONTRACT_VERSION, CLI_UPGRADE_MESSAGE } from "../cliContract.ts";
6
6
  export type { ConfigField, ConfigScope, ConfigValue } from "../configuration.ts";
7
7
  export { configEntrySchema, configFields, configResponseSchema, configValueSchema, } from "../configuration.ts";
8
- export type { AuthorPermission, AutoTier, EffortPosition, ModelAlias, ModelProvider, Payload, PayloadEvent, ProviderConfig, PushPermission, ShellPermission, ToolPermission, WriteablePayload, XrepoConfig, } from "../external.ts";
9
- export { AUTO_EFFICIENT, AUTO_INTELLIGENT, DEFAULT_EFFORT_POSITION, DEFAULT_PROXY_MODEL, defaultAutoTier, EFFORT_ALIASES, getAutoSelectHintModel, getModelEffortLevels, getModelEnvVars, getModelManagedCredentials, getModelProvider, getProviderDisplayName, isAutoTier, isCardGatedModel, isEffortPosition, isOssAllowedModel, modelAliases, modelHasStoredAuth, OSS_MODEL_ALLOWLIST, OSS_RECOMMENDED_MODEL, offeredRungs, ossFundedModelNames, parseEffortPosition, parseModel, providers, pullfrogMcpName, resolveAutoTier, resolveCliModel, resolveDisplayAlias, resolveModelRung, resolveModelSlug, resolveOpenRouterModel, resolveRung, rungLabel, rungPosition, SUBSIDY_RUNG, } from "../external.ts";
8
+ export type { AuthorPermission, AutoTier, EffortPosition, ModelAlias, ModelProvider, Payload, PayloadEvent, PayloadRouting, ProviderConfig, PushPermission, RouterSource, RouterTier, ShellPermission, ToolPermission, WriteablePayload, XrepoConfig, } from "../external.ts";
9
+ export { AUTO_EFFICIENT, AUTO_INTELLIGENT, AUTO_ROUTER, autoLadder, autoRoutedSlug, DEFAULT_EFFORT_POSITION, DEFAULT_PROXY_MODEL, defaultAutoTier, EFFORT_ALIASES, getAutoSelectHintModel, getModelEffortLevels, getModelEnvVars, getModelManagedCredentials, getModelProvider, getProviderDisplayName, isAutoRouted, isAutoSlug, isAutoTier, isCardGatedModel, isEffortPosition, isOssAllowedModel, isRouterTier, ladderRungs, modelAliases, modelHasStoredAuth, OSS_MODEL_ALLOWLIST, OSS_RECOMMENDED_MODEL, offeredRungs, ossFundedModelNames, PROVIDER_GATEWAY_URL_ENV, parseEffortPosition, parseModel, providers, pullfrogMcpName, ROUTED_PROVIDERS, ROUTER_LADDER, ROUTER_TIERS, resolveAutoTier, resolveCliModel, resolveDisplayAlias, resolveModelRung, resolveModelSlug, resolveOpenRouterModel, resolveRoutedModel, resolveRung, rungLabel, rungPosition, SUBSIDY_RUNG, } from "../external.ts";
10
10
  export type { Mode } from "../modes.ts";
11
11
  export { modes } from "../modes.ts";
12
12
  export { commercialPaywallBody } from "../utils/billingErrors.ts";