@hyav/pi-provider 0.1.2 → 0.1.4

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 (52) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +30 -4
  3. package/README.zh-CN.md +30 -4
  4. package/core/adapter-loader.ts +58 -12
  5. package/core/catalog-preflight.ts +130 -0
  6. package/core/credential-type.ts +13 -0
  7. package/core/host.ts +4 -3
  8. package/core/official-pricing.ts +2 -3
  9. package/core/preflight-manager.ts +13 -0
  10. package/core/public-adapters.ts +47 -0
  11. package/core/ratelimit-headers.ts +72 -0
  12. package/core/runtime-config.ts +92 -8
  13. package/core/runtime-entry.ts +26 -0
  14. package/core/runtime.ts +23 -10
  15. package/core/status-manager.ts +7 -1
  16. package/core/types.ts +12 -0
  17. package/index.ts +30 -6
  18. package/package.json +1 -1
  19. package/preflight/anthropic.ts +42 -0
  20. package/preflight/cerebras.ts +27 -0
  21. package/preflight/charm-hyper.ts +2 -4
  22. package/preflight/deepseek.ts +2 -4
  23. package/preflight/github-copilot.ts +74 -0
  24. package/preflight/google.ts +2 -4
  25. package/preflight/groq.ts +72 -0
  26. package/preflight/huggingface.ts +27 -0
  27. package/preflight/mistral.ts +27 -0
  28. package/preflight/moonshotai-cn.ts +27 -0
  29. package/preflight/moonshotai.ts +37 -0
  30. package/preflight/nvidia.ts +27 -0
  31. package/preflight/openai-codex.ts +2 -4
  32. package/preflight/openai.ts +27 -0
  33. package/preflight/opencode-go.ts +2 -3
  34. package/preflight/opencode.ts +2 -3
  35. package/preflight/openrouter.ts +111 -0
  36. package/preflight/vercel-ai-gateway.ts +86 -0
  37. package/preflight/xai.ts +70 -0
  38. package/providers/charm-hyper.ts +8 -5
  39. package/status/anthropic.ts +258 -0
  40. package/status/charm-hyper.ts +3 -5
  41. package/status/deepseek.ts +2 -4
  42. package/status/github-copilot.ts +176 -0
  43. package/status/groq.ts +88 -0
  44. package/status/huggingface.ts +94 -0
  45. package/status/moonshotai-cn.ts +26 -0
  46. package/status/moonshotai.ts +150 -0
  47. package/status/openai-codex.ts +2 -4
  48. package/status/opencode-go.ts +2 -4
  49. package/status/openrouter.ts +172 -0
  50. package/status/vercel-ai-gateway/constants.ts +3 -0
  51. package/status/vercel-ai-gateway.ts +94 -0
  52. package/status/xai.ts +73 -0
@@ -0,0 +1,27 @@
1
+ import type { PreflightAdapter } from "@hyav/pi-provider";
2
+ import { definePreflightExtension } from "@hyav/pi-provider";
3
+ import { createCatalogPreflightAdapter } from "../core/catalog-preflight.ts";
4
+
5
+ export const MISTRAL_MODELS_URL = "https://api.mistral.ai/v1/models";
6
+
7
+ export const mistralPreflightAdapter: PreflightAdapter = createCatalogPreflightAdapter(
8
+ {
9
+ id: "mistral-preflight",
10
+ providerId: "mistral",
11
+ name: "Mistral",
12
+ modelsUrl: MISTRAL_MODELS_URL,
13
+ },
14
+ 8_000,
15
+ );
16
+
17
+ export function createMistralPreflightAdapter(requestTimeoutMs: number): PreflightAdapter {
18
+ return { ...mistralPreflightAdapter, requestTimeoutMs };
19
+ }
20
+
21
+ const mistralPreflightExtension = definePreflightExtension({
22
+ id: "mistral-preflight",
23
+ providerId: "mistral",
24
+ create: ({ statusRequestTimeoutMs }) => createMistralPreflightAdapter(statusRequestTimeoutMs),
25
+ });
26
+
27
+ export default mistralPreflightExtension;
@@ -0,0 +1,27 @@
1
+ import type { PreflightAdapter } from "@hyav/pi-provider";
2
+ import { definePreflightExtension } from "@hyav/pi-provider";
3
+ import { createMoonshotPreflightAdapter, MOONSHOT_CN_MODELS_URL } from "./moonshotai.ts";
4
+
5
+ export const moonshotaiCnPreflightAdapter: PreflightAdapter = createMoonshotPreflightAdapter(
6
+ MOONSHOT_CN_MODELS_URL,
7
+ 8_000,
8
+ "moonshotai-cn-preflight",
9
+ "moonshotai-cn",
10
+ );
11
+
12
+ export function createMoonshotaiCnPreflightAdapter(requestTimeoutMs: number): PreflightAdapter {
13
+ return createMoonshotPreflightAdapter(
14
+ MOONSHOT_CN_MODELS_URL,
15
+ requestTimeoutMs,
16
+ "moonshotai-cn-preflight",
17
+ "moonshotai-cn",
18
+ );
19
+ }
20
+
21
+ const moonshotaiCnPreflightExtension = definePreflightExtension({
22
+ id: "moonshotai-cn-preflight",
23
+ providerId: "moonshotai-cn",
24
+ create: ({ statusRequestTimeoutMs }) => createMoonshotaiCnPreflightAdapter(statusRequestTimeoutMs),
25
+ });
26
+
27
+ export default moonshotaiCnPreflightExtension;
@@ -0,0 +1,37 @@
1
+ import type { PreflightAdapter } from "@hyav/pi-provider";
2
+ import { definePreflightExtension } from "@hyav/pi-provider";
3
+ import { createCatalogPreflightAdapter } from "../core/catalog-preflight.ts";
4
+
5
+ export const MOONSHOT_MODELS_URL = "https://api.moonshot.ai/v1/models";
6
+ export const MOONSHOT_CN_MODELS_URL = "https://api.moonshot.cn/v1/models";
7
+
8
+ export function createMoonshotPreflightAdapter(
9
+ modelsUrl: string,
10
+ requestTimeoutMs: number,
11
+ id: "moonshotai-preflight" | "moonshotai-cn-preflight" = "moonshotai-preflight",
12
+ providerId: "moonshotai" | "moonshotai-cn" = "moonshotai",
13
+ ): PreflightAdapter {
14
+ return createCatalogPreflightAdapter(
15
+ {
16
+ id,
17
+ providerId,
18
+ name: providerId === "moonshotai-cn" ? "Moonshot CN (Kimi)" : "Moonshot (Kimi)",
19
+ modelsUrl,
20
+ },
21
+ requestTimeoutMs,
22
+ );
23
+ }
24
+
25
+ export const moonshotaiPreflightAdapter = createMoonshotPreflightAdapter(MOONSHOT_MODELS_URL, 8_000);
26
+
27
+ export function createMoonshotaiPreflightAdapter(requestTimeoutMs: number): PreflightAdapter {
28
+ return { ...moonshotaiPreflightAdapter, requestTimeoutMs };
29
+ }
30
+
31
+ const moonshotaiPreflightExtension = definePreflightExtension({
32
+ id: "moonshotai-preflight",
33
+ providerId: "moonshotai",
34
+ create: ({ statusRequestTimeoutMs }) => createMoonshotPreflightAdapter(MOONSHOT_MODELS_URL, statusRequestTimeoutMs),
35
+ });
36
+
37
+ export default moonshotaiPreflightExtension;
@@ -0,0 +1,27 @@
1
+ import type { PreflightAdapter } from "@hyav/pi-provider";
2
+ import { definePreflightExtension } from "@hyav/pi-provider";
3
+ import { createCatalogPreflightAdapter } from "../core/catalog-preflight.ts";
4
+
5
+ export const NVIDIA_MODELS_URL = "https://integrate.api.nvidia.com/v1/models";
6
+
7
+ export const nvidiaPreflightAdapter: PreflightAdapter = createCatalogPreflightAdapter(
8
+ {
9
+ id: "nvidia-preflight",
10
+ providerId: "nvidia",
11
+ name: "NVIDIA NIM",
12
+ modelsUrl: NVIDIA_MODELS_URL,
13
+ },
14
+ 8_000,
15
+ );
16
+
17
+ export function createNvidiaPreflightAdapter(requestTimeoutMs: number): PreflightAdapter {
18
+ return { ...nvidiaPreflightAdapter, requestTimeoutMs };
19
+ }
20
+
21
+ const nvidiaPreflightExtension = definePreflightExtension({
22
+ id: "nvidia-preflight",
23
+ providerId: "nvidia",
24
+ create: ({ statusRequestTimeoutMs }) => createNvidiaPreflightAdapter(statusRequestTimeoutMs),
25
+ });
26
+
27
+ export default nvidiaPreflightExtension;
@@ -1,7 +1,5 @@
1
- import { definePreflightExtension } from "../core/adapter-extensions.ts";
2
- import { ProviderDataError } from "../core/errors.ts";
3
- import type { PreflightAdapter } from "../core/preflight-manager.ts";
4
- import { parseRetryAfter } from "../core/retry-after.ts";
1
+ import type { PreflightAdapter } from "@hyav/pi-provider";
2
+ import { definePreflightExtension, ProviderDataError, parseRetryAfter } from "@hyav/pi-provider";
5
3
  import { extractCodexAccountId } from "../status/openai-codex.ts";
6
4
 
7
5
  export const CODEX_MODELS_URL = "https://chatgpt.com/backend-api/codex/models";
@@ -0,0 +1,27 @@
1
+ import type { PreflightAdapter } from "@hyav/pi-provider";
2
+ import { definePreflightExtension } from "@hyav/pi-provider";
3
+ import { createCatalogPreflightAdapter } from "../core/catalog-preflight.ts";
4
+
5
+ export const OPENAI_MODELS_URL = "https://api.openai.com/v1/models";
6
+
7
+ export const openAIPreflightAdapter: PreflightAdapter = createCatalogPreflightAdapter(
8
+ {
9
+ id: "openai-preflight",
10
+ providerId: "openai",
11
+ name: "OpenAI",
12
+ modelsUrl: OPENAI_MODELS_URL,
13
+ },
14
+ 8_000,
15
+ );
16
+
17
+ export function createOpenAIPreflightAdapter(requestTimeoutMs: number): PreflightAdapter {
18
+ return { ...openAIPreflightAdapter, requestTimeoutMs };
19
+ }
20
+
21
+ const openAIPreflightExtension = definePreflightExtension({
22
+ id: "openai-preflight",
23
+ providerId: "openai",
24
+ create: ({ statusRequestTimeoutMs }) => createOpenAIPreflightAdapter(statusRequestTimeoutMs),
25
+ });
26
+
27
+ export default openAIPreflightExtension;
@@ -1,6 +1,5 @@
1
- import { definePreflightExtension } from "../core/adapter-extensions.ts";
2
- import { createOpenCodeCatalogPreflightAdapter } from "../core/opencode-preflight.ts";
3
- import type { PreflightAdapter } from "../core/preflight-manager.ts";
1
+ import type { PreflightAdapter } from "@hyav/pi-provider";
2
+ import { createOpenCodeCatalogPreflightAdapter, definePreflightExtension } from "@hyav/pi-provider";
4
3
 
5
4
  export const OPENCODE_GO_MODELS_URL = "https://opencode.ai/zen/go/v1/models";
6
5
 
@@ -1,6 +1,5 @@
1
- import { definePreflightExtension } from "../core/adapter-extensions.ts";
2
- import { createOpenCodeCatalogPreflightAdapter } from "../core/opencode-preflight.ts";
3
- import type { PreflightAdapter } from "../core/preflight-manager.ts";
1
+ import type { PreflightAdapter } from "@hyav/pi-provider";
2
+ import { createOpenCodeCatalogPreflightAdapter, definePreflightExtension } from "@hyav/pi-provider";
4
3
 
5
4
  export const OPENCODE_MODELS_URL = "https://opencode.ai/zen/v1/models";
6
5
 
@@ -0,0 +1,111 @@
1
+ import type { PreflightAdapter } from "@hyav/pi-provider";
2
+ import { definePreflightExtension, ProviderDataError, parseRetryAfter } from "@hyav/pi-provider";
3
+ import { OPENROUTER_KEY_URL } from "../status/openrouter.ts";
4
+
5
+ export const OPENROUTER_MODELS_URL = "https://openrouter.ai/api/v1/models";
6
+
7
+ function isRecord(value: unknown): value is Record<string, unknown> {
8
+ return value !== null && typeof value === "object" && !Array.isArray(value);
9
+ }
10
+
11
+ async function collectModelIds(context: Parameters<PreflightAdapter["fetch"]>[0]): Promise<Set<string>> {
12
+ const response = await context.fetch(OPENROUTER_MODELS_URL, {
13
+ headers: {
14
+ Accept: "application/json",
15
+ "Accept-Encoding": "identity",
16
+ "User-Agent": "@hyav/pi-provider",
17
+ },
18
+ signal: context.signal,
19
+ });
20
+ if (!response.ok) {
21
+ throw new ProviderDataError(
22
+ `OpenRouter preflight failed: HTTP ${response.status}`,
23
+ `http${response.status}`,
24
+ parseRetryAfter(response.headers.get("retry-after"), context.now()),
25
+ response.status,
26
+ );
27
+ }
28
+ let payload: unknown;
29
+ try {
30
+ payload = await response.json();
31
+ } catch {
32
+ throw new ProviderDataError("OpenRouter preflight returned invalid JSON", "badjson");
33
+ }
34
+ if (!isRecord(payload) || !Array.isArray(payload.data)) {
35
+ throw new ProviderDataError("OpenRouter preflight returned invalid catalog data", "badjson");
36
+ }
37
+ return new Set(
38
+ payload.data
39
+ .filter(isRecord)
40
+ .map((model) => (typeof model.id === "string" ? model.id.trim() : undefined))
41
+ .filter((id): id is string => id !== undefined && id !== ""),
42
+ );
43
+ }
44
+
45
+ async function checkCredential(context: Parameters<PreflightAdapter["fetch"]>[0], apiKey: string): Promise<number> {
46
+ const response = await context.fetch(OPENROUTER_KEY_URL, {
47
+ headers: {
48
+ Accept: "application/json",
49
+ "Accept-Encoding": "identity",
50
+ Authorization: `Bearer ${apiKey}`,
51
+ "User-Agent": "@hyav/pi-provider",
52
+ },
53
+ signal: context.signal,
54
+ });
55
+ if (response.status === 404) return response.status;
56
+ if (!response.ok) {
57
+ throw new ProviderDataError(
58
+ `OpenRouter preflight failed: HTTP ${response.status}`,
59
+ `http${response.status}`,
60
+ parseRetryAfter(response.headers.get("retry-after"), context.now()),
61
+ response.status,
62
+ );
63
+ }
64
+ let payload: unknown;
65
+ try {
66
+ payload = await response.json();
67
+ } catch {
68
+ throw new ProviderDataError("OpenRouter preflight returned invalid JSON", "badjson");
69
+ }
70
+ if (!isRecord(payload) || !isRecord(payload.data) || typeof payload.data.label !== "string") {
71
+ throw new ProviderDataError("OpenRouter preflight returned an invalid key response", "badjson");
72
+ }
73
+ return response.status;
74
+ }
75
+
76
+ export const openRouterPreflightAdapter: PreflightAdapter = {
77
+ id: "openrouter-preflight",
78
+ providerId: "openrouter",
79
+ name: "OpenRouter",
80
+ cacheTtlMs: 30_000,
81
+ requestTimeoutMs: 8_000,
82
+ async fetch(context) {
83
+ const modelIds = await collectModelIds(context);
84
+ const apiKey = await context.getApiKey();
85
+ const checks: string[] = ["endpoint", "catalog"];
86
+ if (!apiKey || apiKey === "proxy-managed") {
87
+ return { passed: modelIds.has(context.model.id), checks: [...checks, "auth"], updatedAt: context.now() };
88
+ }
89
+ // Management keys use /api/v1/credits as the only key endpoint and get 404 here.
90
+ const authStatus = await checkCredential(context, apiKey);
91
+ const authPassed = authStatus !== 404;
92
+ checks.push("auth");
93
+ return {
94
+ passed: modelIds.has(context.model.id) && authPassed,
95
+ checks,
96
+ updatedAt: context.now(),
97
+ };
98
+ },
99
+ };
100
+
101
+ export function createOpenRouterPreflightAdapter(requestTimeoutMs: number): PreflightAdapter {
102
+ return { ...openRouterPreflightAdapter, requestTimeoutMs };
103
+ }
104
+
105
+ const openRouterPreflightExtension = definePreflightExtension({
106
+ id: "openrouter-preflight",
107
+ providerId: "openrouter",
108
+ create: ({ statusRequestTimeoutMs }) => createOpenRouterPreflightAdapter(statusRequestTimeoutMs),
109
+ });
110
+
111
+ export default openRouterPreflightExtension;
@@ -0,0 +1,86 @@
1
+ import type { PreflightAdapter, PreflightSnapshot } from "@hyav/pi-provider";
2
+ import { definePreflightExtension, ProviderDataError, parseRetryAfter } from "@hyav/pi-provider";
3
+ import { VERCEL_PROVIDER_ID } from "../status/vercel-ai-gateway/constants.ts";
4
+
5
+ export const VERCEL_MODELS_URL = "https://ai-gateway.vercel.sh/v1/models";
6
+
7
+ function isRecord(value: unknown): value is Record<string, unknown> {
8
+ return value !== null && typeof value === "object" && !Array.isArray(value);
9
+ }
10
+
11
+ export function parseVercelModelIds(payload: unknown): Set<string> {
12
+ if (!isRecord(payload) || !Array.isArray(payload.data)) {
13
+ throw new ProviderDataError("Vercel AI Gateway preflight returned invalid catalog data", "badjson");
14
+ }
15
+
16
+ const modelIds = new Set<string>();
17
+ for (const value of payload.data) {
18
+ if (!isRecord(value)) continue;
19
+ // Mixed-type gateway catalogs can include non-language entries.
20
+ if (value.type !== undefined && value.type !== "language") continue;
21
+ if (typeof value.id !== "string") continue;
22
+ const id = value.id.trim();
23
+ if (id !== "") modelIds.add(id);
24
+ }
25
+
26
+ if (modelIds.size === 0) {
27
+ throw new ProviderDataError("Vercel AI Gateway preflight returned an empty catalog", "badjson");
28
+ }
29
+ return modelIds;
30
+ }
31
+
32
+ export function createVercelAIGatewayPreflightAdapter(requestTimeoutMs: number): PreflightAdapter {
33
+ return {
34
+ id: "vercel-ai-gateway-preflight",
35
+ providerId: VERCEL_PROVIDER_ID,
36
+ name: "Vercel AI Gateway",
37
+ cacheTtlMs: 30_000,
38
+ requestTimeoutMs,
39
+ async fetch(context): Promise<PreflightSnapshot> {
40
+ const key = await context.getApiKey();
41
+ if (!key || key === "proxy-managed") {
42
+ return { passed: false, checks: ["auth"], updatedAt: context.now() };
43
+ }
44
+
45
+ const response = await context.fetch(VERCEL_MODELS_URL, {
46
+ headers: {
47
+ Accept: "application/json",
48
+ "Accept-Encoding": "identity",
49
+ },
50
+ signal: context.signal,
51
+ });
52
+ if (!response.ok) {
53
+ throw new ProviderDataError(
54
+ `Vercel AI Gateway preflight failed: HTTP ${response.status}`,
55
+ `http${response.status}`,
56
+ parseRetryAfter(response.headers.get("retry-after"), context.now()),
57
+ response.status,
58
+ );
59
+ }
60
+
61
+ let payload: unknown;
62
+ try {
63
+ payload = await response.json();
64
+ } catch {
65
+ throw new ProviderDataError("Vercel AI Gateway preflight returned invalid JSON", "badjson");
66
+ }
67
+
68
+ return {
69
+ passed: parseVercelModelIds(payload).has(context.model.id),
70
+ checks: ["endpoint", "auth", "catalog"],
71
+ updatedAt: context.now(),
72
+ httpStatus: response.status,
73
+ };
74
+ },
75
+ };
76
+ }
77
+
78
+ export const vercelAIGatewayPreflightAdapter = createVercelAIGatewayPreflightAdapter(8_000);
79
+
80
+ const vercelAIGatewayPreflightExtension = definePreflightExtension({
81
+ id: "vercel-ai-gateway-preflight",
82
+ providerId: VERCEL_PROVIDER_ID,
83
+ create: ({ statusRequestTimeoutMs }) => createVercelAIGatewayPreflightAdapter(statusRequestTimeoutMs),
84
+ });
85
+
86
+ export default vercelAIGatewayPreflightExtension;
@@ -0,0 +1,70 @@
1
+ import type { PreflightAdapter } from "@hyav/pi-provider";
2
+ import { definePreflightExtension, ProviderDataError, parseRetryAfter } from "@hyav/pi-provider";
3
+ import { XAI_MODELS_URL } from "../status/xai.ts";
4
+
5
+ function isRecord(value: unknown): value is Record<string, unknown> {
6
+ return value !== null && typeof value === "object" && !Array.isArray(value);
7
+ }
8
+
9
+ export const xaiPreflightAdapter: PreflightAdapter = {
10
+ id: "xai-preflight",
11
+ providerId: "xai",
12
+ name: "xAI",
13
+ cacheTtlMs: 30_000,
14
+ requestTimeoutMs: 8_000,
15
+ async fetch(context) {
16
+ const apiKey = await context.getApiKey();
17
+ const authHeaders: Record<string, string> = {
18
+ Accept: "application/json",
19
+ "Accept-Encoding": "identity",
20
+ "User-Agent": "@hyav/pi-provider",
21
+ };
22
+ if (apiKey && apiKey !== "proxy-managed") authHeaders.Authorization = `Bearer ${apiKey}`;
23
+ const response = await context.fetch(XAI_MODELS_URL, {
24
+ headers: authHeaders,
25
+ signal: context.signal,
26
+ });
27
+ if (!response.ok) {
28
+ throw new ProviderDataError(
29
+ `xAI preflight failed: HTTP ${response.status}`,
30
+ `http${response.status}`,
31
+ parseRetryAfter(response.headers.get("retry-after"), context.now()),
32
+ response.status,
33
+ );
34
+ }
35
+ let payload: unknown;
36
+ try {
37
+ payload = await response.json();
38
+ } catch {
39
+ throw new ProviderDataError("xAI preflight returned invalid JSON", "badjson");
40
+ }
41
+ if (!isRecord(payload) || !Array.isArray(payload.data)) {
42
+ throw new ProviderDataError("xAI preflight returned invalid catalog data", "badjson");
43
+ }
44
+ const modelIds = new Set(
45
+ payload.data
46
+ .filter(isRecord)
47
+ .map((model) => (typeof model.id === "string" ? model.id.trim() : undefined))
48
+ .filter((id): id is string => id !== undefined && id !== ""),
49
+ );
50
+ const checks = apiKey && apiKey !== "proxy-managed" ? ["endpoint", "catalog", "auth"] : ["endpoint", "catalog"];
51
+ return {
52
+ passed: modelIds.has(context.model.id),
53
+ checks,
54
+ updatedAt: context.now(),
55
+ httpStatus: response.status,
56
+ };
57
+ },
58
+ };
59
+
60
+ export function createXaiPreflightAdapter(requestTimeoutMs: number): PreflightAdapter {
61
+ return { ...xaiPreflightAdapter, requestTimeoutMs };
62
+ }
63
+
64
+ const xaiPreflightExtension = definePreflightExtension({
65
+ id: "xai-preflight",
66
+ providerId: "xai",
67
+ create: ({ statusRequestTimeoutMs }) => createXaiPreflightAdapter(statusRequestTimeoutMs),
68
+ });
69
+
70
+ export default xaiPreflightExtension;
@@ -1,7 +1,3 @@
1
- import { defineProviderExtension } from "../core/adapter-extensions.ts";
2
- import { withDeadline } from "../core/deadline.ts";
3
- import { isProviderDataError, ProviderDataError } from "../core/errors.ts";
4
- import { normalizeProviderModels } from "../core/provider-registration.ts";
5
1
  import type {
6
2
  ModelCatalogStatus,
7
3
  ProviderAdapter,
@@ -9,7 +5,14 @@ import type {
9
5
  ProviderModelDraft,
10
6
  ProviderRefreshContext,
11
7
  ThinkingLevel,
12
- } from "../core/types.ts";
8
+ } from "@hyav/pi-provider";
9
+ import {
10
+ defineProviderExtension,
11
+ isProviderDataError,
12
+ normalizeProviderModels,
13
+ ProviderDataError,
14
+ withDeadline,
15
+ } from "@hyav/pi-provider";
13
16
  import { HYPER_BASE_URL, HYPER_USER_AGENT, hyperJsonHeaders } from "./charm-hyper/constants.ts";
14
17
  import { createCharmHyperOAuth } from "./charm-hyper/oauth.ts";
15
18