proxitor 0.9.0-beta.1 → 0.9.0-beta.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/dist/browse.mjs DELETED
@@ -1,85 +0,0 @@
1
- import { autocomplete, confirm, intro, isCancel, log, outro, spinner } from "./dist.mjs";
2
- import { a as getUniqueProviders, c as formatModelHint, d as formatThroughput, f as fetchModels, h as parseModelSlug, i as fetchModelEndpoints, l as formatModelLabel, m as parseModelAuthor, o as formatContextLength, p as formatPrice, s as formatLatency, u as formatPricing } from "./providers.mjs";
3
- import { addOverrideCommand } from "./add.mjs";
4
- //#region src/commands/config/browse.ts
5
- function toOption(m) {
6
- return {
7
- value: m.id,
8
- label: formatModelLabel(m),
9
- hint: formatModelHint(m)
10
- };
11
- }
12
- function displayModelDetails(model) {
13
- log.success(`${model.name || model.id}`);
14
- if (model.description) {
15
- const desc = model.description.length > 200 ? `${model.description.slice(0, 200)}...` : model.description;
16
- log.info(` ${desc}`);
17
- }
18
- log.info(` Context: ${formatContextLength(model.context_length)} tokens`);
19
- if (model.top_provider?.max_completion_tokens) log.info(` Max output: ${formatContextLength(model.top_provider.max_completion_tokens)} tokens`);
20
- log.info(` Pricing: ${formatPricing(model.pricing.prompt, model.pricing.completion)}`);
21
- if (model.pricing.input_cache_read && model.pricing.input_cache_read !== "0") log.info(` Cache read: ${formatPrice(model.pricing.input_cache_read)}`);
22
- if (model.pricing.input_cache_write && model.pricing.input_cache_write !== "0") log.info(` Cache write: ${formatPrice(model.pricing.input_cache_write)}`);
23
- if (model.architecture?.modality) log.info(` Modality: ${model.architecture.modality}`);
24
- if (model.supported_parameters?.length) log.info(` Parameters: ${model.supported_parameters.join(", ")}`);
25
- }
26
- async function displayProviders(client, model) {
27
- const author = parseModelAuthor(model.id);
28
- const slug = parseModelSlug(model.id);
29
- const s = spinner();
30
- s.start("Checking providers...");
31
- try {
32
- const endpoints = await fetchModelEndpoints(client, author, slug);
33
- const unique = getUniqueProviders(endpoints);
34
- s.stop(`${unique.length} providers available`);
35
- for (const p of unique) {
36
- const ep = endpoints.find((e) => e.tag === p.tag);
37
- const latency = formatLatency(ep?.latency_last_30m?.p50 ?? null);
38
- const throughput = formatThroughput(ep?.throughput_last_30m?.p50 ?? null);
39
- log.info(` ${p.providerName} (${p.tag}) — ${latency} · ${throughput}`);
40
- }
41
- } catch {
42
- s.stop("Could not fetch providers");
43
- }
44
- }
45
- /** Run the interactive "Browse models" flow. */
46
- async function browseModelsCommand(client) {
47
- intro("Browse Models");
48
- const s = spinner();
49
- s.start("Loading models...");
50
- let models;
51
- try {
52
- models = await fetchModels(client);
53
- s.stop(`${models.length} models available`);
54
- } catch (error) {
55
- s.stop("Failed to load models");
56
- log.error(String(error));
57
- return;
58
- }
59
- const modelId = await autocomplete({
60
- message: "Search for a model",
61
- placeholder: "Type to search...",
62
- maxItems: 15,
63
- options() {
64
- const query = this.userInput.trim().toLowerCase();
65
- if (!query) return models.slice(0, 15).map(toOption);
66
- return models.filter((m) => `${m.id} ${m.name}`.toLowerCase().includes(query)).slice(0, 15).map(toOption);
67
- },
68
- filter: (_search, _option) => true
69
- });
70
- if (isCancel(modelId)) return;
71
- const model = models.find((m) => m.id === modelId);
72
- if (!model) return;
73
- displayModelDetails(model);
74
- await displayProviders(client, model);
75
- const configure = await confirm({ message: `Configure routing for ${model.id}?` });
76
- if (isCancel(configure) || !configure) {
77
- outro("Bye!");
78
- return;
79
- }
80
- await addOverrideCommand(client);
81
- }
82
- //#endregion
83
- export { browseModelsCommand };
84
-
85
- //# sourceMappingURL=browse.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"browse.mjs","names":["clack.spinner","clack.autocomplete","clack.confirm"],"sources":["../src/commands/config/browse.ts"],"sourcesContent":["import * as clack from '@clack/prompts';\nimport { isCancel } from '@clack/prompts';\nimport type { OpenRouterDataClient } from '../../openrouter/data-client.js';\nimport { fetchModelEndpoints, getUniqueProviders } from '../../openrouter/endpoints.js';\nimport {\n fetchModels,\n formatPrice,\n parseModelAuthor,\n parseModelSlug,\n} from '../../openrouter/models.js';\nimport type { OpenRouterModel } from '../../openrouter/types.js';\nimport { addOverrideCommand } from './add.js';\nimport {\n formatContextLength,\n formatLatency,\n formatModelHint,\n formatModelLabel,\n formatPricing,\n formatThroughput,\n} from './format.js';\n\nfunction toOption(m: OpenRouterModel) {\n return { value: m.id, label: formatModelLabel(m), hint: formatModelHint(m) };\n}\n\nfunction displayModelDetails(model: OpenRouterModel): void {\n clack.log.success(`${model.name || model.id}`);\n if (model.description) {\n const desc =\n model.description.length > 200\n ? `${model.description.slice(0, 200)}...`\n : model.description;\n clack.log.info(` ${desc}`);\n }\n clack.log.info(` Context: ${formatContextLength(model.context_length)} tokens`);\n if (model.top_provider?.max_completion_tokens) {\n clack.log.info(\n ` Max output: ${formatContextLength(model.top_provider.max_completion_tokens)} tokens`,\n );\n }\n clack.log.info(\n ` Pricing: ${formatPricing(model.pricing.prompt, model.pricing.completion)}`,\n );\n if (model.pricing.input_cache_read && model.pricing.input_cache_read !== '0') {\n clack.log.info(` Cache read: ${formatPrice(model.pricing.input_cache_read)}`);\n }\n if (model.pricing.input_cache_write && model.pricing.input_cache_write !== '0') {\n clack.log.info(` Cache write: ${formatPrice(model.pricing.input_cache_write)}`);\n }\n if (model.architecture?.modality) {\n clack.log.info(` Modality: ${model.architecture.modality}`);\n }\n if (model.supported_parameters?.length) {\n clack.log.info(` Parameters: ${model.supported_parameters.join(', ')}`);\n }\n}\n\nasync function displayProviders(\n client: OpenRouterDataClient,\n model: OpenRouterModel,\n): Promise<void> {\n const author = parseModelAuthor(model.id);\n const slug = parseModelSlug(model.id);\n const s = clack.spinner();\n s.start('Checking providers...');\n try {\n const endpoints = await fetchModelEndpoints(client, author, slug);\n const unique = getUniqueProviders(endpoints);\n s.stop(`${unique.length} providers available`);\n\n for (const p of unique) {\n const ep = endpoints.find(e => e.tag === p.tag);\n const latency = formatLatency(ep?.latency_last_30m?.p50 ?? null);\n const throughput = formatThroughput(ep?.throughput_last_30m?.p50 ?? null);\n clack.log.info(` ${p.providerName} (${p.tag}) — ${latency} · ${throughput}`);\n }\n } catch {\n s.stop('Could not fetch providers');\n }\n}\n\n/** Run the interactive \"Browse models\" flow. */\nexport async function browseModelsCommand(client: OpenRouterDataClient): Promise<void> {\n clack.intro('Browse Models');\n\n const s = clack.spinner();\n s.start('Loading models...');\n let models: OpenRouterModel[];\n try {\n models = await fetchModels(client);\n s.stop(`${models.length} models available`);\n } catch (error) {\n s.stop('Failed to load models');\n clack.log.error(String(error));\n return;\n }\n\n const modelId = await clack.autocomplete({\n message: 'Search for a model',\n placeholder: 'Type to search...',\n maxItems: 15,\n options(this: { userInput: string }) {\n const query = this.userInput.trim().toLowerCase();\n if (!query) return models.slice(0, 15).map(toOption);\n\n return models\n .filter(m => `${m.id} ${m.name}`.toLowerCase().includes(query))\n .slice(0, 15)\n .map(toOption);\n },\n filter: (_search: string, _option: { value: string }) => true,\n });\n\n if (isCancel(modelId)) return;\n\n const model = models.find(m => m.id === modelId);\n if (!model) return;\n\n displayModelDetails(model);\n await displayProviders(client, model);\n\n const configure = await clack.confirm({\n message: `Configure routing for ${model.id}?`,\n });\n\n if (isCancel(configure) || !configure) {\n clack.outro('Bye!');\n return;\n }\n\n await addOverrideCommand(client);\n}\n"],"mappings":"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"}
package/dist/config.mjs DELETED
@@ -1,46 +0,0 @@
1
- import { n as findConfigFile, t as logger } from "./cli.mjs";
2
- import { t as require_dist } from "./dist2.mjs";
3
- import { readFileSync, writeFileSync } from "node:fs";
4
- //#region src/commands/config/config.ts
5
- var import_dist = require_dist();
6
- function requireConfigPath() {
7
- const path = findConfigFile();
8
- if (!path) throw new Error("No config file found. Create proxitor.config.yaml first, or pass -c <path>.");
9
- return path;
10
- }
11
- function readConfigRaw(path) {
12
- return readFileSync(path, "utf-8");
13
- }
14
- function writeConfigRaw(path, content) {
15
- writeFileSync(path, content, "utf-8");
16
- }
17
- function setModelOverride(configPath, modelKey, override) {
18
- const doc = (0, import_dist.parseDocument)(readConfigRaw(configPath));
19
- let overrides = doc.get("modelOverrides");
20
- if (!overrides) {
21
- overrides = doc.createNode({});
22
- doc.set("modelOverrides", overrides);
23
- }
24
- overrides.set(modelKey, override);
25
- writeConfigRaw(configPath, doc.toString());
26
- logger.success(`Saved override for "${modelKey}"`);
27
- }
28
- function removeModelOverride(configPath, modelKey) {
29
- const doc = (0, import_dist.parseDocument)(readConfigRaw(configPath));
30
- const overrides = doc.get("modelOverrides");
31
- if (!overrides?.has(modelKey)) throw new Error(`No override found for "${modelKey}"`);
32
- overrides.delete(modelKey);
33
- if (overrides.items.length === 0) doc.delete("modelOverrides");
34
- writeConfigRaw(configPath, doc.toString());
35
- logger.success(`Removed override for "${modelKey}"`);
36
- }
37
- function getModelOverrides(configPath) {
38
- const overrides = (0, import_dist.parseDocument)(readConfigRaw(configPath)).get("modelOverrides");
39
- if (!overrides) return {};
40
- if (typeof overrides === "object" && overrides !== null && "toJSON" in overrides) return overrides.toJSON();
41
- return overrides;
42
- }
43
- //#endregion
44
- export { setModelOverride as i, removeModelOverride as n, requireConfigPath as r, getModelOverrides as t };
45
-
46
- //# sourceMappingURL=config.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.mjs","names":[],"sources":["../src/commands/config/config.ts"],"sourcesContent":["import { readFileSync, writeFileSync } from 'node:fs';\nimport type { YAMLMap } from 'yaml';\nimport { parseDocument } from 'yaml';\nimport { findConfigFile } from '../../config.js';\nimport type { ModelOverride } from '../../config-schema.js';\nimport { logger } from '../../logger.js';\n\nexport function requireConfigPath(): string {\n const path = findConfigFile();\n if (!path) {\n throw new Error(\n 'No config file found. Create proxitor.config.yaml first, or pass -c <path>.',\n );\n }\n return path;\n}\n\nexport function readConfigRaw(path: string): string {\n return readFileSync(path, 'utf-8');\n}\n\nexport function writeConfigRaw(path: string, content: string): void {\n writeFileSync(path, content, 'utf-8');\n}\n\nexport function setModelOverride(\n configPath: string,\n modelKey: string,\n override: ModelOverride,\n): void {\n const raw = readConfigRaw(configPath);\n const doc = parseDocument(raw);\n\n let overrides = doc.get('modelOverrides') as YAMLMap | undefined;\n if (!overrides) {\n overrides = doc.createNode({}) as YAMLMap;\n doc.set('modelOverrides', overrides);\n }\n\n overrides.set(modelKey, override);\n\n writeConfigRaw(configPath, doc.toString());\n logger.success(`Saved override for \"${modelKey}\"`);\n}\n\nexport function removeModelOverride(configPath: string, modelKey: string): void {\n const raw = readConfigRaw(configPath);\n const doc = parseDocument(raw);\n\n const overrides = doc.get('modelOverrides') as YAMLMap | undefined;\n if (!overrides?.has(modelKey)) {\n throw new Error(`No override found for \"${modelKey}\"`);\n }\n\n overrides.delete(modelKey);\n if (overrides.items.length === 0) {\n doc.delete('modelOverrides');\n }\n\n writeConfigRaw(configPath, doc.toString());\n logger.success(`Removed override for \"${modelKey}\"`);\n}\n\nexport function getModelOverrides(configPath: string): Record<string, ModelOverride> {\n const raw = readConfigRaw(configPath);\n const doc = parseDocument(raw);\n const overrides = doc.get('modelOverrides');\n if (!overrides) return {};\n if (typeof overrides === 'object' && overrides !== null && 'toJSON' in overrides) {\n return (overrides as { toJSON: () => unknown }).toJSON() as Record<\n string,\n ModelOverride\n >;\n }\n return overrides as unknown as Record<string, ModelOverride>;\n}\n"],"mappings":";;;;;AAOA,SAAgB,oBAA4B;CAC1C,MAAM,OAAO,eAAe;CAC5B,IAAI,CAAC,MACH,MAAM,IAAI,MACR,6EACF;CAEF,OAAO;AACT;AAEA,SAAgB,cAAc,MAAsB;CAClD,OAAO,aAAa,MAAM,OAAO;AACnC;AAEA,SAAgB,eAAe,MAAc,SAAuB;CAClE,cAAc,MAAM,SAAS,OAAO;AACtC;AAEA,SAAgB,iBACd,YACA,UACA,UACM;CAEN,MAAM,OAAA,GAAA,YAAA,cAAA,CADM,cAAc,UACE,CAAC;CAE7B,IAAI,YAAY,IAAI,IAAI,gBAAgB;CACxC,IAAI,CAAC,WAAW;EACd,YAAY,IAAI,WAAW,CAAC,CAAC;EAC7B,IAAI,IAAI,kBAAkB,SAAS;CACrC;CAEA,UAAU,IAAI,UAAU,QAAQ;CAEhC,eAAe,YAAY,IAAI,SAAS,CAAC;CACzC,OAAO,QAAQ,uBAAuB,SAAS,EAAE;AACnD;AAEA,SAAgB,oBAAoB,YAAoB,UAAwB;CAE9E,MAAM,OAAA,GAAA,YAAA,cAAA,CADM,cAAc,UACE,CAAC;CAE7B,MAAM,YAAY,IAAI,IAAI,gBAAgB;CAC1C,IAAI,CAAC,WAAW,IAAI,QAAQ,GAC1B,MAAM,IAAI,MAAM,0BAA0B,SAAS,EAAE;CAGvD,UAAU,OAAO,QAAQ;CACzB,IAAI,UAAU,MAAM,WAAW,GAC7B,IAAI,OAAO,gBAAgB;CAG7B,eAAe,YAAY,IAAI,SAAS,CAAC;CACzC,OAAO,QAAQ,yBAAyB,SAAS,EAAE;AACrD;AAEA,SAAgB,kBAAkB,YAAmD;CAGnF,MAAM,aAAA,GAAA,YAAA,cAAA,CAFM,cAAc,UACE,CACR,CAAC,CAAC,IAAI,gBAAgB;CAC1C,IAAI,CAAC,WAAW,OAAO,CAAC;CACxB,IAAI,OAAO,cAAc,YAAY,cAAc,QAAQ,YAAY,WACrE,OAAQ,UAAwC,OAAO;CAKzD,OAAO;AACT"}
package/dist/config2.mjs DELETED
@@ -1,73 +0,0 @@
1
- import { intro, isCancel, outro, select } from "./dist.mjs";
2
- import { addOverrideCommand } from "./add.mjs";
3
- import { browseModelsCommand } from "./browse.mjs";
4
- import { editOverrideCommand } from "./edit.mjs";
5
- import { listOverridesCommand } from "./list.mjs";
6
- import { removeOverrideCommand } from "./remove.mjs";
7
- import { validateConfigCommand } from "./validate.mjs";
8
- //#region src/commands/config.ts
9
- /** Run the interactive config manager menu. */
10
- async function runConfigMenu(client) {
11
- intro("Proxitor Config Manager");
12
- const action = await select({
13
- message: "What would you like to do?",
14
- options: [
15
- {
16
- value: "add",
17
- label: "➕ Add model override"
18
- },
19
- {
20
- value: "edit",
21
- label: "✏️ Edit model override"
22
- },
23
- {
24
- value: "remove",
25
- label: "🗑 Remove model override"
26
- },
27
- {
28
- value: "list",
29
- label: "📋 List current overrides"
30
- },
31
- {
32
- value: "browse",
33
- label: "🔍 Browse models"
34
- },
35
- {
36
- value: "validate",
37
- label: "✅ Validate config"
38
- },
39
- {
40
- value: "exit",
41
- label: "❌ Exit"
42
- }
43
- ]
44
- });
45
- if (isCancel(action) || action === "exit") {
46
- outro("Bye!");
47
- return;
48
- }
49
- switch (action) {
50
- case "add":
51
- await addOverrideCommand(client);
52
- break;
53
- case "edit":
54
- await editOverrideCommand(client);
55
- break;
56
- case "remove":
57
- await removeOverrideCommand();
58
- break;
59
- case "list":
60
- await listOverridesCommand();
61
- break;
62
- case "browse":
63
- await browseModelsCommand(client);
64
- break;
65
- case "validate":
66
- await validateConfigCommand();
67
- break;
68
- }
69
- }
70
- //#endregion
71
- export { runConfigMenu };
72
-
73
- //# sourceMappingURL=config2.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config2.mjs","names":["clack.select"],"sources":["../src/commands/config.ts"],"sourcesContent":["import * as clack from '@clack/prompts';\nimport { isCancel } from '@clack/prompts';\nimport type { OpenRouterDataClient } from '../openrouter/data-client.js';\nimport { addOverrideCommand } from './config/add.js';\nimport { browseModelsCommand } from './config/browse.js';\nimport { editOverrideCommand } from './config/edit.js';\nimport { listOverridesCommand } from './config/list.js';\nimport { removeOverrideCommand } from './config/remove.js';\nimport { validateConfigCommand } from './config/validate.js';\n\n/** Run the interactive config manager menu. */\nexport async function runConfigMenu(client: OpenRouterDataClient): Promise<void> {\n clack.intro('Proxitor Config Manager');\n\n const action = await clack.select({\n message: 'What would you like to do?',\n options: [\n { value: 'add', label: '➕ Add model override' },\n { value: 'edit', label: '✏️ Edit model override' },\n { value: 'remove', label: '🗑 Remove model override' },\n { value: 'list', label: '📋 List current overrides' },\n { value: 'browse', label: '🔍 Browse models' },\n { value: 'validate', label: '✅ Validate config' },\n { value: 'exit', label: '❌ Exit' },\n ],\n });\n\n if (isCancel(action) || action === 'exit') {\n clack.outro('Bye!');\n return;\n }\n\n switch (action) {\n case 'add':\n await addOverrideCommand(client);\n break;\n case 'edit':\n await editOverrideCommand(client);\n break;\n case 'remove':\n await removeOverrideCommand();\n break;\n case 'list':\n await listOverridesCommand();\n break;\n case 'browse':\n await browseModelsCommand(client);\n break;\n case 'validate':\n await validateConfigCommand();\n break;\n }\n}\n"],"mappings":";;;;;;;;;AAWA,eAAsB,cAAc,QAA6C;CAC/E,MAAY,yBAAyB;CAErC,MAAM,SAAS,MAAMA,OAAa;EAChC,SAAS;EACT,SAAS;GACP;IAAE,OAAO;IAAO,OAAO;GAAwB;GAC/C;IAAE,OAAO;IAAQ,OAAO;GAA2B;GACnD;IAAE,OAAO;IAAU,OAAO;GAA6B;GACvD;IAAE,OAAO;IAAQ,OAAO;GAA6B;GACrD;IAAE,OAAO;IAAU,OAAO;GAAoB;GAC9C;IAAE,OAAO;IAAY,OAAO;GAAqB;GACjD;IAAE,OAAO;IAAQ,OAAO;GAAU;EACpC;CACF,CAAC;CAED,IAAI,SAAS,MAAM,KAAK,WAAW,QAAQ;EACzC,MAAY,MAAM;EAClB;CACF;CAEA,QAAQ,QAAR;EACE,KAAK;GACH,MAAM,mBAAmB,MAAM;GAC/B;EACF,KAAK;GACH,MAAM,oBAAoB,MAAM;GAChC;EACF,KAAK;GACH,MAAM,sBAAsB;GAC5B;EACF,KAAK;GACH,MAAM,qBAAqB;GAC3B;EACF,KAAK;GACH,MAAM,oBAAoB,MAAM;GAChC;EACF,KAAK;GACH,MAAM,sBAAsB;GAC5B;CACJ;AACF"}