Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -38,7 +38,7 @@ See [ARCHITECTURE.md](./ARCHITECTURE.md) for the full microkernel and layer arch
- **Protocol-first schemas** — All schemas are defined with Zod; TypeScript types are derived via `z.infer<>`.
- **Versioned JSON artifacts** — TypeScript-authored metadata compiles into deployable, self-describing JSON artifacts.
- **Microkernel plugin system** — DI container, EventBus, and lifecycle hooks (init -> start -> destroy).
- **Multi-database support** — In-memory, PostgreSQL, MySQL, SQLite, and Turso/libSQL drivers.
- **Multi-database support** — In-memory, PostgreSQL, MySQL, SQLite (via the unified SQL driver), and MongoDB. Turso/libSQL is not bundled here — it ships as the separate `@objectstack/driver-turso` package in the cloud repo.
- **7 framework adapters** — Express, Fastify, Hono, NestJS, Next.js, Nuxt, SvelteKit.
- **Client SDK + React hooks** — `useQuery`, `useMutation`, `usePagination` out of the box.
- **Built-in authentication** — [better-auth](https://www.better-auth.com/) via `plugin-auth`.
Expand DownExpand Up@@ -254,7 +254,7 @@ Cloud, package registry, and project management subcommands (`os projects`, `os
| Source packages | 51 |
| Apps | 6 (objectos, cloud, studio, console, account, docs) |
| Framework adapters | 7 (Express, Fastify, Hono, NestJS, Next.js, Nuxt, SvelteKit) |
| Database drivers | 4 (Memory, SQL, Turso/libSQL, MongoDB) |
| Database drivers | 4 (Memory, SQL, SQLite-WASM, MongoDB) |
| Zod schema files | 200 |
| Exported schemas | 1,600+ |
| `.describe()` annotations | 8,750+ |
Expand Down
241 changes: 0 additions & 241 deletions packages/runtime/src/dispatcher-plugin.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -623,247 +623,6 @@ export function createDispatcherPlugin(config: DispatcherPluginConfig = {}): Plu
}
});

// ── Cloud (Projects) ─────────────────────────────────────
server.get(`${prefix}/cloud/drivers`, async (req: any, res: any) => {
try {
const result = await dispatcher.handleCloud('/drivers', 'GET', {}, req.query, { request: req });
sendResult(result, res);
} catch (err: any) {
errorResponse(err, res);
}
});

// POST /cloud/admin/platform-sso/backfill — idempotent admin trigger
// for retro-fitting sys_oauth_application rows when boot-time
// backfill plugin races/fails. Authenticated by Bearer == OS_AUTH_SECRET
// (validated inside handleCloud).
server.post(`${prefix}/cloud/admin/platform-sso/backfill`, async (req: any, res: any) => {
try {
const result = await dispatcher.handleCloud('/admin/platform-sso/backfill', 'POST', req.body, req.query, { request: req });
sendResult(result, res);
} catch (err: any) {
errorResponse(err, res);
}
});

server.get(`${prefix}/cloud/templates`, async (req: any, res: any) => {
try {
const result = await dispatcher.handleCloud('/templates', 'GET', {}, req.query, { request: req });
sendResult(result, res);
} catch (err: any) {
errorResponse(err, res);
}
});

server.get(`${prefix}/cloud/environments`, async (req: any, res: any) => {
try {
const result = await dispatcher.handleCloud('/projects', 'GET', {}, req.query, { request: req });
sendResult(result, res);
} catch (err: any) {
errorResponse(err, res);
}
});

server.post(`${prefix}/cloud/environments`, async (req: any, res: any) => {
try {
const result = await dispatcher.handleCloud('/projects', 'POST', req.body, {}, { request: req });
sendResult(result, res);
} catch (err: any) {
errorResponse(err, res);
}
});

server.get(`${prefix}/cloud/environments/:id`, async (req: any, res: any) => {
try {
const result = await dispatcher.handleCloud(`/projects/${req.params.id}`, 'GET', {}, req.query, { request: req });
sendResult(result, res);
} catch (err: any) {
errorResponse(err, res);
}
});

server.patch(`${prefix}/cloud/environments/:id`, async (req: any, res: any) => {
try {
const result = await dispatcher.handleCloud(`/projects/${req.params.id}`, 'PATCH', req.body, {}, { request: req });
sendResult(result, res);
} catch (err: any) {
errorResponse(err, res);
}
});

server.delete(`${prefix}/cloud/environments/:id`, async (req: any, res: any) => {
try {
const result = await dispatcher.handleCloud(`/projects/${req.params.id}`, 'DELETE', {}, req.query, { request: req });
sendResult(result, res);
} catch (err: any) {
errorResponse(err, res);
}
});

server.delete(`${prefix}/cloud/organizations/:id`, async (req: any, res: any) => {
try {
const result = await dispatcher.handleCloud(`/organizations/${req.params.id}`, 'DELETE', {}, req.query, { request: req });
sendResult(result, res);
} catch (err: any) {
errorResponse(err, res);
}
});

server.post(`${prefix}/cloud/environments/:id/hostname`, async (req: any, res: any) => {
try {
const result = await dispatcher.handleCloud(`/projects/${req.params.id}/hostname`, 'POST', req.body, {}, { request: req });
sendResult(result, res);
} catch (err: any) {
errorResponse(err, res);
}
});

server.put(`${prefix}/cloud/environments/:id/hostname`, async (req: any, res: any) => {
try {
const result = await dispatcher.handleCloud(`/projects/${req.params.id}/hostname`, 'PUT', req.body, {}, { request: req });
sendResult(result, res);
} catch (err: any) {
errorResponse(err, res);
}
});

server.post(`${prefix}/cloud/environments/:id/rotate-credential`, async (req: any, res: any) => {
try {
const result = await dispatcher.handleCloud(`/projects/${req.params.id}/rotate-credential`, 'POST', req.body, {}, { request: req });
sendResult(result, res);
} catch (err: any) {
errorResponse(err, res);
}
});

// Alias expected by @objectstack/client: POST /projects/:id/credentials/rotate
server.post(`${prefix}/cloud/environments/:id/credentials/rotate`, async (req: any, res: any) => {
try {
const result = await dispatcher.handleCloud(`/projects/${req.params.id}/credentials/rotate`, 'POST', req.body, {}, { request: req });
sendResult(result, res);
} catch (err: any) {
errorResponse(err, res);
}
});

server.post(`${prefix}/cloud/environments/:id/activate`, async (req: any, res: any) => {
try {
const result = await dispatcher.handleCloud(`/projects/${req.params.id}/activate`, 'POST', req.body, {}, { request: req });
sendResult(result, res);
} catch (err: any) {
errorResponse(err, res);
}
});

server.post(`${prefix}/cloud/environments/:id/retry`, async (req: any, res: any) => {
try {
const result = await dispatcher.handleCloud(`/projects/${req.params.id}/retry`, 'POST', req.body, {}, { request: req });
sendResult(result, res);
} catch (err: any) {
errorResponse(err, res);
}
});

server.get(`${prefix}/cloud/environments/:id/members`, async (req: any, res: any) => {
try {
const result = await dispatcher.handleCloud(`/projects/${req.params.id}/members`, 'GET', {}, req.query, { request: req });
sendResult(result, res);
} catch (err: any) {
errorResponse(err, res);
}
});

server.post(`${prefix}/cloud/environments/:id/members`, async (req: any, res: any) => {
try {
const result = await dispatcher.handleCloud(`/projects/${req.params.id}/members`, 'POST', req.body, {}, { request: req });
sendResult(result, res);
} catch (err: any) {
errorResponse(err, res);
}
});

server.patch(`${prefix}/cloud/environments/:id/members/:memberId`, async (req: any, res: any) => {
try {
const result = await dispatcher.handleCloud(`/projects/${req.params.id}/members/${req.params.memberId}`, 'PATCH', req.body, {}, { request: req });
sendResult(result, res);
} catch (err: any) {
errorResponse(err, res);
}
});

server.delete(`${prefix}/cloud/environments/:id/members/:memberId`, async (req: any, res: any) => {
try {
const result = await dispatcher.handleCloud(`/projects/${req.params.id}/members/${req.params.memberId}`, 'DELETE', req.body ?? {}, {}, { request: req });
sendResult(result, res);
} catch (err: any) {
errorResponse(err, res);
}
});

// ── Cloud — Per-project packages ─────────────────────────────────
server.get(`${prefix}/cloud/environments/:id/packages`, async (req: any, res: any) => {
try {
const result = await dispatcher.handleCloud(`/projects/${req.params.id}/packages`, 'GET', {}, req.query, { request: req });
sendResult(result, res);
} catch (err: any) {
errorResponse(err, res);
}
});

server.post(`${prefix}/cloud/environments/:id/packages`, async (req: any, res: any) => {
try {
const result = await dispatcher.handleCloud(`/projects/${req.params.id}/packages`, 'POST', req.body, {}, { request: req });
sendResult(result, res);
} catch (err: any) {
errorResponse(err, res);
}
});

server.get(`${prefix}/cloud/environments/:id/packages/:pkgId`, async (req: any, res: any) => {
try {
const result = await dispatcher.handleCloud(`/projects/${req.params.id}/packages/${req.params.pkgId}`, 'GET', {}, req.query, { request: req });
sendResult(result, res);
} catch (err: any) {
errorResponse(err, res);
}
});

server.delete(`${prefix}/cloud/environments/:id/packages/:pkgId`, async (req: any, res: any) => {
try {
const result = await dispatcher.handleCloud(`/projects/${req.params.id}/packages/${req.params.pkgId}`, 'DELETE', {}, {}, { request: req });
sendResult(result, res);
} catch (err: any) {
errorResponse(err, res);
}
});

server.patch(`${prefix}/cloud/environments/:id/packages/:pkgId/enable`, async (req: any, res: any) => {
try {
const result = await dispatcher.handleCloud(`/projects/${req.params.id}/packages/${req.params.pkgId}/enable`, 'PATCH', {}, {}, { request: req });
sendResult(result, res);
} catch (err: any) {
errorResponse(err, res);
}
});

server.patch(`${prefix}/cloud/environments/:id/packages/:pkgId/disable`, async (req: any, res: any) => {
try {
const result = await dispatcher.handleCloud(`/projects/${req.params.id}/packages/${req.params.pkgId}/disable`, 'PATCH', {}, {}, { request: req });
sendResult(result, res);
} catch (err: any) {
errorResponse(err, res);
}
});

server.post(`${prefix}/cloud/environments/:id/packages/:pkgId/upgrade`, async (req: any, res: any) => {
try {
const result = await dispatcher.handleCloud(`/projects/${req.params.id}/packages/${req.params.pkgId}/upgrade`, 'POST', req.body, {}, { request: req });
sendResult(result, res);
} catch (err: any) {
errorResponse(err, res);
}
});

// ── Storage ─────────────────────────────────────────────────
server.post(`${prefix}/storage/upload`, async (req: any, res: any) => {
try {
Expand Down
Loading