modelinfo 0.1.0

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.
Files changed (102) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +125 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +130 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/caps.d.ts +5 -0
  7. package/dist/commands/caps.js +37 -0
  8. package/dist/commands/caps.js.map +1 -0
  9. package/dist/commands/cost.d.ts +5 -0
  10. package/dist/commands/cost.js +37 -0
  11. package/dist/commands/cost.js.map +1 -0
  12. package/dist/commands/diff.d.ts +6 -0
  13. package/dist/commands/diff.js +62 -0
  14. package/dist/commands/diff.js.map +1 -0
  15. package/dist/commands/doctor.d.ts +4 -0
  16. package/dist/commands/doctor.js +38 -0
  17. package/dist/commands/doctor.js.map +1 -0
  18. package/dist/commands/limit.d.ts +5 -0
  19. package/dist/commands/limit.js +37 -0
  20. package/dist/commands/limit.js.map +1 -0
  21. package/dist/commands/list.d.ts +4 -0
  22. package/dist/commands/list.js +46 -0
  23. package/dist/commands/list.js.map +1 -0
  24. package/dist/commands/providers.d.ts +4 -0
  25. package/dist/commands/providers.js +20 -0
  26. package/dist/commands/providers.js.map +1 -0
  27. package/dist/commands/search.d.ts +6 -0
  28. package/dist/commands/search.js +24 -0
  29. package/dist/commands/search.js.map +1 -0
  30. package/dist/commands/shared.d.ts +15 -0
  31. package/dist/commands/shared.js +40 -0
  32. package/dist/commands/shared.js.map +1 -0
  33. package/dist/commands/show.d.ts +5 -0
  34. package/dist/commands/show.js +35 -0
  35. package/dist/commands/show.js.map +1 -0
  36. package/dist/commands/update.d.ts +4 -0
  37. package/dist/commands/update.js +22 -0
  38. package/dist/commands/update.js.map +1 -0
  39. package/dist/core/config.d.ts +21 -0
  40. package/dist/core/config.js +29 -0
  41. package/dist/core/config.js.map +1 -0
  42. package/dist/core/errors.d.ts +8 -0
  43. package/dist/core/errors.js +18 -0
  44. package/dist/core/errors.js.map +1 -0
  45. package/dist/core/logger.d.ts +3 -0
  46. package/dist/core/logger.js +10 -0
  47. package/dist/core/logger.js.map +1 -0
  48. package/dist/data/cache.d.ts +9 -0
  49. package/dist/data/cache.js +66 -0
  50. package/dist/data/cache.js.map +1 -0
  51. package/dist/data/index.d.ts +13 -0
  52. package/dist/data/index.js +275 -0
  53. package/dist/data/index.js.map +1 -0
  54. package/dist/data/normalize.d.ts +2 -0
  55. package/dist/data/normalize.js +157 -0
  56. package/dist/data/normalize.js.map +1 -0
  57. package/dist/data/remote.d.ts +11 -0
  58. package/dist/data/remote.js +160 -0
  59. package/dist/data/remote.js.map +1 -0
  60. package/dist/data/schema.d.ts +12 -0
  61. package/dist/data/schema.js +44 -0
  62. package/dist/data/schema.js.map +1 -0
  63. package/dist/data/types.d.ts +142 -0
  64. package/dist/data/types.js +2 -0
  65. package/dist/data/types.js.map +1 -0
  66. package/dist/data/version.d.ts +5 -0
  67. package/dist/data/version.js +28 -0
  68. package/dist/data/version.js.map +1 -0
  69. package/dist/format/detail.d.ts +11 -0
  70. package/dist/format/detail.js +139 -0
  71. package/dist/format/detail.js.map +1 -0
  72. package/dist/format/json.d.ts +258 -0
  73. package/dist/format/json.js +174 -0
  74. package/dist/format/json.js.map +1 -0
  75. package/dist/format/table.d.ts +7 -0
  76. package/dist/format/table.js +120 -0
  77. package/dist/format/table.js.map +1 -0
  78. package/dist/format/value.d.ts +8 -0
  79. package/dist/format/value.js +47 -0
  80. package/dist/format/value.js.map +1 -0
  81. package/dist/search/fuzzy.d.ts +3 -0
  82. package/dist/search/fuzzy.js +20 -0
  83. package/dist/search/fuzzy.js.map +1 -0
  84. package/dist/search/rank.d.ts +5 -0
  85. package/dist/search/rank.js +47 -0
  86. package/dist/search/rank.js.map +1 -0
  87. package/dist/utils/fs.d.ts +5 -0
  88. package/dist/utils/fs.js +31 -0
  89. package/dist/utils/fs.js.map +1 -0
  90. package/dist/utils/numbers.d.ts +3 -0
  91. package/dist/utils/numbers.js +40 -0
  92. package/dist/utils/numbers.js.map +1 -0
  93. package/dist/utils/strings.d.ts +6 -0
  94. package/dist/utils/strings.js +34 -0
  95. package/dist/utils/strings.js.map +1 -0
  96. package/dist/utils/time.d.ts +3 -0
  97. package/dist/utils/time.js +36 -0
  98. package/dist/utils/time.js.map +1 -0
  99. package/package.json +76 -0
  100. package/seed/all.json +166975 -0
  101. package/seed/index.json +576348 -0
  102. package/seed/version.json +8 -0
@@ -0,0 +1,20 @@
1
+ import { ensureRuntimeIndex } from "../data/remote.js";
2
+ import { providerSummaryToJson, writeJson } from "../format/json.js";
3
+ import { renderProvidersTable } from "../format/table.js";
4
+ export async function runProvidersCommand(options) {
5
+ const { index } = await ensureRuntimeIndex();
6
+ const providers = [...index.providers].sort((left, right) => {
7
+ const leftLabel = left.display_name ?? left.name ?? left.id;
8
+ const rightLabel = right.display_name ?? right.name ?? right.id;
9
+ return leftLabel.localeCompare(rightLabel);
10
+ });
11
+ if (options?.output === "json") {
12
+ writeJson({
13
+ count: providers.length,
14
+ providers: providers.map(providerSummaryToJson),
15
+ });
16
+ return;
17
+ }
18
+ process.stdout.write(`${renderProvidersTable(providers)}\n`);
19
+ }
20
+ //# sourceMappingURL=providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/commands/providers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAqB,MAAM,mBAAmB,CAAC;AACxF,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAAmC;IAC3E,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAC7C,MAAM,SAAS,GAAG,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;QAC5D,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;QAEhE,OAAO,SAAS,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,IAAI,OAAO,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;QAC/B,SAAS,CAAC;YACR,KAAK,EAAE,SAAS,CAAC,MAAM;YACvB,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,qBAAqB,CAAC;SAChD,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,oBAAoB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { type OutputFormat } from "../format/json.js";
2
+ export declare function runSearchCommand(keyword: string, options?: {
3
+ provider?: string;
4
+ limit?: number;
5
+ output?: OutputFormat;
6
+ }): Promise<void>;
@@ -0,0 +1,24 @@
1
+ import { searchModels } from "../data/index.js";
2
+ import { ensureRuntimeIndex } from "../data/remote.js";
3
+ import { modelMatchToJson, writeJson } from "../format/json.js";
4
+ import { renderModelMatchesTable } from "../format/table.js";
5
+ export async function runSearchCommand(keyword, options) {
6
+ const { index } = await ensureRuntimeIndex();
7
+ const matches = searchModels(index, keyword, { provider: options?.provider });
8
+ const limited = options?.limit ? matches.slice(0, options.limit) : matches;
9
+ if (options?.output === "json") {
10
+ writeJson({
11
+ query: keyword,
12
+ provider: options?.provider,
13
+ count: limited.length,
14
+ results: limited.map(modelMatchToJson),
15
+ });
16
+ return;
17
+ }
18
+ if (limited.length === 0) {
19
+ process.stdout.write("No models found.\n");
20
+ return;
21
+ }
22
+ process.stdout.write(`${renderModelMatchesTable(limited)}\n`);
23
+ }
24
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAqB,MAAM,mBAAmB,CAAC;AACnF,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAe,EACf,OAAsE;IAEtE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAC7C,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC9E,MAAM,OAAO,GAAG,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAE3E,IAAI,OAAO,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;QAC/B,SAAS,CAAC;YACR,KAAK,EAAE,OAAO;YACd,QAAQ,EAAE,OAAO,EAAE,QAAQ;YAC3B,KAAK,EAAE,OAAO,CAAC,MAAM;YACrB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;SACvC,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC3C,OAAO;IACT,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,uBAAuB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAChE,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { IndexDocument, IndexedModel, IndexedProvider, RankedModelMatch, RankedProviderMatch } from "../data/types.js";
2
+ export interface ModelResolution {
3
+ index: IndexDocument;
4
+ matches: RankedModelMatch[];
5
+ single?: RankedModelMatch;
6
+ }
7
+ export interface ProviderResolution {
8
+ index: IndexDocument;
9
+ matches: RankedProviderMatch[];
10
+ single?: RankedProviderMatch;
11
+ }
12
+ export declare function resolveModelQuery(query: string, provider?: string): Promise<ModelResolution>;
13
+ export declare function resolveProviderQuery(query: string): Promise<ProviderResolution>;
14
+ export declare function requireSingleModel(resolution: ModelResolution): IndexedModel | undefined;
15
+ export declare function requireSingleProvider(resolution: ProviderResolution): IndexedProvider | undefined;
@@ -0,0 +1,40 @@
1
+ import { resolveModelCandidates, resolveProviderCandidates, pickStrongModelMatch, } from "../data/index.js";
2
+ import { ensureRuntimeIndex } from "../data/remote.js";
3
+ function pickStrongProviderMatch(matches) {
4
+ if (matches.length === 0) {
5
+ return undefined;
6
+ }
7
+ if (matches.length === 1) {
8
+ return matches[0];
9
+ }
10
+ const [first, second] = matches;
11
+ if (first && second && first.reason === "exact-name" && second.reason !== "exact-name") {
12
+ return first;
13
+ }
14
+ return undefined;
15
+ }
16
+ export async function resolveModelQuery(query, provider) {
17
+ const { index } = await ensureRuntimeIndex();
18
+ const matches = resolveModelCandidates(index, query, { provider });
19
+ return {
20
+ index,
21
+ matches,
22
+ single: pickStrongModelMatch(matches),
23
+ };
24
+ }
25
+ export async function resolveProviderQuery(query) {
26
+ const { index } = await ensureRuntimeIndex();
27
+ const matches = resolveProviderCandidates(index, query);
28
+ return {
29
+ index,
30
+ matches,
31
+ single: pickStrongProviderMatch(matches),
32
+ };
33
+ }
34
+ export function requireSingleModel(resolution) {
35
+ return resolution.single?.model;
36
+ }
37
+ export function requireSingleProvider(resolution) {
38
+ return resolution.single?.provider;
39
+ }
40
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/commands/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAqBvD,SAAS,uBAAuB,CAAC,OAA8B;IAC7D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;IAChC,IAAI,KAAK,IAAI,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,YAAY,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;QACvF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAAa,EACb,QAAiB;IAEjB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAC7C,MAAM,OAAO,GAAG,sBAAsB,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IAEnE,OAAO;QACL,KAAK;QACL,OAAO;QACP,MAAM,EAAE,oBAAoB,CAAC,OAAO,CAAC;KACtC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,KAAa;IACtD,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAC7C,MAAM,OAAO,GAAG,yBAAyB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAExD,OAAO;QACL,KAAK;QACL,OAAO;QACP,MAAM,EAAE,uBAAuB,CAAC,OAAO,CAAC;KACzC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,UAA2B;IAC5D,OAAO,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,UAA8B;IAClE,OAAO,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC;AACrC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { type OutputFormat } from "../format/json.js";
2
+ export declare function runShowCommand(modelQuery: string, options?: {
3
+ provider?: string;
4
+ output?: OutputFormat;
5
+ }): Promise<void>;
@@ -0,0 +1,35 @@
1
+ import { ModelinfoError } from "../core/errors.js";
2
+ import { writeJson, modelMatchToJson, modelToJson } from "../format/json.js";
3
+ import { renderModelDetail } from "../format/detail.js";
4
+ import { renderModelMatchesTable } from "../format/table.js";
5
+ import { resolveModelQuery, requireSingleModel } from "./shared.js";
6
+ export async function runShowCommand(modelQuery, options) {
7
+ const resolution = await resolveModelQuery(modelQuery, options?.provider);
8
+ const model = requireSingleModel(resolution);
9
+ if (model) {
10
+ if (options?.output === "json") {
11
+ writeJson(modelToJson(model));
12
+ return;
13
+ }
14
+ process.stdout.write(`${renderModelDetail(model)}\n`);
15
+ return;
16
+ }
17
+ if (resolution.matches.length === 0) {
18
+ if (options?.output === "json") {
19
+ writeJson({ error: "MODEL_NOT_FOUND", query: modelQuery });
20
+ process.exitCode = 1;
21
+ return;
22
+ }
23
+ throw new ModelinfoError(`No model matched "${modelQuery}".`, "MODEL_NOT_FOUND");
24
+ }
25
+ if (options?.output === "json") {
26
+ writeJson({
27
+ query: modelQuery,
28
+ count: resolution.matches.length,
29
+ results: resolution.matches.map(modelMatchToJson),
30
+ });
31
+ return;
32
+ }
33
+ process.stdout.write(`${renderModelMatchesTable(resolution.matches, { includeReason: true })}\n`);
34
+ }
35
+ //# sourceMappingURL=show.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show.js","sourceRoot":"","sources":["../../src/commands/show.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,WAAW,EAAqB,MAAM,mBAAmB,CAAC;AAChG,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEpE,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,UAAkB,EAClB,OAAsD;IAEtD,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC1E,MAAM,KAAK,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAE7C,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,OAAO,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;YAC/B,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;YAC9B,OAAO;QACT,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtD,OAAO;IACT,CAAC;IAED,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,IAAI,OAAO,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;YAC/B,SAAS,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;YAC3D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,IAAI,cAAc,CAAC,qBAAqB,UAAU,IAAI,EAAE,iBAAiB,CAAC,CAAC;IACnF,CAAC;IAED,IAAI,OAAO,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;QAC/B,SAAS,CAAC;YACR,KAAK,EAAE,UAAU;YACjB,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,MAAM;YAChC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;SAClD,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,uBAAuB,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC;AACpG,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type OutputFormat } from "../format/json.js";
2
+ export declare function runUpdateCommand(options?: {
3
+ output?: OutputFormat;
4
+ }): Promise<void>;
@@ -0,0 +1,22 @@
1
+ import { getCachePaths } from "../core/config.js";
2
+ import { syncCacheFromRemote } from "../data/remote.js";
3
+ import { updateToJson, writeJson } from "../format/json.js";
4
+ import { formatTimestamp } from "../utils/time.js";
5
+ export async function runUpdateCommand(options) {
6
+ const result = await syncCacheFromRemote(getCachePaths());
7
+ if (options?.output === "json") {
8
+ writeJson(updateToJson(result));
9
+ return;
10
+ }
11
+ const lines = [
12
+ "Update Summary",
13
+ ` Updated : ${result.updated ? "yes" : "no"}`,
14
+ ` Old Version : ${formatTimestamp(result.old_version)}`,
15
+ ` New Version : ${formatTimestamp(result.new_version)}`,
16
+ ` Providers : ${result.provider_count}`,
17
+ ` Models : ${result.model_count}`,
18
+ ` Cache Origin : ${result.cache_origin}`,
19
+ ];
20
+ process.stdout.write(`${lines.join("\n")}\n`);
21
+ }
22
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAqB,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAmC;IACxE,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1D,IAAI,OAAO,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;QAC/B,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;QAChC,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG;QACZ,gBAAgB;QAChB,qBAAqB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;QACpD,qBAAqB,eAAe,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE;QAC1D,qBAAqB,eAAe,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE;QAC1D,qBAAqB,MAAM,CAAC,cAAc,EAAE;QAC5C,qBAAqB,MAAM,CAAC,WAAW,EAAE;QACzC,qBAAqB,MAAM,CAAC,YAAY,EAAE;KAC3C,CAAC;IAEF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,21 @@
1
+ export declare const APP_NAME = "modelinfo";
2
+ export declare const APP_VERSION = "0.1.0";
3
+ export declare const INDEX_SCHEMA_VERSION = 1;
4
+ export declare const VERSION_CHECK_INTERVAL_MS: number;
5
+ export declare const REMOTE_VERSION_URL = "https://raw.githubusercontent.com/ThinkInAIXYZ/PublicProviderConf/refs/heads/dev/dist/dc_sync_version.json";
6
+ export declare const REMOTE_DATASET_URL = "https://raw.githubusercontent.com/ThinkInAIXYZ/PublicProviderConf/refs/heads/dev/dist/all.json";
7
+ export declare const PACKAGE_ROOT: string;
8
+ export declare const SEED_DIR: string;
9
+ export interface CachePaths {
10
+ dir: string;
11
+ raw: string;
12
+ version: string;
13
+ index: string;
14
+ }
15
+ export declare function getCachePaths(cacheDir?: string): CachePaths;
16
+ export declare function getSeedPaths(): {
17
+ dir: string;
18
+ raw: string;
19
+ version: string;
20
+ index: string;
21
+ };
@@ -0,0 +1,29 @@
1
+ import { homedir } from "node:os";
2
+ import { dirname, resolve } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ export const APP_NAME = "modelinfo";
5
+ export const APP_VERSION = "0.1.0";
6
+ export const INDEX_SCHEMA_VERSION = 1;
7
+ export const VERSION_CHECK_INTERVAL_MS = 6 * 60 * 60 * 1000;
8
+ export const REMOTE_VERSION_URL = "https://raw.githubusercontent.com/ThinkInAIXYZ/PublicProviderConf/refs/heads/dev/dist/dc_sync_version.json";
9
+ export const REMOTE_DATASET_URL = "https://raw.githubusercontent.com/ThinkInAIXYZ/PublicProviderConf/refs/heads/dev/dist/all.json";
10
+ const MODULE_DIR = dirname(fileURLToPath(import.meta.url));
11
+ export const PACKAGE_ROOT = resolve(MODULE_DIR, "../..");
12
+ export const SEED_DIR = resolve(PACKAGE_ROOT, "seed");
13
+ export function getCachePaths(cacheDir = resolve(homedir(), ".modelinfo")) {
14
+ return {
15
+ dir: cacheDir,
16
+ raw: resolve(cacheDir, "all.json"),
17
+ version: resolve(cacheDir, "version.json"),
18
+ index: resolve(cacheDir, "index.json"),
19
+ };
20
+ }
21
+ export function getSeedPaths() {
22
+ return {
23
+ dir: SEED_DIR,
24
+ raw: resolve(SEED_DIR, "all.json"),
25
+ version: resolve(SEED_DIR, "version.json"),
26
+ index: resolve(SEED_DIR, "index.json"),
27
+ };
28
+ }
29
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,CAAC,MAAM,QAAQ,GAAG,WAAW,CAAC;AACpC,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC;AACnC,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AACtC,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAC5D,MAAM,CAAC,MAAM,kBAAkB,GAC7B,4GAA4G,CAAC;AAC/G,MAAM,CAAC,MAAM,kBAAkB,GAC7B,gGAAgG,CAAC;AAEnG,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3D,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AACzD,MAAM,CAAC,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;AAStD,MAAM,UAAU,aAAa,CAAC,QAAQ,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC;IACvE,OAAO;QACL,GAAG,EAAE,QAAQ;QACb,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC;QAClC,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,cAAc,CAAC;QAC1C,KAAK,EAAE,OAAO,CAAC,QAAQ,EAAE,YAAY,CAAC;KACvC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO;QACL,GAAG,EAAE,QAAQ;QACb,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC;QAClC,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,cAAc,CAAC;QAC1C,KAAK,EAAE,OAAO,CAAC,QAAQ,EAAE,YAAY,CAAC;KACvC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare class ModelinfoError extends Error {
2
+ readonly code: string;
3
+ constructor(message: string, code?: string, options?: {
4
+ cause?: unknown;
5
+ });
6
+ }
7
+ export declare function isErrorWithMessage(value: unknown): value is Error;
8
+ export declare function toErrorMessage(value: unknown): string;
@@ -0,0 +1,18 @@
1
+ export class ModelinfoError extends Error {
2
+ code;
3
+ constructor(message, code = "MODELINFO_ERROR", options) {
4
+ super(message, options);
5
+ this.name = "ModelinfoError";
6
+ this.code = code;
7
+ }
8
+ }
9
+ export function isErrorWithMessage(value) {
10
+ return value instanceof Error;
11
+ }
12
+ export function toErrorMessage(value) {
13
+ if (isErrorWithMessage(value)) {
14
+ return value.message;
15
+ }
16
+ return String(value);
17
+ }
18
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,cAAe,SAAQ,KAAK;IACvB,IAAI,CAAS;IAE7B,YAAmB,OAAe,EAAE,IAAI,GAAG,iBAAiB,EAAE,OAA6B;QACzF,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,OAAO,KAAK,YAAY,KAAK,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function logInfo(message: string): void;
2
+ export declare function logWarn(message: string): void;
3
+ export declare function logError(message: string): void;
@@ -0,0 +1,10 @@
1
+ export function logInfo(message) {
2
+ process.stderr.write(`${message}\n`);
3
+ }
4
+ export function logWarn(message) {
5
+ process.stderr.write(`warning: ${message}\n`);
6
+ }
7
+ export function logError(message) {
8
+ process.stderr.write(`error: ${message}\n`);
9
+ }
10
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,OAAO,IAAI,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,OAAO,IAAI,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { CachePaths } from "../core/config.js";
2
+ import type { CacheVersionState, IndexDocument, RawDataset } from "./types.js";
3
+ export declare function ensureSeededCache(cachePaths?: CachePaths): Promise<boolean>;
4
+ export declare function readVersionState(cachePaths?: CachePaths): Promise<CacheVersionState | undefined>;
5
+ export declare function writeVersionState(value: CacheVersionState, cachePaths?: CachePaths): Promise<void>;
6
+ export declare function readIndexDocument(cachePaths?: CachePaths): Promise<IndexDocument | undefined>;
7
+ export declare function writeIndexDocument(value: IndexDocument, cachePaths?: CachePaths): Promise<void>;
8
+ export declare function readRawDataset(cachePaths?: CachePaths): Promise<RawDataset | undefined>;
9
+ export declare function writeRawDataset(value: RawDataset, cachePaths?: CachePaths): Promise<void>;
@@ -0,0 +1,66 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { getCachePaths, getSeedPaths } from "../core/config.js";
3
+ import { parseDataset, parseIndexDocument } from "./schema.js";
4
+ import { copyFileSafe, ensureDir, fileExists, readJsonFile, writeJsonAtomic } from "../utils/fs.js";
5
+ import { createVersionState } from "./version.js";
6
+ export async function ensureSeededCache(cachePaths = getCachePaths()) {
7
+ const seedPaths = getSeedPaths();
8
+ await ensureDir(cachePaths.dir);
9
+ const canSeed = (await fileExists(seedPaths.index)) &&
10
+ (await fileExists(seedPaths.version)) &&
11
+ (await fileExists(seedPaths.raw));
12
+ if (!canSeed) {
13
+ return false;
14
+ }
15
+ let copied = false;
16
+ if (!(await fileExists(cachePaths.index))) {
17
+ await copyFileSafe(seedPaths.index, cachePaths.index);
18
+ copied = true;
19
+ }
20
+ if (!(await fileExists(cachePaths.version))) {
21
+ await copyFileSafe(seedPaths.version, cachePaths.version);
22
+ copied = true;
23
+ }
24
+ if (!(await fileExists(cachePaths.raw))) {
25
+ await copyFileSafe(seedPaths.raw, cachePaths.raw);
26
+ copied = true;
27
+ }
28
+ return copied;
29
+ }
30
+ export async function readVersionState(cachePaths = getCachePaths()) {
31
+ if (!(await fileExists(cachePaths.version))) {
32
+ return undefined;
33
+ }
34
+ const value = await readJsonFile(cachePaths.version);
35
+ return createVersionState({
36
+ cache_origin: value.cache_origin ?? "bundled",
37
+ local_updated_at: value.local_updated_at,
38
+ last_checked_remote_updated_at: value.last_checked_remote_updated_at,
39
+ last_checked_at: value.last_checked_at,
40
+ index_built_at: value.index_built_at,
41
+ });
42
+ }
43
+ export async function writeVersionState(value, cachePaths = getCachePaths()) {
44
+ await writeJsonAtomic(cachePaths.version, value);
45
+ }
46
+ export async function readIndexDocument(cachePaths = getCachePaths()) {
47
+ if (!(await fileExists(cachePaths.index))) {
48
+ return undefined;
49
+ }
50
+ const value = await readJsonFile(cachePaths.index);
51
+ return parseIndexDocument(value);
52
+ }
53
+ export async function writeIndexDocument(value, cachePaths = getCachePaths()) {
54
+ await writeJsonAtomic(cachePaths.index, value);
55
+ }
56
+ export async function readRawDataset(cachePaths = getCachePaths()) {
57
+ if (!(await fileExists(cachePaths.raw))) {
58
+ return undefined;
59
+ }
60
+ const content = await readFile(cachePaths.raw, "utf8");
61
+ return parseDataset(JSON.parse(content));
62
+ }
63
+ export async function writeRawDataset(value, cachePaths = getCachePaths()) {
64
+ await writeJsonAtomic(cachePaths.raw, value);
65
+ }
66
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/data/cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { IndexDocument, IndexedModel, NormalizeResult, RankedModelMatch, RankedProviderMatch } from "./types.js";
2
+ export declare function buildIndexDocument(normalized: NormalizeResult, generatedAt?: number): IndexDocument;
3
+ export declare function searchProviders(indexDocument: IndexDocument, keyword: string): RankedProviderMatch[];
4
+ export declare function searchModels(indexDocument: IndexDocument, keyword: string, options?: {
5
+ provider?: string;
6
+ }): RankedModelMatch[];
7
+ export declare function resolveModelCandidates(indexDocument: IndexDocument, keyword: string, options?: {
8
+ provider?: string;
9
+ }): RankedModelMatch[];
10
+ export declare function pickStrongModelMatch(matches: RankedModelMatch[]): RankedModelMatch | undefined;
11
+ export declare function resolveProviderCandidates(indexDocument: IndexDocument, keyword: string): RankedProviderMatch[];
12
+ export declare function getModelsForProvider(indexDocument: IndexDocument, providerId: string): IndexedModel[];
13
+ export declare function collectKnownExtraFields(model: IndexedModel): Array<[label: string, value: string]>;