pi-hide-providers 0.1.0 → 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/README.md +8 -0
- package/hide-providers.ts +2 -2
- package/package.json +1 -1
- package/src/provider-selector.ts +73 -9
package/README.md
CHANGED
|
@@ -76,10 +76,18 @@ Project config (`.pi/hide-providers.json`) takes priority over global config (`~
|
|
|
76
76
|
|
|
77
77
|
## Installation
|
|
78
78
|
|
|
79
|
+
**With `pi install`** (recommended):
|
|
80
|
+
|
|
79
81
|
```bash
|
|
80
82
|
pi install https://github.com/monotykamary/pi-hide-providers
|
|
81
83
|
```
|
|
82
84
|
|
|
85
|
+
**With npm**:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
npm install pi-hide-providers
|
|
89
|
+
```
|
|
90
|
+
|
|
83
91
|
Or in `~/.pi/agent/settings.json`:
|
|
84
92
|
|
|
85
93
|
```json
|
package/hide-providers.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ExtensionAPI, ExtensionCommandContext } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { getAgentDir } from "@earendil-works/pi-coding-agent";
|
|
2
3
|
import {
|
|
3
4
|
HIDE_COMMAND_DESCRIPTION,
|
|
4
5
|
CONFIG_FILENAME,
|
|
@@ -12,7 +13,6 @@ import {
|
|
|
12
13
|
import { HideProviderSelectorComponent, type HideProviderSelectorResult } from "./src/provider-selector.js";
|
|
13
14
|
import { readFileSync, writeFileSync, existsSync, mkdirSync } from "node:fs";
|
|
14
15
|
import { join } from "node:path";
|
|
15
|
-
import { homedir } from "node:os";
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
18
|
* pi-hide-providers — hide providers and models from pi's model selector.
|
|
@@ -27,7 +27,7 @@ import { homedir } from "node:os";
|
|
|
27
27
|
*/
|
|
28
28
|
|
|
29
29
|
// Config paths
|
|
30
|
-
const globalConfigDir =
|
|
30
|
+
const globalConfigDir = getAgentDir();
|
|
31
31
|
const globalConfigPath = join(globalConfigDir, CONFIG_FILENAME);
|
|
32
32
|
|
|
33
33
|
function getProjectConfigPath(cwd: string): string {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-hide-providers",
|
|
3
|
-
"version": "0.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",
|
package/src/provider-selector.ts
CHANGED
|
@@ -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
|
-
//
|
|
373
|
-
|
|
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
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
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
|
|