@luvabase/sdk 0.0.16 → 0.0.18

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/dist/index.d.ts CHANGED
@@ -13,6 +13,12 @@ declare const LuvaEnv: z.ZodLazy<z.ZodObject<{
13
13
  databaseName: z.ZodString;
14
14
  databaseApiToken: z.ZodString;
15
15
  databaseHostname: z.ZodString;
16
+ }, z.core.$strip>, z.ZodObject<{
17
+ type: z.ZodLiteral<"openrouter">;
18
+ name: z.ZodString;
19
+ createdAt: z.ZodString;
20
+ apiKey: z.ZodString;
21
+ apiKeyLabel: z.ZodString;
16
22
  }, z.core.$strip>, z.ZodObject<{
17
23
  type: z.ZodLiteral<"r2">;
18
24
  name: z.ZodString;
@@ -29,6 +35,14 @@ declare const TursoRuntimeService: z.ZodObject<{
29
35
  databaseApiToken: z.ZodString;
30
36
  databaseHostname: z.ZodString;
31
37
  }, z.core.$strip>;
38
+ type OpenRouterRuntimeService = z.infer<typeof OpenRouterRuntimeService>;
39
+ declare const OpenRouterRuntimeService: z.ZodObject<{
40
+ type: z.ZodLiteral<"openrouter">;
41
+ name: z.ZodString;
42
+ createdAt: z.ZodString;
43
+ apiKey: z.ZodString;
44
+ apiKeyLabel: z.ZodString;
45
+ }, z.core.$strip>;
32
46
  type R2RuntimeService = z.infer<typeof R2RuntimeService>;
33
47
  declare const R2RuntimeService: z.ZodObject<{
34
48
  type: z.ZodLiteral<"r2">;
@@ -44,6 +58,12 @@ declare const RuntimeService: z.ZodUnion<readonly [z.ZodObject<{
44
58
  databaseName: z.ZodString;
45
59
  databaseApiToken: z.ZodString;
46
60
  databaseHostname: z.ZodString;
61
+ }, z.core.$strip>, z.ZodObject<{
62
+ type: z.ZodLiteral<"openrouter">;
63
+ name: z.ZodString;
64
+ createdAt: z.ZodString;
65
+ apiKey: z.ZodString;
66
+ apiKeyLabel: z.ZodString;
47
67
  }, z.core.$strip>, z.ZodObject<{
48
68
  type: z.ZodLiteral<"r2">;
49
69
  name: z.ZodString;
@@ -66,6 +86,7 @@ declare const AppManifest: z.ZodLazy<z.ZodObject<{
66
86
  services: z.ZodOptional<z.ZodArray<z.ZodObject<{
67
87
  type: z.ZodEnum<{
68
88
  turso: "turso";
89
+ openrouter: "openrouter";
69
90
  r2: "r2";
70
91
  "durable-object": "durable-object";
71
92
  }>;
@@ -105,6 +126,10 @@ type Member = {
105
126
  name: string;
106
127
  imageUrl: string | null;
107
128
  };
129
+ type Pod = {
130
+ id: string;
131
+ name: string;
132
+ };
108
133
  type Session = {
109
134
  user: Member | null;
110
135
  };
@@ -112,9 +137,10 @@ type FullEnvironment = {
112
137
  luvaEnv: LuvaEnv;
113
138
  session: Session;
114
139
  members: Member[];
140
+ pods: Pod[];
115
141
  };
116
142
  declare function overrideEnvironment(env: FullEnvironment): void;
117
- declare function getLunaEnv(): {
143
+ declare function getLuvaEnv(): {
118
144
  podId: string;
119
145
  installedAt: string;
120
146
  updatedAt: string;
@@ -125,6 +151,12 @@ declare function getLunaEnv(): {
125
151
  databaseName: string;
126
152
  databaseApiToken: string;
127
153
  databaseHostname: string;
154
+ } | {
155
+ type: "openrouter";
156
+ name: string;
157
+ createdAt: string;
158
+ apiKey: string;
159
+ apiKeyLabel: string;
128
160
  } | {
129
161
  type: "r2";
130
162
  name: string;
@@ -135,6 +167,7 @@ declare function getLunaEnv(): {
135
167
  declare function getAdminUrl(): string;
136
168
  declare function getSessionInfo(request: Request): Promise<Session>;
137
169
  declare function getMembers(request: Request): Promise<Member[]>;
170
+ declare function getOtherPods(request: Request): Promise<Pod[]>;
138
171
  //#endregion
139
- export { AppManifest, LuvaEnv, Member, R2RuntimeService, RelatedApp, RuntimeService, Session, TursoRuntimeService, getAdminUrl, getLunaEnv, getMembers, getSessionInfo, overrideEnvironment };
172
+ export { AppManifest, LuvaEnv, Member, OpenRouterRuntimeService, Pod, R2RuntimeService, RelatedApp, RuntimeService, Session, TursoRuntimeService, getAdminUrl, getLuvaEnv, getMembers, getOtherPods, getSessionInfo, overrideEnvironment };
140
173
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/envSchema.ts","../src/manifestSchema.ts","../src/index.ts"],"mappings":";;;KAEY,OAAA,GAAU,CAAA,CAAE,KAAA,QAAa,OAAA;AAAA,cACxB,OAAA,EAAO,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;KASR,mBAAA,GAAsB,CAAA,CAAE,KAAA,QAAa,mBAAA;AAAA,cACpC,mBAAA,EAAmB,CAAA,CAAA,SAAA;;;;;;;;KASpB,gBAAA,GAAmB,CAAA,CAAE,KAAA,QAAa,gBAAA;AAAA,cACjC,gBAAA,EAAgB,CAAA,CAAA,SAAA;;;;;;KAOjB,cAAA,GAAiB,CAAA,CAAE,KAAA,QAAa,cAAA;AAAA,cAC/B,cAAA,EAAc,CAAA,CAAA,QAAA,WAAA,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;KC7Bf,WAAA,GAAc,CAAA,CAAE,KAAA,QAAa,WAAA;AAAA,cAC5B,WAAA,EAAW,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA2EX,UAAA,EAAU,CAAA,CAAA,SAAA;;;;;;;;;;;KCzEX,MAAA;EACV,EAAA;EACA,IAAA;EACA,QAAA;AAAA;AAAA,KAGU,OAAA;EACV,IAAA,EAAM,MAAA;AAAA;AAAA,KAGH,eAAA;EACH,OAAA,EAAS,OAAA;EACT,OAAA,EAAS,OAAA;EACT,OAAA,EAAS,MAAA;AAAA;AAAA,iBASK,mBAAA,CAAoB,GAAA,EAAK,eAAA;AAAA,iBAIzB,UAAA,CAAA;;;;YAAU,MAAA;;;;;;;;;;;;;;iBAeV,WAAA,CAAA;AAAA,iBAKM,cAAA,CAAe,OAAA,EAAS,OAAA,GAAU,OAAA,CAAQ,OAAA;AAAA,iBAQ1C,UAAA,CAAW,OAAA,EAAS,OAAA,GAAU,OAAA,CAAQ,MAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/envSchema.ts","../src/manifestSchema.ts","../src/index.ts"],"mappings":";;;KAEY,OAAA,GAAU,CAAA,CAAE,KAAA,QAAa,OAAA;AAAA,cACxB,OAAA,EAAO,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;KASR,mBAAA,GAAsB,CAAA,CAAE,KAAA,QAAa,mBAAA;AAAA,cACpC,mBAAA,EAAmB,CAAA,CAAA,SAAA;;;;;;;;KASpB,wBAAA,GAA2B,CAAA,CAAE,KAAA,QAAa,wBAAA;AAAA,cACzC,wBAAA,EAAwB,CAAA,CAAA,SAAA;;;;;;;KAQzB,gBAAA,GAAmB,CAAA,CAAE,KAAA,QAAa,gBAAA;AAAA,cACjC,gBAAA,EAAgB,CAAA,CAAA,SAAA;;;;;;KAOjB,cAAA,GAAiB,CAAA,CAAE,KAAA,QAAa,cAAA;AAAA,cAC/B,cAAA,EAAc,CAAA,CAAA,QAAA,WAAA,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;KCtCf,WAAA,GAAc,CAAA,CAAE,KAAA,QAAa,WAAA;AAAA,cAC5B,WAAA,EAAW,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA2EX,UAAA,EAAU,CAAA,CAAA,SAAA;;;;;;;;;;;KCzEX,MAAA;EACV,EAAA;EACA,IAAA;EACA,QAAA;AAAA;AAAA,KAGU,GAAA;EACV,EAAA;EACA,IAAA;AAAA;AAAA,KAGU,OAAA;EACV,IAAA,EAAM,MAAA;AAAA;AAAA,KAGH,eAAA;EACH,OAAA,EAAS,OAAA;EACT,OAAA,EAAS,OAAA;EACT,OAAA,EAAS,MAAA;EACT,IAAA,EAAM,GAAA;AAAA;AAAA,iBAKQ,mBAAA,CAAoB,GAAA,EAAK,eAAA;AAAA,iBAIzB,UAAA,CAAA;;;;YAAU,MAAA;;;;;;;;;;;;;;;;;;;;iBAeV,WAAA,CAAA;AAAA,iBAKM,cAAA,CAAe,OAAA,EAAS,OAAA,GAAU,OAAA,CAAQ,OAAA;AAAA,iBAQ1C,UAAA,CAAW,OAAA,EAAS,OAAA,GAAU,OAAA,CAAQ,MAAA;AAAA,iBAQtC,YAAA,CAAa,OAAA,EAAS,OAAA,GAAU,OAAA,CAAQ,GAAA"}
package/dist/index.js CHANGED
@@ -14,13 +14,24 @@ const TursoRuntimeService = z.object({
14
14
  databaseApiToken: z.string(),
15
15
  databaseHostname: z.string()
16
16
  });
17
+ const OpenRouterRuntimeService = z.object({
18
+ type: z.literal("openrouter"),
19
+ name: z.string(),
20
+ createdAt: z.string(),
21
+ apiKey: z.string(),
22
+ apiKeyLabel: z.string()
23
+ });
17
24
  const R2RuntimeService = z.object({
18
25
  type: z.literal("r2"),
19
26
  name: z.string(),
20
27
  createdAt: z.string(),
21
28
  bucketName: z.string()
22
29
  });
23
- const RuntimeService = z.union([TursoRuntimeService, R2RuntimeService]);
30
+ const RuntimeService = z.union([
31
+ TursoRuntimeService,
32
+ OpenRouterRuntimeService,
33
+ R2RuntimeService
34
+ ]);
24
35
  //#endregion
25
36
  //#region src/manifestSchema.ts
26
37
  const AppManifest = z.lazy(() => z.object({
@@ -36,6 +47,7 @@ const AppManifest = z.lazy(() => z.object({
36
47
  services: z.array(z.object({
37
48
  type: z.enum([
38
49
  "turso",
50
+ "openrouter",
39
51
  "durable-object",
40
52
  "r2"
41
53
  ]),
@@ -60,15 +72,15 @@ let overriddenEnv;
60
72
  function overrideEnvironment(env) {
61
73
  overriddenEnv = env;
62
74
  }
63
- function getLunaEnv() {
75
+ function getLuvaEnv() {
64
76
  if (overriddenEnv) return overriddenEnv.luvaEnv;
65
- let env = process.env.lunaEnv;
66
- if (!env) throw new Error("Luna env is not available");
77
+ let env = process.env.luvaEnv;
78
+ if (!env) throw new Error("Luva env is not available");
67
79
  if (typeof process.env === "string") env = JSON.parse(env);
68
80
  return LuvaEnv.parse(env);
69
81
  }
70
82
  function getAdminUrl() {
71
- return `https://luvabase.com/dash/pods/${getLunaEnv().podId}`;
83
+ return `https://luvabase.com/dash/pods/${getLuvaEnv().podId}`;
72
84
  }
73
85
  async function getSessionInfo(request) {
74
86
  if (overriddenEnv) return overriddenEnv.session;
@@ -80,7 +92,12 @@ async function getMembers(request) {
80
92
  const headers = new Headers(request.headers);
81
93
  return fetch("/luvabase/members", { headers }).then((res) => res.json());
82
94
  }
95
+ async function getOtherPods(request) {
96
+ if (overriddenEnv) return overriddenEnv.pods;
97
+ const headers = new Headers(request.headers);
98
+ return fetch("/luvabase/pods", { headers }).then((res) => res.json());
99
+ }
83
100
  //#endregion
84
- export { AppManifest, LuvaEnv, R2RuntimeService, RelatedApp, RuntimeService, TursoRuntimeService, getAdminUrl, getLunaEnv, getMembers, getSessionInfo, overrideEnvironment };
101
+ export { AppManifest, LuvaEnv, OpenRouterRuntimeService, R2RuntimeService, RelatedApp, RuntimeService, TursoRuntimeService, getAdminUrl, getLuvaEnv, getMembers, getOtherPods, getSessionInfo, overrideEnvironment };
85
102
 
86
103
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/envSchema.ts","../src/manifestSchema.ts","../src/index.ts"],"sourcesContent":["import { z } from \"zod\"\n\nexport type LuvaEnv = z.infer<typeof LuvaEnv>\nexport const LuvaEnv = z.lazy(() =>\n z.object({\n podId: z.string().describe(\"The id of the pod\"),\n installedAt: z.string(),\n updatedAt: z.string(),\n services: z.record(z.string(), RuntimeService),\n }),\n)\n\nexport type TursoRuntimeService = z.infer<typeof TursoRuntimeService>\nexport const TursoRuntimeService = z.object({\n type: z.literal(\"turso\"),\n name: z.string(),\n createdAt: z.string(),\n databaseName: z.string(),\n databaseApiToken: z.string(),\n databaseHostname: z.string(),\n})\n\nexport type R2RuntimeService = z.infer<typeof R2RuntimeService>\nexport const R2RuntimeService = z.object({\n type: z.literal(\"r2\"),\n name: z.string(),\n createdAt: z.string(),\n bucketName: z.string(),\n})\n\nexport type RuntimeService = z.infer<typeof RuntimeService>\nexport const RuntimeService = z.union([TursoRuntimeService, R2RuntimeService])\n","import { z } from \"zod\"\n\nexport type AppManifest = z.infer<typeof AppManifest>\nexport const AppManifest = z.lazy(() =>\n z.object({\n $schema: z.string().optional().describe(\"JSON Schema for the manifest\"),\n identifier: z\n .string()\n .regex(/^[a-z0-9-]+$/)\n .min(3)\n .max(50)\n .optional()\n .describe(\n \"Globally unique url safe and lowercased identifier for the app e.g. 'luvabase-snake' (required for Luvabase submissions)\",\n ),\n name: z\n .string()\n .min(3)\n .max(30)\n .describe(\"Name of the app e.g. 'Snake' (max 30 characters)\"),\n subtitle: z\n .string()\n .min(3)\n .max(50)\n .optional()\n .describe(\n \"Subtitle of the app e.g. 'Play the classic of classics' (max 50 characters)\",\n ),\n description: z\n .string()\n .max(10000)\n .optional()\n .describe(\"Full description of the app\"),\n screenshots: z\n .array(z.string())\n .optional()\n .describe(\n \"Relative paths of app screenshots e.g. ['images/screenshot1.png', 'images/screenshot2.png']\",\n ),\n category: z\n .string()\n .optional()\n .describe(\n \"Could be 'productivity', 'health', etc (must be one of the standard categories listed here https://github.com/w3c/manifest/wiki/Categories)\",\n ),\n icon: z\n .string()\n .optional()\n .describe(\n \"Relative path of the app icon inside the .luva app file e.g. 'images/icon.png'\",\n ),\n repository: z\n .string()\n .optional()\n .describe(\n \"URL of the source code repository e.g. 'https://github.com/luvabase/snake'\",\n ),\n services: z\n .array(\n z.object({\n type: z.enum([\"turso\", \"durable-object\", \"r2\"]),\n name: z.string(),\n metadata: z.record(z.string(), z.any()).optional(),\n }),\n )\n .optional(),\n hooks: z\n .array(\n z.object({\n type: z.enum([\"app.update\", \"member.update\"]),\n relativeUrl: z.string().describe(\"Relative URL to the hook handler\"),\n }),\n )\n .optional(),\n relatedApps: z.array(RelatedApp).optional(),\n }),\n)\n\nexport const RelatedApp = z.object({\n type: z.enum([\"android\", \"ios\"]),\n identifier: z.string(), // android package name or ios bundle id\n downloadLink: z.string().optional(),\n redirectUrls: z.array(z.string()),\n})\n","import { LuvaEnv } from \"./envSchema\"\n\nexport * from \"./envSchema\"\nexport * from \"./manifestSchema\"\n\nexport type Member = {\n id: string\n name: string\n imageUrl: string | null\n}\n\nexport type Session = {\n user: Member | null\n}\n\ntype FullEnvironment = {\n luvaEnv: LuvaEnv\n session: Session\n members: Member[]\n}\n\nlet overriddenEnv: {\n luvaEnv: LuvaEnv\n session: { user: Member | null }\n members: Member[]\n}\n\nexport function overrideEnvironment(env: FullEnvironment) {\n overriddenEnv = env\n}\n\nexport function getLunaEnv() {\n if (overriddenEnv) {\n return overriddenEnv.luvaEnv\n }\n let env = process.env.lunaEnv\n if (!env) {\n throw new Error(\"Luna env is not available\")\n }\n if (typeof process.env === \"string\") {\n env = JSON.parse(env)\n }\n const luvabaseEnv = LuvaEnv.parse(env)\n return luvabaseEnv\n}\n\nexport function getAdminUrl(): string {\n const lunaEnv = getLunaEnv()\n return `https://luvabase.com/dash/pods/${lunaEnv.podId}`\n}\n\nexport async function getSessionInfo(request: Request): Promise<Session> {\n if (overriddenEnv) {\n return overriddenEnv.session\n }\n const headers = new Headers(request.headers)\n return fetch(\"/luvabase/session\", { headers }).then((res) => res.json())\n}\n\nexport async function getMembers(request: Request): Promise<Member[]> {\n if (overriddenEnv) {\n return overriddenEnv.members\n }\n const headers = new Headers(request.headers)\n return fetch(\"/luvabase/members\", { headers }).then((res) => res.json())\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/envSchema.ts","../src/manifestSchema.ts","../src/index.ts"],"sourcesContent":["import { z } from \"zod\"\n\nexport type LuvaEnv = z.infer<typeof LuvaEnv>\nexport const LuvaEnv = z.lazy(() =>\n z.object({\n podId: z.string().describe(\"The id of the pod\"),\n installedAt: z.string(),\n updatedAt: z.string(),\n services: z.record(z.string(), RuntimeService),\n }),\n)\n\nexport type TursoRuntimeService = z.infer<typeof TursoRuntimeService>\nexport const TursoRuntimeService = z.object({\n type: z.literal(\"turso\"),\n name: z.string(),\n createdAt: z.string(),\n databaseName: z.string(),\n databaseApiToken: z.string(),\n databaseHostname: z.string(),\n})\n\nexport type OpenRouterRuntimeService = z.infer<typeof OpenRouterRuntimeService>\nexport const OpenRouterRuntimeService = z.object({\n type: z.literal(\"openrouter\"),\n name: z.string(),\n createdAt: z.string(),\n apiKey: z.string(),\n apiKeyLabel: z.string(),\n})\n\nexport type R2RuntimeService = z.infer<typeof R2RuntimeService>\nexport const R2RuntimeService = z.object({\n type: z.literal(\"r2\"),\n name: z.string(),\n createdAt: z.string(),\n bucketName: z.string(),\n})\n\nexport type RuntimeService = z.infer<typeof RuntimeService>\nexport const RuntimeService = z.union([\n TursoRuntimeService,\n OpenRouterRuntimeService,\n R2RuntimeService,\n])\n","import { z } from \"zod\"\n\nexport type AppManifest = z.infer<typeof AppManifest>\nexport const AppManifest = z.lazy(() =>\n z.object({\n $schema: z.string().optional().describe(\"JSON Schema for the manifest\"),\n identifier: z\n .string()\n .regex(/^[a-z0-9-]+$/)\n .min(3)\n .max(50)\n .optional()\n .describe(\n \"Globally unique url safe and lowercased identifier for the app e.g. 'luvabase-snake' (required for Luvabase submissions)\",\n ),\n name: z\n .string()\n .min(3)\n .max(30)\n .describe(\"Name of the app e.g. 'Snake' (max 30 characters)\"),\n subtitle: z\n .string()\n .min(3)\n .max(50)\n .optional()\n .describe(\n \"Subtitle of the app e.g. 'Play the classic of classics' (max 50 characters)\",\n ),\n description: z\n .string()\n .max(10000)\n .optional()\n .describe(\"Full description of the app\"),\n screenshots: z\n .array(z.string())\n .optional()\n .describe(\n \"Relative paths of app screenshots e.g. ['images/screenshot1.png', 'images/screenshot2.png']\",\n ),\n category: z\n .string()\n .optional()\n .describe(\n \"Could be 'productivity', 'health', etc (must be one of the standard categories listed here https://github.com/w3c/manifest/wiki/Categories)\",\n ),\n icon: z\n .string()\n .optional()\n .describe(\n \"Relative path of the app icon inside the .luva app file e.g. 'images/icon.png'\",\n ),\n repository: z\n .string()\n .optional()\n .describe(\n \"URL of the source code repository e.g. 'https://github.com/luvabase/snake'\",\n ),\n services: z\n .array(\n z.object({\n type: z.enum([\"turso\", \"openrouter\", \"durable-object\", \"r2\"]),\n name: z.string(),\n metadata: z.record(z.string(), z.any()).optional(),\n }),\n )\n .optional(),\n hooks: z\n .array(\n z.object({\n type: z.enum([\"app.update\", \"member.update\"]),\n relativeUrl: z.string().describe(\"Relative URL to the hook handler\"),\n }),\n )\n .optional(),\n relatedApps: z.array(RelatedApp).optional(),\n }),\n)\n\nexport const RelatedApp = z.object({\n type: z.enum([\"android\", \"ios\"]),\n identifier: z.string(), // android package name or ios bundle id\n downloadLink: z.string().optional(),\n redirectUrls: z.array(z.string()),\n})\n","import { LuvaEnv } from \"./envSchema\"\n\nexport * from \"./envSchema\"\nexport * from \"./manifestSchema\"\n\nexport type Member = {\n id: string\n name: string\n imageUrl: string | null\n}\n\nexport type Pod = {\n id: string\n name: string\n}\n\nexport type Session = {\n user: Member | null\n}\n\ntype FullEnvironment = {\n luvaEnv: LuvaEnv\n session: Session\n members: Member[]\n pods: Pod[]\n}\n\nlet overriddenEnv: FullEnvironment | undefined\n\nexport function overrideEnvironment(env: FullEnvironment) {\n overriddenEnv = env\n}\n\nexport function getLuvaEnv() {\n if (overriddenEnv) {\n return overriddenEnv.luvaEnv\n }\n let env = process.env.luvaEnv\n if (!env) {\n throw new Error(\"Luva env is not available\")\n }\n if (typeof process.env === \"string\") {\n env = JSON.parse(env)\n }\n const luvabaseEnv = LuvaEnv.parse(env)\n return luvabaseEnv\n}\n\nexport function getAdminUrl(): string {\n const luvaEnv = getLuvaEnv()\n return `https://luvabase.com/dash/pods/${luvaEnv.podId}`\n}\n\nexport async function getSessionInfo(request: Request): Promise<Session> {\n if (overriddenEnv) {\n return overriddenEnv.session\n }\n const headers = new Headers(request.headers)\n return fetch(\"/luvabase/session\", { headers }).then((res) => res.json())\n}\n\nexport async function getMembers(request: Request): Promise<Member[]> {\n if (overriddenEnv) {\n return overriddenEnv.members\n }\n const headers = new Headers(request.headers)\n return fetch(\"/luvabase/members\", { headers }).then((res) => res.json())\n}\n\nexport async function getOtherPods(request: Request): Promise<Pod[]> {\n if (overriddenEnv) {\n return overriddenEnv.pods\n }\n const headers = new Headers(request.headers)\n return fetch(\"/luvabase/pods\", { headers }).then((res) => res.json())\n}\n"],"mappings":"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"}
@@ -58,6 +58,7 @@
58
58
  "type": "string",
59
59
  "enum": [
60
60
  "turso",
61
+ "openrouter",
61
62
  "durable-object",
62
63
  "r2"
63
64
  ]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@luvabase/sdk",
3
- "version": "0.0.16",
3
+ "version": "0.0.18",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist",
package/src/envSchema.ts CHANGED
@@ -20,6 +20,15 @@ export const TursoRuntimeService = z.object({
20
20
  databaseHostname: z.string(),
21
21
  })
22
22
 
23
+ export type OpenRouterRuntimeService = z.infer<typeof OpenRouterRuntimeService>
24
+ export const OpenRouterRuntimeService = z.object({
25
+ type: z.literal("openrouter"),
26
+ name: z.string(),
27
+ createdAt: z.string(),
28
+ apiKey: z.string(),
29
+ apiKeyLabel: z.string(),
30
+ })
31
+
23
32
  export type R2RuntimeService = z.infer<typeof R2RuntimeService>
24
33
  export const R2RuntimeService = z.object({
25
34
  type: z.literal("r2"),
@@ -29,4 +38,8 @@ export const R2RuntimeService = z.object({
29
38
  })
30
39
 
31
40
  export type RuntimeService = z.infer<typeof RuntimeService>
32
- export const RuntimeService = z.union([TursoRuntimeService, R2RuntimeService])
41
+ export const RuntimeService = z.union([
42
+ TursoRuntimeService,
43
+ OpenRouterRuntimeService,
44
+ R2RuntimeService,
45
+ ])
package/src/index.ts CHANGED
@@ -9,6 +9,11 @@ export type Member = {
9
9
  imageUrl: string | null
10
10
  }
11
11
 
12
+ export type Pod = {
13
+ id: string
14
+ name: string
15
+ }
16
+
12
17
  export type Session = {
13
18
  user: Member | null
14
19
  }
@@ -17,25 +22,22 @@ type FullEnvironment = {
17
22
  luvaEnv: LuvaEnv
18
23
  session: Session
19
24
  members: Member[]
25
+ pods: Pod[]
20
26
  }
21
27
 
22
- let overriddenEnv: {
23
- luvaEnv: LuvaEnv
24
- session: { user: Member | null }
25
- members: Member[]
26
- }
28
+ let overriddenEnv: FullEnvironment | undefined
27
29
 
28
30
  export function overrideEnvironment(env: FullEnvironment) {
29
31
  overriddenEnv = env
30
32
  }
31
33
 
32
- export function getLunaEnv() {
34
+ export function getLuvaEnv() {
33
35
  if (overriddenEnv) {
34
36
  return overriddenEnv.luvaEnv
35
37
  }
36
- let env = process.env.lunaEnv
38
+ let env = process.env.luvaEnv
37
39
  if (!env) {
38
- throw new Error("Luna env is not available")
40
+ throw new Error("Luva env is not available")
39
41
  }
40
42
  if (typeof process.env === "string") {
41
43
  env = JSON.parse(env)
@@ -45,8 +47,8 @@ export function getLunaEnv() {
45
47
  }
46
48
 
47
49
  export function getAdminUrl(): string {
48
- const lunaEnv = getLunaEnv()
49
- return `https://luvabase.com/dash/pods/${lunaEnv.podId}`
50
+ const luvaEnv = getLuvaEnv()
51
+ return `https://luvabase.com/dash/pods/${luvaEnv.podId}`
50
52
  }
51
53
 
52
54
  export async function getSessionInfo(request: Request): Promise<Session> {
@@ -64,3 +66,11 @@ export async function getMembers(request: Request): Promise<Member[]> {
64
66
  const headers = new Headers(request.headers)
65
67
  return fetch("/luvabase/members", { headers }).then((res) => res.json())
66
68
  }
69
+
70
+ export async function getOtherPods(request: Request): Promise<Pod[]> {
71
+ if (overriddenEnv) {
72
+ return overriddenEnv.pods
73
+ }
74
+ const headers = new Headers(request.headers)
75
+ return fetch("/luvabase/pods", { headers }).then((res) => res.json())
76
+ }
@@ -58,7 +58,7 @@ export const AppManifest = z.lazy(() =>
58
58
  services: z
59
59
  .array(
60
60
  z.object({
61
- type: z.enum(["turso", "durable-object", "r2"]),
61
+ type: z.enum(["turso", "openrouter", "durable-object", "r2"]),
62
62
  name: z.string(),
63
63
  metadata: z.record(z.string(), z.any()).optional(),
64
64
  }),