@avallon-labs/sdk 0.0.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.
- package/README.md +135 -0
- package/dist/generated/endpoints/agents/agents.d.ts +172 -0
- package/dist/generated/endpoints/agents/agents.js +96 -0
- package/dist/generated/endpoints/default/default.d.ts +176 -0
- package/dist/generated/endpoints/default/default.js +121 -0
- package/dist/generated/endpoints/index.d.ts +2 -0
- package/dist/generated/endpoints/index.js +2 -0
- package/dist/generated/models/createAgent200.d.ts +11 -0
- package/dist/generated/models/createAgent200.js +1 -0
- package/dist/generated/models/createAgent200Data.d.ts +10 -0
- package/dist/generated/models/createAgent200Data.js +1 -0
- package/dist/generated/models/createAgent200DataAgent.d.ts +34 -0
- package/dist/generated/models/createAgent200DataAgent.js +1 -0
- package/dist/generated/models/createAgent200DataAgentBackgroundSounds.d.ts +11 -0
- package/dist/generated/models/createAgent200DataAgentBackgroundSounds.js +10 -0
- package/dist/generated/models/createAgent200DataAgentDesiredState.d.ts +11 -0
- package/dist/generated/models/createAgent200DataAgentDesiredState.js +10 -0
- package/dist/generated/models/createAgent200DataAgentDirection.d.ts +11 -0
- package/dist/generated/models/createAgent200DataAgentDirection.js +10 -0
- package/dist/generated/models/createAgent200DataAgentLanguage.d.ts +11 -0
- package/dist/generated/models/createAgent200DataAgentLanguage.js +10 -0
- package/dist/generated/models/createAgent200DataAgentLlmModel.d.ts +21 -0
- package/dist/generated/models/createAgent200DataAgentLlmModel.js +20 -0
- package/dist/generated/models/createAgent200DataAgentSttModel.d.ts +12 -0
- package/dist/generated/models/createAgent200DataAgentSttModel.js +11 -0
- package/dist/generated/models/createAgent200DataAgentTtsModel.d.ts +14 -0
- package/dist/generated/models/createAgent200DataAgentTtsModel.js +13 -0
- package/dist/generated/models/createAgent200DataAgentTtsProvider.d.ts +12 -0
- package/dist/generated/models/createAgent200DataAgentTtsProvider.js +11 -0
- package/dist/generated/models/createAgent400.d.ts +12 -0
- package/dist/generated/models/createAgent400.js +1 -0
- package/dist/generated/models/createAgent400Data.d.ts +10 -0
- package/dist/generated/models/createAgent400Data.js +1 -0
- package/dist/generated/models/createAgent400DataErrorsItem.d.ts +12 -0
- package/dist/generated/models/createAgent400DataErrorsItem.js +7 -0
- package/dist/generated/models/createAgent401.d.ts +12 -0
- package/dist/generated/models/createAgent401.js +1 -0
- package/dist/generated/models/createAgent401Data.d.ts +9 -0
- package/dist/generated/models/createAgent401Data.js +7 -0
- package/dist/generated/models/createAgent500.d.ts +12 -0
- package/dist/generated/models/createAgent500.js +1 -0
- package/dist/generated/models/createAgent500Data.d.ts +9 -0
- package/dist/generated/models/createAgent500Data.js +7 -0
- package/dist/generated/models/createAgentBody.d.ts +37 -0
- package/dist/generated/models/createAgentBody.js +1 -0
- package/dist/generated/models/createAgentBodyDirection.d.ts +14 -0
- package/dist/generated/models/createAgentBodyDirection.js +10 -0
- package/dist/generated/models/createAgentBodyLanguage.d.ts +14 -0
- package/dist/generated/models/createAgentBodyLanguage.js +10 -0
- package/dist/generated/models/createAgentBodyLlmModel.d.ts +24 -0
- package/dist/generated/models/createAgentBodyLlmModel.js +20 -0
- package/dist/generated/models/createAgentBodySttModel.d.ts +15 -0
- package/dist/generated/models/createAgentBodySttModel.js +11 -0
- package/dist/generated/models/createAgentBodyTtsModel.d.ts +17 -0
- package/dist/generated/models/createAgentBodyTtsModel.js +13 -0
- package/dist/generated/models/createAgentBodyTtsProvider.d.ts +15 -0
- package/dist/generated/models/createAgentBodyTtsProvider.js +11 -0
- package/dist/generated/models/getAgent200.d.ts +11 -0
- package/dist/generated/models/getAgent200.js +1 -0
- package/dist/generated/models/getAgent200Data.d.ts +10 -0
- package/dist/generated/models/getAgent200Data.js +1 -0
- package/dist/generated/models/getAgent200DataAgent.d.ts +34 -0
- package/dist/generated/models/getAgent200DataAgent.js +1 -0
- package/dist/generated/models/getAgent200DataAgentBackgroundSounds.d.ts +11 -0
- package/dist/generated/models/getAgent200DataAgentBackgroundSounds.js +10 -0
- package/dist/generated/models/getAgent200DataAgentDesiredState.d.ts +11 -0
- package/dist/generated/models/getAgent200DataAgentDesiredState.js +10 -0
- package/dist/generated/models/getAgent200DataAgentDirection.d.ts +11 -0
- package/dist/generated/models/getAgent200DataAgentDirection.js +10 -0
- package/dist/generated/models/getAgent200DataAgentLanguage.d.ts +11 -0
- package/dist/generated/models/getAgent200DataAgentLanguage.js +10 -0
- package/dist/generated/models/getAgent200DataAgentLlmModel.d.ts +21 -0
- package/dist/generated/models/getAgent200DataAgentLlmModel.js +20 -0
- package/dist/generated/models/getAgent200DataAgentSttModel.d.ts +12 -0
- package/dist/generated/models/getAgent200DataAgentSttModel.js +11 -0
- package/dist/generated/models/getAgent200DataAgentTtsModel.d.ts +14 -0
- package/dist/generated/models/getAgent200DataAgentTtsModel.js +13 -0
- package/dist/generated/models/getAgent200DataAgentTtsProvider.d.ts +12 -0
- package/dist/generated/models/getAgent200DataAgentTtsProvider.js +11 -0
- package/dist/generated/models/getAgent400.d.ts +12 -0
- package/dist/generated/models/getAgent400.js +1 -0
- package/dist/generated/models/getAgent400Data.d.ts +10 -0
- package/dist/generated/models/getAgent400Data.js +1 -0
- package/dist/generated/models/getAgent400DataErrorsItem.d.ts +12 -0
- package/dist/generated/models/getAgent400DataErrorsItem.js +7 -0
- package/dist/generated/models/getAgent401.d.ts +12 -0
- package/dist/generated/models/getAgent401.js +1 -0
- package/dist/generated/models/getAgent401Data.d.ts +9 -0
- package/dist/generated/models/getAgent401Data.js +7 -0
- package/dist/generated/models/getAgent404.d.ts +12 -0
- package/dist/generated/models/getAgent404.js +1 -0
- package/dist/generated/models/getAgent404Data.d.ts +9 -0
- package/dist/generated/models/getAgent404Data.js +7 -0
- package/dist/generated/models/getAgent500.d.ts +12 -0
- package/dist/generated/models/getAgent500.js +1 -0
- package/dist/generated/models/getAgent500Data.d.ts +9 -0
- package/dist/generated/models/getAgent500Data.js +7 -0
- package/dist/generated/models/getV1AuthOauthUrl200.d.ts +11 -0
- package/dist/generated/models/getV1AuthOauthUrl200.js +1 -0
- package/dist/generated/models/getV1AuthOauthUrl200Data.d.ts +9 -0
- package/dist/generated/models/getV1AuthOauthUrl200Data.js +7 -0
- package/dist/generated/models/getV1AuthOauthUrl400.d.ts +12 -0
- package/dist/generated/models/getV1AuthOauthUrl400.js +1 -0
- package/dist/generated/models/getV1AuthOauthUrl400Data.d.ts +10 -0
- package/dist/generated/models/getV1AuthOauthUrl400Data.js +1 -0
- package/dist/generated/models/getV1AuthOauthUrl400DataErrorsItem.d.ts +12 -0
- package/dist/generated/models/getV1AuthOauthUrl400DataErrorsItem.js +7 -0
- package/dist/generated/models/getV1AuthOauthUrl401.d.ts +12 -0
- package/dist/generated/models/getV1AuthOauthUrl401.js +1 -0
- package/dist/generated/models/getV1AuthOauthUrl401Data.d.ts +9 -0
- package/dist/generated/models/getV1AuthOauthUrl401Data.js +7 -0
- package/dist/generated/models/getV1AuthOauthUrl500.d.ts +12 -0
- package/dist/generated/models/getV1AuthOauthUrl500.js +1 -0
- package/dist/generated/models/getV1AuthOauthUrl500Data.d.ts +9 -0
- package/dist/generated/models/getV1AuthOauthUrl500Data.js +7 -0
- package/dist/generated/models/getV1AuthOauthUrlCodeChallengeMethod.d.ts +11 -0
- package/dist/generated/models/getV1AuthOauthUrlCodeChallengeMethod.js +10 -0
- package/dist/generated/models/getV1AuthOauthUrlParams.d.ts +17 -0
- package/dist/generated/models/getV1AuthOauthUrlParams.js +1 -0
- package/dist/generated/models/getV1AuthOauthUrlProvider.d.ts +11 -0
- package/dist/generated/models/getV1AuthOauthUrlProvider.js +10 -0
- package/dist/generated/models/index.d.ts +112 -0
- package/dist/generated/models/index.js +112 -0
- package/dist/generated/models/listAgents200.d.ts +11 -0
- package/dist/generated/models/listAgents200.js +1 -0
- package/dist/generated/models/listAgents200Data.d.ts +16 -0
- package/dist/generated/models/listAgents200Data.js +1 -0
- package/dist/generated/models/listAgents200DataAgentsItem.d.ts +34 -0
- package/dist/generated/models/listAgents200DataAgentsItem.js +1 -0
- package/dist/generated/models/listAgents200DataAgentsItemBackgroundSounds.d.ts +11 -0
- package/dist/generated/models/listAgents200DataAgentsItemBackgroundSounds.js +10 -0
- package/dist/generated/models/listAgents200DataAgentsItemDesiredState.d.ts +11 -0
- package/dist/generated/models/listAgents200DataAgentsItemDesiredState.js +10 -0
- package/dist/generated/models/listAgents200DataAgentsItemDirection.d.ts +11 -0
- package/dist/generated/models/listAgents200DataAgentsItemDirection.js +10 -0
- package/dist/generated/models/listAgents200DataAgentsItemLanguage.d.ts +11 -0
- package/dist/generated/models/listAgents200DataAgentsItemLanguage.js +10 -0
- package/dist/generated/models/listAgents200DataAgentsItemLlmModel.d.ts +21 -0
- package/dist/generated/models/listAgents200DataAgentsItemLlmModel.js +20 -0
- package/dist/generated/models/listAgents200DataAgentsItemSttModel.d.ts +12 -0
- package/dist/generated/models/listAgents200DataAgentsItemSttModel.js +11 -0
- package/dist/generated/models/listAgents200DataAgentsItemTtsModel.d.ts +14 -0
- package/dist/generated/models/listAgents200DataAgentsItemTtsModel.js +13 -0
- package/dist/generated/models/listAgents200DataAgentsItemTtsProvider.d.ts +12 -0
- package/dist/generated/models/listAgents200DataAgentsItemTtsProvider.js +11 -0
- package/dist/generated/models/listAgents400.d.ts +12 -0
- package/dist/generated/models/listAgents400.js +1 -0
- package/dist/generated/models/listAgents400Data.d.ts +10 -0
- package/dist/generated/models/listAgents400Data.js +1 -0
- package/dist/generated/models/listAgents400DataErrorsItem.d.ts +12 -0
- package/dist/generated/models/listAgents400DataErrorsItem.js +7 -0
- package/dist/generated/models/listAgents401.d.ts +12 -0
- package/dist/generated/models/listAgents401.js +1 -0
- package/dist/generated/models/listAgents401Data.d.ts +9 -0
- package/dist/generated/models/listAgents401Data.js +7 -0
- package/dist/generated/models/listAgents500.d.ts +12 -0
- package/dist/generated/models/listAgents500.js +1 -0
- package/dist/generated/models/listAgents500Data.d.ts +9 -0
- package/dist/generated/models/listAgents500Data.js +7 -0
- package/dist/generated/models/listAgentsParams.d.ts +12 -0
- package/dist/generated/models/listAgentsParams.js +7 -0
- package/dist/generated/models/postV1AuthRefreshToken200.d.ts +11 -0
- package/dist/generated/models/postV1AuthRefreshToken200.js +1 -0
- package/dist/generated/models/postV1AuthRefreshToken200Data.d.ts +11 -0
- package/dist/generated/models/postV1AuthRefreshToken200Data.js +7 -0
- package/dist/generated/models/postV1AuthRefreshToken400.d.ts +12 -0
- package/dist/generated/models/postV1AuthRefreshToken400.js +1 -0
- package/dist/generated/models/postV1AuthRefreshToken400Data.d.ts +10 -0
- package/dist/generated/models/postV1AuthRefreshToken400Data.js +1 -0
- package/dist/generated/models/postV1AuthRefreshToken400DataErrorsItem.d.ts +12 -0
- package/dist/generated/models/postV1AuthRefreshToken400DataErrorsItem.js +7 -0
- package/dist/generated/models/postV1AuthRefreshToken401.d.ts +12 -0
- package/dist/generated/models/postV1AuthRefreshToken401.js +1 -0
- package/dist/generated/models/postV1AuthRefreshToken401Data.d.ts +9 -0
- package/dist/generated/models/postV1AuthRefreshToken401Data.js +7 -0
- package/dist/generated/models/postV1AuthRefreshToken500.d.ts +12 -0
- package/dist/generated/models/postV1AuthRefreshToken500.js +1 -0
- package/dist/generated/models/postV1AuthRefreshToken500Data.d.ts +9 -0
- package/dist/generated/models/postV1AuthRefreshToken500Data.js +7 -0
- package/dist/generated/models/postV1AuthRefreshTokenBody.d.ts +10 -0
- package/dist/generated/models/postV1AuthRefreshTokenBody.js +7 -0
- package/dist/generated/models/postV1AuthSignIn200.d.ts +11 -0
- package/dist/generated/models/postV1AuthSignIn200.js +1 -0
- package/dist/generated/models/postV1AuthSignIn200Data.d.ts +11 -0
- package/dist/generated/models/postV1AuthSignIn200Data.js +7 -0
- package/dist/generated/models/postV1AuthSignIn400.d.ts +12 -0
- package/dist/generated/models/postV1AuthSignIn400.js +1 -0
- package/dist/generated/models/postV1AuthSignIn400Data.d.ts +10 -0
- package/dist/generated/models/postV1AuthSignIn400Data.js +1 -0
- package/dist/generated/models/postV1AuthSignIn400DataErrorsItem.d.ts +12 -0
- package/dist/generated/models/postV1AuthSignIn400DataErrorsItem.js +7 -0
- package/dist/generated/models/postV1AuthSignIn401.d.ts +12 -0
- package/dist/generated/models/postV1AuthSignIn401.js +1 -0
- package/dist/generated/models/postV1AuthSignIn401Data.d.ts +9 -0
- package/dist/generated/models/postV1AuthSignIn401Data.js +7 -0
- package/dist/generated/models/postV1AuthSignIn500.d.ts +12 -0
- package/dist/generated/models/postV1AuthSignIn500.js +1 -0
- package/dist/generated/models/postV1AuthSignIn500Data.d.ts +9 -0
- package/dist/generated/models/postV1AuthSignIn500Data.js +7 -0
- package/dist/generated/models/postV1AuthSignInBody.d.ts +21 -0
- package/dist/generated/models/postV1AuthSignInBody.js +7 -0
- package/dist/generated/models/postV1AuthSignUp200.d.ts +11 -0
- package/dist/generated/models/postV1AuthSignUp200.js +1 -0
- package/dist/generated/models/postV1AuthSignUp200Data.d.ts +9 -0
- package/dist/generated/models/postV1AuthSignUp200Data.js +7 -0
- package/dist/generated/models/postV1AuthSignUp400.d.ts +12 -0
- package/dist/generated/models/postV1AuthSignUp400.js +1 -0
- package/dist/generated/models/postV1AuthSignUp400Data.d.ts +10 -0
- package/dist/generated/models/postV1AuthSignUp400Data.js +1 -0
- package/dist/generated/models/postV1AuthSignUp400DataErrorsItem.d.ts +12 -0
- package/dist/generated/models/postV1AuthSignUp400DataErrorsItem.js +7 -0
- package/dist/generated/models/postV1AuthSignUp401.d.ts +12 -0
- package/dist/generated/models/postV1AuthSignUp401.js +1 -0
- package/dist/generated/models/postV1AuthSignUp401Data.d.ts +9 -0
- package/dist/generated/models/postV1AuthSignUp401Data.js +7 -0
- package/dist/generated/models/postV1AuthSignUp500.d.ts +12 -0
- package/dist/generated/models/postV1AuthSignUp500.js +1 -0
- package/dist/generated/models/postV1AuthSignUp500Data.d.ts +9 -0
- package/dist/generated/models/postV1AuthSignUp500Data.js +7 -0
- package/dist/generated/models/postV1AuthSignUpBody.d.ts +11 -0
- package/dist/generated/models/postV1AuthSignUpBody.js +7 -0
- package/dist/src/auth.d.ts +50 -0
- package/dist/src/auth.js +122 -0
- package/dist/src/fetcher.d.ts +36 -0
- package/dist/src/fetcher.js +97 -0
- package/dist/src/index.d.ts +9 -0
- package/dist/src/index.js +20 -0
- package/openapi.yaml +1345 -0
- package/package.json +64 -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
|
+
import type { PostV1AuthSignUp400DataErrorsItem } from "./postV1AuthSignUp400DataErrorsItem";
|
|
8
|
+
export type PostV1AuthSignUp400Data = {
|
|
9
|
+
errors: PostV1AuthSignUp400DataErrorsItem[];
|
|
10
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -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 PostV1AuthSignUp400DataErrorsItem = {
|
|
8
|
+
/** Path to the invalid field */
|
|
9
|
+
field: string;
|
|
10
|
+
/** Error description */
|
|
11
|
+
message: string;
|
|
12
|
+
};
|
|
@@ -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
|
+
import type { PostV1AuthSignUp401Data } from "./postV1AuthSignUp401Data";
|
|
8
|
+
export type PostV1AuthSignUp401 = {
|
|
9
|
+
data: PostV1AuthSignUp401Data;
|
|
10
|
+
/** Human-readable error message */
|
|
11
|
+
message: string;
|
|
12
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -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
|
+
import type { PostV1AuthSignUp500Data } from "./postV1AuthSignUp500Data";
|
|
8
|
+
export type PostV1AuthSignUp500 = {
|
|
9
|
+
data: PostV1AuthSignUp500Data;
|
|
10
|
+
/** Human-readable error message */
|
|
11
|
+
message: string;
|
|
12
|
+
};
|
|
@@ -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 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,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;
|
package/dist/src/auth.js
ADDED
|
@@ -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/default/default";
|
|
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,36 @@
|
|
|
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
|
+
/** Custom fetch - throws AvallonError on non-2xx */
|
|
16
|
+
export declare function customFetch<T>(url: string, options: RequestInit): Promise<T>;
|
|
17
|
+
/** Typed error class for API errors */
|
|
18
|
+
export declare class AvallonError extends Error {
|
|
19
|
+
readonly status: number;
|
|
20
|
+
readonly body: {
|
|
21
|
+
data?: unknown;
|
|
22
|
+
message?: string;
|
|
23
|
+
};
|
|
24
|
+
constructor(status: number, body: {
|
|
25
|
+
data?: unknown;
|
|
26
|
+
message?: string;
|
|
27
|
+
});
|
|
28
|
+
/** Validation errors (400) have field-level details */
|
|
29
|
+
get errors(): Array<{
|
|
30
|
+
field: string;
|
|
31
|
+
message: string;
|
|
32
|
+
}> | undefined;
|
|
33
|
+
isValidationError(): boolean;
|
|
34
|
+
isUnauthorized(): boolean;
|
|
35
|
+
isNotFound(): boolean;
|
|
36
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
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
|
+
/** Custom fetch - throws AvallonError on non-2xx */
|
|
24
|
+
export async function customFetch(url, options) {
|
|
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
|
+
// Add auth header
|
|
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
|
+
const response = await fetch(fullUrl, {
|
|
41
|
+
...options,
|
|
42
|
+
headers,
|
|
43
|
+
});
|
|
44
|
+
// Parse response based on content type
|
|
45
|
+
const contentType = response.headers.get("Content-Type") ?? "";
|
|
46
|
+
let body;
|
|
47
|
+
if (response.status === 204) {
|
|
48
|
+
// No content
|
|
49
|
+
body = {};
|
|
50
|
+
}
|
|
51
|
+
else if (contentType.includes("application/json")) {
|
|
52
|
+
body = await response.json().catch(() => ({}));
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
// Non-JSON response (shouldn't happen with our API, but handle gracefully)
|
|
56
|
+
const text = await response.text().catch(() => "");
|
|
57
|
+
body = { message: text };
|
|
58
|
+
}
|
|
59
|
+
// Throw on non-2xx - SWR will catch this as `error`
|
|
60
|
+
if (!response.ok) {
|
|
61
|
+
throw new AvallonError(response.status, body);
|
|
62
|
+
}
|
|
63
|
+
// Return success response in expected shape
|
|
64
|
+
return {
|
|
65
|
+
data: body,
|
|
66
|
+
status: response.status,
|
|
67
|
+
headers: response.headers,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
// --------------------------------------------------------------------------
|
|
71
|
+
// Error class
|
|
72
|
+
// --------------------------------------------------------------------------
|
|
73
|
+
/** Typed error class for API errors */
|
|
74
|
+
export class AvallonError extends Error {
|
|
75
|
+
status;
|
|
76
|
+
body;
|
|
77
|
+
constructor(status, body) {
|
|
78
|
+
super(body?.message ?? `API error ${status}`);
|
|
79
|
+
this.status = status;
|
|
80
|
+
this.body = body;
|
|
81
|
+
this.name = "AvallonError";
|
|
82
|
+
}
|
|
83
|
+
/** Validation errors (400) have field-level details */
|
|
84
|
+
get errors() {
|
|
85
|
+
const data = this.body?.data;
|
|
86
|
+
return data?.errors;
|
|
87
|
+
}
|
|
88
|
+
isValidationError() {
|
|
89
|
+
return this.status === 400;
|
|
90
|
+
}
|
|
91
|
+
isUnauthorized() {
|
|
92
|
+
return this.status === 401;
|
|
93
|
+
}
|
|
94
|
+
isNotFound() {
|
|
95
|
+
return this.status === 404;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @avallon/sdk
|
|
3
|
+
*
|
|
4
|
+
* TypeScript SDK for the Avallon API.
|
|
5
|
+
*/
|
|
6
|
+
export { configure, getConfig, AvallonError, type AvallonConfig, } from "./fetcher";
|
|
7
|
+
export { generateCodeVerifier, generateCodeChallenge, startOAuthFlow, getStoredVerifier, clearStoredVerifier, type OAuthProvider, type OAuthFlowParams, type OAuthFlowResult, type AuthTokens, } from "./auth";
|
|
8
|
+
export * from "../generated/endpoints";
|
|
9
|
+
export * from "../generated/models";
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @avallon/sdk
|
|
3
|
+
*
|
|
4
|
+
* TypeScript SDK for the Avallon API.
|
|
5
|
+
*/
|
|
6
|
+
// ============================================================================
|
|
7
|
+
// HANDWRITTEN - Custom code that can't be generated from OpenAPI
|
|
8
|
+
// ============================================================================
|
|
9
|
+
// Runtime configuration (base URL, auth)
|
|
10
|
+
export { configure, getConfig, AvallonError, } from "./fetcher";
|
|
11
|
+
// OAuth PKCE utilities (browser crypto)
|
|
12
|
+
export { generateCodeVerifier, generateCodeChallenge, startOAuthFlow, getStoredVerifier, clearStoredVerifier, } from "./auth";
|
|
13
|
+
// ============================================================================
|
|
14
|
+
// GENERATED - Auto-generated from OpenAPI spec (do not edit)
|
|
15
|
+
// Run `npm run generate` to regenerate
|
|
16
|
+
// ============================================================================
|
|
17
|
+
// API endpoints (SWR hooks + fetch functions)
|
|
18
|
+
export * from "../generated/endpoints";
|
|
19
|
+
// Request/response types
|
|
20
|
+
export * from "../generated/models";
|