free-pi-cli 0.6.15 → 0.6.16

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
@@ -27,4 +27,4 @@ if (err) {
27
27
  console.error(err);
28
28
  process.exit(1);
29
29
  }
30
- await import("./main-jmyqcr54.js");
30
+ await import("./main-gckhcg3t.js");
@@ -515,7 +515,7 @@ function folderMatches(cwd, sessionCwd) {
515
515
  // package.json
516
516
  var package_default = {
517
517
  name: "free-pi-cli",
518
- version: "0.6.15",
518
+ version: "0.6.16",
519
519
  description: "Free AI coding agent for your terminal. Ads and a daily free allowance pay for the models; sign in with GitHub and run npx free-pi-cli.",
520
520
  keywords: [
521
521
  "coding agent",
@@ -7030,11 +7030,14 @@ function formatRewardStatus(r, now, columns) {
7030
7030
  }
7031
7031
  async function renderMeter(deps, ctx, opts = {}) {
7032
7032
  const me = await fetchMe(deps);
7033
- ctx.ui.setStatus(METER_STATUS_KEY, undefined);
7034
7033
  if (!me) {
7035
- ctx.ui.setWidget(METER_WIDGET_ID, undefined);
7034
+ if (await deps.getToken() !== lastToken) {
7035
+ ctx.ui.setStatus(METER_STATUS_KEY, undefined);
7036
+ ctx.ui.setWidget(METER_WIDGET_ID, undefined);
7037
+ }
7036
7038
  return;
7037
7039
  }
7040
+ ctx.ui.setStatus(METER_STATUS_KEY, undefined);
7038
7041
  const theme = ctx.ui.theme;
7039
7042
  const reward = formatRewardStatus(me.earn_reward, opts.now ?? Date.now(), opts.columns ?? (process.stdout.columns || 80));
7040
7043
  if (reward)
@@ -8915,10 +8918,10 @@ function createToolAliasesExtension(opts = {}) {
8915
8918
  var FUSION_ID = "fusion";
8916
8919
  var FUSION_PICKER_ID = "\uD83E\uDDE8 fusion";
8917
8920
  var FUSION_NAME = "\uD83E\uDDE8 Fusion · DeepSeek Pro plans, Flash builds";
8918
- var FUSION_FALLBACK_NAME = "\uD83E\uDDE8 Fusion · Sonnet plans, DeepSeek builds";
8921
+ var FUSION_FALLBACK_NAME = "\uD83E\uDDE8 Fusion · DeepSeek Flash plans and builds";
8919
8922
  var FUSION_PLANNER_ID = "deepseek-v4-pro";
8920
8923
  var FUSION_EXECUTOR_ID = "deepseek-v4-flash";
8921
- var FUSION_FALLBACK_PLANNER_ID = "claude-sonnet-5.5";
8924
+ var FUSION_FALLBACK_PLANNER_ID = "deepseek-v4-flash";
8922
8925
  function resolveFusionIds(catalogIds, server) {
8923
8926
  const has = (id) => catalogIds.includes(id);
8924
8927
  if (server && has(server.planner) && has(server.executor))
@@ -9200,7 +9203,7 @@ var LIMIT_CODES = new Set([
9200
9203
  "context_too_long",
9201
9204
  "reward_required"
9202
9205
  ]);
9203
- var SERVER_MESSAGE_CODES = new Set(["reward_required", "premium_allowance", "model_at_capacity", "context_too_long_for_fallback", "context_too_long"]);
9206
+ var SERVER_MESSAGE_CODES = new Set(["concurrent", "reward_required", "premium_allowance", "model_at_capacity", "context_too_long_for_fallback", "context_too_long"]);
9204
9207
  var FREE_OFFER_CODES = new Set(["daily_cap", "queue_wait", "rolling_cap", "premium_allowance", "model_at_capacity", "model_requires_credits"]);
9205
9208
  var isFusion = (model) => model?.provider === PROVIDER_NAME && (model.id === FUSION_ID || model.id === FUSION_PICKER_ID);
9206
9209
  function lastUserEntryId(ctx) {
@@ -9840,6 +9843,14 @@ function mergeAttribution(a, b) {
9840
9843
 
9841
9844
  // src/changelog.ts
9842
9845
  var CHANGELOG_HIGHLIGHTS = [
9846
+ {
9847
+ version: "0.6.16",
9848
+ highlights: [
9849
+ "New premium model: DeepSeek V4.1 Flash Ultrafast. Find it in /model as \uD83D\uDD25\uD83D\uDD25\uD83D\uDD25 ultrafast. It uses premium credits only.",
9850
+ "Subagents now need credits: they use premium credit, and up to 4 run at once.",
9851
+ "Fusion plans with DeepSeek Flash, since the Claude models are retired."
9852
+ ]
9853
+ },
9843
9854
  {
9844
9855
  version: "0.6.15",
9845
9856
  highlights: [
@@ -11995,12 +12006,40 @@ function createHeaderExtension(opts) {
11995
12006
  };
11996
12007
  }
11997
12008
 
12009
+ // src/ultrafast.ts
12010
+ var ULTRAFAST_THINKING_LEVELS = ["off", "minimal", "low", "medium", "high"];
12011
+ var ULTRAFAST_CATALOG_ID = "deepseek-v4.1-flash-1017-ultrafast";
12012
+ var ULTRAFAST_PICKER_ID = "\uD83D\uDD25\uD83D\uDD25\uD83D\uDD25 ultrafast";
12013
+ function createUltrafastExtension(model) {
12014
+ return {
12015
+ name: "free-pi-ultrafast",
12016
+ factory(pi) {
12017
+ if (!model || model.id !== ULTRAFAST_CATALOG_ID)
12018
+ return;
12019
+ pi.registerVirtualModel({
12020
+ provider: PROVIDER_NAME,
12021
+ id: ULTRAFAST_PICKER_ID,
12022
+ name: model.name,
12023
+ input: ["text"],
12024
+ thinkingLevels: ULTRAFAST_THINKING_LEVELS,
12025
+ contextWindow: CONTEXT_WINDOW,
12026
+ maxTokens: MAX_OUTPUT_TOKENS,
12027
+ route: (_request, ctx) => ({
12028
+ model: ctx.modelRegistry.find(PROVIDER_NAME, ULTRAFAST_CATALOG_ID),
12029
+ thinkingLevel: _request.thinkingLevel
12030
+ })
12031
+ });
12032
+ }
12033
+ };
12034
+ }
12035
+
11998
12036
  // src/provider-lock.ts
11999
12037
  function resolveFreePiScope(modelRuntime, providerName, modelIds, env = process.env) {
12000
12038
  if (env.FREEPI_KEEP_ENV_PROVIDERS)
12001
12039
  return [];
12002
12040
  const scoped = [];
12003
- for (const id of new Set([FUSION_PICKER_ID, ...modelIds])) {
12041
+ const pickerModelIds = modelIds.map((id) => id === ULTRAFAST_CATALOG_ID ? ULTRAFAST_PICKER_ID : id);
12042
+ for (const id of new Set([FUSION_PICKER_ID, ...pickerModelIds])) {
12004
12043
  const model = modelRuntime.getModel(providerName, id);
12005
12044
  if (model)
12006
12045
  scoped.push({ model });
@@ -12032,19 +12071,22 @@ var SEND_MESSAGE_TOOL = "send_message";
12032
12071
  var SUBMIT_PLAN_TOOL = "submit_plan";
12033
12072
  var MAX_PARALLEL = 8;
12034
12073
  var PARTICLE_ID = "particle";
12035
- var REFUSAL_FALLBACK = "Subagents run on the free Particle model, or with credits. Switch with /model or run /buy-credits.";
12074
+ var REFUSAL_FALLBACK = "Subagents need credits. Run /buy-credits.";
12036
12075
  function subagentModelId(agent, parentModelId, ids) {
12037
12076
  if (parentModelId === PARTICLE_ID)
12038
12077
  return PARTICLE_ID;
12039
12078
  if (agent === "planner")
12040
12079
  return ids.planner;
12080
+ if (parentModelId === ULTRAFAST_PICKER_ID)
12081
+ return ULTRAFAST_CATALOG_ID;
12041
12082
  return parentModelId === FUSION_ID || parentModelId === FUSION_PICKER_ID ? ids.executor : parentModelId;
12042
12083
  }
12043
- function subagentsAvailable(modelId, hasCredit) {
12044
- return modelId === PARTICLE_ID || hasCredit;
12084
+ function subagentsAvailable(_modelId, hasCredit) {
12085
+ return hasCredit;
12045
12086
  }
12046
- function subagentConcurrency(modelId) {
12047
- return modelId === PARTICLE_ID ? 4 : 1;
12087
+ var SUBAGENT_CONCURRENCY = 4;
12088
+ function subagentConcurrency(_modelId) {
12089
+ return SUBAGENT_CONCURRENCY;
12048
12090
  }
12049
12091
  function substitutePrevious(task, previous) {
12050
12092
  return task.split("{previous}").join(previous);
@@ -14063,6 +14105,9 @@ function catalogModelsFor(opts) {
14063
14105
  return [{ id, name: id }];
14064
14106
  }
14065
14107
  function pickerModelName(opts, id) {
14108
+ if (id === ULTRAFAST_PICKER_ID) {
14109
+ return opts.models?.find((m) => m.id === ULTRAFAST_CATALOG_ID)?.name ?? ULTRAFAST_PICKER_ID;
14110
+ }
14066
14111
  return [...catalogModelsFor(opts), ...defenseModelsFor(opts)].find((m) => m.id === id)?.name;
14067
14112
  }
14068
14113
  function defenseModelsFor(opts) {
@@ -14261,6 +14306,7 @@ function buildRuntimeOptions(opts, sessionId) {
14261
14306
  });
14262
14307
  const extensionFactories = [
14263
14308
  providerExtension,
14309
+ ...models.some((m) => m.id === ULTRAFAST_CATALOG_ID) ? [createUltrafastExtension(models.find((m) => m.id === ULTRAFAST_CATALOG_ID))] : [],
14264
14310
  createFusionExtension(models[0].id, resolveFusionIds(models.map((m) => m.id), opts.fusion)),
14265
14311
  adsExtension,
14266
14312
  usageToolExtension,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "free-pi-cli",
3
- "version": "0.6.15",
3
+ "version": "0.6.16",
4
4
  "description": "Free AI coding agent for your terminal. Ads and a daily free allowance pay for the models; sign in with GitHub and run npx free-pi-cli.",
5
5
  "keywords": [
6
6
  "coding agent",