free-pi-cli 0.6.13 → 0.6.14

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-p8g9x0pd.js");
30
+ await import("./main-j1ey9ghj.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.13",
518
+ version: "0.6.14",
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",
@@ -6269,7 +6269,11 @@ var ConfigSchema = object({
6269
6269
  experientialPriceCooldownMs: number2().int().min(1).default(3600000),
6270
6270
  particleEnabled: boolean2().default(false),
6271
6271
  particleBaseUrl: string2().default("https://api.particle.ai/v1"),
6272
- particleModel: string2().default("particle-1"),
6272
+ particleModelMap: record(string2(), string2()).default({
6273
+ particle: "particle-1",
6274
+ "deepseek-v4.1-flash": "deepseek-ai/deepseek-v41-flash-1017",
6275
+ "glm-5.3-flash": "z-ai/glm-5.3-flash"
6276
+ }),
6273
6277
  particleTtftMs: number2().int().min(1).default(1e4),
6274
6278
  minCliVersion: string2().default("0.0.0"),
6275
6279
  latestCliVersion: string2().default("0.2.0"),
@@ -6577,7 +6581,7 @@ function loadConfig(env = process.env) {
6577
6581
  experientialPriceCooldownMs: envNumber(env.EXPERIENTIAL_PRICE_COOLDOWN_MS),
6578
6582
  particleEnabled: envBoolean(env.PARTICLE_ENABLED),
6579
6583
  particleBaseUrl: env.PARTICLE_BASE_URL?.trim().replace(/\/$/, "") || undefined,
6580
- particleModel: env.PARTICLE_MODEL?.trim() || undefined,
6584
+ particleModelMap: envPairs(env.PARTICLE_MODEL_MAP),
6581
6585
  particleTtftMs: envNumber(env.PARTICLE_TTFT_MS),
6582
6586
  minCliVersion: env.MIN_CLI_VERSION || undefined,
6583
6587
  latestCliVersion: env.LATEST_CLI_VERSION || undefined,
@@ -9644,6 +9648,12 @@ function mergeAttribution(a, b) {
9644
9648
 
9645
9649
  // src/changelog.ts
9646
9650
  var CHANGELOG_HIGHLIGHTS = [
9651
+ {
9652
+ version: "0.6.14",
9653
+ highlights: [
9654
+ "Free Unlimited for a limited time: Particle, DeepSeek V4.1 Flash and GLM 5.3 Flash use no credits. They are at the top of the model list."
9655
+ ]
9656
+ },
9647
9657
  {
9648
9658
  version: "0.6.13",
9649
9659
  highlights: [
@@ -11439,8 +11449,8 @@ var ALL_COMMANDS = [
11439
11449
  var commands = () => ALL_COMMANDS.filter((c) => c.name !== "/hive" || process.env.FREEPI_HIVE === "1");
11440
11450
  var NAME_COLUMN = 24;
11441
11451
  var WELCOME_LINE = "Welcome to Free Pi, ad-supported inference. Please visit our advertisers to support us.";
11442
- var PARTICLE_ID = "particle";
11443
- var PARTICLE_LINE = "Free Particle — doesn't use any credits.";
11452
+ var FREE_LABEL = "Free Unlimited: limited time";
11453
+ var PARTICLE_LINE = `${FREE_LABEL} — doesn't use any credits.`;
11444
11454
  var GUEST_LINE = "Guest trial — sign in with GitHub (/login) to unlock daily credits and a comeback bonus.";
11445
11455
  var CONSENT_LINE_1 = "Usage is funded by ads and training. By using free-pi you consent.";
11446
11456
  var CONSENT_LINE_2 = "See /tos and /privacy-policy.";
@@ -11514,7 +11524,7 @@ function createHeaderExtension(opts) {
11514
11524
  render(width) {
11515
11525
  const active = ctx.model?.id;
11516
11526
  const name = active && opts.modelNameFor?.(active) || opts.modelName;
11517
- return headerLines(theme, name, expanded, width, opts.updateLatest, opts.guest, opts.allowanceLine, active === PARTICLE_ID);
11527
+ return headerLines(theme, name, expanded, width, opts.updateLatest, opts.guest, opts.allowanceLine, name.includes(FREE_LABEL));
11518
11528
  },
11519
11529
  invalidate() {},
11520
11530
  setExpanded(next) {
@@ -13518,14 +13528,13 @@ patchResumeLine(process.stdout);
13518
13528
  function pickerScopeFor(modelRuntime, opts) {
13519
13529
  const main = resolveFreePiScope(modelRuntime, PROVIDER_NAME, catalogModelsFor(opts).map((m) => m.id));
13520
13530
  const defense = resolveFreePiScope(modelRuntime, DEFENSE_PROVIDER_NAME, defenseModelsFor(opts).map((m) => m.id));
13521
- const fusion = main.filter((s) => s.model.id === FUSION_PICKER_ID);
13522
- const rest = main.filter((s) => !fusion.includes(s));
13523
- const tierOf = new Map((opts.models ?? []).map((m) => [m.id, m.tier]));
13524
- if ((opts.models ?? []).some((m) => m.tier !== undefined)) {
13525
- const rank = (s) => tierOf.get(s.model.id) === "premium" ? 1 : 0;
13526
- return [...fusion, ...rest.filter((s) => rank(s) === 0), ...rest.filter((s) => rank(s) === 1), ...defense];
13527
- }
13528
- return [...fusion, ...defense, ...rest];
13531
+ const all = [...main, ...defense];
13532
+ const nameOf = (s) => s.model.name ?? "";
13533
+ const idOf = (s) => s.model.id;
13534
+ const serverOrder = new Map((opts.models ?? []).map((m, i) => [m.id, i]));
13535
+ const free = all.filter((s) => nameOf(s).includes(FREE_LABEL)).sort((a, b) => (serverOrder.get(idOf(a)) ?? 0) - (serverOrder.get(idOf(b)) ?? 0));
13536
+ const others = all.filter((s) => !free.includes(s)).sort((a, b) => idOf(a).localeCompare(idOf(b)));
13537
+ return [...free, ...others];
13529
13538
  }
13530
13539
  function interactiveModeOptions(opts) {
13531
13540
  return { initialImages: [], initialMessages: [], ...opts.initialMessage ? { initialMessage: opts.initialMessage } : {} };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "free-pi-cli",
3
- "version": "0.6.13",
3
+ "version": "0.6.14",
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",