@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 +35 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -6
- package/dist/index.js.map +1 -1
- package/dist/manifest-schema.json +1 -0
- package/package.json +1 -1
- package/src/envSchema.ts +14 -1
- package/src/index.ts +20 -10
- package/src/manifestSchema.ts +1 -1
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
|
|
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,
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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
|
|
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([
|
|
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
|
|
75
|
+
function getLuvaEnv() {
|
|
64
76
|
if (overriddenEnv) return overriddenEnv.luvaEnv;
|
|
65
|
-
let env = process.env.
|
|
66
|
-
if (!env) throw new Error("
|
|
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/${
|
|
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,
|
|
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
|
|
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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"}
|
package/package.json
CHANGED
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([
|
|
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
|
|
34
|
+
export function getLuvaEnv() {
|
|
33
35
|
if (overriddenEnv) {
|
|
34
36
|
return overriddenEnv.luvaEnv
|
|
35
37
|
}
|
|
36
|
-
let env = process.env.
|
|
38
|
+
let env = process.env.luvaEnv
|
|
37
39
|
if (!env) {
|
|
38
|
-
throw new Error("
|
|
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
|
|
49
|
-
return `https://luvabase.com/dash/pods/${
|
|
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
|
+
}
|
package/src/manifestSchema.ts
CHANGED
|
@@ -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
|
}),
|