@raybase/api 0.0.0 → 0.1.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 (42) hide show
  1. package/LICENSE +21 -0
  2. package/dist/admin-routes.d.ts +11 -0
  3. package/dist/admin-routes.d.ts.map +1 -0
  4. package/dist/admin-routes.js +208 -0
  5. package/dist/admin-routes.js.map +1 -0
  6. package/dist/api.d.ts +102 -0
  7. package/dist/api.d.ts.map +1 -0
  8. package/dist/api.js +375 -0
  9. package/dist/api.js.map +1 -0
  10. package/dist/auth.d.ts +87 -0
  11. package/dist/auth.d.ts.map +1 -0
  12. package/dist/auth.js +377 -0
  13. package/dist/auth.js.map +1 -0
  14. package/dist/crypto.d.ts +14 -0
  15. package/dist/crypto.d.ts.map +1 -0
  16. package/dist/crypto.js +59 -0
  17. package/dist/crypto.js.map +1 -0
  18. package/dist/errors.d.ts +9 -0
  19. package/dist/errors.d.ts.map +1 -0
  20. package/dist/errors.js +26 -0
  21. package/dist/errors.js.map +1 -0
  22. package/dist/generated/admin-assets.d.ts +5 -0
  23. package/dist/generated/admin-assets.d.ts.map +1 -0
  24. package/dist/generated/admin-assets.js +5 -0
  25. package/dist/generated/admin-assets.js.map +1 -0
  26. package/dist/index.d.ts +6 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +6 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/path.d.ts +2 -0
  31. package/dist/path.d.ts.map +1 -0
  32. package/dist/path.js +25 -0
  33. package/dist/path.js.map +1 -0
  34. package/dist/system-tables.d.ts +6 -0
  35. package/dist/system-tables.d.ts.map +1 -0
  36. package/dist/system-tables.js +65 -0
  37. package/dist/system-tables.js.map +1 -0
  38. package/package.json +36 -8
  39. package/skills/raybase-api/SKILL.md +45 -0
  40. package/templates/react-router/app/api/operations.ts +8 -0
  41. package/templates/tanstack-start/src/api/operations.ts +15 -0
  42. package/README.md +0 -3
package/dist/api.js ADDED
@@ -0,0 +1,375 @@
1
+ import { ActionDeniedError, ActionInputValidationError, ActionOutputValidationError, actionInputJsonSchema, actionOutputJsonSchema, actorAuditRef, authSecret, createRaybaseAuthContextRuntime, createRaybaseDb, defineRaybaseModule, disabledRaybaseAI, executeAction, randomId, recordAudit, unsupportedRaybaseAgentInvocationRuntime, unsupportedRaybaseJobsRuntime, validateActionExposure } from "@raybase/core";
2
+ import { authenticateApiRequest, recordApiKeyEvent } from "./auth.js";
3
+ import { ApiHttpError, apiErrorResponse, errorMessage } from "./errors.js";
4
+ import { createApiAdminRoutes } from "./admin-routes.js";
5
+ import { matchApiPath } from "./path.js";
6
+ import { raybaseApiSystemTables } from "./system-tables.js";
7
+ export function apiOperation(action, options) {
8
+ if ("handler" in options) {
9
+ throw new Error("apiOperation() adapts a Raybase action and does not accept a handler.");
10
+ }
11
+ return {
12
+ kind: "raybase.api.operation",
13
+ action,
14
+ method: normalizeMethod(options.method),
15
+ path: normalizeRelativePath(options.path),
16
+ scopes: normalizeScopes(options.scopes),
17
+ summary: options.summary,
18
+ description: options.description,
19
+ tags: options.tags ?? [],
20
+ idempotency: options.idempotency,
21
+ parseRequest: options.parseRequest,
22
+ serializeResponse: options.serializeResponse,
23
+ examples: options.examples ?? []
24
+ };
25
+ }
26
+ export function defineApiOperations(operations) {
27
+ validateApiOperations(operations, defaultApiPrefix);
28
+ return operations;
29
+ }
30
+ export function apiKeyScopes(...scopes) {
31
+ return normalizeScopes(scopes);
32
+ }
33
+ export function apiModule(options) {
34
+ const prefix = normalizePrefix(options.prefix ?? defaultApiPrefix);
35
+ validateApiOperations(options.operations, prefix);
36
+ const operations = Object.entries(options.operations);
37
+ const routes = operations.map(([name, operation]) => {
38
+ const fullPath = joinPaths(prefix, operation.path);
39
+ return {
40
+ method: operation.method,
41
+ path: fullPath,
42
+ auth: "public",
43
+ csrf: "bypass",
44
+ handle: (ctx) => handleApiOperation(ctx, name, operation, fullPath, options.keys)
45
+ };
46
+ });
47
+ return defineRaybaseModule({
48
+ id: "api",
49
+ packageName: "@raybase/api",
50
+ version: "0.1.0",
51
+ runtime: () => ({
52
+ systemTables: raybaseApiSystemTables,
53
+ routes,
54
+ adminRoutes: options.admin?.enabled === false
55
+ ? []
56
+ : createApiAdminRoutes({
57
+ prefix,
58
+ operations: operationSummaries(prefix, options.operations),
59
+ keys: options.keys,
60
+ docsTitle: options.docs?.title ?? "Raybase API"
61
+ })
62
+ })
63
+ });
64
+ }
65
+ export function operationSummaries(prefix, operations) {
66
+ return Object.entries(operations).map(([name, operation]) => ({
67
+ name,
68
+ actionName: operation.action.name,
69
+ method: operation.method,
70
+ path: joinPaths(prefix, operation.path),
71
+ scopes: operation.scopes,
72
+ summary: operation.summary ?? operation.action.annotations?.title ?? operation.action.name,
73
+ description: operation.description ?? operation.action.description,
74
+ tags: operation.tags,
75
+ inputSchema: actionInputJsonSchema(operation.action),
76
+ outputSchema: actionOutputJsonSchema(operation.action),
77
+ examples: operation.examples
78
+ }));
79
+ }
80
+ export const defaultApiPrefix = "/api/v1";
81
+ const reservedApiPrefixes = [
82
+ "/api",
83
+ "/api/data",
84
+ "/api/files",
85
+ "/api/admin",
86
+ "/api/auth",
87
+ "/api/health",
88
+ "/api/search",
89
+ "/api/realtime",
90
+ "/api/raybase",
91
+ "/api/guide",
92
+ "/api/ai",
93
+ "/mcp",
94
+ "/admin",
95
+ "/login",
96
+ "/signup",
97
+ "/setup",
98
+ "/invite"
99
+ ];
100
+ function validateApiOperations(operations, prefix) {
101
+ normalizePrefix(prefix);
102
+ const names = new Set();
103
+ const routes = new Set();
104
+ for (const [name, operation] of Object.entries(operations)) {
105
+ if (!/^[A-Za-z][A-Za-z0-9_.:-]{0,127}$/.test(name))
106
+ throw new Error(`Invalid API operation name: ${name}`);
107
+ if (names.has(name))
108
+ throw new Error(`Duplicate API operation name: ${name}`);
109
+ names.add(name);
110
+ if (operation.kind !== "raybase.api.operation")
111
+ throw new Error(`Invalid API operation declaration: ${name}`);
112
+ validateActionExposure(operation.action, { requirePolicy: true });
113
+ operation.method = normalizeMethod(operation.method);
114
+ operation.path = normalizeRelativePath(operation.path);
115
+ operation.scopes = normalizeScopes(operation.scopes);
116
+ const routeKey = `${operation.method} ${routeShape(joinPaths(prefix, operation.path))}`;
117
+ if (routes.has(routeKey))
118
+ throw new Error(`Duplicate API operation route: ${routeKey}`);
119
+ routes.add(routeKey);
120
+ }
121
+ }
122
+ function normalizeMethod(method) {
123
+ const normalized = method.toUpperCase();
124
+ if (!["GET", "POST", "PUT", "PATCH", "DELETE"].includes(normalized)) {
125
+ throw new Error(`Unsupported API operation method: ${method}`);
126
+ }
127
+ return normalized;
128
+ }
129
+ function normalizeRelativePath(path) {
130
+ if (typeof path !== "string" || !path.startsWith("/"))
131
+ throw new Error("API operation path must start with /.");
132
+ if (path.includes("?") || path.includes("#"))
133
+ throw new Error("API operation path must not include query or hash.");
134
+ const normalized = `/${path.split("/").filter(Boolean).join("/")}`;
135
+ return normalized === "/" ? "/" : normalized;
136
+ }
137
+ function normalizePrefix(prefix) {
138
+ if (typeof prefix !== "string" || !prefix.startsWith("/"))
139
+ throw new Error("API prefix must start with /.");
140
+ if (prefix.includes("?") || prefix.includes("#"))
141
+ throw new Error("API prefix must not include query or hash.");
142
+ const normalized = `/${prefix.split("/").filter(Boolean).join("/")}`;
143
+ for (const reserved of reservedApiPrefixes) {
144
+ if (reserved === "/api") {
145
+ if (normalized === "/api")
146
+ throw new Error("API prefix /api overlaps Raybase-owned API infrastructure.");
147
+ continue;
148
+ }
149
+ if (normalized === reserved || normalized.startsWith(`${reserved}/`)) {
150
+ throw new Error(`API prefix ${normalized} overlaps Raybase-owned route prefix ${reserved}.`);
151
+ }
152
+ }
153
+ return normalized;
154
+ }
155
+ function normalizeScopes(scopes) {
156
+ if (!Array.isArray(scopes) || scopes.length === 0)
157
+ throw new Error("API operation scopes must not be empty.");
158
+ const normalized = Array.from(new Set(scopes.map((scope) => String(scope ?? "").trim()).filter(Boolean)));
159
+ for (const scope of normalized) {
160
+ if (!/^[a-z][a-z0-9_.-]{0,63}:(read|write|delete|[a-z][a-z0-9_.-]{0,31})$/.test(scope)) {
161
+ throw new Error(`Invalid API operation scope: ${scope}`);
162
+ }
163
+ }
164
+ return normalized;
165
+ }
166
+ function joinPaths(prefix, path) {
167
+ const joined = `${prefix.replace(/\/+$/g, "")}/${path.replace(/^\/+/g, "")}`;
168
+ return joined.replace(/\/+$/g, "") || "/";
169
+ }
170
+ function routeShape(path) {
171
+ return path
172
+ .split("/")
173
+ .map((part) => (part.startsWith(":") ? ":" : part))
174
+ .join("/");
175
+ }
176
+ async function handleApiOperation(ctx, operationName, operation, route, keyOptions) {
177
+ const requestId = ctx.request.headers.get("cf-ray") ?? randomId("api_req");
178
+ let actorId = null;
179
+ let apiKeyId = null;
180
+ let servicePrincipalId = null;
181
+ try {
182
+ const params = matchApiPath(route, new URL(ctx.request.url).pathname);
183
+ if (!params)
184
+ throw new ApiHttpError(404, "not_found", "API operation not found.");
185
+ const authenticated = await authenticateApiRequest(ctx, {
186
+ scopes: operation.scopes,
187
+ operationName,
188
+ route: `${operation.method} ${route}`,
189
+ requestId
190
+ });
191
+ actorId = authenticated.user.id;
192
+ apiKeyId = authenticated.key.id;
193
+ servicePrincipalId = authenticated.servicePrincipal.id;
194
+ const body = await readRequestBody(ctx.request, operation.method);
195
+ const parts = {
196
+ request: ctx.request,
197
+ params,
198
+ query: queryObject(ctx.request),
199
+ body,
200
+ headers: ctx.request.headers,
201
+ method: operation.method,
202
+ path: route,
203
+ requestId
204
+ };
205
+ const rawInput = operation.parseRequest ? operation.parseRequest(parts) : defaultActionInput(parts);
206
+ const db = createRaybaseDb(ctx.env, ctx.schema, ctx.appMigrations).for({
207
+ user: authenticated.user,
208
+ source: {
209
+ surface: "api",
210
+ route,
211
+ requestId,
212
+ actionName: operation.action.name,
213
+ apiKeyId: authenticated.key.id,
214
+ servicePrincipalId: authenticated.servicePrincipal.id,
215
+ apiOperationName: operationName
216
+ },
217
+ audit: (entry) => recordAudit(ctx.control, { actor: actorAuditRef(authenticated.user.id), action: entry.action, target: entry.target, metadata: entry.metadata, source: entry.source })
218
+ });
219
+ const apiMetadata = {
220
+ requestId,
221
+ operationName,
222
+ actionName: operation.action.name,
223
+ route: `${operation.method} ${route}`,
224
+ servicePrincipalId: authenticated.servicePrincipal.id,
225
+ apiKeyId: authenticated.key.id,
226
+ scopes: authenticated.scopes
227
+ };
228
+ await recordAudit(ctx.control, {
229
+ actor: actorAuditRef(authenticated.user.id),
230
+ action: "api.operation.invoke",
231
+ target: { type: "raybase_api_operation", id: operationName },
232
+ metadata: {
233
+ ...apiMetadata,
234
+ requiredScopes: operation.scopes
235
+ },
236
+ source: { surface: "api", route, requestId }
237
+ });
238
+ const result = await executeAction(operation.action, rawInput, {
239
+ request: ctx.request,
240
+ env: ctx.env,
241
+ user: authenticated.user,
242
+ principal: { kind: "user", user: authenticated.user },
243
+ db,
244
+ auth: createRaybaseAuthContextRuntime({
245
+ db: ctx.control,
246
+ secret: authSecret(ctx.env),
247
+ config: ctx.config,
248
+ sessionAuthenticated: false,
249
+ principal: { kind: "user", user: authenticated.user },
250
+ request: ctx.request,
251
+ audit: (entry) => recordAudit(ctx.control, {
252
+ actor: actorAuditRef(authenticated.user.id),
253
+ action: entry.action,
254
+ target: entry.target,
255
+ metadata: entry.metadata,
256
+ source: entry.source
257
+ })
258
+ }),
259
+ agents: unsupportedRaybaseAgentInvocationRuntime,
260
+ ai: disabledRaybaseAI,
261
+ jobs: unsupportedRaybaseJobsRuntime,
262
+ settings: ctx.settings,
263
+ route,
264
+ surface: "api",
265
+ requestId,
266
+ audit: (entry) => recordAudit(ctx.control, { actor: actorAuditRef(authenticated.user.id), action: entry.action, target: entry.target, metadata: entry.metadata, source: entry.source })
267
+ }, {
268
+ surface: "api",
269
+ requirePolicy: true,
270
+ idempotencyKey: resolveIdempotencyKey(ctx.request, operation, rawInput, apiMetadata)
271
+ });
272
+ const response = serializeOperationResponse(operation, result, {
273
+ requestId,
274
+ operationName,
275
+ actionName: operation.action.name,
276
+ status: "ok"
277
+ });
278
+ await recordAudit(ctx.control, {
279
+ actor: actorAuditRef(authenticated.user.id),
280
+ action: "api.operation.success",
281
+ target: { type: "raybase_api_operation", id: operationName },
282
+ metadata: {
283
+ ...apiMetadata,
284
+ status: response.status
285
+ },
286
+ source: { surface: "api", route, requestId }
287
+ });
288
+ await recordApiKeyEvent(ctx.control, {
289
+ keyId: authenticated.key.id,
290
+ servicePrincipalId: authenticated.servicePrincipal.id,
291
+ ownerUserId: authenticated.user.id,
292
+ event: "operation.success",
293
+ requestId,
294
+ metadata: { operationName, actionName: operation.action.name, route, status: response.status }
295
+ });
296
+ return response;
297
+ }
298
+ catch (error) {
299
+ const mapped = mapApiError(error);
300
+ if (!(mapped instanceof ApiHttpError && mapped.status === 401 && mapped.code === "authentication_required")) {
301
+ await recordAudit(ctx.control, {
302
+ actor: actorAuditRef(actorId),
303
+ action: "api.operation.error",
304
+ target: { type: "raybase_api_operation", id: operationName },
305
+ metadata: { requestId, route, apiKeyId, servicePrincipalId, error: errorMessage(error), status: mapped.status },
306
+ source: { surface: "api", route, requestId }
307
+ }).catch(() => undefined);
308
+ }
309
+ return apiErrorResponse(mapped, requestId);
310
+ }
311
+ }
312
+ function resolveIdempotencyKey(request, operation, input, metadata) {
313
+ const headerName = operation.idempotency?.header ?? "Idempotency-Key";
314
+ const headerValue = request.headers.get(headerName) ?? undefined;
315
+ if (operation.idempotency?.key)
316
+ return operation.idempotency.key(input, metadata);
317
+ return headerValue;
318
+ }
319
+ function serializeOperationResponse(operation, output, metadata) {
320
+ const serialized = operation.serializeResponse ? operation.serializeResponse(output, metadata) : { data: output };
321
+ if (serialized instanceof Response)
322
+ return serialized;
323
+ if (isSerializedResponse(serialized)) {
324
+ return Response.json(serialized.body ?? null, { status: serialized.status ?? 200, headers: serialized.headers });
325
+ }
326
+ return Response.json(serialized ?? null);
327
+ }
328
+ function isSerializedResponse(value) {
329
+ if (!value || typeof value !== "object" || Array.isArray(value))
330
+ return false;
331
+ return "body" in value || "status" in value || "headers" in value;
332
+ }
333
+ function mapApiError(error) {
334
+ if (error instanceof ApiHttpError)
335
+ return error;
336
+ if (error instanceof ActionInputValidationError)
337
+ return new ApiHttpError(400, "invalid_request", "Request input is invalid.");
338
+ if (error instanceof ActionDeniedError)
339
+ return new ApiHttpError(403, "policy_denied", "Action policy denied this request.");
340
+ if (error instanceof ActionOutputValidationError)
341
+ return new ApiHttpError(500, "internal_error", "The API request could not be completed.");
342
+ return new ApiHttpError(500, "internal_error", "The API request could not be completed.");
343
+ }
344
+ async function readRequestBody(request, method) {
345
+ if (method === "GET" || method === "DELETE")
346
+ return undefined;
347
+ const text = await request.text();
348
+ if (!text.trim())
349
+ return {};
350
+ try {
351
+ return JSON.parse(text);
352
+ }
353
+ catch {
354
+ throw new ApiHttpError(400, "invalid_request", "Request body must be valid JSON.");
355
+ }
356
+ }
357
+ function defaultActionInput(parts) {
358
+ const query = parts.query;
359
+ if (parts.method === "GET" || parts.method === "DELETE")
360
+ return { ...parts.params, ...query };
361
+ if (parts.body && typeof parts.body === "object" && !Array.isArray(parts.body)) {
362
+ return { ...parts.params, ...query, ...parts.body };
363
+ }
364
+ return { ...parts.params, ...query, body: parts.body };
365
+ }
366
+ function queryObject(request) {
367
+ const url = new URL(request.url);
368
+ const result = {};
369
+ for (const key of new Set(url.searchParams.keys())) {
370
+ const values = url.searchParams.getAll(key);
371
+ result[key] = values.length > 1 ? values : values[0] ?? "";
372
+ }
373
+ return result;
374
+ }
375
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
package/dist/auth.d.ts ADDED
@@ -0,0 +1,87 @@
1
+ import { type RaybaseModuleRouteContext, type RaybaseUser, type SqlExecutor } from "@raybase/core";
2
+ export type ApiKeyRecord = {
3
+ id: string;
4
+ name: string;
5
+ description: string | null;
6
+ servicePrincipalId: string;
7
+ ownerUserId: string;
8
+ principalLabel: string;
9
+ prefix: string;
10
+ hash: string;
11
+ scopesJson: string;
12
+ expiresAt: string | null;
13
+ revokedAt: string | null;
14
+ revokedBy: string | null;
15
+ revokedReason: string | null;
16
+ createdBy: string | null;
17
+ createdAt: string;
18
+ rotatedAt: string | null;
19
+ lastUsedAt: string | null;
20
+ lastUsedIpHash: string | null;
21
+ lastUsedUserAgent: string | null;
22
+ };
23
+ export type ApiServicePrincipalRecord = {
24
+ id: string;
25
+ label: string;
26
+ description: string | null;
27
+ ownerUserId: string;
28
+ defaultScopesJson: string;
29
+ disabledAt: string | null;
30
+ createdBy: string | null;
31
+ createdAt: string;
32
+ updatedAt: string;
33
+ };
34
+ export type AuthenticatedApiKey = {
35
+ key: ApiKeyRecord;
36
+ servicePrincipal: ApiServicePrincipalRecord;
37
+ user: RaybaseUser;
38
+ scopes: string[];
39
+ };
40
+ export type ApiKeyOptions = {
41
+ defaultExpiryDays?: number;
42
+ maxExpiryDays?: number;
43
+ prefix?: string;
44
+ };
45
+ export type CreateApiKeyInput = {
46
+ name?: unknown;
47
+ description?: unknown;
48
+ ownerUserId?: unknown;
49
+ servicePrincipalId?: unknown;
50
+ principalLabel?: unknown;
51
+ scopes?: unknown;
52
+ expiresAt?: unknown;
53
+ };
54
+ export type CreateApiKeyResult = {
55
+ key: ApiKeySummary;
56
+ token: string;
57
+ };
58
+ export type ApiKeySummary = Omit<ApiKeyRecord, "hash" | "scopesJson"> & {
59
+ scopes: string[];
60
+ };
61
+ export declare function apiKeySecret(env: unknown): string;
62
+ export declare function authenticateApiRequest<Env>(ctx: RaybaseModuleRouteContext<Env>, input: {
63
+ scopes: string[];
64
+ operationName: string;
65
+ route: string;
66
+ requestId: string;
67
+ }): Promise<AuthenticatedApiKey>;
68
+ export declare function listApiKeys(control: SqlExecutor): Promise<ApiKeySummary[]>;
69
+ export declare function createApiKey<Env>(ctx: RaybaseModuleRouteContext<Env>, input: CreateApiKeyInput, options?: ApiKeyOptions): Promise<CreateApiKeyResult>;
70
+ export declare function rotateApiKey<Env>(ctx: RaybaseModuleRouteContext<Env>, keyId: string, options?: ApiKeyOptions): Promise<CreateApiKeyResult>;
71
+ export declare function revokeApiKey<Env>(ctx: RaybaseModuleRouteContext<Env>, keyId: string, reason?: unknown): Promise<{
72
+ key: ApiKeySummary;
73
+ }>;
74
+ export declare function deleteApiKey<Env>(ctx: RaybaseModuleRouteContext<Env>, keyId: string): Promise<{
75
+ ok: true;
76
+ }>;
77
+ export declare function recordApiKeyEvent(control: SqlExecutor, input: {
78
+ keyId: string;
79
+ event: string;
80
+ servicePrincipalId?: string | null;
81
+ ownerUserId?: string | null;
82
+ actorUserId?: string | null;
83
+ requestId?: string | null;
84
+ metadata?: unknown;
85
+ }): Promise<void>;
86
+ export declare function summarizeApiKey(row: ApiKeyRecord): ApiKeySummary;
87
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}