forked from bai/curriculum-project-hub
fb66614e38
vite dev only proxied /api and /auth, so /admin/login hit the SPA root layout, re-ran loadSession, got 401, and redirected back to /admin/login with an ever-nesting returnTo. Proxy /admin/login to the backend (which owns it before the SPA fallback) and guard redirectToLogin against re-entering /admin/login. Replace the only emoji-as-icon (the back-arrow on project detail) with the Icon component (new arrow-left glyph). Add scripts/dev-bootstrap.ts for seeding a local Silo (stub probes) so npm run dev can start on a fresh dev DB.
53 lines
1.7 KiB
TypeScript
53 lines
1.7 KiB
TypeScript
import { config } from "dotenv";
|
|
config();
|
|
|
|
import { PrismaClient } from "@prisma/client";
|
|
import { bootstrapAlphaSilo } from "../src/deployment/bootstrap-silo.js";
|
|
import { loadLocalSecretKeyring, LocalSecretEnvelope } from "../src/security/secretEnvelope.js";
|
|
|
|
async function main(): Promise<void> {
|
|
const keyringFile = process.env["HUB_SECRET_KEYRING_FILE"];
|
|
if (!keyringFile) throw new Error("HUB_SECRET_KEYRING_FILE is required");
|
|
const secrets = new LocalSecretEnvelope(await loadLocalSecretKeyring());
|
|
const prisma = new PrismaClient();
|
|
try {
|
|
const result = await bootstrapAlphaSilo(
|
|
prisma,
|
|
secrets,
|
|
{
|
|
organization: {
|
|
id: "org_default",
|
|
slug: "default",
|
|
name: "Default Organization",
|
|
},
|
|
owner: {
|
|
openId: process.env["FEISHU_BOT_OPEN_ID"] ?? "dev-owner",
|
|
displayName: "Dev Owner",
|
|
},
|
|
feishu: {
|
|
appId: process.env["FEISHU_APP_ID"] ?? "dev-app",
|
|
appSecret: process.env["FEISHU_APP_SECRET"] ?? "dev-secret",
|
|
botOpenId: process.env["FEISHU_BOT_OPEN_ID"] ?? "dev-bot",
|
|
},
|
|
provider: {
|
|
providerId: "openrouter",
|
|
baseUrl: process.env["ANTHROPIC_BASE_URL"] ?? "https://openrouter.ai/api",
|
|
authToken: process.env["ANTHROPIC_AUTH_TOKEN"] ?? "dev-token",
|
|
},
|
|
},
|
|
{
|
|
feishu: async () => undefined,
|
|
provider: async () => undefined,
|
|
},
|
|
);
|
|
console.log("bootstrap ok:", JSON.stringify(result, null, 2));
|
|
} finally {
|
|
await prisma.$disconnect();
|
|
}
|
|
}
|
|
|
|
main().catch((error: unknown) => {
|
|
console.error("[dev-bootstrap] failed:", error instanceof Error ? error.message : String(error));
|
|
process.exitCode = 1;
|
|
});
|