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,44 @@
1
+ import { z } from "zod";
2
+ import { INDEX_SCHEMA_VERSION } from "../core/config.js";
3
+ const timestampSchema = z.union([z.number(), z.string(), z.date()]);
4
+ const datasetEnvelopeSchema = z
5
+ .object({
6
+ providers: z.union([z.array(z.unknown()), z.record(z.unknown())]),
7
+ updated_at: timestampSchema.optional(),
8
+ })
9
+ .passthrough();
10
+ export const versionFileSchema = z
11
+ .object({
12
+ updated_at: timestampSchema,
13
+ })
14
+ .passthrough();
15
+ export function parseVersionFile(value) {
16
+ return versionFileSchema.parse(value);
17
+ }
18
+ export function parseDataset(value) {
19
+ if (Array.isArray(value)) {
20
+ return value;
21
+ }
22
+ return datasetEnvelopeSchema.parse(value);
23
+ }
24
+ export function parseIndexDocument(value) {
25
+ const schema = z.object({
26
+ schema_version: z.literal(INDEX_SCHEMA_VERSION),
27
+ generated_at: z.number(),
28
+ provider_count: z.number(),
29
+ model_count: z.number(),
30
+ providers: z.array(z.unknown()),
31
+ models: z.array(z.unknown()),
32
+ lookup: z.object({
33
+ by_model_id: z.record(z.array(z.number())),
34
+ by_display_name: z.record(z.array(z.number())),
35
+ by_name: z.record(z.array(z.number())),
36
+ by_provider_id: z.record(z.array(z.number())),
37
+ by_provider_name: z.record(z.array(z.number())),
38
+ by_provider_display_name: z.record(z.array(z.number())),
39
+ }),
40
+ source_updated_at: z.number().optional(),
41
+ });
42
+ return schema.parse(value);
43
+ }
44
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/data/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEzD,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAEpE,MAAM,qBAAqB,GAAG,CAAC;KAC5B,MAAM,CAAC;IACN,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACjE,UAAU,EAAE,eAAe,CAAC,QAAQ,EAAE;CACvC,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC;KAC/B,MAAM,CAAC;IACN,UAAU,EAAE,eAAe;CAC5B,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAmB,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAmB,CAAC;IAC7B,CAAC;IAED,OAAO,qBAAqB,CAAC,KAAK,CAAC,KAAK,CAAe,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;QACtB,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC;QAC/C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;QACxB,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE;QAC1B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;QACvB,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QAC/B,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QAC5B,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACf,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YAC1C,eAAe,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YAC9C,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YACtC,cAAc,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YAC7C,gBAAgB,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YAC/C,wBAAwB,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;SACxD,CAAC;QACF,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KACzC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAkB,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,142 @@
1
+ export type UnknownRecord = Record<string, unknown>;
2
+ export interface RawVersionFile extends UnknownRecord {
3
+ updated_at: unknown;
4
+ }
5
+ export interface RawModel extends UnknownRecord {
6
+ id?: unknown;
7
+ name?: unknown;
8
+ display_name?: unknown;
9
+ type?: unknown;
10
+ attachment?: unknown;
11
+ reasoning?: unknown;
12
+ tool_call?: unknown;
13
+ temperature?: unknown;
14
+ vision?: unknown;
15
+ open_weights?: unknown;
16
+ knowledge?: unknown;
17
+ release_date?: unknown;
18
+ last_updated?: unknown;
19
+ modalities?: unknown;
20
+ cost?: unknown;
21
+ limit?: unknown;
22
+ metadata?: unknown;
23
+ features?: unknown;
24
+ typeHints?: unknown;
25
+ }
26
+ export interface RawProvider extends UnknownRecord {
27
+ id?: unknown;
28
+ api?: unknown;
29
+ name?: unknown;
30
+ doc?: unknown;
31
+ display_name?: unknown;
32
+ models?: unknown;
33
+ metadata?: unknown;
34
+ updated_at?: unknown;
35
+ }
36
+ export interface RawDatasetEnvelope extends UnknownRecord {
37
+ providers: RawProvider[] | Record<string, RawProvider>;
38
+ updated_at?: unknown;
39
+ }
40
+ export type RawDataset = RawProvider[] | RawDatasetEnvelope;
41
+ export interface NormalizedProvider {
42
+ id: string;
43
+ name?: string;
44
+ display_name?: string;
45
+ api?: string;
46
+ doc?: string;
47
+ metadata?: UnknownRecord;
48
+ model_count: number;
49
+ raw: RawProvider;
50
+ }
51
+ export interface NormalizedModel {
52
+ provider_id: string;
53
+ provider_name?: string;
54
+ provider_display_name?: string;
55
+ provider_api?: string;
56
+ provider_doc?: string;
57
+ model_id: string;
58
+ model_name?: string;
59
+ model_display_name?: string;
60
+ type?: string;
61
+ attachment?: boolean;
62
+ reasoning_supported?: boolean;
63
+ reasoning_default?: boolean;
64
+ tool_call?: boolean;
65
+ temperature?: boolean;
66
+ vision?: boolean;
67
+ open_weights?: boolean;
68
+ knowledge?: string;
69
+ release_date?: string;
70
+ last_updated?: string;
71
+ input_modalities: string[];
72
+ output_modalities: string[];
73
+ cost_input?: number;
74
+ cost_output?: number;
75
+ cost_cache_read?: number;
76
+ context_limit?: number;
77
+ output_limit?: number;
78
+ metadata_description?: string;
79
+ metadata_features: string[];
80
+ metadata_type_hints: string[];
81
+ raw: RawModel;
82
+ }
83
+ export interface IndexedProvider extends NormalizedProvider {
84
+ search_text: string;
85
+ search_tokens: string[];
86
+ }
87
+ export interface IndexedModel extends NormalizedModel {
88
+ search_text: string;
89
+ search_tokens: string[];
90
+ }
91
+ export interface IndexLookup {
92
+ by_model_id: Record<string, number[]>;
93
+ by_display_name: Record<string, number[]>;
94
+ by_name: Record<string, number[]>;
95
+ by_provider_id: Record<string, number[]>;
96
+ by_provider_name: Record<string, number[]>;
97
+ by_provider_display_name: Record<string, number[]>;
98
+ }
99
+ export interface IndexDocument {
100
+ schema_version: number;
101
+ source_updated_at?: number;
102
+ generated_at: number;
103
+ provider_count: number;
104
+ model_count: number;
105
+ providers: IndexedProvider[];
106
+ models: IndexedModel[];
107
+ lookup: IndexLookup;
108
+ }
109
+ export interface CacheVersionState {
110
+ schema_version: number;
111
+ local_updated_at?: number;
112
+ last_checked_remote_updated_at?: number;
113
+ last_checked_at?: number;
114
+ index_built_at?: number;
115
+ cache_origin: "bundled" | "remote";
116
+ }
117
+ export interface NormalizeResult {
118
+ providers: NormalizedProvider[];
119
+ models: NormalizedModel[];
120
+ source_updated_at?: number;
121
+ }
122
+ export type MatchReason = "exact-model-id" | "exact-display-name" | "exact-name" | "prefix" | "substring" | "fuzzy";
123
+ export interface RankedModelMatch {
124
+ model: IndexedModel;
125
+ index: number;
126
+ reason: MatchReason;
127
+ sort_score: number;
128
+ fuzzy_score?: number;
129
+ }
130
+ export interface RankedProviderMatch {
131
+ provider: IndexedProvider;
132
+ reason: Exclude<MatchReason, "exact-model-id">;
133
+ sort_score: number;
134
+ }
135
+ export interface SyncResult {
136
+ updated: boolean;
137
+ old_version?: number;
138
+ new_version: number;
139
+ provider_count: number;
140
+ model_count: number;
141
+ cache_origin: "bundled" | "remote";
142
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/data/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ import type { CacheVersionState } from "./types.js";
2
+ export declare function createVersionState(input: Partial<CacheVersionState>): CacheVersionState;
3
+ export declare function isRemoteNewer(remoteUpdatedAt: number, localUpdatedAt: number | undefined): boolean;
4
+ export declare function shouldCheckRemoteVersion(versionState: CacheVersionState | undefined, now?: number): boolean;
5
+ export declare function getStaleState(localUpdatedAt: number | undefined, remoteUpdatedAt: number | undefined): "yes" | "no" | "unknown";
@@ -0,0 +1,28 @@
1
+ import { INDEX_SCHEMA_VERSION, VERSION_CHECK_INTERVAL_MS } from "../core/config.js";
2
+ import { isExpired } from "../utils/time.js";
3
+ export function createVersionState(input) {
4
+ return {
5
+ schema_version: INDEX_SCHEMA_VERSION,
6
+ cache_origin: input.cache_origin ?? "remote",
7
+ local_updated_at: input.local_updated_at,
8
+ last_checked_remote_updated_at: input.last_checked_remote_updated_at,
9
+ last_checked_at: input.last_checked_at,
10
+ index_built_at: input.index_built_at,
11
+ };
12
+ }
13
+ export function isRemoteNewer(remoteUpdatedAt, localUpdatedAt) {
14
+ if (!localUpdatedAt) {
15
+ return true;
16
+ }
17
+ return remoteUpdatedAt > localUpdatedAt;
18
+ }
19
+ export function shouldCheckRemoteVersion(versionState, now = Date.now()) {
20
+ return isExpired(versionState?.last_checked_at, VERSION_CHECK_INTERVAL_MS, now);
21
+ }
22
+ export function getStaleState(localUpdatedAt, remoteUpdatedAt) {
23
+ if (!localUpdatedAt || !remoteUpdatedAt) {
24
+ return "unknown";
25
+ }
26
+ return remoteUpdatedAt > localUpdatedAt ? "yes" : "no";
27
+ }
28
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/data/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAEpF,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,MAAM,UAAU,kBAAkB,CAAC,KAAiC;IAClE,OAAO;QACL,cAAc,EAAE,oBAAoB;QACpC,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,QAAQ;QAC5C,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,8BAA8B,EAAE,KAAK,CAAC,8BAA8B;QACpE,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,cAAc,EAAE,KAAK,CAAC,cAAc;KACrC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,eAAuB,EACvB,cAAkC;IAElC,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,eAAe,GAAG,cAAc,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,YAA2C,EAC3C,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAEhB,OAAO,SAAS,CAAC,YAAY,EAAE,eAAe,EAAE,yBAAyB,EAAE,GAAG,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,cAAkC,EAClC,eAAmC;IAEnC,IAAI,CAAC,cAAc,IAAI,CAAC,eAAe,EAAE,CAAC;QACxC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,eAAe,GAAG,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACzD,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { CacheVersionState, IndexedModel, IndexDocument } from "../data/types.js";
2
+ export declare function renderModelDetail(model: IndexedModel): string;
3
+ export declare function renderCapsDetail(model: IndexedModel): string;
4
+ export declare function renderCostDetail(model: IndexedModel): string;
5
+ export declare function renderLimitDetail(model: IndexedModel): string;
6
+ export declare function renderDoctor(indexDocument: IndexDocument | undefined, versionState: CacheVersionState | undefined, paths: {
7
+ dir: string;
8
+ raw: string;
9
+ version: string;
10
+ index: string;
11
+ }, stale: "yes" | "no" | "unknown"): string;
@@ -0,0 +1,139 @@
1
+ import { collectKnownExtraFields } from "../data/index.js";
2
+ import { formatBoolean, formatCost, formatLimit, formatList, formatMaybe, modelLabel, providerLabel, } from "./value.js";
3
+ import { formatTimestamp } from "../utils/time.js";
4
+ function renderBlock(title, rows) {
5
+ const width = rows.reduce((current, [label]) => Math.max(current, label.length), 0);
6
+ const body = rows.length === 0
7
+ ? " -"
8
+ : rows.map(([label, value]) => ` ${label.padEnd(width, " ")} : ${value}`).join("\n");
9
+ return `${title}\n${body}`;
10
+ }
11
+ function renderExtraFields(model) {
12
+ const metadata = typeof model.raw.metadata === "object" && model.raw.metadata !== null
13
+ ? model.raw.metadata
14
+ : undefined;
15
+ const extras = [];
16
+ if (metadata) {
17
+ for (const [key, value] of Object.entries(metadata)) {
18
+ if ([
19
+ "description",
20
+ "features",
21
+ "typeHints",
22
+ "pricing",
23
+ "inputModalities",
24
+ "modalities",
25
+ ].includes(key)) {
26
+ continue;
27
+ }
28
+ extras.push([`metadata.${key}`, typeof value === "string" ? value : JSON.stringify(value)]);
29
+ }
30
+ }
31
+ extras.push(...collectKnownExtraFields(model));
32
+ if (extras.length === 0) {
33
+ return undefined;
34
+ }
35
+ return renderBlock("Extra Fields", extras);
36
+ }
37
+ export function renderModelDetail(model) {
38
+ const sections = [
39
+ renderBlock("Model", [
40
+ ["Model", modelLabel(model)],
41
+ ["Model ID", model.model_id],
42
+ ["Model Name", formatMaybe(model.model_name)],
43
+ ["Display Name", formatMaybe(model.model_display_name)],
44
+ ["Provider ID", model.provider_id],
45
+ ["Provider Name", formatMaybe(model.provider_name)],
46
+ ["Provider Display", formatMaybe(model.provider_display_name)],
47
+ ["Provider API", formatMaybe(model.provider_api)],
48
+ ["Provider Doc", formatMaybe(model.provider_doc)],
49
+ ["Type", formatMaybe(model.type)],
50
+ ]),
51
+ renderBlock("Capabilities", [
52
+ ["Input Modalities", formatList(model.input_modalities)],
53
+ ["Output Modalities", formatList(model.output_modalities)],
54
+ ["Reasoning", formatBoolean(model.reasoning_supported)],
55
+ ["Reasoning Default", formatBoolean(model.reasoning_default)],
56
+ ["Tool Call", formatBoolean(model.tool_call)],
57
+ ["Attachment", formatBoolean(model.attachment)],
58
+ ["Temperature", formatBoolean(model.temperature)],
59
+ ["Vision", formatBoolean(model.vision)],
60
+ ["Open Weights", formatBoolean(model.open_weights)],
61
+ ]),
62
+ renderBlock("Dates", [
63
+ ["Knowledge", formatMaybe(model.knowledge)],
64
+ ["Release Date", formatMaybe(model.release_date)],
65
+ ["Last Updated", formatMaybe(model.last_updated)],
66
+ ]),
67
+ renderBlock("Pricing & Limits", [
68
+ ["Input Cost", formatCost(model.cost_input)],
69
+ ["Output Cost", formatCost(model.cost_output)],
70
+ ["Cache Read", formatCost(model.cost_cache_read)],
71
+ ["Context Limit", formatLimit(model.context_limit)],
72
+ ["Output Limit", formatLimit(model.output_limit)],
73
+ ]),
74
+ renderBlock("Metadata", [
75
+ ["Description", formatMaybe(model.metadata_description)],
76
+ ["Features", formatList(model.metadata_features)],
77
+ ["Type Hints", formatList(model.metadata_type_hints)],
78
+ ]),
79
+ ];
80
+ const extras = renderExtraFields(model);
81
+ if (extras) {
82
+ sections.push(extras);
83
+ }
84
+ return sections.join("\n\n");
85
+ }
86
+ export function renderCapsDetail(model) {
87
+ return renderBlock("Capabilities", [
88
+ ["Model", modelLabel(model)],
89
+ ["Provider", providerLabel(model)],
90
+ ["Type", formatMaybe(model.type)],
91
+ ["Input Modalities", formatList(model.input_modalities)],
92
+ ["Output Modalities", formatList(model.output_modalities)],
93
+ ["Reasoning", formatBoolean(model.reasoning_supported)],
94
+ ["Tool Call", formatBoolean(model.tool_call)],
95
+ ["Attachment", formatBoolean(model.attachment)],
96
+ ["Temperature", formatBoolean(model.temperature)],
97
+ ["Vision", formatBoolean(model.vision)],
98
+ ["Open Weights", formatBoolean(model.open_weights)],
99
+ ]);
100
+ }
101
+ export function renderCostDetail(model) {
102
+ return renderBlock("Pricing", [
103
+ ["Model", modelLabel(model)],
104
+ ["Provider", providerLabel(model)],
105
+ ["Input Cost", formatCost(model.cost_input)],
106
+ ["Output Cost", formatCost(model.cost_output)],
107
+ ["Cache Read", formatCost(model.cost_cache_read)],
108
+ ]);
109
+ }
110
+ export function renderLimitDetail(model) {
111
+ return renderBlock("Limits", [
112
+ ["Model", modelLabel(model)],
113
+ ["Provider", providerLabel(model)],
114
+ ["Context Limit", formatLimit(model.context_limit)],
115
+ ["Output Limit", formatLimit(model.output_limit)],
116
+ ]);
117
+ }
118
+ export function renderDoctor(indexDocument, versionState, paths, stale) {
119
+ return renderBlock("Doctor", [
120
+ ["Cache Status", indexDocument ? "ready" : "missing"],
121
+ ["Cache Dir", paths.dir],
122
+ ["Raw Path", paths.raw],
123
+ ["Version Path", paths.version],
124
+ ["Index Path", paths.index],
125
+ [
126
+ "Local Version",
127
+ versionState?.local_updated_at ? formatTimestamp(versionState.local_updated_at) : "-",
128
+ ],
129
+ [
130
+ "Last Checked",
131
+ versionState?.last_checked_at ? formatTimestamp(versionState.last_checked_at) : "-",
132
+ ],
133
+ ["Cache Origin", versionState?.cache_origin ?? "-"],
134
+ ["Providers", indexDocument ? String(indexDocument.provider_count) : "-"],
135
+ ["Models", indexDocument ? String(indexDocument.model_count) : "-"],
136
+ ["Stale", stale],
137
+ ]);
138
+ }
139
+ //# sourceMappingURL=detail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detail.js","sourceRoot":"","sources":["../../src/format/detail.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,258 @@
1
+ import type { CacheVersionState, IndexedModel, IndexedProvider, IndexDocument, RankedModelMatch, RankedProviderMatch, SyncResult } from "../data/types.js";
2
+ export type OutputFormat = "table" | "json";
3
+ export declare function writeJson(value: unknown): void;
4
+ export declare function providerSummaryToJson(provider: IndexedProvider): {
5
+ id: string;
6
+ name: string | undefined;
7
+ display_name: string | undefined;
8
+ api: string | undefined;
9
+ doc: string | undefined;
10
+ model_count: number;
11
+ };
12
+ export declare function modelSummaryToJson(model: IndexedModel): {
13
+ provider_id: string;
14
+ provider_name: string | undefined;
15
+ provider_display_name: string | undefined;
16
+ model_id: string;
17
+ model_name: string | undefined;
18
+ model_display_name: string | undefined;
19
+ type: string | undefined;
20
+ input_modalities: string[];
21
+ output_modalities: string[];
22
+ cost_input: number | undefined;
23
+ cost_output: number | undefined;
24
+ cost_cache_read: number | undefined;
25
+ context_limit: number | undefined;
26
+ output_limit: number | undefined;
27
+ };
28
+ export declare function modelToJson(model: IndexedModel): {
29
+ provider_id: string;
30
+ provider_name: string | undefined;
31
+ provider_display_name: string | undefined;
32
+ provider_api: string | undefined;
33
+ provider_doc: string | undefined;
34
+ model_id: string;
35
+ model_name: string | undefined;
36
+ model_display_name: string | undefined;
37
+ type: string | undefined;
38
+ attachment: boolean | undefined;
39
+ reasoning_supported: boolean | undefined;
40
+ reasoning_default: boolean | undefined;
41
+ tool_call: boolean | undefined;
42
+ temperature: boolean | undefined;
43
+ vision: boolean | undefined;
44
+ open_weights: boolean | undefined;
45
+ knowledge: string | undefined;
46
+ release_date: string | undefined;
47
+ last_updated: string | undefined;
48
+ input_modalities: string[];
49
+ output_modalities: string[];
50
+ cost_input: number | undefined;
51
+ cost_output: number | undefined;
52
+ cost_cache_read: number | undefined;
53
+ context_limit: number | undefined;
54
+ output_limit: number | undefined;
55
+ metadata_description: string | undefined;
56
+ metadata_features: string[];
57
+ metadata_type_hints: string[];
58
+ raw: import("../data/types.js").RawModel;
59
+ };
60
+ export declare function modelMatchToJson(match: RankedModelMatch): {
61
+ provider_id: string;
62
+ provider_name: string | undefined;
63
+ provider_display_name: string | undefined;
64
+ model_id: string;
65
+ model_name: string | undefined;
66
+ model_display_name: string | undefined;
67
+ type: string | undefined;
68
+ input_modalities: string[];
69
+ output_modalities: string[];
70
+ cost_input: number | undefined;
71
+ cost_output: number | undefined;
72
+ cost_cache_read: number | undefined;
73
+ context_limit: number | undefined;
74
+ output_limit: number | undefined;
75
+ reason: import("../data/types.js").MatchReason;
76
+ };
77
+ export declare function providerMatchToJson(match: RankedProviderMatch): {
78
+ id: string;
79
+ name: string | undefined;
80
+ display_name: string | undefined;
81
+ api: string | undefined;
82
+ doc: string | undefined;
83
+ model_count: number;
84
+ reason: "exact-display-name" | "exact-name" | "prefix" | "substring" | "fuzzy";
85
+ };
86
+ export declare function capsToJson(model: IndexedModel): {
87
+ provider_id: string;
88
+ provider_name: string | undefined;
89
+ provider_display_name: string | undefined;
90
+ model_id: string;
91
+ model_name: string | undefined;
92
+ model_display_name: string | undefined;
93
+ type: string | undefined;
94
+ input_modalities: string[];
95
+ output_modalities: string[];
96
+ attachment: boolean | undefined;
97
+ reasoning_supported: boolean | undefined;
98
+ reasoning_default: boolean | undefined;
99
+ tool_call: boolean | undefined;
100
+ temperature: boolean | undefined;
101
+ vision: boolean | undefined;
102
+ open_weights: boolean | undefined;
103
+ };
104
+ export declare function costToJson(model: IndexedModel): {
105
+ provider_id: string;
106
+ provider_name: string | undefined;
107
+ provider_display_name: string | undefined;
108
+ model_id: string;
109
+ model_name: string | undefined;
110
+ model_display_name: string | undefined;
111
+ cost_input: number | undefined;
112
+ cost_output: number | undefined;
113
+ cost_cache_read: number | undefined;
114
+ };
115
+ export declare function limitToJson(model: IndexedModel): {
116
+ provider_id: string;
117
+ provider_name: string | undefined;
118
+ provider_display_name: string | undefined;
119
+ model_id: string;
120
+ model_name: string | undefined;
121
+ model_display_name: string | undefined;
122
+ context_limit: number | undefined;
123
+ output_limit: number | undefined;
124
+ };
125
+ export declare function diffToJson(left: IndexedModel, right: IndexedModel): {
126
+ left: {
127
+ provider_id: string;
128
+ provider_name: string | undefined;
129
+ provider_display_name: string | undefined;
130
+ model_id: string;
131
+ model_name: string | undefined;
132
+ model_display_name: string | undefined;
133
+ type: string | undefined;
134
+ input_modalities: string[];
135
+ output_modalities: string[];
136
+ cost_input: number | undefined;
137
+ cost_output: number | undefined;
138
+ cost_cache_read: number | undefined;
139
+ context_limit: number | undefined;
140
+ output_limit: number | undefined;
141
+ };
142
+ right: {
143
+ provider_id: string;
144
+ provider_name: string | undefined;
145
+ provider_display_name: string | undefined;
146
+ model_id: string;
147
+ model_name: string | undefined;
148
+ model_display_name: string | undefined;
149
+ type: string | undefined;
150
+ input_modalities: string[];
151
+ output_modalities: string[];
152
+ cost_input: number | undefined;
153
+ cost_output: number | undefined;
154
+ cost_cache_read: number | undefined;
155
+ context_limit: number | undefined;
156
+ output_limit: number | undefined;
157
+ };
158
+ comparison: {
159
+ provider: {
160
+ left: string;
161
+ right: string;
162
+ };
163
+ type: {
164
+ left: string | undefined;
165
+ right: string | undefined;
166
+ };
167
+ input_modalities: {
168
+ left: string[];
169
+ right: string[];
170
+ };
171
+ output_modalities: {
172
+ left: string[];
173
+ right: string[];
174
+ };
175
+ reasoning_supported: {
176
+ left: boolean | undefined;
177
+ right: boolean | undefined;
178
+ };
179
+ tool_call: {
180
+ left: boolean | undefined;
181
+ right: boolean | undefined;
182
+ };
183
+ attachment: {
184
+ left: boolean | undefined;
185
+ right: boolean | undefined;
186
+ };
187
+ temperature: {
188
+ left: boolean | undefined;
189
+ right: boolean | undefined;
190
+ };
191
+ vision: {
192
+ left: boolean | undefined;
193
+ right: boolean | undefined;
194
+ };
195
+ open_weights: {
196
+ left: boolean | undefined;
197
+ right: boolean | undefined;
198
+ };
199
+ knowledge: {
200
+ left: string | undefined;
201
+ right: string | undefined;
202
+ };
203
+ release_date: {
204
+ left: string | undefined;
205
+ right: string | undefined;
206
+ };
207
+ last_updated: {
208
+ left: string | undefined;
209
+ right: string | undefined;
210
+ };
211
+ cost_input: {
212
+ left: number | undefined;
213
+ right: number | undefined;
214
+ };
215
+ cost_output: {
216
+ left: number | undefined;
217
+ right: number | undefined;
218
+ };
219
+ cost_cache_read: {
220
+ left: number | undefined;
221
+ right: number | undefined;
222
+ };
223
+ context_limit: {
224
+ left: number | undefined;
225
+ right: number | undefined;
226
+ };
227
+ output_limit: {
228
+ left: number | undefined;
229
+ right: number | undefined;
230
+ };
231
+ };
232
+ };
233
+ export declare function doctorToJson(indexDocument: IndexDocument | undefined, versionState: CacheVersionState | undefined, paths: {
234
+ dir: string;
235
+ raw: string;
236
+ version: string;
237
+ index: string;
238
+ }, stale: "yes" | "no" | "unknown"): {
239
+ cache_status: string;
240
+ cache_dir: string;
241
+ raw_path: string;
242
+ version_path: string;
243
+ index_path: string;
244
+ local_updated_at: number | undefined;
245
+ last_checked_at: number | undefined;
246
+ cache_origin: "bundled" | "remote" | undefined;
247
+ provider_count: number | undefined;
248
+ model_count: number | undefined;
249
+ stale: "yes" | "no" | "unknown";
250
+ };
251
+ export declare function updateToJson(result: SyncResult): {
252
+ updated: boolean;
253
+ old_version: number | undefined;
254
+ new_version: number;
255
+ provider_count: number;
256
+ model_count: number;
257
+ cache_origin: "bundled" | "remote";
258
+ };