@avallon-labs/sdk 0.0.0-main.1

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 (125) hide show
  1. package/README.md +135 -0
  2. package/dist/generated/endpoints/agents/agents.d.ts +172 -0
  3. package/dist/generated/endpoints/agents/agents.js +96 -0
  4. package/dist/generated/endpoints/auth/auth.d.ts +176 -0
  5. package/dist/generated/endpoints/auth/auth.js +121 -0
  6. package/dist/generated/endpoints/index.d.ts +2 -0
  7. package/dist/generated/endpoints/index.js +2 -0
  8. package/dist/generated/models/createAgent200.d.ts +11 -0
  9. package/dist/generated/models/createAgent200.js +1 -0
  10. package/dist/generated/models/createAgent200Data.d.ts +10 -0
  11. package/dist/generated/models/createAgent200Data.js +1 -0
  12. package/dist/generated/models/createAgent200DataAgent.d.ts +32 -0
  13. package/dist/generated/models/createAgent200DataAgent.js +1 -0
  14. package/dist/generated/models/createAgent200DataAgentBackgroundSounds.d.ts +11 -0
  15. package/dist/generated/models/createAgent200DataAgentBackgroundSounds.js +10 -0
  16. package/dist/generated/models/createAgent200DataAgentDirection.d.ts +11 -0
  17. package/dist/generated/models/createAgent200DataAgentDirection.js +10 -0
  18. package/dist/generated/models/createAgent200DataAgentLanguage.d.ts +11 -0
  19. package/dist/generated/models/createAgent200DataAgentLanguage.js +10 -0
  20. package/dist/generated/models/createAgent200DataAgentLlmModel.d.ts +21 -0
  21. package/dist/generated/models/createAgent200DataAgentLlmModel.js +20 -0
  22. package/dist/generated/models/createAgent200DataAgentSttModel.d.ts +12 -0
  23. package/dist/generated/models/createAgent200DataAgentSttModel.js +11 -0
  24. package/dist/generated/models/createAgent200DataAgentTtsModel.d.ts +14 -0
  25. package/dist/generated/models/createAgent200DataAgentTtsModel.js +13 -0
  26. package/dist/generated/models/createAgent200DataAgentTtsProvider.d.ts +12 -0
  27. package/dist/generated/models/createAgent200DataAgentTtsProvider.js +11 -0
  28. package/dist/generated/models/createAgentBody.d.ts +41 -0
  29. package/dist/generated/models/createAgentBody.js +1 -0
  30. package/dist/generated/models/createAgentBodyDirection.d.ts +14 -0
  31. package/dist/generated/models/createAgentBodyDirection.js +10 -0
  32. package/dist/generated/models/createAgentBodyLanguage.d.ts +14 -0
  33. package/dist/generated/models/createAgentBodyLanguage.js +10 -0
  34. package/dist/generated/models/createAgentBodyLlmModel.d.ts +24 -0
  35. package/dist/generated/models/createAgentBodyLlmModel.js +20 -0
  36. package/dist/generated/models/createAgentBodySttModel.d.ts +15 -0
  37. package/dist/generated/models/createAgentBodySttModel.js +11 -0
  38. package/dist/generated/models/createAgentBodyTtsModel.d.ts +17 -0
  39. package/dist/generated/models/createAgentBodyTtsModel.js +13 -0
  40. package/dist/generated/models/createAgentBodyTtsProvider.d.ts +15 -0
  41. package/dist/generated/models/createAgentBodyTtsProvider.js +11 -0
  42. package/dist/generated/models/errorResponse.d.ts +12 -0
  43. package/dist/generated/models/errorResponse.js +1 -0
  44. package/dist/generated/models/errorResponseData.d.ts +9 -0
  45. package/dist/generated/models/errorResponseData.js +7 -0
  46. package/dist/generated/models/getAgent200.d.ts +11 -0
  47. package/dist/generated/models/getAgent200.js +1 -0
  48. package/dist/generated/models/getAgent200Data.d.ts +10 -0
  49. package/dist/generated/models/getAgent200Data.js +1 -0
  50. package/dist/generated/models/getAgent200DataAgent.d.ts +32 -0
  51. package/dist/generated/models/getAgent200DataAgent.js +1 -0
  52. package/dist/generated/models/getAgent200DataAgentBackgroundSounds.d.ts +11 -0
  53. package/dist/generated/models/getAgent200DataAgentBackgroundSounds.js +10 -0
  54. package/dist/generated/models/getAgent200DataAgentDirection.d.ts +11 -0
  55. package/dist/generated/models/getAgent200DataAgentDirection.js +10 -0
  56. package/dist/generated/models/getAgent200DataAgentLanguage.d.ts +11 -0
  57. package/dist/generated/models/getAgent200DataAgentLanguage.js +10 -0
  58. package/dist/generated/models/getAgent200DataAgentLlmModel.d.ts +21 -0
  59. package/dist/generated/models/getAgent200DataAgentLlmModel.js +20 -0
  60. package/dist/generated/models/getAgent200DataAgentSttModel.d.ts +12 -0
  61. package/dist/generated/models/getAgent200DataAgentSttModel.js +11 -0
  62. package/dist/generated/models/getAgent200DataAgentTtsModel.d.ts +14 -0
  63. package/dist/generated/models/getAgent200DataAgentTtsModel.js +13 -0
  64. package/dist/generated/models/getAgent200DataAgentTtsProvider.d.ts +12 -0
  65. package/dist/generated/models/getAgent200DataAgentTtsProvider.js +11 -0
  66. package/dist/generated/models/getV1AuthOauthUrl200.d.ts +11 -0
  67. package/dist/generated/models/getV1AuthOauthUrl200.js +1 -0
  68. package/dist/generated/models/getV1AuthOauthUrl200Data.d.ts +9 -0
  69. package/dist/generated/models/getV1AuthOauthUrl200Data.js +7 -0
  70. package/dist/generated/models/getV1AuthOauthUrlCodeChallengeMethod.d.ts +11 -0
  71. package/dist/generated/models/getV1AuthOauthUrlCodeChallengeMethod.js +10 -0
  72. package/dist/generated/models/getV1AuthOauthUrlParams.d.ts +17 -0
  73. package/dist/generated/models/getV1AuthOauthUrlParams.js +1 -0
  74. package/dist/generated/models/getV1AuthOauthUrlProvider.d.ts +11 -0
  75. package/dist/generated/models/getV1AuthOauthUrlProvider.js +10 -0
  76. package/dist/generated/models/index.d.ts +60 -0
  77. package/dist/generated/models/index.js +60 -0
  78. package/dist/generated/models/listAgents200.d.ts +11 -0
  79. package/dist/generated/models/listAgents200.js +1 -0
  80. package/dist/generated/models/listAgents200Data.d.ts +16 -0
  81. package/dist/generated/models/listAgents200Data.js +1 -0
  82. package/dist/generated/models/listAgents200DataAgentsItem.d.ts +32 -0
  83. package/dist/generated/models/listAgents200DataAgentsItem.js +1 -0
  84. package/dist/generated/models/listAgents200DataAgentsItemBackgroundSounds.d.ts +11 -0
  85. package/dist/generated/models/listAgents200DataAgentsItemBackgroundSounds.js +10 -0
  86. package/dist/generated/models/listAgents200DataAgentsItemDirection.d.ts +11 -0
  87. package/dist/generated/models/listAgents200DataAgentsItemDirection.js +10 -0
  88. package/dist/generated/models/listAgents200DataAgentsItemLanguage.d.ts +11 -0
  89. package/dist/generated/models/listAgents200DataAgentsItemLanguage.js +10 -0
  90. package/dist/generated/models/listAgents200DataAgentsItemLlmModel.d.ts +21 -0
  91. package/dist/generated/models/listAgents200DataAgentsItemLlmModel.js +20 -0
  92. package/dist/generated/models/listAgents200DataAgentsItemSttModel.d.ts +12 -0
  93. package/dist/generated/models/listAgents200DataAgentsItemSttModel.js +11 -0
  94. package/dist/generated/models/listAgents200DataAgentsItemTtsModel.d.ts +14 -0
  95. package/dist/generated/models/listAgents200DataAgentsItemTtsModel.js +13 -0
  96. package/dist/generated/models/listAgents200DataAgentsItemTtsProvider.d.ts +12 -0
  97. package/dist/generated/models/listAgents200DataAgentsItemTtsProvider.js +11 -0
  98. package/dist/generated/models/listAgentsParams.d.ts +12 -0
  99. package/dist/generated/models/listAgentsParams.js +7 -0
  100. package/dist/generated/models/postV1AuthRefreshToken200.d.ts +11 -0
  101. package/dist/generated/models/postV1AuthRefreshToken200.js +1 -0
  102. package/dist/generated/models/postV1AuthRefreshToken200Data.d.ts +11 -0
  103. package/dist/generated/models/postV1AuthRefreshToken200Data.js +7 -0
  104. package/dist/generated/models/postV1AuthRefreshTokenBody.d.ts +10 -0
  105. package/dist/generated/models/postV1AuthRefreshTokenBody.js +7 -0
  106. package/dist/generated/models/postV1AuthSignIn200.d.ts +11 -0
  107. package/dist/generated/models/postV1AuthSignIn200.js +1 -0
  108. package/dist/generated/models/postV1AuthSignIn200Data.d.ts +11 -0
  109. package/dist/generated/models/postV1AuthSignIn200Data.js +7 -0
  110. package/dist/generated/models/postV1AuthSignInBody.d.ts +21 -0
  111. package/dist/generated/models/postV1AuthSignInBody.js +7 -0
  112. package/dist/generated/models/postV1AuthSignUp200.d.ts +11 -0
  113. package/dist/generated/models/postV1AuthSignUp200.js +1 -0
  114. package/dist/generated/models/postV1AuthSignUp200Data.d.ts +9 -0
  115. package/dist/generated/models/postV1AuthSignUp200Data.js +7 -0
  116. package/dist/generated/models/postV1AuthSignUpBody.d.ts +11 -0
  117. package/dist/generated/models/postV1AuthSignUpBody.js +7 -0
  118. package/dist/src/auth.d.ts +50 -0
  119. package/dist/src/auth.js +122 -0
  120. package/dist/src/fetcher.d.ts +38 -0
  121. package/dist/src/fetcher.js +106 -0
  122. package/dist/src/index.d.ts +9 -0
  123. package/dist/src/index.js +20 -0
  124. package/openapi.yaml +925 -0
  125. package/package.json +66 -0
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Generated by orval v8.1.0 🍺
3
+ * Do not edit manually.
4
+ * Avallon API
5
+ * OpenAPI spec version: 1.0.0
6
+ */
7
+ export const ListAgents200DataAgentsItemLanguage = {
8
+ "en-US": "en-US",
9
+ "de-DE": "de-DE",
10
+ };
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Generated by orval v8.1.0 🍺
3
+ * Do not edit manually.
4
+ * Avallon API
5
+ * OpenAPI spec version: 1.0.0
6
+ */
7
+ export type ListAgents200DataAgentsItemLlmModel = (typeof ListAgents200DataAgentsItemLlmModel)[keyof typeof ListAgents200DataAgentsItemLlmModel];
8
+ export declare const ListAgents200DataAgentsItemLlmModel: {
9
+ readonly GPT41: "GPT4.1";
10
+ readonly "AZURE-GPT4o": "AZURE-GPT4o";
11
+ readonly "AZURE-GPT41": "AZURE-GPT4.1";
12
+ readonly "GPT-5": "GPT-5";
13
+ readonly "GPT-5-low": "GPT-5-low";
14
+ readonly "GPT-5-high": "GPT-5-high";
15
+ readonly "GPT-51-chat-latest": "GPT-5.1-chat-latest";
16
+ readonly "GPT-51-no-reasoning": "GPT-5.1-no-reasoning";
17
+ readonly "GEMINI-15-flash": "GEMINI-1.5-flash";
18
+ readonly "GEMINI-25-flash": "GEMINI-2.5-flash";
19
+ readonly "GEMINI-25-flash-lite": "GEMINI-2.5-flash-lite";
20
+ readonly "GEMINI-3-flash": "GEMINI-3-flash";
21
+ };
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Generated by orval v8.1.0 🍺
3
+ * Do not edit manually.
4
+ * Avallon API
5
+ * OpenAPI spec version: 1.0.0
6
+ */
7
+ export const ListAgents200DataAgentsItemLlmModel = {
8
+ GPT41: "GPT4.1",
9
+ "AZURE-GPT4o": "AZURE-GPT4o",
10
+ "AZURE-GPT41": "AZURE-GPT4.1",
11
+ "GPT-5": "GPT-5",
12
+ "GPT-5-low": "GPT-5-low",
13
+ "GPT-5-high": "GPT-5-high",
14
+ "GPT-51-chat-latest": "GPT-5.1-chat-latest",
15
+ "GPT-51-no-reasoning": "GPT-5.1-no-reasoning",
16
+ "GEMINI-15-flash": "GEMINI-1.5-flash",
17
+ "GEMINI-25-flash": "GEMINI-2.5-flash",
18
+ "GEMINI-25-flash-lite": "GEMINI-2.5-flash-lite",
19
+ "GEMINI-3-flash": "GEMINI-3-flash",
20
+ };
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Generated by orval v8.1.0 🍺
3
+ * Do not edit manually.
4
+ * Avallon API
5
+ * OpenAPI spec version: 1.0.0
6
+ */
7
+ export type ListAgents200DataAgentsItemSttModel = (typeof ListAgents200DataAgentsItemSttModel)[keyof typeof ListAgents200DataAgentsItemSttModel];
8
+ export declare const ListAgents200DataAgentsItemSttModel: {
9
+ readonly "DEEPGRAM-NOVA-2-GENERAL": "DEEPGRAM-NOVA-2-GENERAL";
10
+ readonly "DEEPGRAM-NOVA-3-GENERAL": "DEEPGRAM-NOVA-3-GENERAL";
11
+ readonly "AWS-TRANSCRIBE": "AWS-TRANSCRIBE";
12
+ };
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Generated by orval v8.1.0 🍺
3
+ * Do not edit manually.
4
+ * Avallon API
5
+ * OpenAPI spec version: 1.0.0
6
+ */
7
+ export const ListAgents200DataAgentsItemSttModel = {
8
+ "DEEPGRAM-NOVA-2-GENERAL": "DEEPGRAM-NOVA-2-GENERAL",
9
+ "DEEPGRAM-NOVA-3-GENERAL": "DEEPGRAM-NOVA-3-GENERAL",
10
+ "AWS-TRANSCRIBE": "AWS-TRANSCRIBE",
11
+ };
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Generated by orval v8.1.0 🍺
3
+ * Do not edit manually.
4
+ * Avallon API
5
+ * OpenAPI spec version: 1.0.0
6
+ */
7
+ export type ListAgents200DataAgentsItemTtsModel = (typeof ListAgents200DataAgentsItemTtsModel)[keyof typeof ListAgents200DataAgentsItemTtsModel];
8
+ export declare const ListAgents200DataAgentsItemTtsModel: {
9
+ readonly eleven_flash_v2_5: "eleven_flash_v2_5";
10
+ readonly eleven_turbo_v2_5: "eleven_turbo_v2_5";
11
+ readonly "sonic-multilingual": "sonic-multilingual";
12
+ readonly "sonic-3": "sonic-3";
13
+ readonly chirp_3: "chirp_3";
14
+ };
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Generated by orval v8.1.0 🍺
3
+ * Do not edit manually.
4
+ * Avallon API
5
+ * OpenAPI spec version: 1.0.0
6
+ */
7
+ export const ListAgents200DataAgentsItemTtsModel = {
8
+ eleven_flash_v2_5: "eleven_flash_v2_5",
9
+ eleven_turbo_v2_5: "eleven_turbo_v2_5",
10
+ "sonic-multilingual": "sonic-multilingual",
11
+ "sonic-3": "sonic-3",
12
+ chirp_3: "chirp_3",
13
+ };
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Generated by orval v8.1.0 🍺
3
+ * Do not edit manually.
4
+ * Avallon API
5
+ * OpenAPI spec version: 1.0.0
6
+ */
7
+ export type ListAgents200DataAgentsItemTtsProvider = (typeof ListAgents200DataAgentsItemTtsProvider)[keyof typeof ListAgents200DataAgentsItemTtsProvider];
8
+ export declare const ListAgents200DataAgentsItemTtsProvider: {
9
+ readonly elevenlabs: "elevenlabs";
10
+ readonly cartesia: "cartesia";
11
+ readonly google: "google";
12
+ };
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Generated by orval v8.1.0 🍺
3
+ * Do not edit manually.
4
+ * Avallon API
5
+ * OpenAPI spec version: 1.0.0
6
+ */
7
+ export const ListAgents200DataAgentsItemTtsProvider = {
8
+ elevenlabs: "elevenlabs",
9
+ cartesia: "cartesia",
10
+ google: "google",
11
+ };
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Generated by orval v8.1.0 🍺
3
+ * Do not edit manually.
4
+ * Avallon API
5
+ * OpenAPI spec version: 1.0.0
6
+ */
7
+ export type ListAgentsParams = {
8
+ /**
9
+ * Filter by exact agent name
10
+ */
11
+ agent_name?: string;
12
+ };
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Generated by orval v8.1.0 🍺
3
+ * Do not edit manually.
4
+ * Avallon API
5
+ * OpenAPI spec version: 1.0.0
6
+ */
7
+ export {};
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Generated by orval v8.1.0 🍺
3
+ * Do not edit manually.
4
+ * Avallon API
5
+ * OpenAPI spec version: 1.0.0
6
+ */
7
+ import type { PostV1AuthRefreshToken200Data } from "./postV1AuthRefreshToken200Data";
8
+ export type PostV1AuthRefreshToken200 = {
9
+ data: PostV1AuthRefreshToken200Data;
10
+ message: string;
11
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Generated by orval v8.1.0 🍺
3
+ * Do not edit manually.
4
+ * Avallon API
5
+ * OpenAPI spec version: 1.0.0
6
+ */
7
+ export type PostV1AuthRefreshToken200Data = {
8
+ access_token: string;
9
+ refresh_token: string;
10
+ expires_at: string;
11
+ };
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Generated by orval v8.1.0 🍺
3
+ * Do not edit manually.
4
+ * Avallon API
5
+ * OpenAPI spec version: 1.0.0
6
+ */
7
+ export {};
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Generated by orval v8.1.0 🍺
3
+ * Do not edit manually.
4
+ * Avallon API
5
+ * OpenAPI spec version: 1.0.0
6
+ */
7
+ export type PostV1AuthRefreshTokenBody = {
8
+ access_token: string;
9
+ refresh_token: string;
10
+ };
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Generated by orval v8.1.0 🍺
3
+ * Do not edit manually.
4
+ * Avallon API
5
+ * OpenAPI spec version: 1.0.0
6
+ */
7
+ export {};
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Generated by orval v8.1.0 🍺
3
+ * Do not edit manually.
4
+ * Avallon API
5
+ * OpenAPI spec version: 1.0.0
6
+ */
7
+ import type { PostV1AuthSignIn200Data } from "./postV1AuthSignIn200Data";
8
+ export type PostV1AuthSignIn200 = {
9
+ data: PostV1AuthSignIn200Data;
10
+ message: string;
11
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Generated by orval v8.1.0 🍺
3
+ * Do not edit manually.
4
+ * Avallon API
5
+ * OpenAPI spec version: 1.0.0
6
+ */
7
+ export type PostV1AuthSignIn200Data = {
8
+ access_token: string;
9
+ refresh_token: string;
10
+ expires_at: string;
11
+ };
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Generated by orval v8.1.0 🍺
3
+ * Do not edit manually.
4
+ * Avallon API
5
+ * OpenAPI spec version: 1.0.0
6
+ */
7
+ export {};
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Generated by orval v8.1.0 🍺
3
+ * Do not edit manually.
4
+ * Avallon API
5
+ * OpenAPI spec version: 1.0.0
6
+ */
7
+ export type PostV1AuthSignInBody = {
8
+ type: "password";
9
+ email: string;
10
+ password: string;
11
+ } | {
12
+ type: "oauth";
13
+ code: string;
14
+ verifier: string;
15
+ } | {
16
+ type: "email_otp";
17
+ /** @pattern ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$ */
18
+ email: string;
19
+ /** @minLength 1 */
20
+ token: string;
21
+ };
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Generated by orval v8.1.0 🍺
3
+ * Do not edit manually.
4
+ * Avallon API
5
+ * OpenAPI spec version: 1.0.0
6
+ */
7
+ export {};
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Generated by orval v8.1.0 🍺
3
+ * Do not edit manually.
4
+ * Avallon API
5
+ * OpenAPI spec version: 1.0.0
6
+ */
7
+ import type { PostV1AuthSignUp200Data } from "./postV1AuthSignUp200Data";
8
+ export type PostV1AuthSignUp200 = {
9
+ data: PostV1AuthSignUp200Data;
10
+ message: string;
11
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Generated by orval v8.1.0 🍺
3
+ * Do not edit manually.
4
+ * Avallon API
5
+ * OpenAPI spec version: 1.0.0
6
+ */
7
+ export type PostV1AuthSignUp200Data = {
8
+ [key: string]: unknown;
9
+ };
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Generated by orval v8.1.0 🍺
3
+ * Do not edit manually.
4
+ * Avallon API
5
+ * OpenAPI spec version: 1.0.0
6
+ */
7
+ export {};
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Generated by orval v8.1.0 🍺
3
+ * Do not edit manually.
4
+ * Avallon API
5
+ * OpenAPI spec version: 1.0.0
6
+ */
7
+ export type PostV1AuthSignUpBody = {
8
+ /** @pattern ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$ */
9
+ email: string;
10
+ password: string;
11
+ };
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Generated by orval v8.1.0 🍺
3
+ * Do not edit manually.
4
+ * Avallon API
5
+ * OpenAPI spec version: 1.0.0
6
+ */
7
+ export {};
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Auth Utilities
3
+ *
4
+ * PKCE helpers for OAuth flow. This is legitimately custom code -
5
+ * browser-side crypto can't be generated from OpenAPI.
6
+ */
7
+ export type { GetV1AuthOauthUrlParams } from "../generated/models";
8
+ /** OAuth providers - matches backend enum */
9
+ export type OAuthProvider = "google" | "microsoft";
10
+ export type AuthTokens = {
11
+ accessToken: string;
12
+ refreshToken: string;
13
+ expiresAt: string;
14
+ };
15
+ /** Generate a cryptographically random code verifier */
16
+ export declare function generateCodeVerifier(length?: number): string;
17
+ /** Generate code challenge from verifier (S256) */
18
+ export declare function generateCodeChallenge(verifier: string): Promise<string>;
19
+ export type OAuthFlowParams = {
20
+ provider: OAuthProvider;
21
+ redirectUri: string;
22
+ };
23
+ export type OAuthFlowResult = {
24
+ /** URL to redirect user to for OAuth */
25
+ url: string;
26
+ /** Stored verifier (needed to complete flow) */
27
+ verifier: string;
28
+ };
29
+ /**
30
+ * Start OAuth flow.
31
+ *
32
+ * 1. Generates PKCE verifier + challenge
33
+ * 2. Calls backend to get OAuth redirect URL
34
+ * 3. Stores verifier in sessionStorage (needed for token exchange)
35
+ * 4. Returns URL for redirect
36
+ *
37
+ * @example
38
+ * ```ts
39
+ * const { url } = await startOAuthFlow({
40
+ * provider: "google",
41
+ * redirectUri: "https://app.example.com/auth/callback"
42
+ * });
43
+ * window.location.href = url;
44
+ * ```
45
+ */
46
+ export declare function startOAuthFlow(params: OAuthFlowParams): Promise<OAuthFlowResult>;
47
+ /** Get stored verifier (after OAuth redirect) */
48
+ export declare function getStoredVerifier(): string | null;
49
+ /** Clear stored verifier */
50
+ export declare function clearStoredVerifier(): void;
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Auth Utilities
3
+ *
4
+ * PKCE helpers for OAuth flow. This is legitimately custom code -
5
+ * browser-side crypto can't be generated from OpenAPI.
6
+ */
7
+ import { getV1AuthOauthUrl } from "../generated/endpoints";
8
+ // --------------------------------------------------------------------------
9
+ // PKCE Utilities
10
+ // --------------------------------------------------------------------------
11
+ /** Generate a cryptographically random code verifier */
12
+ export function generateCodeVerifier(length = 64) {
13
+ const charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~";
14
+ const randomValues = crypto.getRandomValues(new Uint8Array(length));
15
+ return Array.from(randomValues)
16
+ .map((v) => charset[v % charset.length])
17
+ .join("");
18
+ }
19
+ /** Generate code challenge from verifier (S256) */
20
+ export async function generateCodeChallenge(verifier) {
21
+ const encoder = new TextEncoder();
22
+ const data = encoder.encode(verifier);
23
+ const digest = await crypto.subtle.digest("SHA-256", data);
24
+ return base64UrlEncode(digest);
25
+ }
26
+ function base64UrlEncode(buffer) {
27
+ const bytes = new Uint8Array(buffer);
28
+ let binary = "";
29
+ for (const byte of bytes) {
30
+ binary += String.fromCharCode(byte);
31
+ }
32
+ return btoa(binary)
33
+ .replace(/\+/g, "-")
34
+ .replace(/\//g, "_")
35
+ .replace(/=+$/, "");
36
+ }
37
+ // --------------------------------------------------------------------------
38
+ // Storage helpers (safe for private browsing / quota issues)
39
+ // --------------------------------------------------------------------------
40
+ const OAUTH_VERIFIER_KEY = "avallon_oauth_verifier";
41
+ function safeSessionStorageSet(key, value) {
42
+ try {
43
+ if (typeof sessionStorage !== "undefined") {
44
+ sessionStorage.setItem(key, value);
45
+ return true;
46
+ }
47
+ }
48
+ catch {
49
+ // Quota exceeded or private browsing - fall through
50
+ }
51
+ return false;
52
+ }
53
+ function safeSessionStorageGet(key) {
54
+ try {
55
+ if (typeof sessionStorage !== "undefined") {
56
+ return sessionStorage.getItem(key);
57
+ }
58
+ }
59
+ catch {
60
+ // Private browsing or other issue
61
+ }
62
+ return null;
63
+ }
64
+ function safeSessionStorageRemove(key) {
65
+ try {
66
+ if (typeof sessionStorage !== "undefined") {
67
+ sessionStorage.removeItem(key);
68
+ }
69
+ }
70
+ catch {
71
+ // Ignore
72
+ }
73
+ }
74
+ /**
75
+ * Start OAuth flow.
76
+ *
77
+ * 1. Generates PKCE verifier + challenge
78
+ * 2. Calls backend to get OAuth redirect URL
79
+ * 3. Stores verifier in sessionStorage (needed for token exchange)
80
+ * 4. Returns URL for redirect
81
+ *
82
+ * @example
83
+ * ```ts
84
+ * const { url } = await startOAuthFlow({
85
+ * provider: "google",
86
+ * redirectUri: "https://app.example.com/auth/callback"
87
+ * });
88
+ * window.location.href = url;
89
+ * ```
90
+ */
91
+ export async function startOAuthFlow(params) {
92
+ const verifier = generateCodeVerifier();
93
+ const challenge = await generateCodeChallenge(verifier);
94
+ // Get OAuth URL from backend FIRST (before storing anything)
95
+ const response = await getV1AuthOauthUrl({
96
+ provider: params.provider,
97
+ redirect_uri: params.redirectUri,
98
+ code_challenge: challenge,
99
+ code_challenge_method: "s256",
100
+ });
101
+ // Type narrowing - fetcher throws on errors, so this is always success
102
+ if (response.status !== 200) {
103
+ throw new Error("Failed to get OAuth URL");
104
+ }
105
+ // Only store verifier AFTER successful API call
106
+ const stored = safeSessionStorageSet(OAUTH_VERIFIER_KEY, verifier);
107
+ if (!stored) {
108
+ console.warn("Could not store OAuth verifier - token exchange may fail after redirect");
109
+ }
110
+ return {
111
+ url: response.data.data.url,
112
+ verifier,
113
+ };
114
+ }
115
+ /** Get stored verifier (after OAuth redirect) */
116
+ export function getStoredVerifier() {
117
+ return safeSessionStorageGet(OAUTH_VERIFIER_KEY);
118
+ }
119
+ /** Clear stored verifier */
120
+ export function clearStoredVerifier() {
121
+ safeSessionStorageRemove(OAUTH_VERIFIER_KEY);
122
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Custom fetch wrapper for Orval-generated client.
3
+ * Handles auth (API key or Bearer token) and base URL configuration.
4
+ * Throws AvallonError on non-2xx responses for clean SWR error handling.
5
+ */
6
+ export type AvallonConfig = {
7
+ baseUrl?: string;
8
+ apiKey?: string;
9
+ getAccessToken?: () => string | null;
10
+ };
11
+ /** Configure the SDK at runtime */
12
+ export declare function configure(newConfig: Partial<AvallonConfig>): void;
13
+ /** Get current config */
14
+ export declare function getConfig(): AvallonConfig;
15
+ /** Authenticated fetch - adds API key or Bearer token */
16
+ export declare function customFetch<T>(url: string, options: RequestInit): Promise<T>;
17
+ /** Unauthenticated fetch - for auth flow endpoints (sign-in, sign-up, etc.) */
18
+ export declare function customFetchNoAuth<T>(url: string, options: RequestInit): Promise<T>;
19
+ /** Typed error class for API errors */
20
+ export declare class AvallonError extends Error {
21
+ readonly status: number;
22
+ readonly body: {
23
+ data?: unknown;
24
+ message?: string;
25
+ };
26
+ constructor(status: number, body: {
27
+ data?: unknown;
28
+ message?: string;
29
+ });
30
+ /** Validation errors (400) have field-level details */
31
+ get errors(): Array<{
32
+ field: string;
33
+ message: string;
34
+ }> | undefined;
35
+ isValidationError(): boolean;
36
+ isUnauthorized(): boolean;
37
+ isNotFound(): boolean;
38
+ }
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Custom fetch wrapper for Orval-generated client.
3
+ * Handles auth (API key or Bearer token) and base URL configuration.
4
+ * Throws AvallonError on non-2xx responses for clean SWR error handling.
5
+ */
6
+ // --------------------------------------------------------------------------
7
+ // Configuration
8
+ // --------------------------------------------------------------------------
9
+ let config = {
10
+ baseUrl: "https://api.avallon.ai",
11
+ };
12
+ /** Configure the SDK at runtime */
13
+ export function configure(newConfig) {
14
+ config = { ...config, ...newConfig };
15
+ }
16
+ /** Get current config */
17
+ export function getConfig() {
18
+ return { ...config };
19
+ }
20
+ // --------------------------------------------------------------------------
21
+ // Fetch wrapper
22
+ // --------------------------------------------------------------------------
23
+ /** Shared fetch logic */
24
+ async function doFetch(url, options, withAuth) {
25
+ const fullUrl = url.startsWith("http") ? url : `${config.baseUrl}${url}`;
26
+ const headers = new Headers(options.headers);
27
+ // Only set Content-Type for requests with JSON body
28
+ // (allows file uploads to set their own Content-Type)
29
+ if (options.body && typeof options.body === "string") {
30
+ headers.set("Content-Type", "application/json");
31
+ }
32
+ if (withAuth) {
33
+ const accessToken = config.getAccessToken?.();
34
+ if (accessToken) {
35
+ headers.set("Authorization", `Bearer ${accessToken}`);
36
+ }
37
+ else if (config.apiKey) {
38
+ headers.set("x-api-key", config.apiKey);
39
+ }
40
+ }
41
+ const response = await fetch(fullUrl, {
42
+ ...options,
43
+ headers,
44
+ });
45
+ // Parse response based on content type
46
+ const contentType = response.headers.get("Content-Type") ?? "";
47
+ let body;
48
+ if (response.status === 204) {
49
+ // No content
50
+ body = {};
51
+ }
52
+ else if (contentType.includes("application/json")) {
53
+ body = await response.json().catch(() => ({}));
54
+ }
55
+ else {
56
+ // Non-JSON response (shouldn't happen with our API, but handle gracefully)
57
+ const text = await response.text().catch(() => "");
58
+ body = { message: text };
59
+ }
60
+ // Throw on non-2xx - SWR will catch this as `error`
61
+ if (!response.ok) {
62
+ throw new AvallonError(response.status, body);
63
+ }
64
+ // Return success response in expected shape
65
+ return {
66
+ data: body,
67
+ status: response.status,
68
+ headers: response.headers,
69
+ };
70
+ }
71
+ /** Authenticated fetch - adds API key or Bearer token */
72
+ export async function customFetch(url, options) {
73
+ return doFetch(url, options, true);
74
+ }
75
+ /** Unauthenticated fetch - for auth flow endpoints (sign-in, sign-up, etc.) */
76
+ export async function customFetchNoAuth(url, options) {
77
+ return doFetch(url, options, false);
78
+ }
79
+ // --------------------------------------------------------------------------
80
+ // Error class
81
+ // --------------------------------------------------------------------------
82
+ /** Typed error class for API errors */
83
+ export class AvallonError extends Error {
84
+ status;
85
+ body;
86
+ constructor(status, body) {
87
+ super(body?.message ?? `API error ${status}`);
88
+ this.status = status;
89
+ this.body = body;
90
+ this.name = "AvallonError";
91
+ }
92
+ /** Validation errors (400) have field-level details */
93
+ get errors() {
94
+ const data = this.body?.data;
95
+ return data?.errors;
96
+ }
97
+ isValidationError() {
98
+ return this.status === 400;
99
+ }
100
+ isUnauthorized() {
101
+ return this.status === 401;
102
+ }
103
+ isNotFound() {
104
+ return this.status === 404;
105
+ }
106
+ }