@kavachos/expo 0.0.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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 KavachOS
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,145 @@
1
+ import * as react from 'react';
2
+ import { ReactNode } from 'react';
3
+
4
+ interface KavachUser {
5
+ id: string;
6
+ email?: string;
7
+ name?: string;
8
+ image?: string;
9
+ }
10
+ interface KavachSession {
11
+ token: string;
12
+ user: KavachUser;
13
+ expiresAt?: string;
14
+ }
15
+ interface KavachAgent {
16
+ id: string;
17
+ ownerId: string;
18
+ name: string;
19
+ type: "autonomous" | "delegated" | "service";
20
+ token: string;
21
+ permissions: KavachPermission[];
22
+ status: "active" | "revoked" | "expired";
23
+ expiresAt: string | null;
24
+ createdAt: string;
25
+ updatedAt: string;
26
+ }
27
+ interface KavachPermission {
28
+ resource: string;
29
+ actions: string[];
30
+ constraints?: {
31
+ maxCallsPerHour?: number;
32
+ allowedArgPatterns?: string[];
33
+ requireApproval?: boolean;
34
+ timeWindow?: {
35
+ start: string;
36
+ end: string;
37
+ };
38
+ ipAllowlist?: string[];
39
+ };
40
+ }
41
+ interface CreateAgentInput {
42
+ ownerId: string;
43
+ name: string;
44
+ type: "autonomous" | "delegated" | "service";
45
+ permissions: KavachPermission[];
46
+ expiresAt?: string;
47
+ metadata?: Record<string, unknown>;
48
+ }
49
+ type ActionResult<T = void> = {
50
+ success: true;
51
+ data: T;
52
+ } | {
53
+ success: false;
54
+ error: string;
55
+ };
56
+ /**
57
+ * Storage adapter interface — matches AsyncStorage and SecureStore APIs.
58
+ * Pass an implementation from @react-native-async-storage/async-storage or
59
+ * expo-secure-store without importing those packages directly here.
60
+ */
61
+ interface KavachStorage {
62
+ getItem(key: string): Promise<string | null>;
63
+ setItem(key: string, value: string): Promise<void>;
64
+ removeItem(key: string): Promise<void>;
65
+ }
66
+ interface KavachExpoConfig {
67
+ /** Full base URL including path: "https://api.myapp.com/api/kavach" */
68
+ basePath: string;
69
+ /** Storage adapter for persisting session tokens. Defaults to in-memory. */
70
+ storage?: KavachStorage;
71
+ }
72
+ interface KavachContextValue {
73
+ session: KavachSession | null;
74
+ user: KavachUser | null;
75
+ isLoading: boolean;
76
+ isAuthenticated: boolean;
77
+ signIn: (email: string, password: string) => Promise<ActionResult>;
78
+ signUp: (email: string, password: string, name?: string) => Promise<ActionResult>;
79
+ signOut: () => Promise<void>;
80
+ refresh: () => Promise<void>;
81
+ }
82
+
83
+ /**
84
+ * Returns the current session, loading state, and a manual refresh function.
85
+ */
86
+ declare function useSession(): {
87
+ session: KavachSession | null;
88
+ isLoading: boolean;
89
+ refresh: () => Promise<void>;
90
+ };
91
+ /**
92
+ * Returns the current user, loading state, and authentication status.
93
+ */
94
+ declare function useUser(): {
95
+ user: KavachUser | null;
96
+ isLoading: boolean;
97
+ isAuthenticated: boolean;
98
+ };
99
+ /**
100
+ * Returns a signIn function plus local loading and error state.
101
+ */
102
+ declare function useSignIn(): {
103
+ signIn: (email: string, password: string) => Promise<ActionResult>;
104
+ isLoading: boolean;
105
+ error: string | null;
106
+ };
107
+ /**
108
+ * Returns a signUp function plus local loading and error state.
109
+ */
110
+ declare function useSignUp(): {
111
+ signUp: (email: string, password: string, name?: string) => Promise<ActionResult>;
112
+ isLoading: boolean;
113
+ error: string | null;
114
+ };
115
+ /**
116
+ * Returns a signOut function.
117
+ */
118
+ declare function useSignOut(): {
119
+ signOut: () => Promise<void>;
120
+ };
121
+ /**
122
+ * Manages agent identity records for a given user.
123
+ *
124
+ * Sends the session token via Authorization header (not cookies) to work
125
+ * correctly in React Native environments.
126
+ */
127
+ declare function useAgents(basePath: string): {
128
+ agents: KavachAgent[];
129
+ isLoading: boolean;
130
+ error: string | null;
131
+ load: () => Promise<void>;
132
+ create: (input: CreateAgentInput) => Promise<ActionResult<KavachAgent>>;
133
+ revoke: (agentId: string) => Promise<ActionResult>;
134
+ rotate: (agentId: string) => Promise<ActionResult<KavachAgent>>;
135
+ };
136
+
137
+ declare const KavachExpoContext: react.Context<KavachContextValue | null>;
138
+ declare function useKavachContext(): KavachContextValue;
139
+ interface KavachExpoProviderProps {
140
+ config: KavachExpoConfig;
141
+ children: ReactNode;
142
+ }
143
+ declare function KavachExpoProvider({ config, children }: KavachExpoProviderProps): ReactNode;
144
+
145
+ export { type ActionResult, type CreateAgentInput, type KavachAgent, type KavachContextValue, type KavachExpoConfig, KavachExpoContext, KavachExpoProvider, type KavachExpoProviderProps, type KavachPermission, type KavachSession, type KavachStorage, type KavachUser, useAgents, useKavachContext, useSession, useSignIn, useSignOut, useSignUp, useUser };
package/dist/index.js ADDED
@@ -0,0 +1,361 @@
1
+ // src/hooks.ts
2
+ import { useCallback as useCallback2, useContext as useContext2, useState as useState2 } from "react";
3
+
4
+ // src/provider.tsx
5
+ import { createContext, useCallback, useContext, useEffect, useRef, useState } from "react";
6
+
7
+ // src/storage.ts
8
+ function createMemoryStorage() {
9
+ const store = /* @__PURE__ */ new Map();
10
+ return {
11
+ async getItem(key) {
12
+ return store.get(key) ?? null;
13
+ },
14
+ async setItem(key, value) {
15
+ store.set(key, value);
16
+ },
17
+ async removeItem(key) {
18
+ store.delete(key);
19
+ }
20
+ };
21
+ }
22
+
23
+ // src/provider.tsx
24
+ import { jsx } from "react/jsx-runtime";
25
+ var SESSION_KEY = "kavachos_session";
26
+ var KavachExpoContext = createContext(null);
27
+ function useKavachContext() {
28
+ const ctx = useContext(KavachExpoContext);
29
+ if (!ctx) {
30
+ throw new Error("useKavachContext must be used inside <KavachExpoProvider>");
31
+ }
32
+ return ctx;
33
+ }
34
+ function KavachExpoProvider({ config, children }) {
35
+ const [session, setSession] = useState(null);
36
+ const [isLoading, setIsLoading] = useState(true);
37
+ const base = config.basePath.replace(/\/$/, "");
38
+ const storageRef = useRef(config.storage ?? createMemoryStorage());
39
+ useEffect(() => {
40
+ storageRef.current = config.storage ?? createMemoryStorage();
41
+ }, [config.storage]);
42
+ const fetchSession = useCallback(async () => {
43
+ const token = await storageRef.current.getItem(SESSION_KEY);
44
+ if (!token) {
45
+ setSession(null);
46
+ return;
47
+ }
48
+ try {
49
+ const res = await fetch(`${base}/session`, {
50
+ headers: { Authorization: `Bearer ${token}` }
51
+ });
52
+ if (res.ok) {
53
+ const json = await res.json();
54
+ setSession(json.data ?? null);
55
+ if (!json.data) {
56
+ await storageRef.current.removeItem(SESSION_KEY);
57
+ }
58
+ } else {
59
+ setSession(null);
60
+ await storageRef.current.removeItem(SESSION_KEY);
61
+ }
62
+ } catch {
63
+ setSession(null);
64
+ }
65
+ }, [base]);
66
+ useEffect(() => {
67
+ setIsLoading(true);
68
+ void fetchSession().finally(() => {
69
+ setIsLoading(false);
70
+ });
71
+ }, [fetchSession]);
72
+ const refresh = useCallback(async () => {
73
+ await fetchSession();
74
+ }, [fetchSession]);
75
+ const signIn = useCallback(
76
+ async (email, password) => {
77
+ try {
78
+ const res = await fetch(`${base}/sign-in/email`, {
79
+ method: "POST",
80
+ headers: { "Content-Type": "application/json" },
81
+ body: JSON.stringify({ email, password })
82
+ });
83
+ const json = await res.json();
84
+ if (!res.ok) {
85
+ const errBody = json;
86
+ return {
87
+ success: false,
88
+ error: errBody.error?.message ?? `Sign-in failed (${res.status})`
89
+ };
90
+ }
91
+ const okBody = json;
92
+ await storageRef.current.setItem(SESSION_KEY, okBody.data.token);
93
+ setSession(okBody.data);
94
+ return { success: true, data: void 0 };
95
+ } catch (err) {
96
+ return {
97
+ success: false,
98
+ error: err instanceof Error ? err.message : "Network error"
99
+ };
100
+ }
101
+ },
102
+ [base]
103
+ );
104
+ const signUp = useCallback(
105
+ async (email, password, name) => {
106
+ try {
107
+ const res = await fetch(`${base}/sign-up/email`, {
108
+ method: "POST",
109
+ headers: { "Content-Type": "application/json" },
110
+ body: JSON.stringify({ email, password, name })
111
+ });
112
+ const json = await res.json();
113
+ if (!res.ok) {
114
+ const errBody = json;
115
+ return {
116
+ success: false,
117
+ error: errBody.error?.message ?? `Sign-up failed (${res.status})`
118
+ };
119
+ }
120
+ const okBody = json;
121
+ await storageRef.current.setItem(SESSION_KEY, okBody.data.token);
122
+ setSession(okBody.data);
123
+ return { success: true, data: void 0 };
124
+ } catch (err) {
125
+ return {
126
+ success: false,
127
+ error: err instanceof Error ? err.message : "Network error"
128
+ };
129
+ }
130
+ },
131
+ [base]
132
+ );
133
+ const signOut = useCallback(async () => {
134
+ const token = await storageRef.current.getItem(SESSION_KEY);
135
+ try {
136
+ if (token) {
137
+ await fetch(`${base}/sign-out`, {
138
+ method: "POST",
139
+ headers: { Authorization: `Bearer ${token}` }
140
+ });
141
+ }
142
+ } finally {
143
+ await storageRef.current.removeItem(SESSION_KEY);
144
+ setSession(null);
145
+ }
146
+ }, [base]);
147
+ const user = session?.user ?? null;
148
+ const value = {
149
+ session,
150
+ user,
151
+ isLoading,
152
+ isAuthenticated: session !== null,
153
+ signIn,
154
+ signUp,
155
+ signOut,
156
+ refresh
157
+ };
158
+ return /* @__PURE__ */ jsx(KavachExpoContext.Provider, { value, children });
159
+ }
160
+
161
+ // src/hooks.ts
162
+ function useRequiredContext(hookName) {
163
+ const ctx = useContext2(KavachExpoContext);
164
+ if (!ctx) {
165
+ throw new Error(`${hookName} must be used inside <KavachExpoProvider>`);
166
+ }
167
+ return ctx;
168
+ }
169
+ function useSession() {
170
+ const { session, isLoading, refresh } = useRequiredContext("useSession");
171
+ return { session, isLoading, refresh };
172
+ }
173
+ function useUser() {
174
+ const { user, isLoading, isAuthenticated } = useRequiredContext("useUser");
175
+ return { user, isLoading, isAuthenticated };
176
+ }
177
+ function useSignIn() {
178
+ const { signIn } = useRequiredContext("useSignIn");
179
+ const [isLoading, setIsLoading] = useState2(false);
180
+ const [error, setError] = useState2(null);
181
+ const execute = useCallback2(
182
+ async (email, password) => {
183
+ setIsLoading(true);
184
+ setError(null);
185
+ const result = await signIn(email, password);
186
+ if (!result.success) {
187
+ setError(result.error);
188
+ }
189
+ setIsLoading(false);
190
+ return result;
191
+ },
192
+ [signIn]
193
+ );
194
+ return { signIn: execute, isLoading, error };
195
+ }
196
+ function useSignUp() {
197
+ const { signUp } = useRequiredContext("useSignUp");
198
+ const [isLoading, setIsLoading] = useState2(false);
199
+ const [error, setError] = useState2(null);
200
+ const execute = useCallback2(
201
+ async (email, password, name) => {
202
+ setIsLoading(true);
203
+ setError(null);
204
+ const result = await signUp(email, password, name);
205
+ if (!result.success) {
206
+ setError(result.error);
207
+ }
208
+ setIsLoading(false);
209
+ return result;
210
+ },
211
+ [signUp]
212
+ );
213
+ return { signUp: execute, isLoading, error };
214
+ }
215
+ function useSignOut() {
216
+ const { signOut } = useRequiredContext("useSignOut");
217
+ return { signOut };
218
+ }
219
+ function extractError(body, fallback) {
220
+ if (body !== null && typeof body === "object" && "error" in body && body.error !== null && typeof body.error === "object" && "message" in body.error && typeof body.error.message === "string") {
221
+ return body.error.message;
222
+ }
223
+ return fallback;
224
+ }
225
+ function useAgents(basePath) {
226
+ const { user, session } = useRequiredContext("useAgents");
227
+ const base = basePath.replace(/\/$/, "");
228
+ const [agents, setAgents] = useState2([]);
229
+ const [isLoading, setIsLoading] = useState2(false);
230
+ const [error, setError] = useState2(null);
231
+ const token = session?.token ?? null;
232
+ const authHeaders = useCallback2(() => {
233
+ if (token) {
234
+ return { Authorization: `Bearer ${token}` };
235
+ }
236
+ return {};
237
+ }, [token]);
238
+ const load = useCallback2(async () => {
239
+ if (!user) {
240
+ setAgents([]);
241
+ return;
242
+ }
243
+ setIsLoading(true);
244
+ setError(null);
245
+ try {
246
+ const res = await fetch(`${base}/agents?userId=${encodeURIComponent(user.id)}`, {
247
+ headers: authHeaders()
248
+ });
249
+ const json = await res.json();
250
+ if (!res.ok) {
251
+ setError(extractError(json, `Failed to load agents (${res.status})`));
252
+ return;
253
+ }
254
+ setAgents(json.data);
255
+ } catch (err) {
256
+ setError(err instanceof Error ? err.message : "Network error");
257
+ } finally {
258
+ setIsLoading(false);
259
+ }
260
+ }, [base, user, authHeaders]);
261
+ const [loaded, setLoaded] = useState2(false);
262
+ if (user && !loaded) {
263
+ setLoaded(true);
264
+ void Promise.resolve().then(load);
265
+ }
266
+ if (!user && loaded) {
267
+ setLoaded(false);
268
+ setAgents([]);
269
+ }
270
+ const create = useCallback2(
271
+ async (input) => {
272
+ try {
273
+ const res = await fetch(`${base}/agents`, {
274
+ method: "POST",
275
+ headers: { "Content-Type": "application/json", ...authHeaders() },
276
+ body: JSON.stringify(input)
277
+ });
278
+ const json = await res.json();
279
+ if (!res.ok) {
280
+ return {
281
+ success: false,
282
+ error: extractError(json, `Failed to create agent (${res.status})`)
283
+ };
284
+ }
285
+ const agent = json.data;
286
+ await load();
287
+ return { success: true, data: agent };
288
+ } catch (err) {
289
+ return {
290
+ success: false,
291
+ error: err instanceof Error ? err.message : "Network error"
292
+ };
293
+ }
294
+ },
295
+ [base, load, authHeaders]
296
+ );
297
+ const revoke = useCallback2(
298
+ async (agentId) => {
299
+ try {
300
+ const res = await fetch(`${base}/agents/${encodeURIComponent(agentId)}`, {
301
+ method: "DELETE",
302
+ headers: authHeaders()
303
+ });
304
+ if (!res.ok && res.status !== 204) {
305
+ const json = await res.json().catch(() => null);
306
+ return {
307
+ success: false,
308
+ error: extractError(json, `Failed to revoke agent (${res.status})`)
309
+ };
310
+ }
311
+ await load();
312
+ return { success: true, data: void 0 };
313
+ } catch (err) {
314
+ return {
315
+ success: false,
316
+ error: err instanceof Error ? err.message : "Network error"
317
+ };
318
+ }
319
+ },
320
+ [base, load, authHeaders]
321
+ );
322
+ const rotate = useCallback2(
323
+ async (agentId) => {
324
+ try {
325
+ const res = await fetch(`${base}/agents/${encodeURIComponent(agentId)}/rotate`, {
326
+ method: "POST",
327
+ headers: authHeaders()
328
+ });
329
+ const json = await res.json();
330
+ if (!res.ok) {
331
+ return {
332
+ success: false,
333
+ error: extractError(json, `Failed to rotate agent token (${res.status})`)
334
+ };
335
+ }
336
+ const agent = json.data;
337
+ await load();
338
+ return { success: true, data: agent };
339
+ } catch (err) {
340
+ return {
341
+ success: false,
342
+ error: err instanceof Error ? err.message : "Network error"
343
+ };
344
+ }
345
+ },
346
+ [base, load, authHeaders]
347
+ );
348
+ return { agents, isLoading, error, load, create, revoke, rotate };
349
+ }
350
+ export {
351
+ KavachExpoContext,
352
+ KavachExpoProvider,
353
+ useAgents,
354
+ useKavachContext,
355
+ useSession,
356
+ useSignIn,
357
+ useSignOut,
358
+ useSignUp,
359
+ useUser
360
+ };
361
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks.ts","../src/provider.tsx","../src/storage.ts"],"sourcesContent":["import { useCallback, useContext, useState } from \"react\";\nimport { KavachExpoContext } from \"./provider.js\";\nimport type { ActionResult, CreateAgentInput, KavachAgent } from \"./types.js\";\n\n// ─── Guards ────────────────────────────────────────────────────────────────────\n\nfunction useRequiredContext(hookName: string) {\n\tconst ctx = useContext(KavachExpoContext);\n\tif (!ctx) {\n\t\tthrow new Error(`${hookName} must be used inside <KavachExpoProvider>`);\n\t}\n\treturn ctx;\n}\n\n// ─── useSession ───────────────────────────────────────────────────────────────\n\n/**\n * Returns the current session, loading state, and a manual refresh function.\n */\nexport function useSession() {\n\tconst { session, isLoading, refresh } = useRequiredContext(\"useSession\");\n\treturn { session, isLoading, refresh };\n}\n\n// ─── useUser ──────────────────────────────────────────────────────────────────\n\n/**\n * Returns the current user, loading state, and authentication status.\n */\nexport function useUser() {\n\tconst { user, isLoading, isAuthenticated } = useRequiredContext(\"useUser\");\n\treturn { user, isLoading, isAuthenticated };\n}\n\n// ─── useSignIn ────────────────────────────────────────────────────────────────\n\n/**\n * Returns a signIn function plus local loading and error state.\n */\nexport function useSignIn() {\n\tconst { signIn } = useRequiredContext(\"useSignIn\");\n\tconst [isLoading, setIsLoading] = useState(false);\n\tconst [error, setError] = useState<string | null>(null);\n\n\tconst execute = useCallback(\n\t\tasync (email: string, password: string): Promise<ActionResult> => {\n\t\t\tsetIsLoading(true);\n\t\t\tsetError(null);\n\t\t\tconst result = await signIn(email, password);\n\t\t\tif (!result.success) {\n\t\t\t\tsetError(result.error);\n\t\t\t}\n\t\t\tsetIsLoading(false);\n\t\t\treturn result;\n\t\t},\n\t\t[signIn],\n\t);\n\n\treturn { signIn: execute, isLoading, error };\n}\n\n// ─── useSignUp ────────────────────────────────────────────────────────────────\n\n/**\n * Returns a signUp function plus local loading and error state.\n */\nexport function useSignUp() {\n\tconst { signUp } = useRequiredContext(\"useSignUp\");\n\tconst [isLoading, setIsLoading] = useState(false);\n\tconst [error, setError] = useState<string | null>(null);\n\n\tconst execute = useCallback(\n\t\tasync (email: string, password: string, name?: string): Promise<ActionResult> => {\n\t\t\tsetIsLoading(true);\n\t\t\tsetError(null);\n\t\t\tconst result = await signUp(email, password, name);\n\t\t\tif (!result.success) {\n\t\t\t\tsetError(result.error);\n\t\t\t}\n\t\t\tsetIsLoading(false);\n\t\t\treturn result;\n\t\t},\n\t\t[signUp],\n\t);\n\n\treturn { signUp: execute, isLoading, error };\n}\n\n// ─── useSignOut ───────────────────────────────────────────────────────────────\n\n/**\n * Returns a signOut function.\n */\nexport function useSignOut() {\n\tconst { signOut } = useRequiredContext(\"useSignOut\");\n\treturn { signOut };\n}\n\n// ─── useAgents ────────────────────────────────────────────────────────────────\n\ninterface AgentApiResponse {\n\tdata: KavachAgent[];\n}\n\ninterface AgentSingleApiResponse {\n\tdata: KavachAgent;\n}\n\ninterface ApiErrorResponse {\n\terror: {\n\t\tcode: string;\n\t\tmessage: string;\n\t};\n}\n\nfunction extractError(body: unknown, fallback: string): string {\n\tif (\n\t\tbody !== null &&\n\t\ttypeof body === \"object\" &&\n\t\t\"error\" in body &&\n\t\tbody.error !== null &&\n\t\ttypeof body.error === \"object\" &&\n\t\t\"message\" in body.error &&\n\t\ttypeof (body as ApiErrorResponse).error.message === \"string\"\n\t) {\n\t\treturn (body as ApiErrorResponse).error.message;\n\t}\n\treturn fallback;\n}\n\n/**\n * Manages agent identity records for a given user.\n *\n * Sends the session token via Authorization header (not cookies) to work\n * correctly in React Native environments.\n */\nexport function useAgents(basePath: string) {\n\tconst { user, session } = useRequiredContext(\"useAgents\");\n\tconst base = basePath.replace(/\\/$/, \"\");\n\n\tconst [agents, setAgents] = useState<KavachAgent[]>([]);\n\tconst [isLoading, setIsLoading] = useState(false);\n\tconst [error, setError] = useState<string | null>(null);\n\n\tconst token = session?.token ?? null;\n\n\tconst authHeaders = useCallback((): Record<string, string> => {\n\t\tif (token) {\n\t\t\treturn { Authorization: `Bearer ${token}` };\n\t\t}\n\t\treturn {};\n\t}, [token]);\n\n\tconst load = useCallback(async (): Promise<void> => {\n\t\tif (!user) {\n\t\t\tsetAgents([]);\n\t\t\treturn;\n\t\t}\n\t\tsetIsLoading(true);\n\t\tsetError(null);\n\t\ttry {\n\t\t\tconst res = await fetch(`${base}/agents?userId=${encodeURIComponent(user.id)}`, {\n\t\t\t\theaders: authHeaders(),\n\t\t\t});\n\t\t\tconst json: unknown = await res.json();\n\t\t\tif (!res.ok) {\n\t\t\t\tsetError(extractError(json, `Failed to load agents (${res.status})`));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetAgents((json as AgentApiResponse).data);\n\t\t} catch (err) {\n\t\t\tsetError(err instanceof Error ? err.message : \"Network error\");\n\t\t} finally {\n\t\t\tsetIsLoading(false);\n\t\t}\n\t}, [base, user, authHeaders]);\n\n\t// Load once when user is available\n\tconst [loaded, setLoaded] = useState(false);\n\tif (user && !loaded) {\n\t\tsetLoaded(true);\n\t\tvoid Promise.resolve().then(load);\n\t}\n\tif (!user && loaded) {\n\t\tsetLoaded(false);\n\t\tsetAgents([]);\n\t}\n\n\tconst create = useCallback(\n\t\tasync (input: CreateAgentInput): Promise<ActionResult<KavachAgent>> => {\n\t\t\ttry {\n\t\t\t\tconst res = await fetch(`${base}/agents`, {\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\theaders: { \"Content-Type\": \"application/json\", ...authHeaders() },\n\t\t\t\t\tbody: JSON.stringify(input),\n\t\t\t\t});\n\t\t\t\tconst json: unknown = await res.json();\n\t\t\t\tif (!res.ok) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\terror: extractError(json, `Failed to create agent (${res.status})`),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst agent = (json as AgentSingleApiResponse).data;\n\t\t\t\tawait load();\n\t\t\t\treturn { success: true, data: agent };\n\t\t\t} catch (err) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: err instanceof Error ? err.message : \"Network error\",\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t\t[base, load, authHeaders],\n\t);\n\n\tconst revoke = useCallback(\n\t\tasync (agentId: string): Promise<ActionResult> => {\n\t\t\ttry {\n\t\t\t\tconst res = await fetch(`${base}/agents/${encodeURIComponent(agentId)}`, {\n\t\t\t\t\tmethod: \"DELETE\",\n\t\t\t\t\theaders: authHeaders(),\n\t\t\t\t});\n\t\t\t\tif (!res.ok && res.status !== 204) {\n\t\t\t\t\tconst json: unknown = await res.json().catch(() => null);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\terror: extractError(json, `Failed to revoke agent (${res.status})`),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tawait load();\n\t\t\t\treturn { success: true, data: undefined };\n\t\t\t} catch (err) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: err instanceof Error ? err.message : \"Network error\",\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t\t[base, load, authHeaders],\n\t);\n\n\tconst rotate = useCallback(\n\t\tasync (agentId: string): Promise<ActionResult<KavachAgent>> => {\n\t\t\ttry {\n\t\t\t\tconst res = await fetch(`${base}/agents/${encodeURIComponent(agentId)}/rotate`, {\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\theaders: authHeaders(),\n\t\t\t\t});\n\t\t\t\tconst json: unknown = await res.json();\n\t\t\t\tif (!res.ok) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\terror: extractError(json, `Failed to rotate agent token (${res.status})`),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst agent = (json as AgentSingleApiResponse).data;\n\t\t\t\tawait load();\n\t\t\t\treturn { success: true, data: agent };\n\t\t\t} catch (err) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: err instanceof Error ? err.message : \"Network error\",\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t\t[base, load, authHeaders],\n\t);\n\n\treturn { agents, isLoading, error, load, create, revoke, rotate };\n}\n","import type { ReactNode } from \"react\";\nimport { createContext, useCallback, useContext, useEffect, useRef, useState } from \"react\";\nimport { createMemoryStorage } from \"./storage.js\";\nimport type {\n\tActionResult,\n\tKavachContextValue,\n\tKavachExpoConfig,\n\tKavachSession,\n\tKavachStorage,\n\tKavachUser,\n} from \"./types.js\";\n\nconst SESSION_KEY = \"kavachos_session\";\n\n// ─── Context ──────────────────────────────────────────────────────────────────\n\nexport const KavachExpoContext = createContext<KavachContextValue | null>(null);\n\nexport function useKavachContext(): KavachContextValue {\n\tconst ctx = useContext(KavachExpoContext);\n\tif (!ctx) {\n\t\tthrow new Error(\"useKavachContext must be used inside <KavachExpoProvider>\");\n\t}\n\treturn ctx;\n}\n\n// ─── Provider ─────────────────────────────────────────────────────────────────\n\nexport interface KavachExpoProviderProps {\n\tconfig: KavachExpoConfig;\n\tchildren: ReactNode;\n}\n\nexport function KavachExpoProvider({ config, children }: KavachExpoProviderProps): ReactNode {\n\tconst [session, setSession] = useState<KavachSession | null>(null);\n\tconst [isLoading, setIsLoading] = useState(true);\n\n\t// Strip trailing slash from basePath once\n\tconst base = config.basePath.replace(/\\/$/, \"\");\n\n\t// Storage adapter — stable ref so callbacks don't re-create on each render\n\tconst storageRef = useRef<KavachStorage>(config.storage ?? createMemoryStorage());\n\n\t// Keep storage ref in sync when config changes\n\tuseEffect(() => {\n\t\tstorageRef.current = config.storage ?? createMemoryStorage();\n\t}, [config.storage]);\n\n\t// ─── Fetch session from server (using stored token) ──────────────────────\n\n\tconst fetchSession = useCallback(async (): Promise<void> => {\n\t\tconst token = await storageRef.current.getItem(SESSION_KEY);\n\t\tif (!token) {\n\t\t\tsetSession(null);\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst res = await fetch(`${base}/session`, {\n\t\t\t\theaders: { Authorization: `Bearer ${token}` },\n\t\t\t});\n\t\t\tif (res.ok) {\n\t\t\t\tconst json = (await res.json()) as { data?: KavachSession };\n\t\t\t\tsetSession(json.data ?? null);\n\t\t\t\tif (!json.data) {\n\t\t\t\t\tawait storageRef.current.removeItem(SESSION_KEY);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsetSession(null);\n\t\t\t\tawait storageRef.current.removeItem(SESSION_KEY);\n\t\t\t}\n\t\t} catch {\n\t\t\tsetSession(null);\n\t\t}\n\t}, [base]);\n\n\t// Fetch session on mount\n\tuseEffect(() => {\n\t\tsetIsLoading(true);\n\t\tvoid fetchSession().finally(() => {\n\t\t\tsetIsLoading(false);\n\t\t});\n\t}, [fetchSession]);\n\n\tconst refresh = useCallback(async (): Promise<void> => {\n\t\tawait fetchSession();\n\t}, [fetchSession]);\n\n\t// ─── Sign in ──────────────────────────────────────────────────────────────\n\n\tconst signIn = useCallback(\n\t\tasync (email: string, password: string): Promise<ActionResult> => {\n\t\t\ttry {\n\t\t\t\tconst res = await fetch(`${base}/sign-in/email`, {\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\t\tbody: JSON.stringify({ email, password }),\n\t\t\t\t});\n\n\t\t\t\tconst json = (await res.json()) as\n\t\t\t\t\t| { data: KavachSession }\n\t\t\t\t\t| { error: { code: string; message: string } };\n\n\t\t\t\tif (!res.ok) {\n\t\t\t\t\tconst errBody = json as { error: { code: string; message: string } };\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\terror: errBody.error?.message ?? `Sign-in failed (${res.status})`,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tconst okBody = json as { data: KavachSession };\n\t\t\t\tawait storageRef.current.setItem(SESSION_KEY, okBody.data.token);\n\t\t\t\tsetSession(okBody.data);\n\t\t\t\treturn { success: true, data: undefined };\n\t\t\t} catch (err) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: err instanceof Error ? err.message : \"Network error\",\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t\t[base],\n\t);\n\n\t// ─── Sign up ──────────────────────────────────────────────────────────────\n\n\tconst signUp = useCallback(\n\t\tasync (email: string, password: string, name?: string): Promise<ActionResult> => {\n\t\t\ttry {\n\t\t\t\tconst res = await fetch(`${base}/sign-up/email`, {\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\t\tbody: JSON.stringify({ email, password, name }),\n\t\t\t\t});\n\n\t\t\t\tconst json = (await res.json()) as\n\t\t\t\t\t| { data: KavachSession }\n\t\t\t\t\t| { error: { code: string; message: string } };\n\n\t\t\t\tif (!res.ok) {\n\t\t\t\t\tconst errBody = json as { error: { code: string; message: string } };\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\terror: errBody.error?.message ?? `Sign-up failed (${res.status})`,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tconst okBody = json as { data: KavachSession };\n\t\t\t\tawait storageRef.current.setItem(SESSION_KEY, okBody.data.token);\n\t\t\t\tsetSession(okBody.data);\n\t\t\t\treturn { success: true, data: undefined };\n\t\t\t} catch (err) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: err instanceof Error ? err.message : \"Network error\",\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t\t[base],\n\t);\n\n\t// ─── Sign out ─────────────────────────────────────────────────────────────\n\n\tconst signOut = useCallback(async (): Promise<void> => {\n\t\tconst token = await storageRef.current.getItem(SESSION_KEY);\n\t\ttry {\n\t\t\tif (token) {\n\t\t\t\tawait fetch(`${base}/sign-out`, {\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\theaders: { Authorization: `Bearer ${token}` },\n\t\t\t\t});\n\t\t\t}\n\t\t} finally {\n\t\t\tawait storageRef.current.removeItem(SESSION_KEY);\n\t\t\tsetSession(null);\n\t\t}\n\t}, [base]);\n\n\tconst user: KavachUser | null = session?.user ?? null;\n\n\tconst value: KavachContextValue = {\n\t\tsession,\n\t\tuser,\n\t\tisLoading,\n\t\tisAuthenticated: session !== null,\n\t\tsignIn,\n\t\tsignUp,\n\t\tsignOut,\n\t\trefresh,\n\t};\n\n\treturn <KavachExpoContext.Provider value={value}>{children}</KavachExpoContext.Provider>;\n}\n","import type { KavachStorage } from \"./types.js\";\n\n/**\n * Minimal in-memory storage fallback used when no storage adapter is provided.\n * Tokens are lost when the JS runtime reloads. Pass a real adapter\n * (AsyncStorage, SecureStore) via KavachExpoConfig.storage.\n */\nexport function createMemoryStorage(): KavachStorage {\n\tconst store = new Map<string, string>();\n\treturn {\n\t\tasync getItem(key: string): Promise<string | null> {\n\t\t\treturn store.get(key) ?? null;\n\t\t},\n\t\tasync setItem(key: string, value: string): Promise<void> {\n\t\t\tstore.set(key, value);\n\t\t},\n\t\tasync removeItem(key: string): Promise<void> {\n\t\t\tstore.delete(key);\n\t\t},\n\t};\n}\n"],"mappings":"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","names":["useCallback","useContext","useState","useContext","useState","useCallback"]}
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@kavachos/expo",
3
+ "version": "0.0.3",
4
+ "description": "React Native / Expo client for KavachOS auth",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "license": "MIT",
18
+ "author": "KavachOS <hello@kavachos.com>",
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "https://github.com/kavachos/kavachos.git",
22
+ "directory": "packages/expo"
23
+ },
24
+ "peerDependencies": {
25
+ "react": ">=18.0.0",
26
+ "react-native": ">=0.72.0"
27
+ },
28
+ "devDependencies": {
29
+ "react": "^19.0.0",
30
+ "@types/react": "^19.0.0",
31
+ "tsup": "^8.4.0",
32
+ "typescript": "^5.8.0"
33
+ },
34
+ "scripts": {
35
+ "build": "tsup",
36
+ "typecheck": "tsc --noEmit"
37
+ }
38
+ }