pi-hide-providers 0.1.1 → 0.1.2

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-hide-providers",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "Hide providers and models from pi's model selector — filter the /model list and Ctrl+P cycling via a configurable blocklist",
5
5
  "type": "module",
6
6
  "author": "Tom X Nguyen",
@@ -28,6 +28,7 @@ import type { Theme } from "@earendil-works/pi-coding-agent";
28
28
  import { DynamicBorder, keyText } from "@earendil-works/pi-coding-agent";
29
29
  import {
30
30
  type HideRule,
31
+ PROVIDER_WILDCARD,
31
32
  isHidden,
32
33
  deduplicateRules,
33
34
  } from "./index.js";
@@ -369,12 +370,34 @@ export class HideProviderSelectorComponent implements Component {
369
370
  /** Toggle a single item between hidden and visible. */
370
371
  private toggleItem(item: DisplayItem): void {
371
372
  if (item.hidden) {
372
- // Remove the matching rule
373
- this.hiddenRules = this.hiddenRules.filter(
374
- (r) =>
375
- !(r.provider === item.provider &&
376
- (r.model === item.modelId || r.model === undefined)),
373
+ // Check if a provider-level rule covers this item
374
+ const hasProviderRule = this.hiddenRules.some(
375
+ (r) => r.provider === item.provider && (r.model === undefined || r.model === PROVIDER_WILDCARD),
377
376
  );
377
+
378
+ if (hasProviderRule) {
379
+ // Remove the provider-level rule and add individual rules
380
+ // for every OTHER model in the provider (keeping them hidden)
381
+ this.hiddenRules = this.hiddenRules.filter(
382
+ (r) => !(r.provider === item.provider && (r.model === undefined || r.model === PROVIDER_WILDCARD)),
383
+ );
384
+
385
+ const siblingModelIds = this.allItems
386
+ .filter((i) => i.provider === item.provider && i.modelId !== item.modelId)
387
+ .map((i) => i.modelId);
388
+
389
+ for (const modelId of siblingModelIds) {
390
+ this.hiddenRules.push({ provider: item.provider, model: modelId });
391
+ }
392
+
393
+ this.hiddenRules = deduplicateRules(this.hiddenRules);
394
+ } else {
395
+ // Remove the specific model-level rule
396
+ this.hiddenRules = this.hiddenRules.filter(
397
+ (r) =>
398
+ !(r.provider === item.provider && r.model === item.modelId),
399
+ );
400
+ }
378
401
  } else {
379
402
  // Add a rule for this specific model
380
403
  this.hiddenRules = deduplicateRules([
@@ -442,12 +465,53 @@ export class HideProviderSelectorComponent implements Component {
442
465
 
443
466
  /** Remove hide rules for the given items. */
444
467
  private showModels(items: DisplayItem[]): void {
468
+ // Group by provider so we handle provider-level rules correctly
469
+ const byProvider = new Map<string, DisplayItem[]>();
445
470
  for (const item of items) {
446
- this.hiddenRules = this.hiddenRules.filter(
447
- (r) =>
448
- !(r.provider === item.provider &&
449
- (r.model === item.modelId || r.model === undefined)),
471
+ const list = byProvider.get(item.provider) ?? [];
472
+ list.push(item);
473
+ byProvider.set(item.provider, list);
474
+ }
475
+
476
+ for (const [provider, shownItems] of byProvider) {
477
+ const allProviderItems = this.allItems.filter((i) => i.provider === provider);
478
+ const hasProviderRule = this.hiddenRules.some(
479
+ (r) => r.provider === provider && (r.model === undefined || r.model === PROVIDER_WILDCARD),
450
480
  );
481
+
482
+ if (hasProviderRule) {
483
+ const shownIds = new Set(shownItems.map((i) => i.modelId));
484
+ const allShown = shownIds.size === allProviderItems.length;
485
+
486
+ if (allShown) {
487
+ // Showing every model in the provider — just drop the provider rule
488
+ this.hiddenRules = this.hiddenRules.filter(
489
+ (r) => !(r.provider === provider && (r.model === undefined || r.model === PROVIDER_WILDCARD)),
490
+ );
491
+ } else {
492
+ // Partial — replace provider rule with individual rules for models still hidden
493
+ this.hiddenRules = this.hiddenRules.filter(
494
+ (r) => !(r.provider === provider && (r.model === undefined || r.model === PROVIDER_WILDCARD)),
495
+ );
496
+
497
+ const stillHiddenIds = allProviderItems
498
+ .filter((i) => !shownIds.has(i.modelId))
499
+ .map((i) => i.modelId);
500
+
501
+ for (const modelId of stillHiddenIds) {
502
+ this.hiddenRules.push({ provider, model: modelId });
503
+ }
504
+
505
+ this.hiddenRules = deduplicateRules(this.hiddenRules);
506
+ }
507
+ } else {
508
+ // No provider-level rule — just remove specific model rules
509
+ for (const item of shownItems) {
510
+ this.hiddenRules = this.hiddenRules.filter(
511
+ (r) => !(r.provider === item.provider && r.model === item.modelId),
512
+ );
513
+ }
514
+ }
451
515
  }
452
516
  }
453
517