@llmnative/react 2.4.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/README.md +3 -2
  2. package/dist/index.js +20 -21
  3. package/dist/index.js.map +1 -1
  4. package/dist/index.mjs +6570 -6733
  5. package/dist/index.mjs.map +1 -1
  6. package/dist/modelIdentity-CIXNPtTA.mjs +624 -0
  7. package/dist/modelIdentity-CIXNPtTA.mjs.map +1 -0
  8. package/dist/modelIdentity-DX62i7g2.js +3 -0
  9. package/dist/modelIdentity-DX62i7g2.js.map +1 -0
  10. package/dist/server-B430eH0y.mjs +352 -0
  11. package/dist/server-B430eH0y.mjs.map +1 -0
  12. package/dist/server-CDheNgME.js +2 -0
  13. package/dist/server-CDheNgME.js.map +1 -0
  14. package/dist/server.js +1 -1
  15. package/dist/server.mjs +3 -3
  16. package/dist/types/src/App.d.ts +6 -4
  17. package/dist/types/src/index.d.ts +16 -7
  18. package/dist/types/src/libs/index.d.ts +0 -1
  19. package/dist/types/src/providers/ProviderRegistryContext.d.ts +7 -5
  20. package/dist/types/src/providers/ai/server.d.ts +20 -0
  21. package/dist/types/src/providers/api/ApiProvider.d.ts +1 -1
  22. package/dist/types/src/providers/email/EmailError.d.ts +27 -0
  23. package/dist/types/src/providers/email/EmailProviderContext.d.ts +13 -7
  24. package/dist/types/src/providers/email/EmailRead.d.ts +48 -0
  25. package/dist/types/src/providers/email/EmailSend.d.ts +54 -0
  26. package/dist/types/src/providers/email/brevo/BrevoEmailSender.d.ts +21 -0
  27. package/dist/types/src/providers/email/definitions.d.ts +4 -2
  28. package/dist/types/src/providers/email/gmail/GmailEmailReader.d.ts +37 -0
  29. package/dist/types/src/providers/email/gmail/GmailEmailSender.d.ts +21 -0
  30. package/dist/types/src/providers/email/gmail/browser.d.ts +10 -0
  31. package/dist/types/src/providers/email/gmail/gmailApi.d.ts +53 -0
  32. package/dist/types/src/providers/email/gmail/gmailOAuth.d.ts +25 -0
  33. package/dist/types/src/providers/email/imap/ImapEmailReader.d.ts +70 -0
  34. package/dist/types/src/providers/email/resend/ResendEmailSender.d.ts +20 -0
  35. package/dist/types/src/providers/manifest.d.ts +7 -5
  36. package/dist/vite.js +1 -1
  37. package/dist/vite.mjs +1 -1
  38. package/llms-full.txt +1690 -1657
  39. package/llms.txt +83 -82
  40. package/package.json +18 -1
  41. package/dist/modelIdentity-CGWliGDU.mjs +0 -183
  42. package/dist/modelIdentity-CGWliGDU.mjs.map +0 -1
  43. package/dist/modelIdentity-CgRMrC5H.js +0 -2
  44. package/dist/modelIdentity-CgRMrC5H.js.map +0 -1
  45. package/dist/server-CCbjPJEz.js +0 -2
  46. package/dist/server-CCbjPJEz.js.map +0 -1
  47. package/dist/server-CiWwr3Zg.mjs +0 -107
  48. package/dist/server-CiWwr3Zg.mjs.map +0 -1
  49. package/dist/types/src/libs/email.d.ts +0 -16
  50. package/dist/types/src/providers/email/EmailProvider.d.ts +0 -10
  51. package/dist/types/src/providers/email/google/GmailEmailProvider.d.ts +0 -7
  52. package/dist/types/src/providers/email/google/email.d.ts +0 -13
@@ -1,107 +0,0 @@
1
- import { d as e, u as t } from "./modelIdentity-CGWliGDU.mjs";
2
- //#region src/providers/auth/github/githubOAuth.ts
3
- var n = class extends Error {
4
- status;
5
- constructor(e, t) {
6
- super(e), this.status = t;
7
- }
8
- }, r = "https://github.com", i = "https://api.github.com";
9
- function a(e, t = globalThis.fetch) {
10
- let a = async (e, r) => {
11
- let a = await t(`${i}${e}`, { headers: {
12
- Accept: "application/vnd.github+json",
13
- Authorization: `Bearer ${r}`,
14
- "X-GitHub-Api-Version": "2022-11-28"
15
- } });
16
- if (!a.ok) throw new n(`GitHub ${e}: HTTP ${a.status}`, a.status);
17
- return a.json();
18
- };
19
- return {
20
- authorizeUrl({ state: t, redirectUri: n, scopes: i = e.scopes, codeChallenge: a }) {
21
- let o = new URLSearchParams({
22
- client_id: e.clientId,
23
- redirect_uri: n,
24
- state: t
25
- });
26
- return i?.length && o.set("scope", i.join(" ")), a && (o.set("code_challenge", a), o.set("code_challenge_method", "S256")), `${r}/login/oauth/authorize?${o.toString()}`;
27
- },
28
- async exchangeCode({ code: i, redirectUri: a, codeVerifier: o }) {
29
- let s = await t(`${r}/login/oauth/access_token`, {
30
- method: "POST",
31
- headers: {
32
- Accept: "application/json",
33
- "Content-Type": "application/json"
34
- },
35
- body: JSON.stringify({
36
- client_id: e.clientId,
37
- client_secret: e.clientSecret,
38
- code: i,
39
- redirect_uri: a,
40
- ...o ? { code_verifier: o } : {}
41
- })
42
- }), c = await s.json().catch(() => ({}));
43
- if (!s.ok || typeof c.access_token != "string") throw new n(String(c.error_description ?? c.error ?? `HTTP ${s.status}`), s.status);
44
- return {
45
- accessToken: c.access_token,
46
- scope: String(c.scope ?? "")
47
- };
48
- },
49
- async getUser(e) {
50
- let t = await a("/user", e);
51
- return {
52
- login: t.login,
53
- name: t.name ?? null,
54
- avatarUrl: t.avatar_url ?? null,
55
- email: t.email ?? null
56
- };
57
- },
58
- async getOrganizations(e) {
59
- return (await a("/user/memberships/orgs?state=active&per_page=100", e)).map(({ role: e, organization: t }) => ({
60
- login: t.login,
61
- avatarUrl: t.avatar_url ?? null,
62
- role: e === "admin" ? "admin" : "member"
63
- }));
64
- }
65
- };
66
- }
67
- //#endregion
68
- //#region src/providers/ai/server.ts
69
- async function o(n, r) {
70
- let i = [n.url, ...Object.values(n.headers)].flatMap(t);
71
- if (i.length === 0) return {
72
- ok: !0,
73
- url: n.url,
74
- headers: n.headers
75
- };
76
- let a = new URL(n.url), { url: o } = n, s = { ...n.headers }, c = /* @__PURE__ */ new Set();
77
- for (let { placeholder: t, scope: n, provider: l } of i) {
78
- if (c.has(t)) continue;
79
- c.add(t);
80
- let i = await r(n, l);
81
- if (!i?.apiKey) return {
82
- ok: !1,
83
- status: 404,
84
- error: "unknown-credential",
85
- provider: l
86
- };
87
- if (!e({
88
- ...i,
89
- id: l
90
- }, a)) return {
91
- ok: !1,
92
- status: 403,
93
- error: "forbidden-target",
94
- provider: l
95
- };
96
- o = o.split(t).join(encodeURIComponent(i.apiKey)), s = Object.fromEntries(Object.entries(s).map(([e, n]) => [e, n.split(t).join(i.apiKey)]));
97
- }
98
- return {
99
- ok: !0,
100
- url: o,
101
- headers: s
102
- };
103
- }
104
- //#endregion
105
- export { n, a as r, o as t };
106
-
107
- //# sourceMappingURL=server-CiWwr3Zg.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server-CiWwr3Zg.mjs","names":["isAIProviderTarget","findServerCredentials","GitHubOAuthError","message","status","GITHUB","API","createGitHubOAuth","api","response","fetchFn","path","token","config","params","redirectUri","scopes","codeChallenge","codeVerifier","body","user","organization","role","resolveServerCredentials","found","request","target","headers","done","placeholder","secret","lookup","scope","provider","url","name","value"],"sources":["../src/providers/auth/github/githubOAuth.ts","../src/providers/ai/server.ts"],"sourcesContent":["// The GitHub side of the sign-in of an app whose server holds the session (CR-104): the authorize\n// URL, the code exchange (it needs the client secret: server only), the profile and the\n// organizations of the person. Pure: no React, no browser API; `fetchFn` is replaceable in tests.\n\nexport type GitHubOAuthConfig = {\n clientId: string;\n clientSecret: string;\n /** Default scopes, e.g. `['read:org']` to list the organizations of the person. */\n scopes?: string[];\n};\n\nexport type GitHubOAuthUser = { login: string; name: string | null; avatarUrl: string | null; email: string | null };\n\nexport type GitHubOAuthOrganization = { login: string; avatarUrl: string | null; role: 'admin' | 'member' };\n\nexport class GitHubOAuthError extends Error {\n constructor(message: string, readonly status?: number) {\n super(message);\n }\n}\n\nconst GITHUB = 'https://github.com';\nconst API = 'https://api.github.com';\n\nexport function createGitHubOAuth(config: GitHubOAuthConfig, fetchFn: typeof fetch = globalThis.fetch) {\n const api = async <T>(path: string, token: string): Promise<T> => {\n const response = await fetchFn(`${API}${path}`, {\n headers: { Accept: 'application/vnd.github+json', Authorization: `Bearer ${token}`, 'X-GitHub-Api-Version': '2022-11-28' },\n });\n if (!response.ok) throw new GitHubOAuthError(`GitHub ${path}: HTTP ${response.status}`, response.status);\n return response.json() as Promise<T>;\n };\n\n return {\n /** Where the person authorizes the app. `state` ties the callback to this request; `codeChallenge` (S256) adds PKCE. */\n authorizeUrl({ state, redirectUri, scopes = config.scopes, codeChallenge }: { state: string; redirectUri: string; scopes?: string[]; codeChallenge?: string }): string {\n const params = new URLSearchParams({ client_id: config.clientId, redirect_uri: redirectUri, state });\n if (scopes?.length) params.set('scope', scopes.join(' '));\n if (codeChallenge) {\n params.set('code_challenge', codeChallenge);\n params.set('code_challenge_method', 'S256');\n }\n return `${GITHUB}/login/oauth/authorize?${params.toString()}`;\n },\n\n /** The access token for the code GitHub sent back. */\n async exchangeCode({ code, redirectUri, codeVerifier }: { code: string; redirectUri: string; codeVerifier?: string }): Promise<{ accessToken: string; scope: string }> {\n const response = await fetchFn(`${GITHUB}/login/oauth/access_token`, {\n method: 'POST',\n headers: { Accept: 'application/json', 'Content-Type': 'application/json' },\n body: JSON.stringify({\n client_id: config.clientId,\n client_secret: config.clientSecret,\n code,\n redirect_uri: redirectUri,\n ...(codeVerifier ? { code_verifier: codeVerifier } : {}),\n }),\n });\n const body = await response.json().catch(() => ({})) as Record<string, unknown>;\n if (!response.ok || typeof body.access_token !== 'string') {\n throw new GitHubOAuthError(String(body.error_description ?? body.error ?? `HTTP ${response.status}`), response.status);\n }\n return { accessToken: body.access_token, scope: String(body.scope ?? '') };\n },\n\n async getUser(token: string): Promise<GitHubOAuthUser> {\n const user = await api<{ login: string; name?: string | null; avatar_url?: string | null; email?: string | null }>('/user', token);\n return { login: user.login, name: user.name ?? null, avatarUrl: user.avatar_url ?? null, email: user.email ?? null };\n },\n\n /** The organizations the person belongs to, with their role (needs `read:org`). */\n async getOrganizations(token: string): Promise<GitHubOAuthOrganization[]> {\n const memberships = await api<Array<{ role: string; organization: { login: string; avatar_url?: string | null } }>>('/user/memberships/orgs?state=active&per_page=100', token);\n return memberships.map(({ role, organization }) => ({\n login: organization.login,\n avatarUrl: organization.avatar_url ?? null,\n role: role === 'admin' ? 'admin' : 'member',\n }));\n },\n };\n}\n\nexport type GitHubOAuth = ReturnType<typeof createGitHubOAuth>;\n","// `@llmnative/react/server`: what a Node proxy needs for server-held AI credentials (CR-102).\r\n// No React and no browser API: it runs in the app's own server or in the Vite dev proxy.\r\n\r\nimport { findServerCredentials, isAIProviderTarget, type ServerAIConnection } from './serverCredentials';\r\n\r\nexport { AI_PROVIDER_HOSTS, isAIProviderTarget, serverCredential, SERVER_CREDENTIAL_PREFIX } from './serverCredentials';\r\nexport type { ServerAIConnection } from './serverCredentials';\r\n// Sign-in with GitHub held by the app's server (CR-104): authorize URL, code exchange, profile, organizations.\r\nexport { createGitHubOAuth, GitHubOAuthError } from '../auth/github/githubOAuth';\r\nexport type { GitHubOAuth, GitHubOAuthConfig, GitHubOAuthOrganization, GitHubOAuthUser } from '../auth/github/githubOAuth';\r\n// Provider-agnostic identity of models (CR-103): pure, so a server or a generator can resolve them too.\r\nexport { canonicalModelName, buildModelIdentityIndex, resolveModel, modelOffers, loadModelIdentityIndex } from './modelIdentity';\r\nexport type { ModelIdentity, ModelIdentityEntry, ModelIdentityIndex, ResolvedModel, ModelOffer, ModelCost } from './modelIdentity';\r\n\r\n/** The connection of a provider as the server keeps it, key included. */\r\nexport type ServerAISecret = ServerAIConnection & { apiKey: string };\r\n\r\n/** The key of `provider` for `scope` (e.g. a company), or nothing when it is not connected. */\r\nexport type ServerCredentialLookup = (scope: string, provider: string) => ServerAISecret | undefined | Promise<ServerAISecret | undefined>;\r\n\r\nexport type ServerCredentialRequest = { url: string; headers: Record<string, string> };\r\n\r\nexport type ServerCredentialResolution =\r\n | { ok: true; url: string; headers: Record<string, string> }\r\n /** 404: the provider is not connected for that scope; 403: the target is not a host of that provider. */\r\n | { ok: false; status: 403 | 404; error: 'unknown-credential' | 'forbidden-target'; provider: string };\r\n\r\n/**\r\n * Swaps every server-credential placeholder of a proxied request (headers and URL) for the key it\r\n * stands for. The key only goes to a host of its provider: any other target is refused, so a\r\n * placeholder can never carry a key elsewhere. A request without placeholders passes unchanged.\r\n */\r\nexport async function resolveServerCredentials(request: ServerCredentialRequest, lookup: ServerCredentialLookup): Promise<ServerCredentialResolution> {\r\n const found = [request.url, ...Object.values(request.headers)].flatMap(findServerCredentials);\r\n if (found.length === 0) return { ok: true, url: request.url, headers: request.headers };\r\n\r\n const target = new URL(request.url);\r\n let { url } = request;\r\n let headers = { ...request.headers };\r\n const done = new Set<string>();\r\n for (const { placeholder, scope, provider } of found) {\r\n if (done.has(placeholder)) continue;\r\n done.add(placeholder);\r\n const secret = await lookup(scope, provider);\r\n if (!secret?.apiKey) return { ok: false, status: 404, error: 'unknown-credential', provider };\r\n if (!isAIProviderTarget({ ...secret, id: provider }, target)) return { ok: false, status: 403, error: 'forbidden-target', provider };\r\n url = url.split(placeholder).join(encodeURIComponent(secret.apiKey));\r\n headers = Object.fromEntries(Object.entries(headers).map(([name, value]) => [name, value.split(placeholder).join(secret.apiKey)]));\r\n }\r\n return { ok: true, url, headers };\r\n}\r\n"],"mappings":"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"}
@@ -1,16 +0,0 @@
1
- type Recipient = {
2
- email: string;
3
- name?: string;
4
- };
5
- type EmailContent = string | React.ReactNode;
6
- export declare function sendEmail({ to, bcc, subject, message, }: {
7
- to: string | string[] | Recipient | Recipient[];
8
- bcc?: string | string[];
9
- subject: string;
10
- message?: EmailContent;
11
- }): Promise<{
12
- id: string;
13
- threadId: string;
14
- labelIds?: string[];
15
- }[]>;
16
- export {};
@@ -1,10 +0,0 @@
1
- import type { ProviderConfigurable } from '../ProviderConfiguration';
2
- export interface EmailSendParams {
3
- to: string | string[];
4
- bcc?: string | string[];
5
- subject: string;
6
- message: string;
7
- }
8
- export interface EmailProviderAdapter extends ProviderConfigurable {
9
- send(params: EmailSendParams): Promise<void>;
10
- }
@@ -1,7 +0,0 @@
1
- import { EmailProviderAdapter, EmailSendParams } from '../EmailProvider';
2
- import { type ProviderConfigurationState } from '../../ProviderConfiguration';
3
- export declare class GmailEmailProvider implements EmailProviderAdapter {
4
- getConfigurationState(): ProviderConfigurationState;
5
- isConfigured(): boolean;
6
- send(params: EmailSendParams): Promise<void>;
7
- }
@@ -1,13 +0,0 @@
1
- type SendEmailParams = {
2
- to: string[];
3
- bcc?: string[];
4
- subject: string;
5
- message: string;
6
- };
7
- type GmailSendResponse = {
8
- id: string;
9
- threadId: string;
10
- labelIds?: string[];
11
- };
12
- export declare function sendEmail({ to, bcc, subject, message }: SendEmailParams): Promise<GmailSendResponse>;
13
- export {};