@sriinnu/kosha-discovery 1.8.1 → 1.10.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 (82) hide show
  1. package/README.md +25 -3
  2. package/dist/cache.d.ts +2 -0
  3. package/dist/cache.d.ts.map +1 -1
  4. package/dist/cache.js +4 -2
  5. package/dist/cache.js.map +1 -1
  6. package/dist/catalog-source.d.ts +99 -0
  7. package/dist/catalog-source.d.ts.map +1 -0
  8. package/dist/catalog-source.js +203 -0
  9. package/dist/catalog-source.js.map +1 -0
  10. package/dist/cli-cmd-doctor.d.ts.map +1 -1
  11. package/dist/cli-cmd-doctor.js +27 -8
  12. package/dist/cli-cmd-doctor.js.map +1 -1
  13. package/dist/cli-cmd-registry.d.ts +12 -0
  14. package/dist/cli-cmd-registry.d.ts.map +1 -0
  15. package/dist/cli-cmd-registry.js +39 -0
  16. package/dist/cli-cmd-registry.js.map +1 -0
  17. package/dist/cli-help.d.ts.map +1 -1
  18. package/dist/cli-help.js +10 -1
  19. package/dist/cli-help.js.map +1 -1
  20. package/dist/cli.d.ts.map +1 -1
  21. package/dist/cli.js +7 -3
  22. package/dist/cli.js.map +1 -1
  23. package/dist/cost.js +3 -3
  24. package/dist/cost.js.map +1 -1
  25. package/dist/credentials/resolver.d.ts +2 -8
  26. package/dist/credentials/resolver.d.ts.map +1 -1
  27. package/dist/credentials/resolver.js +8 -53
  28. package/dist/credentials/resolver.js.map +1 -1
  29. package/dist/discovery/bedrock.d.ts.map +1 -1
  30. package/dist/discovery/bedrock.js +2 -1
  31. package/dist/discovery/bedrock.js.map +1 -1
  32. package/dist/discovery/public-seed.d.ts +4 -1
  33. package/dist/discovery/public-seed.d.ts.map +1 -1
  34. package/dist/discovery/public-seed.js +40 -8
  35. package/dist/discovery/public-seed.js.map +1 -1
  36. package/dist/discovery/snapshot-catalog.d.ts +44 -0
  37. package/dist/discovery/snapshot-catalog.d.ts.map +1 -0
  38. package/dist/discovery/snapshot-catalog.js +177 -0
  39. package/dist/discovery/snapshot-catalog.js.map +1 -0
  40. package/dist/discovery/vertex.d.ts.map +1 -1
  41. package/dist/discovery/vertex.js +4 -2
  42. package/dist/discovery/vertex.js.map +1 -1
  43. package/dist/enrichment/catalog.d.ts +19 -0
  44. package/dist/enrichment/catalog.d.ts.map +1 -0
  45. package/dist/enrichment/catalog.js +60 -0
  46. package/dist/enrichment/catalog.js.map +1 -0
  47. package/dist/enrichment/index.d.ts +1 -0
  48. package/dist/enrichment/index.d.ts.map +1 -1
  49. package/dist/enrichment/index.js +1 -0
  50. package/dist/enrichment/index.js.map +1 -1
  51. package/dist/index.d.ts +17 -15
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +8 -7
  54. package/dist/index.js.map +1 -1
  55. package/dist/mcp-server.d.ts.map +1 -1
  56. package/dist/mcp-server.js +4 -10
  57. package/dist/mcp-server.js.map +1 -1
  58. package/dist/proxy.d.ts.map +1 -1
  59. package/dist/proxy.js +78 -23
  60. package/dist/proxy.js.map +1 -1
  61. package/dist/registry-runtime.d.ts.map +1 -1
  62. package/dist/registry-runtime.js +29 -24
  63. package/dist/registry-runtime.js.map +1 -1
  64. package/dist/registry.d.ts +1 -1
  65. package/dist/registry.d.ts.map +1 -1
  66. package/dist/registry.js +64 -22
  67. package/dist/registry.js.map +1 -1
  68. package/dist/security.d.ts.map +1 -1
  69. package/dist/security.js +8 -6
  70. package/dist/security.js.map +1 -1
  71. package/dist/server.d.ts +14 -1
  72. package/dist/server.d.ts.map +1 -1
  73. package/dist/server.js +102 -19
  74. package/dist/server.js.map +1 -1
  75. package/dist/shell-safe.d.ts +13 -0
  76. package/dist/shell-safe.d.ts.map +1 -1
  77. package/dist/shell-safe.js +14 -0
  78. package/dist/shell-safe.js.map +1 -1
  79. package/dist/types.d.ts +17 -4
  80. package/dist/types.d.ts.map +1 -1
  81. package/package.json +2 -2
  82. package/server.json +2 -2
package/README.md CHANGED
@@ -6,6 +6,9 @@
6
6
 
7
7
  **Tells your agent — or your code — which model to use and what it costs.**
8
8
 
9
+ [![Sponsor](https://img.shields.io/badge/sponsor-%E2%9D%A4-ea4aaa?logo=githubsponsors&logoColor=white)](https://github.com/sponsors/sriinnu)
10
+ [![Buy Me a Coffee](https://img.shields.io/badge/buy%20me%20a%20coffee-FFDD00?logo=buymeacoffee&logoColor=black)](https://buymeacoffee.com/sriinnu)
11
+
9
12
  kosha discovers models across 46 providers and local runtimes, finds your API keys
10
13
  wherever they already live (env vars, Claude CLI, Codex, gcloud ADC, AWS SSO), fills
11
14
  in pricing and context limits, and answers questions like *the cheapest model with
@@ -76,6 +79,10 @@ or listed by no provider any more:
76
79
  sonnet
77
80
  ```
78
81
 
82
+ Pin it to a commit SHA rather than a moving tag, as you would any action. The
83
+ action runs the kosha version it was released with, not `latest`, so a new npm
84
+ publish does not change what your CI runs until you move the pin.
85
+
79
86
  It runs `kosha doctor --ci --model …` against the public catalogs (no provider
80
87
  keys needed), writes a table to the job summary, and annotates each failing
81
88
  model. A reseller retiring one of its routes is reported but does not fail the
@@ -202,7 +209,7 @@ rather than a hand-written class.
202
209
  | Provider | Discovery | Credential sources |
203
210
  |----------|-----------|--------------------|
204
211
  | Anthropic | `GET /v1/models` (context, output cap, capabilities read from the API) | `ANTHROPIC_API_KEY`, Claude CLI, Codex CLI |
205
- | OpenAI | `GET /v1/models` | `OPENAI_API_KEY`, GitHub Copilot tokens |
212
+ | OpenAI | `GET /v1/models` | `OPENAI_API_KEY` |
206
213
  | Google | `GET /v1beta/models` | `GOOGLE_API_KEY`, `GEMINI_API_KEY`, Gemini CLI, gcloud |
207
214
  | AWS Bedrock | SDK → CLI → public catalog → static list | `AWS_ACCESS_KEY_ID`, `~/.aws/credentials`, SSO, IAM |
208
215
  | Vertex AI | API → gcloud → public catalog → static list | `GOOGLE_APPLICATION_CREDENTIALS`, ADC |
@@ -237,7 +244,9 @@ provider:
237
244
  `kosha routes <model>` lists every region a model is served from, so you can
238
245
  compare prices across them directly.
239
246
 
240
- Without a key, providers fall back to the public models.dev + LiteLLM catalog, then to a curated static list, so `kosha list` works on a fresh machine. The same fallback applies when a key is present but rejected: the provider stays listed from the public catalog, shows as unauthenticated, and the error is kept for `kosha doctor`. Exact env var names: [docs/credentials.md](docs/credentials.md).
247
+ Without a key, providers fall back to the public models.dev + LiteLLM catalog, then to kosha's own weekly [snapshot](#public-snapshot) if those are unreachable, then to a curated static list, so `kosha list` works on a fresh machine. The same fallback applies when a key is present but rejected: the provider stays listed from the public catalog, shows as unauthenticated, and the error is kept for `kosha doctor`. Exact env var names: [docs/credentials.md](docs/credentials.md).
248
+
249
+ To take models.dev and LiteLLM out of the loop, set `KOSHA_CATALOG_SOURCE=pinned` (kosha's snapshot only) or `local` (a file from `kosha registry export`, no network). See [Catalog Source](docs/configuration.md#catalog-source).
241
250
 
242
251
  ### Non-chat modes
243
252
 
@@ -352,7 +361,20 @@ git tag -s vX.Y.Z -m "vX.Y.Z" && git push origin vX.Y.Z
352
361
  gh workflow run release-npm.yml -f tag=vX.Y.Z
353
362
  ```
354
363
 
355
- The workflow checks that the tag matches `package.json`, runs lint / build / test, publishes to npm with provenance, and creates the GitHub Release. Publishing authenticates through npm trusted publishing (OIDC) when a trusted publisher is configured for this repo and workflow on npmjs.com, or through an `NPM_TOKEN` repository secret.
364
+ The workflow checks that the tag matches `package.json`, runs lint / build / test, stages the package on npm with provenance, and creates the GitHub Release. Staging authenticates through npm trusted publishing (OIDC); there is no npm token. The version goes live only after a maintainer approves it with 2FA:
365
+
366
+ ```bash
367
+ npm stage list @sriinnu/kosha-discovery
368
+ npm stage approve <id>
369
+ gh workflow run release-npm.yml -f tag=vX.Y.Z -f publish_npm=false -f create_github_release=false # then publish to the MCP registry
370
+ ```
371
+
372
+ ## Support
373
+
374
+ kosha is free and open source. If it helps you pick cheaper models, consider sponsoring its upkeep:
375
+
376
+ - [GitHub Sponsors](https://github.com/sponsors/sriinnu)
377
+ - [Buy Me a Coffee](https://buymeacoffee.com/sriinnu)
356
378
 
357
379
  ## License
358
380
 
package/dist/cache.d.ts CHANGED
@@ -50,6 +50,8 @@ export declare class KoshaCache {
50
50
  private keyToPath;
51
51
  /**
52
52
  * Ensure the cache directory exists, creating it recursively if needed.
53
+ * Owner-only: the cache and its siblings (ledger, manifest) say which
54
+ * providers you use and what you spend. Existing directories keep their mode.
53
55
  */
54
56
  private ensureDir;
55
57
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,UAAU,UAAU,CAAC,CAAC;IACrB,IAAI,EAAE,CAAC,CAAC;IACR,SAAS,EAAE,MAAM,CAAC;CAClB;AAqBD;;;;;GAKG;AACH,qBAAa,UAAU;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAElC,YAAY,QAAQ,CAAC,EAAE,MAAM,EAE5B;IAED;;;OAGG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAsCvD;IAED;;;;;OAKG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAehD;IAED;;OAEG;IACG,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO3C;IAED;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAU3B;IAED;;OAEG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAEnD;IAMD;;;OAGG;IACH,OAAO,CAAC,SAAS;IAKjB;;OAEG;YACW,SAAS;CAGvB"}
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,UAAU,UAAU,CAAC,CAAC;IACrB,IAAI,EAAE,CAAC,CAAC;IACR,SAAS,EAAE,MAAM,CAAC;CAClB;AAqBD;;;;;GAKG;AACH,qBAAa,UAAU;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAElC,YAAY,QAAQ,CAAC,EAAE,MAAM,EAE5B;IAED;;;OAGG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAsCvD;IAED;;;;;OAKG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAehD;IAED;;OAEG;IACG,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO3C;IAED;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAU3B;IAED;;OAEG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAEnD;IAMD;;;OAGG;IACH,OAAO,CAAC,SAAS;IAKjB;;;;OAIG;YACW,SAAS;CAGvB"}
package/dist/cache.js CHANGED
@@ -98,7 +98,7 @@ export class KoshaCache {
98
98
  const filePath = this.keyToPath(key);
99
99
  const tmpPath = `${filePath}.${randomBytes(4).toString("hex")}.tmp`;
100
100
  try {
101
- await writeFile(tmpPath, JSON.stringify(entry, null, "\t"), "utf-8");
101
+ await writeFile(tmpPath, JSON.stringify(entry, null, "\t"), { encoding: "utf-8", mode: 0o600 });
102
102
  await rename(tmpPath, filePath);
103
103
  }
104
104
  catch (err) {
@@ -152,9 +152,11 @@ export class KoshaCache {
152
152
  }
153
153
  /**
154
154
  * Ensure the cache directory exists, creating it recursively if needed.
155
+ * Owner-only: the cache and its siblings (ledger, manifest) say which
156
+ * providers you use and what you spend. Existing directories keep their mode.
155
157
  */
156
158
  async ensureDir() {
157
- await mkdir(this.cacheDir, { recursive: true });
159
+ await mkdir(this.cacheDir, { recursive: true, mode: 0o700 });
158
160
  }
159
161
  }
160
162
  //# sourceMappingURL=cache.js.map
package/dist/cache.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * kosha-discovery — Where keyless catalog data comes from.
3
+ *
4
+ * Without an API key, kosha learns about models from catalogs it does not
5
+ * own: models.dev and LiteLLM. If either one shuts down or ships poisoned
6
+ * data, this is the switch that takes them out of the loop:
7
+ *
8
+ * - `community` (default): models.dev first, LiteLLM as filler and for
9
+ * enrichment, kosha's weekly snapshot when both are unreachable.
10
+ * - `pinned`: kosha's own published snapshot only. No models.dev, no LiteLLM.
11
+ * - `local`: a catalog file on disk (`kosha registry export` writes one).
12
+ * Never touches the network for catalog data. A missing or broken file is
13
+ * an error, never a silent fallback to the network.
14
+ *
15
+ * Provider APIs called with your own key are official sources and run in
16
+ * every mode. `KOSHA_CATALOG_SOURCE` and `KOSHA_CATALOG_FILE` override config.
17
+ * @module
18
+ */
19
+ import { type SnapshotCatalog } from "./discovery/snapshot-catalog.js";
20
+ import type { KoshaConfig, ModelCard, ProviderInfo } from "./types.js";
21
+ export type CatalogSource = "community" | "pinned" | "local";
22
+ export declare const CATALOG_SOURCES: readonly CatalogSource[];
23
+ export declare const CATALOG_SOURCE_ENV = "KOSHA_CATALOG_SOURCE";
24
+ export declare const CATALOG_FILE_ENV = "KOSHA_CATALOG_FILE";
25
+ /** Envelope version for `kosha registry export` and the published snapshot. */
26
+ export declare const CATALOG_SCHEMA_VERSION = 1;
27
+ export declare const CATALOG_KIND = "kosha-catalog";
28
+ export interface ResolvedCatalogSource {
29
+ mode: CatalogSource;
30
+ /** Absolute path of the catalog file; set only in `local` mode. */
31
+ file?: string;
32
+ /** Where the mode came from, for `kosha doctor`. */
33
+ origin: "default" | "config" | "env";
34
+ }
35
+ export declare function isCatalogSource(value: unknown): value is CatalogSource;
36
+ /**
37
+ * Record the config's choice. Called by the registry constructor, so the
38
+ * last registry built sets it for the process; the env still wins.
39
+ */
40
+ export declare function configureCatalogSource(config?: Pick<KoshaConfig, "catalogSource" | "catalogFile">): void;
41
+ /**
42
+ * The mode in force right now. An unknown value in the env is an error
43
+ * rather than a quiet fallback: someone who typed `KOSHA_CATALOG_SOURCE=locl`
44
+ * meant to stop the network fetch.
45
+ */
46
+ export declare function resolveCatalogSource(): ResolvedCatalogSource;
47
+ /**
48
+ * Prefix a cache key with the mode, so data cached in `community` mode is
49
+ * never served after switching away from it. `community` keeps the bare
50
+ * keys, so existing caches stay valid.
51
+ */
52
+ export declare function catalogCacheKey(key: string): string;
53
+ /** Seed cards for one provider from the local catalog file. */
54
+ export declare function getLocalSeed(providerId: string): Promise<ModelCard[]>;
55
+ /** Load and validate the local catalog once per process (per file). */
56
+ export declare function loadLocalCatalog(file: string): Promise<SnapshotCatalog>;
57
+ /** The catalog the active mode reads from, for enrichment outside `community`. */
58
+ export declare function loadActiveCatalog(): Promise<SnapshotCatalog | null>;
59
+ /**
60
+ * Run before discovery. In `local` mode a missing or invalid file throws
61
+ * here, because past this point a seed failure only degrades a provider to
62
+ * its bundled static list, quietly. A bad env value throws in every mode.
63
+ */
64
+ export declare function assertCatalogReady(): Promise<void>;
65
+ /** What `kosha doctor` reports about the catalog in use. */
66
+ export interface CatalogReport {
67
+ mode: CatalogSource | null;
68
+ origin: ResolvedCatalogSource["origin"] | null;
69
+ file?: string;
70
+ /** When the catalog was built; community catalogs are fetched live and have none. */
71
+ fetchedAt?: string;
72
+ ageDays?: number;
73
+ error?: string;
74
+ }
75
+ /**
76
+ * Describe the active catalog, loading it outside `community` to read its
77
+ * age. Never throws: a broken setup is exactly what doctor must show.
78
+ */
79
+ export declare function describeCatalog(now?: number): Promise<CatalogReport>;
80
+ /** The file format shared by `kosha registry export` and the weekly snapshot. */
81
+ export interface CatalogEnvelope {
82
+ schemaVersion: typeof CATALOG_SCHEMA_VERSION;
83
+ kind: typeof CATALOG_KIND;
84
+ fetchedAt: string;
85
+ providerScope: string;
86
+ modelCount: number;
87
+ providerCount: number;
88
+ discoveredAt: number;
89
+ providers: ProviderInfo[];
90
+ }
91
+ /** Wrap discovered providers in the catalog envelope, ready to write as JSON. */
92
+ export declare function buildCatalogEnvelope(providers: ProviderInfo[], options: {
93
+ discoveredAt: number;
94
+ providerScope?: string;
95
+ now?: Date;
96
+ }): CatalogEnvelope;
97
+ /** Test hook. */
98
+ export declare function resetCatalogSource(): void;
99
+ //# sourceMappingURL=catalog-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-source.d.ts","sourceRoot":"","sources":["../src/catalog-source.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,OAAO,EAA6C,KAAK,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEvE,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE7D,eAAO,MAAM,eAAe,EAAE,SAAS,aAAa,EAAqC,CAAC;AAC1F,eAAO,MAAM,kBAAkB,yBAAyB,CAAC;AACzD,eAAO,MAAM,gBAAgB,uBAAuB,CAAC;AAErD,+EAA+E;AAC/E,eAAO,MAAM,sBAAsB,IAAI,CAAC;AACxC,eAAO,MAAM,YAAY,kBAAkB,CAAC;AAK5C,MAAM,WAAW,qBAAqB;IACrC,IAAI,EAAE,aAAa,CAAC;IACpB,mEAAmE;IACnE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,KAAK,CAAC;CACrC;AAKD,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAEtE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,eAAe,GAAG,aAAa,CAAC,GAAG,IAAI,CAMxG;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,qBAAqB,CAuB5D;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED,+DAA+D;AAC/D,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAU3E;AAED,uEAAuE;AACvE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAOvE;AAED,kFAAkF;AAClF,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAKzE;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAGxD;AAED,4DAA4D;AAC5D,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,qBAAqB,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qFAAqF;IACrF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,GAAG,SAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAoB9E;AAED,iFAAiF;AACjF,MAAM,WAAW,eAAe;IAC/B,aAAa,EAAE,OAAO,sBAAsB,CAAC;IAC7C,IAAI,EAAE,OAAO,YAAY,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,iFAAiF;AACjF,wBAAgB,oBAAoB,CACnC,SAAS,EAAE,YAAY,EAAE,EACzB,OAAO,EAAE;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,IAAI,CAAA;CAAE,GACnE,eAAe,CAWjB;AAED,iBAAiB;AACjB,wBAAgB,kBAAkB,IAAI,IAAI,CAGzC"}
@@ -0,0 +1,203 @@
1
+ /**
2
+ * kosha-discovery — Where keyless catalog data comes from.
3
+ *
4
+ * Without an API key, kosha learns about models from catalogs it does not
5
+ * own: models.dev and LiteLLM. If either one shuts down or ships poisoned
6
+ * data, this is the switch that takes them out of the loop:
7
+ *
8
+ * - `community` (default): models.dev first, LiteLLM as filler and for
9
+ * enrichment, kosha's weekly snapshot when both are unreachable.
10
+ * - `pinned`: kosha's own published snapshot only. No models.dev, no LiteLLM.
11
+ * - `local`: a catalog file on disk (`kosha registry export` writes one).
12
+ * Never touches the network for catalog data. A missing or broken file is
13
+ * an error, never a silent fallback to the network.
14
+ *
15
+ * Provider APIs called with your own key are official sources and run in
16
+ * every mode. `KOSHA_CATALOG_SOURCE` and `KOSHA_CATALOG_FILE` override config.
17
+ * @module
18
+ */
19
+ import { open } from "node:fs/promises";
20
+ import { homedir } from "node:os";
21
+ import { isAbsolute, resolve } from "node:path";
22
+ import { loadSnapshotCatalog, parseSnapshotCatalog } from "./discovery/snapshot-catalog.js";
23
+ export const CATALOG_SOURCES = ["community", "pinned", "local"];
24
+ export const CATALOG_SOURCE_ENV = "KOSHA_CATALOG_SOURCE";
25
+ export const CATALOG_FILE_ENV = "KOSHA_CATALOG_FILE";
26
+ /** Envelope version for `kosha registry export` and the published snapshot. */
27
+ export const CATALOG_SCHEMA_VERSION = 1;
28
+ export const CATALOG_KIND = "kosha-catalog";
29
+ /** Same cap as the published snapshot; ours is ~3 MB today. */
30
+ const MAX_LOCAL_BYTES = 16 * 1024 * 1024;
31
+ let configured = {};
32
+ let localInflight = null;
33
+ export function isCatalogSource(value) {
34
+ return typeof value === "string" && CATALOG_SOURCES.includes(value);
35
+ }
36
+ /**
37
+ * Record the config's choice. Called by the registry constructor, so the
38
+ * last registry built sets it for the process; the env still wins.
39
+ */
40
+ export function configureCatalogSource(config) {
41
+ configured = {
42
+ mode: isCatalogSource(config?.catalogSource) ? config.catalogSource : undefined,
43
+ file: typeof config?.catalogFile === "string" ? config.catalogFile : undefined,
44
+ };
45
+ localInflight = null;
46
+ }
47
+ /**
48
+ * The mode in force right now. An unknown value in the env is an error
49
+ * rather than a quiet fallback: someone who typed `KOSHA_CATALOG_SOURCE=locl`
50
+ * meant to stop the network fetch.
51
+ */
52
+ export function resolveCatalogSource() {
53
+ const envMode = process.env[CATALOG_SOURCE_ENV]?.trim();
54
+ let mode = "community";
55
+ let origin = "default";
56
+ if (envMode) {
57
+ if (!isCatalogSource(envMode)) {
58
+ throw new Error(`${CATALOG_SOURCE_ENV}="${envMode}" is not one of: ${CATALOG_SOURCES.join(", ")}`);
59
+ }
60
+ mode = envMode;
61
+ origin = "env";
62
+ }
63
+ else if (configured.mode) {
64
+ mode = configured.mode;
65
+ origin = "config";
66
+ }
67
+ if (mode !== "local")
68
+ return { mode, origin };
69
+ const raw = process.env[CATALOG_FILE_ENV]?.trim() || configured.file;
70
+ if (!raw) {
71
+ throw new Error(`catalog source is "local" but no catalog file is set (${CATALOG_FILE_ENV} or catalogFile in ~/.kosharc.json)`);
72
+ }
73
+ return { mode, file: expandPath(raw), origin };
74
+ }
75
+ /**
76
+ * Prefix a cache key with the mode, so data cached in `community` mode is
77
+ * never served after switching away from it. `community` keeps the bare
78
+ * keys, so existing caches stay valid.
79
+ */
80
+ export function catalogCacheKey(key) {
81
+ const { mode } = resolveCatalogSource();
82
+ return mode === "community" ? key : `${mode}_${key}`;
83
+ }
84
+ /** Seed cards for one provider from the local catalog file. */
85
+ export async function getLocalSeed(providerId) {
86
+ const { file } = resolveCatalogSource();
87
+ if (!file)
88
+ return [];
89
+ const catalog = await loadLocalCatalog(file);
90
+ const now = Date.now();
91
+ return (catalog.providers.get(providerId) ?? []).map((card) => ({
92
+ ...card,
93
+ discoveredAt: now,
94
+ catalogSource: "local",
95
+ }));
96
+ }
97
+ /** Load and validate the local catalog once per process (per file). */
98
+ export function loadLocalCatalog(file) {
99
+ if (localInflight)
100
+ return localInflight;
101
+ localInflight = readLocalCatalog(file).catch((error) => {
102
+ localInflight = null;
103
+ throw error;
104
+ });
105
+ return localInflight;
106
+ }
107
+ /** The catalog the active mode reads from, for enrichment outside `community`. */
108
+ export async function loadActiveCatalog() {
109
+ const source = resolveCatalogSource();
110
+ if (source.mode === "local" && source.file)
111
+ return loadLocalCatalog(source.file);
112
+ if (source.mode === "pinned")
113
+ return loadSnapshotCatalog();
114
+ return null;
115
+ }
116
+ /**
117
+ * Run before discovery. In `local` mode a missing or invalid file throws
118
+ * here, because past this point a seed failure only degrades a provider to
119
+ * its bundled static list, quietly. A bad env value throws in every mode.
120
+ */
121
+ export async function assertCatalogReady() {
122
+ const source = resolveCatalogSource();
123
+ if (source.mode === "local" && source.file)
124
+ await loadLocalCatalog(source.file);
125
+ }
126
+ /**
127
+ * Describe the active catalog, loading it outside `community` to read its
128
+ * age. Never throws: a broken setup is exactly what doctor must show.
129
+ */
130
+ export async function describeCatalog(now = Date.now()) {
131
+ let source;
132
+ try {
133
+ source = resolveCatalogSource();
134
+ }
135
+ catch (error) {
136
+ return { mode: null, origin: null, error: error.message };
137
+ }
138
+ const report = { mode: source.mode, origin: source.origin, file: source.file };
139
+ if (source.mode === "community")
140
+ return report;
141
+ try {
142
+ const catalog = await loadActiveCatalog();
143
+ const built = catalog?.fetchedAt ? Date.parse(catalog.fetchedAt) : Number.NaN;
144
+ if (catalog?.fetchedAt && Number.isFinite(built)) {
145
+ report.fetchedAt = catalog.fetchedAt;
146
+ report.ageDays = Math.max(0, Math.floor((now - built) / 86_400_000));
147
+ }
148
+ }
149
+ catch (error) {
150
+ report.error = error.message;
151
+ }
152
+ return report;
153
+ }
154
+ /** Wrap discovered providers in the catalog envelope, ready to write as JSON. */
155
+ export function buildCatalogEnvelope(providers, options) {
156
+ return {
157
+ schemaVersion: CATALOG_SCHEMA_VERSION,
158
+ kind: CATALOG_KIND,
159
+ fetchedAt: (options.now ?? new Date()).toISOString(),
160
+ providerScope: options.providerScope ?? "all",
161
+ modelCount: providers.reduce((sum, provider) => sum + provider.models.length, 0),
162
+ providerCount: providers.length,
163
+ discoveredAt: options.discoveredAt,
164
+ providers,
165
+ };
166
+ }
167
+ /** Test hook. */
168
+ export function resetCatalogSource() {
169
+ configured = {};
170
+ localInflight = null;
171
+ }
172
+ /**
173
+ * One handle for the check and the read, so the file can't be swapped in
174
+ * between, and the read itself stops at the cap in case the file grows.
175
+ */
176
+ async function readLocalCatalog(file) {
177
+ const handle = await open(file, "r").catch(() => null);
178
+ if (!handle)
179
+ throw new Error(`local catalog not found: ${file}`);
180
+ try {
181
+ if (!(await handle.stat()).isFile())
182
+ throw new Error(`local catalog is not a file: ${file}`);
183
+ const buffer = Buffer.alloc(MAX_LOCAL_BYTES + 1);
184
+ let length = 0;
185
+ while (length < buffer.length) {
186
+ const { bytesRead } = await handle.read(buffer, length, buffer.length - length, length);
187
+ if (bytesRead === 0)
188
+ break;
189
+ length += bytesRead;
190
+ }
191
+ if (length > MAX_LOCAL_BYTES)
192
+ throw new Error(`local catalog too large (> ${MAX_LOCAL_BYTES} bytes): ${file}`);
193
+ return parseSnapshotCatalog(buffer.toString("utf8", 0, length), `local catalog ${file}`);
194
+ }
195
+ finally {
196
+ await handle.close();
197
+ }
198
+ }
199
+ function expandPath(raw) {
200
+ const path = raw === "~" || raw.startsWith("~/") ? `${homedir()}${raw.slice(1)}` : raw;
201
+ return isAbsolute(path) ? path : resolve(path);
202
+ }
203
+ //# sourceMappingURL=catalog-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-source.js","sourceRoot":"","sources":["../src/catalog-source.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"cli-cmd-doctor.d.ts","sourceRoot":"","sources":["../src/cli-cmd-doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAmBnD,6EAA6E;AAC7E,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC,gFAAgF;AAChF,eAAO,MAAM,iCAAiC,KAAK,CAAC;AAsBpD,wBAAsB,SAAS,CAAC,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAgD/G"}
1
+ {"version":3,"file":"cli-cmd-doctor.d.ts","sourceRoot":"","sources":["../src/cli-cmd-doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAmBnD,6EAA6E;AAC7E,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC,gFAAgF;AAChF,eAAO,MAAM,iCAAiC,KAAK,CAAC;AAsBpD,wBAAsB,SAAS,CAAC,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA+C/G"}
@@ -8,7 +8,8 @@
8
8
  * from each provider.
9
9
  * @module
10
10
  */
11
- import { c, CYAN, DIM, GREEN, RED, YELLOW } from "./cli-format.js";
11
+ import { describeCatalog } from "./catalog-source.js";
12
+ import { CYAN, c, DIM, GREEN, RED, YELLOW } from "./cli-format.js";
12
13
  import { extractOriginProvider, matchableModelId } from "./normalize.js";
13
14
  /** Exit code `doctor` uses to fail a CI run without looking like a crash. */
14
15
  export const DOCTOR_CI_EXIT_CODE = 2;
@@ -25,6 +26,7 @@ export async function cmdDoctor(registry, flags) {
25
26
  // Even if discovery fails, we can still report on whatever the cached
26
27
  // registry holds — that's the point of `doctor`.
27
28
  }
29
+ const catalog = await describeCatalog();
28
30
  const scope = parseModelScope(f.model);
29
31
  const scoped = scope ? resolveScope(registry, scope) : undefined;
30
32
  const models = scoped ? scopeModels(registry, scoped) : registry.models();
@@ -39,9 +41,10 @@ export async function cmdDoctor(registry, flags) {
39
41
  .map((providerId) => projectHealth(registry, providerId))
40
42
  .filter((row) => row !== null);
41
43
  if (f.json) {
42
- process.stdout.write(`${JSON.stringify({ deprecations, health: healthFindings }, null, 2)}\n`);
44
+ process.stdout.write(`${JSON.stringify({ catalog, deprecations, health: healthFindings }, null, 2)}\n`);
43
45
  }
44
46
  else {
47
+ renderCatalog(catalog);
45
48
  renderDeprecations(deprecations);
46
49
  renderHealth(healthFindings);
47
50
  }
@@ -56,6 +59,23 @@ export async function cmdDoctor(registry, flags) {
56
59
  process.exit(DOCTOR_CI_EXIT_CODE);
57
60
  }
58
61
  }
62
+ /** One line on where keyless catalog data comes from, and how old it is. */
63
+ function renderCatalog(report) {
64
+ if (report.error) {
65
+ console.log(`${c(RED, "Catalog source:")} ${report.mode ?? "invalid"} — ${report.error}`);
66
+ return;
67
+ }
68
+ const detail = report.mode === "community"
69
+ ? "models.dev + LiteLLM, fetched live"
70
+ : [
71
+ report.file,
72
+ report.fetchedAt ? `built ${report.fetchedAt.slice(0, 10)}, ${report.ageDays}d old` : "build date unknown",
73
+ ]
74
+ .filter(Boolean)
75
+ .join(", ");
76
+ const mode = report.mode === "community" ? report.mode : c(GREEN, report.mode ?? "");
77
+ console.log(`${c(CYAN, "Catalog source:")} ${mode} ${c(DIM, `(${detail}; set by ${report.origin})`)}`);
78
+ }
59
79
  /**
60
80
  * The subset of deprecation findings that trip the CI gate, or an empty array
61
81
  * when CI mode is off (no `--ci` / `--fail-on-warning`) so {@link cmdDoctor}
@@ -101,7 +121,10 @@ function parseDeprecationWindow(raw) {
101
121
  function parseModelScope(raw) {
102
122
  if (typeof raw !== "string")
103
123
  return undefined;
104
- const ids = Array.from(new Set(raw.split(",").map((id) => id.trim()).filter(Boolean)));
124
+ const ids = Array.from(new Set(raw
125
+ .split(",")
126
+ .map((id) => id.trim())
127
+ .filter(Boolean)));
105
128
  return ids.length > 0 ? ids : undefined;
106
129
  }
107
130
  /**
@@ -250,11 +273,7 @@ function renderHealth(findings) {
250
273
  return;
251
274
  }
252
275
  for (const h of findings) {
253
- const tag = h.available
254
- ? h.reliabilityScore >= 0.95
255
- ? c(GREEN, "ok")
256
- : c(YELLOW, "degraded")
257
- : c(RED, "open");
276
+ const tag = h.available ? (h.reliabilityScore >= 0.95 ? c(GREEN, "ok") : c(YELLOW, "degraded")) : c(RED, "open");
258
277
  const p95 = h.p95LatencyMs !== null ? `${h.p95LatencyMs}ms` : "no samples";
259
278
  const reliability = (h.reliabilityScore * 100).toFixed(0);
260
279
  process.stdout.write(` ${tag} ${h.providerId.padEnd(14)} ${c(DIM, `reliability=${reliability}%`)} ${c(DIM, `p95=${p95}`)}\n`);
@@ -1 +1 @@
1
- {"version":3,"file":"cli-cmd-doctor.js","sourceRoot":"","sources":["../src/cli-cmd-doctor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli-cmd-doctor.js","sourceRoot":"","sources":["../src/cli-cmd-doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAsB,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAoBzE,6EAA6E;AAC7E,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAErC,gFAAgF;AAChF,MAAM,CAAC,MAAM,iCAAiC,GAAG,EAAE,CAAC;AAsBpD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAuB,EAAE,KAAuC;IAC/F,MAAM,CAAC,GAAgB,KAAK,CAAC;IAE7B,qEAAqE;IACrE,4CAA4C;IAC5C,IAAI,CAAC;QACJ,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACR,sEAAsE;QACtE,iDAAiD;IAClD,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,eAAe,EAAE,CAAC;IACxC,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACjE,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;IAC1E,MAAM,YAAY,GAAG,MAAM;QAC1B,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC,MAAM,CAAC,EAAE,GAAG,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrE,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC/B,wEAAwE;IACxE,wDAAwD;IACxD,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;IAC1E,MAAM,SAAS,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,cAAc,GAAG,SAAS;SAC9B,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;SACxD,MAAM,CAAC,CAAC,GAAG,EAAwB,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;IAEtD,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IACzG,CAAC;SAAM,CAAC;QACP,aAAa,CAAC,OAAO,CAAC,CAAC;QACvB,kBAAkB,CAAC,YAAY,CAAC,CAAC;QACjC,YAAY,CAAC,cAAc,CAAC,CAAC;IAC9B,CAAC;IAED,2EAA2E;IAC3E,0EAA0E;IAC1E,yEAAyE;IACzE,mDAAmD;IACnD,MAAM,UAAU,GAAG,iBAAiB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC/C,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,sBAAsB,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC;QACnE,OAAO,CAAC,KAAK,CACZ,CAAC,CAAC,GAAG,EAAE,iBAAiB,UAAU,CAAC,MAAM,oDAAoD,UAAU,KAAK,CAAC,CAC7G,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACnC,CAAC;AACF,CAAC;AAED,4EAA4E;AAC5E,SAAS,aAAa,CAAC,MAAqB;IAC3C,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,iBAAiB,CAAC,IAAI,MAAM,CAAC,IAAI,IAAI,SAAS,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC1F,OAAO;IACR,CAAC;IACD,MAAM,MAAM,GACX,MAAM,CAAC,IAAI,KAAK,WAAW;QAC1B,CAAC,CAAC,oCAAoC;QACtC,CAAC,CAAC;YACA,MAAM,CAAC,IAAI;YACX,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,MAAM,CAAC,OAAO,OAAO,CAAC,CAAC,CAAC,oBAAoB;SAC1G;aACC,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACrF,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,MAAM,YAAY,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC;AACxG,CAAC;AAED;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,CAAc,EAAE,QAA8B;IACxE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAC7B,MAAM,UAAU,GAAG,sBAAsB,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC;IACnE,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,iFAAiF;AACjF,SAAS,SAAS,CAAC,CAAc;IAChC,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED;;;;GAIG;AACH,SAAS,WAAW,CAAC,OAA2B,EAAE,UAAkB;IACnE,IAAI,OAAO,CAAC,MAAM,KAAK,YAAY,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACjH,IAAI,OAAO,CAAC,eAAe,KAAK,IAAI,IAAI,OAAO,CAAC,eAAe,IAAI,UAAU;QAAE,OAAO,IAAI,CAAC;IAC3F,OAAO,KAAK,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,SAAS,sBAAsB,CAAC,GAAiC;IAChE,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QACxD,OAAO,iCAAiC,CAAC;IAC1C,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC;QAAE,OAAO,iCAAiC,CAAC;IACrF,OAAO,MAAM,CAAC;AACf,CAAC;AAQD,+EAA+E;AAC/E,SAAS,eAAe,CAAC,GAAiC;IACzD,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC9C,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CACrB,IAAI,GAAG,CACN,GAAG;SACD,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;SACtB,MAAM,CAAC,OAAO,CAAC,CACjB,CACD,CAAC;IACF,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AACzC,CAAC;AAED;;;;;GAKG;AACH,SAAS,WAAW,CAAC,QAAuB,EAAE,MAAqB;IAClE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAa,CAAC;IAClC,KAAK,MAAM,EAAE,QAAQ,EAAE,IAAI,MAAM,EAAE,CAAC;QACnC,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC;YAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,YAAY,CAAC,QAAuB,EAAE,KAAe;IAC7D,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;AACzF,CAAC;AAED;;;;GAIG;AACH,SAAS,cAAc,CAAC,MAAqB,EAAE,MAAmB;IACjE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACzF,OAAO,MAAM;SACX,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;SAChF,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QAClC,OAAO,EAAE,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,KAAK,QAAQ,GAAG;QAC1E,QAAQ,EAAE,GAAG;QACb,MAAM,EAAE,SAAS;QACjB,eAAe,EAAE,IAAI;QACrB,eAAe,EAAE,IAAI;QACrB,UAAU,EAAE,IAAI;KAChB,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;;;;GAKG;AACH,SAAS,aAAa,CAAC,QAA8B,EAAE,MAAmB;IACzE,MAAM,MAAM,GAAG,CAAC,EAAU,EAAU,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC1E,MAAM,cAAc,GAAG,IAAI,GAAG,EAAuB,CAAC;IACtD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7B,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,QAAQ,GAAG,CAAC,KAAgB,EAAW,EAAE,CAC9C,KAAK,CAAC,QAAQ,KAAK,CAAC,KAAK,CAAC,cAAc,IAAI,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChG,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,SAAS,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAElG,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;QAClC,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QAC9C,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACjE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1G,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,IAAI,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACjC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,SAAS,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAmB;IAC/C,MAAM,KAAK,GAAG,OAAO,EAAE,CAAC;IACxB,MAAM,QAAQ,GAAyB,EAAE,CAAC;IAC1C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC;QACpC,MAAM,eAAe,GAAG,KAAK,CAAC,eAAe,IAAI,IAAI,CAAC;QACtD,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC;QAE5C,IAAI,CAAC,MAAM,IAAI,CAAC,eAAe,IAAI,CAAC,UAAU;YAAE,SAAS;QACzD,IAAI,MAAM,KAAK,YAAY,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,eAAe;YAAE,SAAS;QAElF,QAAQ,CAAC,IAAI,CAAC;YACb,OAAO,EAAE,KAAK,CAAC,EAAE;YACjB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,MAAM;YACN,eAAe;YACf,eAAe,EAAE,eAAe,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI;YAC7E,UAAU;SACV,CAAC,CAAC;IACJ,CAAC;IACD,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACtB,0DAA0D;QAC1D,MAAM,IAAI,GAAG,CAAC,CAAC,eAAe,IAAI,MAAM,CAAC,iBAAiB,CAAC;QAC3D,MAAM,IAAI,GAAG,CAAC,CAAC,eAAe,IAAI,MAAM,CAAC,iBAAiB,CAAC;QAC3D,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,GAAG,IAAI,CAAC;QACtC,OAAO,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAmB;IAC7C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAClE,CAAC;AAED,SAAS,aAAa,CAAC,QAAuB,EAAE,UAAkB;IACjE,IAAI,CAAC;QACJ,MAAM,CAAC,GAAG,QAAQ,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;QACnD,OAAO;YACN,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,gBAAgB,EAAE,CAAC,CAAC,gBAAgB;YACpC,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,WAAW,EAAE,CAAC,CAAC,WAAW;SAC1B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED,SAAS,kBAAkB,CAAC,QAA8B;IACzD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACxD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,2DAA2D,CAAC,CAAC,CAAC;QAC1F,OAAO;IACR,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,CAAC,CAAC,eAAe,CAAC;QAC/B,IAAI,GAAW,CAAC;QAChB,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS;YAAE,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;aAC/C,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS;YAAE,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;aACpD,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,EAAE;YAAE,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,cAAc,IAAI,GAAG,CAAC,CAAC;aACrE,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,EAAE;YAAE,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,cAAc,IAAI,GAAG,CAAC,CAAC;aACxE,IAAI,CAAC,CAAC,MAAM,KAAK,YAAY;YAAE,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;aAC7D,IAAI,IAAI,KAAK,IAAI;YAAE,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,cAAc,IAAI,GAAG,CAAC,CAAC;;YACvD,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC;QAEzC,MAAM,WAAW,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,OAAO,GAAG,WAAW,IAAI,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,YAAY,CAAC,QAAyB;IAC9C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACxD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,8DAA8D,CAAC,CAAC,CAAC;QAC7F,OAAO;IACR,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACjH,MAAM,GAAG,GAAG,CAAC,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC;QAC3E,MAAM,WAAW,GAAG,CAAC,CAAC,CAAC,gBAAgB,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,MAAM,CAAC,KAAK,CACnB,KAAK,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,eAAe,WAAW,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,OAAO,GAAG,EAAE,CAAC,IAAI,CAC1G,CAAC;IACH,CAAC;AACF,CAAC;AAED,SAAS,WAAW,CAAC,KAAa,EAAE,OAAe;IAClD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACjC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,UAAU,CAAC,CAAC;AAChD,CAAC;AAED;;;GAGG;AACH,SAAS,OAAO;IACf,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACzB,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC;AACtB,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * `kosha registry export` — write the current catalog to a file.
3
+ *
4
+ * The output uses the same envelope as kosha's weekly snapshot, so it can
5
+ * be fed straight back in as a `local` catalog
6
+ * (`KOSHA_CATALOG_SOURCE=local KOSHA_CATALOG_FILE=<file>`), e.g. on an
7
+ * air-gapped machine or to freeze a catalog you have reviewed.
8
+ * @module
9
+ */
10
+ import type { ModelRegistry } from "./registry.js";
11
+ export declare function cmdRegistry(registry: ModelRegistry, subcommand: string | undefined, flags: Record<string, string | boolean>): Promise<void>;
12
+ //# sourceMappingURL=cli-cmd-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-cmd-registry.d.ts","sourceRoot":"","sources":["../src/cli-cmd-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,wBAAsB,WAAW,CAChC,QAAQ,EAAE,aAAa,EACvB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GACrC,OAAO,CAAC,IAAI,CAAC,CA4Bf"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * `kosha registry export` — write the current catalog to a file.
3
+ *
4
+ * The output uses the same envelope as kosha's weekly snapshot, so it can
5
+ * be fed straight back in as a `local` catalog
6
+ * (`KOSHA_CATALOG_SOURCE=local KOSHA_CATALOG_FILE=<file>`), e.g. on an
7
+ * air-gapped machine or to freeze a catalog you have reviewed.
8
+ * @module
9
+ */
10
+ import { rename, writeFile } from "node:fs/promises";
11
+ import { resolve } from "node:path";
12
+ import { buildCatalogEnvelope, resolveCatalogSource } from "./catalog-source.js";
13
+ import { c, DIM, GREEN, RED } from "./cli-format.js";
14
+ export async function cmdRegistry(registry, subcommand, flags) {
15
+ if (subcommand !== "export") {
16
+ console.error(c(RED, `Unknown registry subcommand: "${subcommand ?? ""}"`));
17
+ console.error(c(DIM, "Usage: kosha registry export [--output <file>] [--provider <id>]"));
18
+ process.exit(1);
19
+ }
20
+ const provider = typeof flags.provider === "string" ? flags.provider : undefined;
21
+ const result = await registry.fetchLatestDetails({ providers: provider ? [provider] : undefined });
22
+ const envelope = buildCatalogEnvelope(result.providers, {
23
+ discoveredAt: result.discoveredAt,
24
+ providerScope: provider ?? "all",
25
+ });
26
+ const json = `${JSON.stringify(envelope, null, 2)}\n`;
27
+ if (typeof flags.output !== "string") {
28
+ process.stdout.write(json);
29
+ return;
30
+ }
31
+ // Write beside the target and rename, so a reader never sees half a file.
32
+ const target = resolve(flags.output);
33
+ const temp = `${target}.${process.pid}.tmp`;
34
+ await writeFile(temp, json, { encoding: "utf8", mode: 0o644 });
35
+ await rename(temp, target);
36
+ console.error(c(GREEN, `Wrote ${envelope.modelCount} models from ${envelope.providerCount} providers`) +
37
+ c(DIM, ` (catalog source: ${resolveCatalogSource().mode}) → ${target}`));
38
+ }
39
+ //# sourceMappingURL=cli-cmd-registry.js.map