@zhachory1/mewrite-ai 0.65.3

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 (238) hide show
  1. package/README.md +1330 -0
  2. package/dist/api-registry.d.ts +20 -0
  3. package/dist/api-registry.d.ts.map +1 -0
  4. package/dist/api-registry.js +44 -0
  5. package/dist/api-registry.js.map +1 -0
  6. package/dist/bedrock-provider.d.ts +5 -0
  7. package/dist/bedrock-provider.d.ts.map +1 -0
  8. package/dist/bedrock-provider.js +6 -0
  9. package/dist/bedrock-provider.js.map +1 -0
  10. package/dist/cache/__tests__/compaction.test.d.ts +2 -0
  11. package/dist/cache/__tests__/compaction.test.d.ts.map +1 -0
  12. package/dist/cache/__tests__/compaction.test.js +100 -0
  13. package/dist/cache/__tests__/compaction.test.js.map +1 -0
  14. package/dist/cache/__tests__/layers.test.d.ts +2 -0
  15. package/dist/cache/__tests__/layers.test.d.ts.map +1 -0
  16. package/dist/cache/__tests__/layers.test.js +71 -0
  17. package/dist/cache/__tests__/layers.test.js.map +1 -0
  18. package/dist/cache/__tests__/policy.test.d.ts +2 -0
  19. package/dist/cache/__tests__/policy.test.d.ts.map +1 -0
  20. package/dist/cache/__tests__/policy.test.js +79 -0
  21. package/dist/cache/__tests__/policy.test.js.map +1 -0
  22. package/dist/cache/__tests__/tool-serializer.test.d.ts +2 -0
  23. package/dist/cache/__tests__/tool-serializer.test.d.ts.map +1 -0
  24. package/dist/cache/__tests__/tool-serializer.test.js +64 -0
  25. package/dist/cache/__tests__/tool-serializer.test.js.map +1 -0
  26. package/dist/cache/compaction.d.ts +30 -0
  27. package/dist/cache/compaction.d.ts.map +1 -0
  28. package/dist/cache/compaction.js +50 -0
  29. package/dist/cache/compaction.js.map +1 -0
  30. package/dist/cache/index.d.ts +5 -0
  31. package/dist/cache/index.d.ts.map +1 -0
  32. package/dist/cache/index.js +5 -0
  33. package/dist/cache/index.js.map +1 -0
  34. package/dist/cache/layers.d.ts +17 -0
  35. package/dist/cache/layers.d.ts.map +1 -0
  36. package/dist/cache/layers.js +48 -0
  37. package/dist/cache/layers.js.map +1 -0
  38. package/dist/cache/policy.d.ts +40 -0
  39. package/dist/cache/policy.d.ts.map +1 -0
  40. package/dist/cache/policy.js +50 -0
  41. package/dist/cache/policy.js.map +1 -0
  42. package/dist/cache/tool-serializer.d.ts +8 -0
  43. package/dist/cache/tool-serializer.d.ts.map +1 -0
  44. package/dist/cache/tool-serializer.js +35 -0
  45. package/dist/cache/tool-serializer.js.map +1 -0
  46. package/dist/cli.d.ts +3 -0
  47. package/dist/cli.d.ts.map +1 -0
  48. package/dist/cli.js +116 -0
  49. package/dist/cli.js.map +1 -0
  50. package/dist/env-api-keys.d.ts +27 -0
  51. package/dist/env-api-keys.d.ts.map +1 -0
  52. package/dist/env-api-keys.js +223 -0
  53. package/dist/env-api-keys.js.map +1 -0
  54. package/dist/index.d.ts +32 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +21 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/models.d.ts +34 -0
  59. package/dist/models.d.ts.map +1 -0
  60. package/dist/models.generated.d.ts +14370 -0
  61. package/dist/models.generated.d.ts.map +1 -0
  62. package/dist/models.generated.js +14181 -0
  63. package/dist/models.generated.js.map +1 -0
  64. package/dist/models.js +140 -0
  65. package/dist/models.js.map +1 -0
  66. package/dist/oauth.d.ts +2 -0
  67. package/dist/oauth.d.ts.map +1 -0
  68. package/dist/oauth.js +2 -0
  69. package/dist/oauth.js.map +1 -0
  70. package/dist/providers/amazon-bedrock.d.ts +20 -0
  71. package/dist/providers/amazon-bedrock.d.ts.map +1 -0
  72. package/dist/providers/amazon-bedrock.js +651 -0
  73. package/dist/providers/amazon-bedrock.js.map +1 -0
  74. package/dist/providers/anthropic-capabilities.d.ts +65 -0
  75. package/dist/providers/anthropic-capabilities.d.ts.map +1 -0
  76. package/dist/providers/anthropic-capabilities.js +155 -0
  77. package/dist/providers/anthropic-capabilities.js.map +1 -0
  78. package/dist/providers/anthropic-discovery.d.ts +49 -0
  79. package/dist/providers/anthropic-discovery.d.ts.map +1 -0
  80. package/dist/providers/anthropic-discovery.js +218 -0
  81. package/dist/providers/anthropic-discovery.js.map +1 -0
  82. package/dist/providers/anthropic.d.ts +40 -0
  83. package/dist/providers/anthropic.d.ts.map +1 -0
  84. package/dist/providers/anthropic.js +766 -0
  85. package/dist/providers/anthropic.js.map +1 -0
  86. package/dist/providers/azure-openai-responses.d.ts +15 -0
  87. package/dist/providers/azure-openai-responses.d.ts.map +1 -0
  88. package/dist/providers/azure-openai-responses.js +176 -0
  89. package/dist/providers/azure-openai-responses.js.map +1 -0
  90. package/dist/providers/faux.d.ts +56 -0
  91. package/dist/providers/faux.d.ts.map +1 -0
  92. package/dist/providers/faux.js +367 -0
  93. package/dist/providers/faux.js.map +1 -0
  94. package/dist/providers/github-copilot-headers.d.ts +8 -0
  95. package/dist/providers/github-copilot-headers.d.ts.map +1 -0
  96. package/dist/providers/github-copilot-headers.js +29 -0
  97. package/dist/providers/github-copilot-headers.js.map +1 -0
  98. package/dist/providers/google-gemini-cli.d.ts +74 -0
  99. package/dist/providers/google-gemini-cli.d.ts.map +1 -0
  100. package/dist/providers/google-gemini-cli.js +776 -0
  101. package/dist/providers/google-gemini-cli.js.map +1 -0
  102. package/dist/providers/google-shared.d.ts +65 -0
  103. package/dist/providers/google-shared.d.ts.map +1 -0
  104. package/dist/providers/google-shared.js +312 -0
  105. package/dist/providers/google-shared.js.map +1 -0
  106. package/dist/providers/google-vertex.d.ts +15 -0
  107. package/dist/providers/google-vertex.d.ts.map +1 -0
  108. package/dist/providers/google-vertex.js +419 -0
  109. package/dist/providers/google-vertex.js.map +1 -0
  110. package/dist/providers/google.d.ts +13 -0
  111. package/dist/providers/google.d.ts.map +1 -0
  112. package/dist/providers/google.js +374 -0
  113. package/dist/providers/google.js.map +1 -0
  114. package/dist/providers/mistral.d.ts +22 -0
  115. package/dist/providers/mistral.d.ts.map +1 -0
  116. package/dist/providers/mistral.js +501 -0
  117. package/dist/providers/mistral.js.map +1 -0
  118. package/dist/providers/openai-codex-responses.d.ts +9 -0
  119. package/dist/providers/openai-codex-responses.d.ts.map +1 -0
  120. package/dist/providers/openai-codex-responses.js +741 -0
  121. package/dist/providers/openai-codex-responses.js.map +1 -0
  122. package/dist/providers/openai-completions.d.ts +15 -0
  123. package/dist/providers/openai-completions.d.ts.map +1 -0
  124. package/dist/providers/openai-completions.js +753 -0
  125. package/dist/providers/openai-completions.js.map +1 -0
  126. package/dist/providers/openai-responses-shared.d.ts +17 -0
  127. package/dist/providers/openai-responses-shared.d.ts.map +1 -0
  128. package/dist/providers/openai-responses-shared.js +470 -0
  129. package/dist/providers/openai-responses-shared.js.map +1 -0
  130. package/dist/providers/openai-responses.d.ts +13 -0
  131. package/dist/providers/openai-responses.d.ts.map +1 -0
  132. package/dist/providers/openai-responses.js +190 -0
  133. package/dist/providers/openai-responses.js.map +1 -0
  134. package/dist/providers/register-builtins.d.ts +38 -0
  135. package/dist/providers/register-builtins.d.ts.map +1 -0
  136. package/dist/providers/register-builtins.js +261 -0
  137. package/dist/providers/register-builtins.js.map +1 -0
  138. package/dist/providers/simple-options.d.ts +8 -0
  139. package/dist/providers/simple-options.d.ts.map +1 -0
  140. package/dist/providers/simple-options.js +35 -0
  141. package/dist/providers/simple-options.js.map +1 -0
  142. package/dist/providers/transform-messages.d.ts +8 -0
  143. package/dist/providers/transform-messages.d.ts.map +1 -0
  144. package/dist/providers/transform-messages.js +155 -0
  145. package/dist/providers/transform-messages.js.map +1 -0
  146. package/dist/registry/fetcher.d.ts +26 -0
  147. package/dist/registry/fetcher.d.ts.map +1 -0
  148. package/dist/registry/fetcher.js +69 -0
  149. package/dist/registry/fetcher.js.map +1 -0
  150. package/dist/registry/index.d.ts +8 -0
  151. package/dist/registry/index.d.ts.map +1 -0
  152. package/dist/registry/index.js +8 -0
  153. package/dist/registry/index.js.map +1 -0
  154. package/dist/registry/loader.d.ts +38 -0
  155. package/dist/registry/loader.d.ts.map +1 -0
  156. package/dist/registry/loader.js +90 -0
  157. package/dist/registry/loader.js.map +1 -0
  158. package/dist/registry/merger.d.ts +21 -0
  159. package/dist/registry/merger.d.ts.map +1 -0
  160. package/dist/registry/merger.js +90 -0
  161. package/dist/registry/merger.js.map +1 -0
  162. package/dist/registry/schema.d.ts +130 -0
  163. package/dist/registry/schema.d.ts.map +1 -0
  164. package/dist/registry/schema.js +103 -0
  165. package/dist/registry/schema.js.map +1 -0
  166. package/dist/stream.d.ts +8 -0
  167. package/dist/stream.d.ts.map +1 -0
  168. package/dist/stream.js +27 -0
  169. package/dist/stream.js.map +1 -0
  170. package/dist/types.d.ts +296 -0
  171. package/dist/types.d.ts.map +1 -0
  172. package/dist/types.js +2 -0
  173. package/dist/types.js.map +1 -0
  174. package/dist/utils/event-stream.d.ts +21 -0
  175. package/dist/utils/event-stream.d.ts.map +1 -0
  176. package/dist/utils/event-stream.js +81 -0
  177. package/dist/utils/event-stream.js.map +1 -0
  178. package/dist/utils/hash.d.ts +3 -0
  179. package/dist/utils/hash.d.ts.map +1 -0
  180. package/dist/utils/hash.js +14 -0
  181. package/dist/utils/hash.js.map +1 -0
  182. package/dist/utils/json-parse.d.ts +9 -0
  183. package/dist/utils/json-parse.d.ts.map +1 -0
  184. package/dist/utils/json-parse.js +29 -0
  185. package/dist/utils/json-parse.js.map +1 -0
  186. package/dist/utils/oauth/anthropic.d.ts +25 -0
  187. package/dist/utils/oauth/anthropic.d.ts.map +1 -0
  188. package/dist/utils/oauth/anthropic.js +336 -0
  189. package/dist/utils/oauth/anthropic.js.map +1 -0
  190. package/dist/utils/oauth/github-copilot.d.ts +30 -0
  191. package/dist/utils/oauth/github-copilot.d.ts.map +1 -0
  192. package/dist/utils/oauth/github-copilot.js +293 -0
  193. package/dist/utils/oauth/github-copilot.js.map +1 -0
  194. package/dist/utils/oauth/google-antigravity.d.ts +26 -0
  195. package/dist/utils/oauth/google-antigravity.d.ts.map +1 -0
  196. package/dist/utils/oauth/google-antigravity.js +376 -0
  197. package/dist/utils/oauth/google-antigravity.js.map +1 -0
  198. package/dist/utils/oauth/google-gemini-cli.d.ts +26 -0
  199. package/dist/utils/oauth/google-gemini-cli.d.ts.map +1 -0
  200. package/dist/utils/oauth/google-gemini-cli.js +482 -0
  201. package/dist/utils/oauth/google-gemini-cli.js.map +1 -0
  202. package/dist/utils/oauth/index.d.ts +61 -0
  203. package/dist/utils/oauth/index.d.ts.map +1 -0
  204. package/dist/utils/oauth/index.js +131 -0
  205. package/dist/utils/oauth/index.js.map +1 -0
  206. package/dist/utils/oauth/oauth-page.d.ts +3 -0
  207. package/dist/utils/oauth/oauth-page.d.ts.map +1 -0
  208. package/dist/utils/oauth/oauth-page.js +105 -0
  209. package/dist/utils/oauth/oauth-page.js.map +1 -0
  210. package/dist/utils/oauth/openai-codex.d.ts +34 -0
  211. package/dist/utils/oauth/openai-codex.d.ts.map +1 -0
  212. package/dist/utils/oauth/openai-codex.js +374 -0
  213. package/dist/utils/oauth/openai-codex.js.map +1 -0
  214. package/dist/utils/oauth/pkce.d.ts +13 -0
  215. package/dist/utils/oauth/pkce.d.ts.map +1 -0
  216. package/dist/utils/oauth/pkce.js +31 -0
  217. package/dist/utils/oauth/pkce.js.map +1 -0
  218. package/dist/utils/oauth/types.d.ts +49 -0
  219. package/dist/utils/oauth/types.d.ts.map +1 -0
  220. package/dist/utils/oauth/types.js +2 -0
  221. package/dist/utils/oauth/types.js.map +1 -0
  222. package/dist/utils/overflow.d.ts +53 -0
  223. package/dist/utils/overflow.d.ts.map +1 -0
  224. package/dist/utils/overflow.js +132 -0
  225. package/dist/utils/overflow.js.map +1 -0
  226. package/dist/utils/sanitize-unicode.d.ts +22 -0
  227. package/dist/utils/sanitize-unicode.d.ts.map +1 -0
  228. package/dist/utils/sanitize-unicode.js +26 -0
  229. package/dist/utils/sanitize-unicode.js.map +1 -0
  230. package/dist/utils/typebox-helpers.d.ts +17 -0
  231. package/dist/utils/typebox-helpers.d.ts.map +1 -0
  232. package/dist/utils/typebox-helpers.js +21 -0
  233. package/dist/utils/typebox-helpers.js.map +1 -0
  234. package/dist/utils/validation.d.ts +18 -0
  235. package/dist/utils/validation.d.ts.map +1 -0
  236. package/dist/utils/validation.js +80 -0
  237. package/dist/utils/validation.js.map +1 -0
  238. package/package.json +129 -0
@@ -0,0 +1,90 @@
1
+ /**
2
+ * WS15: Registry merger — convert RegistryProvider entries into the
3
+ * @zhachory1/mewrite-ai Model<Api> shape so they can be injected into ModelRegistry.
4
+ *
5
+ * Compatibility constraint: existing model-registry.ts consumers keep
6
+ * working. The merger produces models in the same shape as getModels()
7
+ * outputs — existing code paths are unchanged.
8
+ */
9
+ // ---------------------------------------------------------------------------
10
+ // Kind → Api mapping
11
+ // ---------------------------------------------------------------------------
12
+ /** Map registry provider kinds to the @zhachory1/mewrite-ai Api string */
13
+ function kindToApi(kind) {
14
+ switch (kind) {
15
+ case "anthropic":
16
+ return "anthropic";
17
+ case "openai":
18
+ return "openai-responses";
19
+ case "google":
20
+ return "google";
21
+ case "openrouter":
22
+ return "openai-completions";
23
+ case "mistral":
24
+ return "openai-completions";
25
+ case "bedrock":
26
+ return "bedrock-converse-stream";
27
+ case "gemini-cli":
28
+ return "google";
29
+ case "vertex":
30
+ return "google-vertex";
31
+ case "xai":
32
+ return "openai-completions";
33
+ case "groq":
34
+ return "openai-completions";
35
+ case "cerebras":
36
+ return "openai-completions";
37
+ case "other":
38
+ return "openai-completions";
39
+ default:
40
+ return undefined;
41
+ }
42
+ }
43
+ // ---------------------------------------------------------------------------
44
+ // Converter
45
+ // ---------------------------------------------------------------------------
46
+ /**
47
+ * Convert a single RegistryModel + its parent RegistryProvider into
48
+ * the Model<Api> shape used by @zhachory1/mewrite-ai's internal registry.
49
+ */
50
+ export function registryModelToModel(provider, model) {
51
+ const api = kindToApi(provider.kind);
52
+ if (!api)
53
+ return undefined;
54
+ const caps = model.capabilities ?? [];
55
+ return {
56
+ id: model.id,
57
+ name: model.displayName,
58
+ api,
59
+ provider: provider.id,
60
+ baseUrl: provider.baseUrl ?? "",
61
+ reasoning: caps.includes("reasoning"),
62
+ input: caps.includes("vision") ? ["text", "image"] : ["text"],
63
+ cost: {
64
+ input: model.inputCostPerMtok ?? 0,
65
+ output: model.outputCostPerMtok ?? 0,
66
+ cacheRead: 0,
67
+ cacheWrite: 0,
68
+ },
69
+ contextWindow: model.contextWindow,
70
+ maxTokens: model.maxOutputTokens ?? 16384,
71
+ headers: undefined,
72
+ compat: undefined,
73
+ };
74
+ }
75
+ /**
76
+ * Convert all models from a Registry into Model<Api>[] entries.
77
+ * Unknown provider kinds are silently skipped.
78
+ */
79
+ export function registryToModels(registry) {
80
+ const result = [];
81
+ for (const provider of registry.providers) {
82
+ for (const model of provider.models) {
83
+ const m = registryModelToModel(provider, model);
84
+ if (m)
85
+ result.push(m);
86
+ }
87
+ }
88
+ return result;
89
+ }
90
+ //# sourceMappingURL=merger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merger.js","sourceRoot":"","sources":["../../src/registry/merger.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,8EAA8E;AAC9E,uBAAqB;AACrB,8EAA8E;AAE9E,0EAA0E;AAC1E,SAAS,SAAS,CAAC,IAA8B,EAAmB;IACnE,QAAQ,IAAI,EAAE,CAAC;QACd,KAAK,WAAW;YACf,OAAO,WAAW,CAAC;QACpB,KAAK,QAAQ;YACZ,OAAO,kBAAkB,CAAC;QAC3B,KAAK,QAAQ;YACZ,OAAO,QAAQ,CAAC;QACjB,KAAK,YAAY;YAChB,OAAO,oBAAoB,CAAC;QAC7B,KAAK,SAAS;YACb,OAAO,oBAAoB,CAAC;QAC7B,KAAK,SAAS;YACb,OAAO,yBAAyB,CAAC;QAClC,KAAK,YAAY;YAChB,OAAO,QAAQ,CAAC;QACjB,KAAK,QAAQ;YACZ,OAAO,eAAe,CAAC;QACxB,KAAK,KAAK;YACT,OAAO,oBAAoB,CAAC;QAC7B,KAAK,MAAM;YACV,OAAO,oBAAoB,CAAC;QAC7B,KAAK,UAAU;YACd,OAAO,oBAAoB,CAAC;QAC7B,KAAK,OAAO;YACX,OAAO,oBAAoB,CAAC;QAC7B;YACC,OAAO,SAAS,CAAC;IACnB,CAAC;AAAA,CACD;AAED,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAA0B,EAAE,KAAoB,EAA0B;IAC9G,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAE3B,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC;IAEtC,OAAO;QACN,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,IAAI,EAAE,KAAK,CAAC,WAAW;QACvB,GAAG;QACH,QAAQ,EAAE,QAAQ,CAAC,EAAE;QACrB,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,EAAE;QAC/B,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;QACrC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC7D,IAAI,EAAE;YACL,KAAK,EAAE,KAAK,CAAC,gBAAgB,IAAI,CAAC;YAClC,MAAM,EAAE,KAAK,CAAC,iBAAiB,IAAI,CAAC;YACpC,SAAS,EAAE,CAAC;YACZ,UAAU,EAAE,CAAC;SACb;QACD,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,SAAS,EAAE,KAAK,CAAC,eAAe,IAAI,KAAK;QACzC,OAAO,EAAE,SAAS;QAClB,MAAM,EAAE,SAAS;KACH,CAAC;AAAA,CAChB;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAkB,EAAgB;IAClE,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,KAAK,MAAM,QAAQ,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;QAC3C,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACrC,MAAM,CAAC,GAAG,oBAAoB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAChD,IAAI,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;IACF,CAAC;IACD,OAAO,MAAM,CAAC;AAAA,CACd","sourcesContent":["/**\n * WS15: Registry merger — convert RegistryProvider entries into the\n * @zhachory1/mewrite-ai Model<Api> shape so they can be injected into ModelRegistry.\n *\n * Compatibility constraint: existing model-registry.ts consumers keep\n * working. The merger produces models in the same shape as getModels()\n * outputs — existing code paths are unchanged.\n */\n\nimport type { Api, Model } from \"../types.js\";\nimport type { Registry, RegistryModel, RegistryProvider } from \"./schema.js\";\n\n// ---------------------------------------------------------------------------\n// Kind → Api mapping\n// ---------------------------------------------------------------------------\n\n/** Map registry provider kinds to the @zhachory1/mewrite-ai Api string */\nfunction kindToApi(kind: RegistryProvider[\"kind\"]): Api | undefined {\n\tswitch (kind) {\n\t\tcase \"anthropic\":\n\t\t\treturn \"anthropic\";\n\t\tcase \"openai\":\n\t\t\treturn \"openai-responses\";\n\t\tcase \"google\":\n\t\t\treturn \"google\";\n\t\tcase \"openrouter\":\n\t\t\treturn \"openai-completions\";\n\t\tcase \"mistral\":\n\t\t\treturn \"openai-completions\";\n\t\tcase \"bedrock\":\n\t\t\treturn \"bedrock-converse-stream\";\n\t\tcase \"gemini-cli\":\n\t\t\treturn \"google\";\n\t\tcase \"vertex\":\n\t\t\treturn \"google-vertex\";\n\t\tcase \"xai\":\n\t\t\treturn \"openai-completions\";\n\t\tcase \"groq\":\n\t\t\treturn \"openai-completions\";\n\t\tcase \"cerebras\":\n\t\t\treturn \"openai-completions\";\n\t\tcase \"other\":\n\t\t\treturn \"openai-completions\";\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Converter\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a single RegistryModel + its parent RegistryProvider into\n * the Model<Api> shape used by @zhachory1/mewrite-ai's internal registry.\n */\nexport function registryModelToModel(provider: RegistryProvider, model: RegistryModel): Model<Api> | undefined {\n\tconst api = kindToApi(provider.kind);\n\tif (!api) return undefined;\n\n\tconst caps = model.capabilities ?? [];\n\n\treturn {\n\t\tid: model.id,\n\t\tname: model.displayName,\n\t\tapi,\n\t\tprovider: provider.id,\n\t\tbaseUrl: provider.baseUrl ?? \"\",\n\t\treasoning: caps.includes(\"reasoning\"),\n\t\tinput: caps.includes(\"vision\") ? [\"text\", \"image\"] : [\"text\"],\n\t\tcost: {\n\t\t\tinput: model.inputCostPerMtok ?? 0,\n\t\t\toutput: model.outputCostPerMtok ?? 0,\n\t\t\tcacheRead: 0,\n\t\t\tcacheWrite: 0,\n\t\t},\n\t\tcontextWindow: model.contextWindow,\n\t\tmaxTokens: model.maxOutputTokens ?? 16384,\n\t\theaders: undefined,\n\t\tcompat: undefined,\n\t} as Model<Api>;\n}\n\n/**\n * Convert all models from a Registry into Model<Api>[] entries.\n * Unknown provider kinds are silently skipped.\n */\nexport function registryToModels(registry: Registry): Model<Api>[] {\n\tconst result: Model<Api>[] = [];\n\tfor (const provider of registry.providers) {\n\t\tfor (const model of provider.models) {\n\t\t\tconst m = registryModelToModel(provider, model);\n\t\t\tif (m) result.push(m);\n\t\t}\n\t}\n\treturn result;\n}\n"]}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * WS15: Catwalk-style provider/model registry schema.
3
+ *
4
+ * Registry JSON schema defined with @sinclair/typebox (matches existing
5
+ * @zhachory1/mewrite-ai conventions — ajv + typebox, no zod dependency).
6
+ *
7
+ * Validation: use validateRegistry() which returns a typed result.
8
+ */
9
+ import { type Static } from "@sinclair/typebox";
10
+ export declare const RegistryModelCapabilitySchema: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"tools">, import("@sinclair/typebox").TLiteral<"vision">, import("@sinclair/typebox").TLiteral<"cache">, import("@sinclair/typebox").TLiteral<"reasoning">]>;
11
+ export declare const RegistryModelSchema: import("@sinclair/typebox").TObject<{
12
+ /** Canonical model ID (e.g. "claude-sonnet-4-5") */
13
+ id: import("@sinclair/typebox").TString;
14
+ /** Human-readable display name */
15
+ displayName: import("@sinclair/typebox").TString;
16
+ /** Context window in tokens */
17
+ contextWindow: import("@sinclair/typebox").TNumber;
18
+ /** Max output tokens */
19
+ maxOutputTokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
20
+ /** Input cost per million tokens (USD) */
21
+ inputCostPerMtok: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
22
+ /** Output cost per million tokens (USD) */
23
+ outputCostPerMtok: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
24
+ /** Supported capabilities */
25
+ capabilities: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"tools">, import("@sinclair/typebox").TLiteral<"vision">, import("@sinclair/typebox").TLiteral<"cache">, import("@sinclair/typebox").TLiteral<"reasoning">]>>>;
26
+ }>;
27
+ export declare const RegistryProviderAuthSchema: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"api-key">, import("@sinclair/typebox").TLiteral<"oauth">, import("@sinclair/typebox").TLiteral<"none">]>;
28
+ export declare const RegistryProviderKindSchema: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"anthropic">, import("@sinclair/typebox").TLiteral<"openai">, import("@sinclair/typebox").TLiteral<"google">, import("@sinclair/typebox").TLiteral<"openrouter">, import("@sinclair/typebox").TLiteral<"mistral">, import("@sinclair/typebox").TLiteral<"bedrock">, import("@sinclair/typebox").TLiteral<"gemini-cli">, import("@sinclair/typebox").TLiteral<"vertex">, import("@sinclair/typebox").TLiteral<"xai">, import("@sinclair/typebox").TLiteral<"groq">, import("@sinclair/typebox").TLiteral<"cerebras">, import("@sinclair/typebox").TLiteral<"other">]>;
29
+ export declare const RegistryProviderOAuthSchema: import("@sinclair/typebox").TObject<{
30
+ authorizationUrl: import("@sinclair/typebox").TString;
31
+ tokenUrl: import("@sinclair/typebox").TString;
32
+ clientId: import("@sinclair/typebox").TString;
33
+ scopes: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
34
+ }>;
35
+ export declare const RegistryProviderSchema: import("@sinclair/typebox").TObject<{
36
+ /** Unique provider identifier (e.g. "anthropic", "openai") */
37
+ id: import("@sinclair/typebox").TString;
38
+ /** Human-readable name */
39
+ name: import("@sinclair/typebox").TString;
40
+ /** Provider API kind — maps to @zhachory1/mewrite-ai Api type */
41
+ kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"anthropic">, import("@sinclair/typebox").TLiteral<"openai">, import("@sinclair/typebox").TLiteral<"google">, import("@sinclair/typebox").TLiteral<"openrouter">, import("@sinclair/typebox").TLiteral<"mistral">, import("@sinclair/typebox").TLiteral<"bedrock">, import("@sinclair/typebox").TLiteral<"gemini-cli">, import("@sinclair/typebox").TLiteral<"vertex">, import("@sinclair/typebox").TLiteral<"xai">, import("@sinclair/typebox").TLiteral<"groq">, import("@sinclair/typebox").TLiteral<"cerebras">, import("@sinclair/typebox").TLiteral<"other">]>;
42
+ /** Optional override base URL */
43
+ baseUrl: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
44
+ /** Auth mechanism */
45
+ auth: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"api-key">, import("@sinclair/typebox").TLiteral<"oauth">, import("@sinclair/typebox").TLiteral<"none">]>;
46
+ /** OAuth config when auth === "oauth" */
47
+ oauth: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
48
+ authorizationUrl: import("@sinclair/typebox").TString;
49
+ tokenUrl: import("@sinclair/typebox").TString;
50
+ clientId: import("@sinclair/typebox").TString;
51
+ scopes: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
52
+ }>>;
53
+ /** Models offered by this provider */
54
+ models: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
55
+ /** Canonical model ID (e.g. "claude-sonnet-4-5") */
56
+ id: import("@sinclair/typebox").TString;
57
+ /** Human-readable display name */
58
+ displayName: import("@sinclair/typebox").TString;
59
+ /** Context window in tokens */
60
+ contextWindow: import("@sinclair/typebox").TNumber;
61
+ /** Max output tokens */
62
+ maxOutputTokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
63
+ /** Input cost per million tokens (USD) */
64
+ inputCostPerMtok: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
65
+ /** Output cost per million tokens (USD) */
66
+ outputCostPerMtok: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
67
+ /** Supported capabilities */
68
+ capabilities: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"tools">, import("@sinclair/typebox").TLiteral<"vision">, import("@sinclair/typebox").TLiteral<"cache">, import("@sinclair/typebox").TLiteral<"reasoning">]>>>;
69
+ }>>;
70
+ }>;
71
+ export declare const RegistrySchema: import("@sinclair/typebox").TObject<{
72
+ /** Semver of this registry snapshot */
73
+ version: import("@sinclair/typebox").TString;
74
+ /** Channel: stable | beta */
75
+ channel: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"stable">, import("@sinclair/typebox").TLiteral<"beta">]>>;
76
+ /** ISO-8601 timestamp of when this registry was published */
77
+ publishedAt: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
78
+ providers: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
79
+ /** Unique provider identifier (e.g. "anthropic", "openai") */
80
+ id: import("@sinclair/typebox").TString;
81
+ /** Human-readable name */
82
+ name: import("@sinclair/typebox").TString;
83
+ /** Provider API kind — maps to @zhachory1/mewrite-ai Api type */
84
+ kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"anthropic">, import("@sinclair/typebox").TLiteral<"openai">, import("@sinclair/typebox").TLiteral<"google">, import("@sinclair/typebox").TLiteral<"openrouter">, import("@sinclair/typebox").TLiteral<"mistral">, import("@sinclair/typebox").TLiteral<"bedrock">, import("@sinclair/typebox").TLiteral<"gemini-cli">, import("@sinclair/typebox").TLiteral<"vertex">, import("@sinclair/typebox").TLiteral<"xai">, import("@sinclair/typebox").TLiteral<"groq">, import("@sinclair/typebox").TLiteral<"cerebras">, import("@sinclair/typebox").TLiteral<"other">]>;
85
+ /** Optional override base URL */
86
+ baseUrl: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
87
+ /** Auth mechanism */
88
+ auth: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"api-key">, import("@sinclair/typebox").TLiteral<"oauth">, import("@sinclair/typebox").TLiteral<"none">]>;
89
+ /** OAuth config when auth === "oauth" */
90
+ oauth: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
91
+ authorizationUrl: import("@sinclair/typebox").TString;
92
+ tokenUrl: import("@sinclair/typebox").TString;
93
+ clientId: import("@sinclair/typebox").TString;
94
+ scopes: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
95
+ }>>;
96
+ /** Models offered by this provider */
97
+ models: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
98
+ /** Canonical model ID (e.g. "claude-sonnet-4-5") */
99
+ id: import("@sinclair/typebox").TString;
100
+ /** Human-readable display name */
101
+ displayName: import("@sinclair/typebox").TString;
102
+ /** Context window in tokens */
103
+ contextWindow: import("@sinclair/typebox").TNumber;
104
+ /** Max output tokens */
105
+ maxOutputTokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
106
+ /** Input cost per million tokens (USD) */
107
+ inputCostPerMtok: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
108
+ /** Output cost per million tokens (USD) */
109
+ outputCostPerMtok: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
110
+ /** Supported capabilities */
111
+ capabilities: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"tools">, import("@sinclair/typebox").TLiteral<"vision">, import("@sinclair/typebox").TLiteral<"cache">, import("@sinclair/typebox").TLiteral<"reasoning">]>>>;
112
+ }>>;
113
+ }>>;
114
+ }>;
115
+ export type RegistryModel = Static<typeof RegistryModelSchema>;
116
+ export type RegistryProvider = Static<typeof RegistryProviderSchema>;
117
+ export type Registry = Static<typeof RegistrySchema>;
118
+ export type RegistryValidationResult = {
119
+ ok: true;
120
+ registry: Registry;
121
+ } | {
122
+ ok: false;
123
+ errors: string[];
124
+ };
125
+ /**
126
+ * Validate a raw unknown value against the registry schema.
127
+ * Returns typed Registry on success, or descriptive error strings on failure.
128
+ */
129
+ export declare function validateRegistry(raw: unknown): RegistryValidationResult;
130
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/registry/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,MAAM,EAAQ,MAAM,mBAAmB,CAAC;AAUtD,eAAO,MAAM,6BAA6B,uOAKxC,CAAC;AAEH,eAAO,MAAM,mBAAmB;IAC/B,oDAAoD;;IAEpD,kCAAkC;;IAElC,+BAA+B;;IAE/B,wBAAwB;;IAExB,0CAA0C;;IAE1C,2CAA2C;;IAE3C,6BAA6B;;EAE5B,CAAC;AAEH,eAAO,MAAM,0BAA0B,oLAIrC,CAAC;AAEH,eAAO,MAAM,0BAA0B,+mBAarC,CAAC;AAEH,eAAO,MAAM,2BAA2B;;;;;EAKtC,CAAC;AAEH,eAAO,MAAM,sBAAsB;IAClC,8DAA8D;;IAE9D,0BAA0B;;IAE1B,mEAAiE;;IAEjE,iCAAiC;;IAEjC,qBAAqB;;IAErB,yCAAyC;;;;;;;IAEzC,sCAAsC;;QAzDtC,oDAAoD;;QAEpD,kCAAkC;;QAElC,+BAA+B;;QAE/B,wBAAwB;;QAExB,0CAA0C;;QAE1C,2CAA2C;;QAE3C,6BAA6B;;;EA+C5B,CAAC;AAEH,eAAO,MAAM,cAAc;IAC1B,uCAAuC;;IAEvC,6BAA6B;;IAE7B,6DAA6D;;;QArB7D,8DAA8D;;QAE9D,0BAA0B;;QAE1B,mEAAiE;;QAEjE,iCAAiC;;QAEjC,qBAAqB;;QAErB,yCAAyC;;;;;;;QAEzC,sCAAsC;;YAzDtC,oDAAoD;;YAEpD,kCAAkC;;YAElC,+BAA+B;;YAE/B,wBAAwB;;YAExB,0CAA0C;;YAE1C,2CAA2C;;YAE3C,6BAA6B;;;;EAyD5B,CAAC;AAYH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAC/D,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACrE,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,cAAc,CAAC,CAAC;AAMrD,MAAM,MAAM,wBAAwB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAE1G;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,wBAAwB,CAWvE","sourcesContent":["/**\n * WS15: Catwalk-style provider/model registry schema.\n *\n * Registry JSON schema defined with @sinclair/typebox (matches existing\n * @zhachory1/mewrite-ai conventions — ajv + typebox, no zod dependency).\n *\n * Validation: use validateRegistry() which returns a typed result.\n */\n\nimport { type Static, Type } from \"@sinclair/typebox\";\nimport AjvModule from \"ajv\";\n\nconst Ajv = (AjvModule as any).default ?? AjvModule;\nconst ajv = new Ajv({ allErrors: true });\n\n// ---------------------------------------------------------------------------\n// Sub-schemas\n// ---------------------------------------------------------------------------\n\nexport const RegistryModelCapabilitySchema = Type.Union([\n\tType.Literal(\"tools\"),\n\tType.Literal(\"vision\"),\n\tType.Literal(\"cache\"),\n\tType.Literal(\"reasoning\"),\n]);\n\nexport const RegistryModelSchema = Type.Object({\n\t/** Canonical model ID (e.g. \"claude-sonnet-4-5\") */\n\tid: Type.String({ minLength: 1 }),\n\t/** Human-readable display name */\n\tdisplayName: Type.String({ minLength: 1 }),\n\t/** Context window in tokens */\n\tcontextWindow: Type.Number({ minimum: 1 }),\n\t/** Max output tokens */\n\tmaxOutputTokens: Type.Optional(Type.Number({ minimum: 1 })),\n\t/** Input cost per million tokens (USD) */\n\tinputCostPerMtok: Type.Optional(Type.Number({ minimum: 0 })),\n\t/** Output cost per million tokens (USD) */\n\toutputCostPerMtok: Type.Optional(Type.Number({ minimum: 0 })),\n\t/** Supported capabilities */\n\tcapabilities: Type.Optional(Type.Array(RegistryModelCapabilitySchema)),\n});\n\nexport const RegistryProviderAuthSchema = Type.Union([\n\tType.Literal(\"api-key\"),\n\tType.Literal(\"oauth\"),\n\tType.Literal(\"none\"),\n]);\n\nexport const RegistryProviderKindSchema = Type.Union([\n\tType.Literal(\"anthropic\"),\n\tType.Literal(\"openai\"),\n\tType.Literal(\"google\"),\n\tType.Literal(\"openrouter\"),\n\tType.Literal(\"mistral\"),\n\tType.Literal(\"bedrock\"),\n\tType.Literal(\"gemini-cli\"),\n\tType.Literal(\"vertex\"),\n\tType.Literal(\"xai\"),\n\tType.Literal(\"groq\"),\n\tType.Literal(\"cerebras\"),\n\tType.Literal(\"other\"),\n]);\n\nexport const RegistryProviderOAuthSchema = Type.Object({\n\tauthorizationUrl: Type.String({ minLength: 1 }),\n\ttokenUrl: Type.String({ minLength: 1 }),\n\tclientId: Type.String({ minLength: 1 }),\n\tscopes: Type.Array(Type.String()),\n});\n\nexport const RegistryProviderSchema = Type.Object({\n\t/** Unique provider identifier (e.g. \"anthropic\", \"openai\") */\n\tid: Type.String({ minLength: 1 }),\n\t/** Human-readable name */\n\tname: Type.String({ minLength: 1 }),\n\t/** Provider API kind — maps to @zhachory1/mewrite-ai Api type */\n\tkind: RegistryProviderKindSchema,\n\t/** Optional override base URL */\n\tbaseUrl: Type.Optional(Type.String({ minLength: 1 })),\n\t/** Auth mechanism */\n\tauth: RegistryProviderAuthSchema,\n\t/** OAuth config when auth === \"oauth\" */\n\toauth: Type.Optional(RegistryProviderOAuthSchema),\n\t/** Models offered by this provider */\n\tmodels: Type.Array(RegistryModelSchema),\n});\n\nexport const RegistrySchema = Type.Object({\n\t/** Semver of this registry snapshot */\n\tversion: Type.String({ minLength: 1 }),\n\t/** Channel: stable | beta */\n\tchannel: Type.Optional(Type.Union([Type.Literal(\"stable\"), Type.Literal(\"beta\")])),\n\t/** ISO-8601 timestamp of when this registry was published */\n\tpublishedAt: Type.Optional(Type.String()),\n\tproviders: Type.Array(RegistryProviderSchema),\n});\n\n// ---------------------------------------------------------------------------\n// Compiled validator\n// ---------------------------------------------------------------------------\n\nconst validate = ajv.compile(RegistrySchema);\n\n// ---------------------------------------------------------------------------\n// Exported types\n// ---------------------------------------------------------------------------\n\nexport type RegistryModel = Static<typeof RegistryModelSchema>;\nexport type RegistryProvider = Static<typeof RegistryProviderSchema>;\nexport type Registry = Static<typeof RegistrySchema>;\n\n// ---------------------------------------------------------------------------\n// Validation helper\n// ---------------------------------------------------------------------------\n\nexport type RegistryValidationResult = { ok: true; registry: Registry } | { ok: false; errors: string[] };\n\n/**\n * Validate a raw unknown value against the registry schema.\n * Returns typed Registry on success, or descriptive error strings on failure.\n */\nexport function validateRegistry(raw: unknown): RegistryValidationResult {\n\tif (validate(raw)) {\n\t\treturn { ok: true, registry: raw as Registry };\n\t}\n\n\tconst errors = (validate.errors ?? []).map(\n\t\t(e: { instancePath?: string; message?: string }) =>\n\t\t\t` - ${e.instancePath || \"(root)\"}: ${e.message ?? \"invalid\"}`,\n\t);\n\n\treturn { ok: false, errors };\n}\n"]}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * WS15: Catwalk-style provider/model registry schema.
3
+ *
4
+ * Registry JSON schema defined with @sinclair/typebox (matches existing
5
+ * @zhachory1/mewrite-ai conventions — ajv + typebox, no zod dependency).
6
+ *
7
+ * Validation: use validateRegistry() which returns a typed result.
8
+ */
9
+ import { Type } from "@sinclair/typebox";
10
+ import AjvModule from "ajv";
11
+ const Ajv = AjvModule.default ?? AjvModule;
12
+ const ajv = new Ajv({ allErrors: true });
13
+ // ---------------------------------------------------------------------------
14
+ // Sub-schemas
15
+ // ---------------------------------------------------------------------------
16
+ export const RegistryModelCapabilitySchema = Type.Union([
17
+ Type.Literal("tools"),
18
+ Type.Literal("vision"),
19
+ Type.Literal("cache"),
20
+ Type.Literal("reasoning"),
21
+ ]);
22
+ export const RegistryModelSchema = Type.Object({
23
+ /** Canonical model ID (e.g. "claude-sonnet-4-5") */
24
+ id: Type.String({ minLength: 1 }),
25
+ /** Human-readable display name */
26
+ displayName: Type.String({ minLength: 1 }),
27
+ /** Context window in tokens */
28
+ contextWindow: Type.Number({ minimum: 1 }),
29
+ /** Max output tokens */
30
+ maxOutputTokens: Type.Optional(Type.Number({ minimum: 1 })),
31
+ /** Input cost per million tokens (USD) */
32
+ inputCostPerMtok: Type.Optional(Type.Number({ minimum: 0 })),
33
+ /** Output cost per million tokens (USD) */
34
+ outputCostPerMtok: Type.Optional(Type.Number({ minimum: 0 })),
35
+ /** Supported capabilities */
36
+ capabilities: Type.Optional(Type.Array(RegistryModelCapabilitySchema)),
37
+ });
38
+ export const RegistryProviderAuthSchema = Type.Union([
39
+ Type.Literal("api-key"),
40
+ Type.Literal("oauth"),
41
+ Type.Literal("none"),
42
+ ]);
43
+ export const RegistryProviderKindSchema = Type.Union([
44
+ Type.Literal("anthropic"),
45
+ Type.Literal("openai"),
46
+ Type.Literal("google"),
47
+ Type.Literal("openrouter"),
48
+ Type.Literal("mistral"),
49
+ Type.Literal("bedrock"),
50
+ Type.Literal("gemini-cli"),
51
+ Type.Literal("vertex"),
52
+ Type.Literal("xai"),
53
+ Type.Literal("groq"),
54
+ Type.Literal("cerebras"),
55
+ Type.Literal("other"),
56
+ ]);
57
+ export const RegistryProviderOAuthSchema = Type.Object({
58
+ authorizationUrl: Type.String({ minLength: 1 }),
59
+ tokenUrl: Type.String({ minLength: 1 }),
60
+ clientId: Type.String({ minLength: 1 }),
61
+ scopes: Type.Array(Type.String()),
62
+ });
63
+ export const RegistryProviderSchema = Type.Object({
64
+ /** Unique provider identifier (e.g. "anthropic", "openai") */
65
+ id: Type.String({ minLength: 1 }),
66
+ /** Human-readable name */
67
+ name: Type.String({ minLength: 1 }),
68
+ /** Provider API kind — maps to @zhachory1/mewrite-ai Api type */
69
+ kind: RegistryProviderKindSchema,
70
+ /** Optional override base URL */
71
+ baseUrl: Type.Optional(Type.String({ minLength: 1 })),
72
+ /** Auth mechanism */
73
+ auth: RegistryProviderAuthSchema,
74
+ /** OAuth config when auth === "oauth" */
75
+ oauth: Type.Optional(RegistryProviderOAuthSchema),
76
+ /** Models offered by this provider */
77
+ models: Type.Array(RegistryModelSchema),
78
+ });
79
+ export const RegistrySchema = Type.Object({
80
+ /** Semver of this registry snapshot */
81
+ version: Type.String({ minLength: 1 }),
82
+ /** Channel: stable | beta */
83
+ channel: Type.Optional(Type.Union([Type.Literal("stable"), Type.Literal("beta")])),
84
+ /** ISO-8601 timestamp of when this registry was published */
85
+ publishedAt: Type.Optional(Type.String()),
86
+ providers: Type.Array(RegistryProviderSchema),
87
+ });
88
+ // ---------------------------------------------------------------------------
89
+ // Compiled validator
90
+ // ---------------------------------------------------------------------------
91
+ const validate = ajv.compile(RegistrySchema);
92
+ /**
93
+ * Validate a raw unknown value against the registry schema.
94
+ * Returns typed Registry on success, or descriptive error strings on failure.
95
+ */
96
+ export function validateRegistry(raw) {
97
+ if (validate(raw)) {
98
+ return { ok: true, registry: raw };
99
+ }
100
+ const errors = (validate.errors ?? []).map((e) => ` - ${e.instancePath || "(root)"}: ${e.message ?? "invalid"}`);
101
+ return { ok: false, errors };
102
+ }
103
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/registry/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAe,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,SAAS,MAAM,KAAK,CAAC;AAE5B,MAAM,GAAG,GAAI,SAAiB,CAAC,OAAO,IAAI,SAAS,CAAC;AACpD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAEzC,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E,MAAM,CAAC,MAAM,6BAA6B,GAAG,IAAI,CAAC,KAAK,CAAC;IACvD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;IACrB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;IACtB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;IACrB,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;CACzB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC;IAC9C,oDAAoD;IACpD,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACjC,kCAAkC;IAClC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IAC1C,+BAA+B;IAC/B,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IAC1C,wBAAwB;IACxB,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IAC3D,0CAA0C;IAC1C,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IAC5D,2CAA2C;IAC3C,iBAAiB,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IAC7D,6BAA6B;IAC7B,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;CACtE,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,CAAC,KAAK,CAAC;IACpD,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;IACvB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;IACrB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;CACpB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,CAAC,KAAK,CAAC;IACpD,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;IACzB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;IACtB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;IACtB,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;IAC1B,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;IACvB,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;IACvB,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;IAC1B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;IACtB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;IACnB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IACpB,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;IACxB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;CACrB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,CAAC,MAAM,CAAC;IACtD,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IAC/C,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACvC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACvC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;CACjC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC,MAAM,CAAC;IACjD,8DAA8D;IAC9D,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACjC,0BAA0B;IAC1B,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACnC,mEAAiE;IACjE,IAAI,EAAE,0BAA0B;IAChC,iCAAiC;IACjC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;IACrD,qBAAqB;IACrB,IAAI,EAAE,0BAA0B;IAChC,yCAAyC;IACzC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACjD,sCAAsC;IACtC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC;CACvC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC;IACzC,uCAAuC;IACvC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACtC,6BAA6B;IAC7B,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAClF,6DAA6D;IAC7D,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IACzC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC;CAC7C,CAAC,CAAC;AAEH,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;AAgB7C;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAY,EAA4B;IACxE,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAe,EAAE,CAAC;IAChD,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CACzC,CAAC,CAA8C,EAAE,EAAE,CAClD,OAAO,CAAC,CAAC,YAAY,IAAI,QAAQ,KAAK,CAAC,CAAC,OAAO,IAAI,SAAS,EAAE,CAC/D,CAAC;IAEF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAAA,CAC7B","sourcesContent":["/**\n * WS15: Catwalk-style provider/model registry schema.\n *\n * Registry JSON schema defined with @sinclair/typebox (matches existing\n * @zhachory1/mewrite-ai conventions — ajv + typebox, no zod dependency).\n *\n * Validation: use validateRegistry() which returns a typed result.\n */\n\nimport { type Static, Type } from \"@sinclair/typebox\";\nimport AjvModule from \"ajv\";\n\nconst Ajv = (AjvModule as any).default ?? AjvModule;\nconst ajv = new Ajv({ allErrors: true });\n\n// ---------------------------------------------------------------------------\n// Sub-schemas\n// ---------------------------------------------------------------------------\n\nexport const RegistryModelCapabilitySchema = Type.Union([\n\tType.Literal(\"tools\"),\n\tType.Literal(\"vision\"),\n\tType.Literal(\"cache\"),\n\tType.Literal(\"reasoning\"),\n]);\n\nexport const RegistryModelSchema = Type.Object({\n\t/** Canonical model ID (e.g. \"claude-sonnet-4-5\") */\n\tid: Type.String({ minLength: 1 }),\n\t/** Human-readable display name */\n\tdisplayName: Type.String({ minLength: 1 }),\n\t/** Context window in tokens */\n\tcontextWindow: Type.Number({ minimum: 1 }),\n\t/** Max output tokens */\n\tmaxOutputTokens: Type.Optional(Type.Number({ minimum: 1 })),\n\t/** Input cost per million tokens (USD) */\n\tinputCostPerMtok: Type.Optional(Type.Number({ minimum: 0 })),\n\t/** Output cost per million tokens (USD) */\n\toutputCostPerMtok: Type.Optional(Type.Number({ minimum: 0 })),\n\t/** Supported capabilities */\n\tcapabilities: Type.Optional(Type.Array(RegistryModelCapabilitySchema)),\n});\n\nexport const RegistryProviderAuthSchema = Type.Union([\n\tType.Literal(\"api-key\"),\n\tType.Literal(\"oauth\"),\n\tType.Literal(\"none\"),\n]);\n\nexport const RegistryProviderKindSchema = Type.Union([\n\tType.Literal(\"anthropic\"),\n\tType.Literal(\"openai\"),\n\tType.Literal(\"google\"),\n\tType.Literal(\"openrouter\"),\n\tType.Literal(\"mistral\"),\n\tType.Literal(\"bedrock\"),\n\tType.Literal(\"gemini-cli\"),\n\tType.Literal(\"vertex\"),\n\tType.Literal(\"xai\"),\n\tType.Literal(\"groq\"),\n\tType.Literal(\"cerebras\"),\n\tType.Literal(\"other\"),\n]);\n\nexport const RegistryProviderOAuthSchema = Type.Object({\n\tauthorizationUrl: Type.String({ minLength: 1 }),\n\ttokenUrl: Type.String({ minLength: 1 }),\n\tclientId: Type.String({ minLength: 1 }),\n\tscopes: Type.Array(Type.String()),\n});\n\nexport const RegistryProviderSchema = Type.Object({\n\t/** Unique provider identifier (e.g. \"anthropic\", \"openai\") */\n\tid: Type.String({ minLength: 1 }),\n\t/** Human-readable name */\n\tname: Type.String({ minLength: 1 }),\n\t/** Provider API kind — maps to @zhachory1/mewrite-ai Api type */\n\tkind: RegistryProviderKindSchema,\n\t/** Optional override base URL */\n\tbaseUrl: Type.Optional(Type.String({ minLength: 1 })),\n\t/** Auth mechanism */\n\tauth: RegistryProviderAuthSchema,\n\t/** OAuth config when auth === \"oauth\" */\n\toauth: Type.Optional(RegistryProviderOAuthSchema),\n\t/** Models offered by this provider */\n\tmodels: Type.Array(RegistryModelSchema),\n});\n\nexport const RegistrySchema = Type.Object({\n\t/** Semver of this registry snapshot */\n\tversion: Type.String({ minLength: 1 }),\n\t/** Channel: stable | beta */\n\tchannel: Type.Optional(Type.Union([Type.Literal(\"stable\"), Type.Literal(\"beta\")])),\n\t/** ISO-8601 timestamp of when this registry was published */\n\tpublishedAt: Type.Optional(Type.String()),\n\tproviders: Type.Array(RegistryProviderSchema),\n});\n\n// ---------------------------------------------------------------------------\n// Compiled validator\n// ---------------------------------------------------------------------------\n\nconst validate = ajv.compile(RegistrySchema);\n\n// ---------------------------------------------------------------------------\n// Exported types\n// ---------------------------------------------------------------------------\n\nexport type RegistryModel = Static<typeof RegistryModelSchema>;\nexport type RegistryProvider = Static<typeof RegistryProviderSchema>;\nexport type Registry = Static<typeof RegistrySchema>;\n\n// ---------------------------------------------------------------------------\n// Validation helper\n// ---------------------------------------------------------------------------\n\nexport type RegistryValidationResult = { ok: true; registry: Registry } | { ok: false; errors: string[] };\n\n/**\n * Validate a raw unknown value against the registry schema.\n * Returns typed Registry on success, or descriptive error strings on failure.\n */\nexport function validateRegistry(raw: unknown): RegistryValidationResult {\n\tif (validate(raw)) {\n\t\treturn { ok: true, registry: raw as Registry };\n\t}\n\n\tconst errors = (validate.errors ?? []).map(\n\t\t(e: { instancePath?: string; message?: string }) =>\n\t\t\t` - ${e.instancePath || \"(root)\"}: ${e.message ?? \"invalid\"}`,\n\t);\n\n\treturn { ok: false, errors };\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import "./providers/register-builtins.js";
2
+ import type { Api, AssistantMessage, AssistantMessageEventStream, Context, Model, ProviderStreamOptions, SimpleStreamOptions } from "./types.js";
3
+ export { getEnvApiKey } from "./env-api-keys.js";
4
+ export declare function stream<TApi extends Api>(model: Model<TApi>, context: Context, options?: ProviderStreamOptions): AssistantMessageEventStream;
5
+ export declare function complete<TApi extends Api>(model: Model<TApi>, context: Context, options?: ProviderStreamOptions): Promise<AssistantMessage>;
6
+ export declare function streamSimple<TApi extends Api>(model: Model<TApi>, context: Context, options?: SimpleStreamOptions): AssistantMessageEventStream;
7
+ export declare function completeSimple<TApi extends Api>(model: Model<TApi>, context: Context, options?: SimpleStreamOptions): Promise<AssistantMessage>;
8
+ //# sourceMappingURL=stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AAAA,OAAO,kCAAkC,CAAC;AAG1C,OAAO,KAAK,EACX,GAAG,EACH,gBAAgB,EAChB,2BAA2B,EAC3B,OAAO,EACP,KAAK,EACL,qBAAqB,EACrB,mBAAmB,EAEnB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAUjD,wBAAgB,MAAM,CAAC,IAAI,SAAS,GAAG,EACtC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAClB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,qBAAqB,GAC7B,2BAA2B,CAG7B;AAED,wBAAsB,QAAQ,CAAC,IAAI,SAAS,GAAG,EAC9C,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAClB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,qBAAqB,GAC7B,OAAO,CAAC,gBAAgB,CAAC,CAG3B;AAED,wBAAgB,YAAY,CAAC,IAAI,SAAS,GAAG,EAC5C,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAClB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,mBAAmB,GAC3B,2BAA2B,CAG7B;AAED,wBAAsB,cAAc,CAAC,IAAI,SAAS,GAAG,EACpD,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAClB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,gBAAgB,CAAC,CAG3B","sourcesContent":["import \"./providers/register-builtins.js\";\n\nimport { getApiProvider } from \"./api-registry.js\";\nimport type {\n\tApi,\n\tAssistantMessage,\n\tAssistantMessageEventStream,\n\tContext,\n\tModel,\n\tProviderStreamOptions,\n\tSimpleStreamOptions,\n\tStreamOptions,\n} from \"./types.js\";\n\nexport { getEnvApiKey } from \"./env-api-keys.js\";\n\nfunction resolveApiProvider(api: Api) {\n\tconst provider = getApiProvider(api);\n\tif (!provider) {\n\t\tthrow new Error(`No API provider registered for api: ${api}`);\n\t}\n\treturn provider;\n}\n\nexport function stream<TApi extends Api>(\n\tmodel: Model<TApi>,\n\tcontext: Context,\n\toptions?: ProviderStreamOptions,\n): AssistantMessageEventStream {\n\tconst provider = resolveApiProvider(model.api);\n\treturn provider.stream(model, context, options as StreamOptions);\n}\n\nexport async function complete<TApi extends Api>(\n\tmodel: Model<TApi>,\n\tcontext: Context,\n\toptions?: ProviderStreamOptions,\n): Promise<AssistantMessage> {\n\tconst s = stream(model, context, options);\n\treturn s.result();\n}\n\nexport function streamSimple<TApi extends Api>(\n\tmodel: Model<TApi>,\n\tcontext: Context,\n\toptions?: SimpleStreamOptions,\n): AssistantMessageEventStream {\n\tconst provider = resolveApiProvider(model.api);\n\treturn provider.streamSimple(model, context, options);\n}\n\nexport async function completeSimple<TApi extends Api>(\n\tmodel: Model<TApi>,\n\tcontext: Context,\n\toptions?: SimpleStreamOptions,\n): Promise<AssistantMessage> {\n\tconst s = streamSimple(model, context, options);\n\treturn s.result();\n}\n"]}
package/dist/stream.js ADDED
@@ -0,0 +1,27 @@
1
+ import "./providers/register-builtins.js";
2
+ import { getApiProvider } from "./api-registry.js";
3
+ export { getEnvApiKey } from "./env-api-keys.js";
4
+ function resolveApiProvider(api) {
5
+ const provider = getApiProvider(api);
6
+ if (!provider) {
7
+ throw new Error(`No API provider registered for api: ${api}`);
8
+ }
9
+ return provider;
10
+ }
11
+ export function stream(model, context, options) {
12
+ const provider = resolveApiProvider(model.api);
13
+ return provider.stream(model, context, options);
14
+ }
15
+ export async function complete(model, context, options) {
16
+ const s = stream(model, context, options);
17
+ return s.result();
18
+ }
19
+ export function streamSimple(model, context, options) {
20
+ const provider = resolveApiProvider(model.api);
21
+ return provider.streamSimple(model, context, options);
22
+ }
23
+ export async function completeSimple(model, context, options) {
24
+ const s = streamSimple(model, context, options);
25
+ return s.result();
26
+ }
27
+ //# sourceMappingURL=stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AAAA,OAAO,kCAAkC,CAAC;AAE1C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAYnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,SAAS,kBAAkB,CAAC,GAAQ,EAAE;IACrC,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,uCAAuC,GAAG,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,QAAQ,CAAC;AAAA,CAChB;AAED,MAAM,UAAU,MAAM,CACrB,KAAkB,EAClB,OAAgB,EAChB,OAA+B,EACD;IAC9B,MAAM,QAAQ,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/C,OAAO,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAwB,CAAC,CAAC;AAAA,CACjE;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC7B,KAAkB,EAClB,OAAgB,EAChB,OAA+B,EACH;IAC5B,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1C,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;AAAA,CAClB;AAED,MAAM,UAAU,YAAY,CAC3B,KAAkB,EAClB,OAAgB,EAChB,OAA6B,EACC;IAC9B,MAAM,QAAQ,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/C,OAAO,QAAQ,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAAA,CACtD;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CACnC,KAAkB,EAClB,OAAgB,EAChB,OAA6B,EACD;IAC5B,MAAM,CAAC,GAAG,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAChD,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;AAAA,CAClB","sourcesContent":["import \"./providers/register-builtins.js\";\n\nimport { getApiProvider } from \"./api-registry.js\";\nimport type {\n\tApi,\n\tAssistantMessage,\n\tAssistantMessageEventStream,\n\tContext,\n\tModel,\n\tProviderStreamOptions,\n\tSimpleStreamOptions,\n\tStreamOptions,\n} from \"./types.js\";\n\nexport { getEnvApiKey } from \"./env-api-keys.js\";\n\nfunction resolveApiProvider(api: Api) {\n\tconst provider = getApiProvider(api);\n\tif (!provider) {\n\t\tthrow new Error(`No API provider registered for api: ${api}`);\n\t}\n\treturn provider;\n}\n\nexport function stream<TApi extends Api>(\n\tmodel: Model<TApi>,\n\tcontext: Context,\n\toptions?: ProviderStreamOptions,\n): AssistantMessageEventStream {\n\tconst provider = resolveApiProvider(model.api);\n\treturn provider.stream(model, context, options as StreamOptions);\n}\n\nexport async function complete<TApi extends Api>(\n\tmodel: Model<TApi>,\n\tcontext: Context,\n\toptions?: ProviderStreamOptions,\n): Promise<AssistantMessage> {\n\tconst s = stream(model, context, options);\n\treturn s.result();\n}\n\nexport function streamSimple<TApi extends Api>(\n\tmodel: Model<TApi>,\n\tcontext: Context,\n\toptions?: SimpleStreamOptions,\n): AssistantMessageEventStream {\n\tconst provider = resolveApiProvider(model.api);\n\treturn provider.streamSimple(model, context, options);\n}\n\nexport async function completeSimple<TApi extends Api>(\n\tmodel: Model<TApi>,\n\tcontext: Context,\n\toptions?: SimpleStreamOptions,\n): Promise<AssistantMessage> {\n\tconst s = streamSimple(model, context, options);\n\treturn s.result();\n}\n"]}