@openagentpack/playground 0.0.2 → 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.
@@ -2192,7 +2192,7 @@ async function writeProviderConfig(input) {
2192
2192
  // ../../apps/server/src/schemas/config.ts
2193
2193
  import { z as z3 } from "@hono/zod-openapi";
2194
2194
  var AgentsConfigSchema = z3.object({
2195
- AGENTS_PROVIDER: z3.enum(AGENTS_CONFIG_PROVIDERS2).optional()
2195
+ AGENTS_PROVIDER: z3.enum(AGENTS_CONFIG_PROVIDERS2)
2196
2196
  }).catchall(z3.string()).openapi("AgentsConfig");
2197
2197
  var AgentsConfigSnapshotSchema = z3.object({
2198
2198
  AGENTS_PROVIDER: z3.enum(AGENTS_CONFIG_PROVIDERS2).optional()
@@ -2357,7 +2357,45 @@ environmentsRoute.openapi(deleteEnvironmentRoute, async (c) => {
2357
2357
  });
2358
2358
 
2359
2359
  // ../../apps/server/src/routes/files.ts
2360
- import { OpenAPIHono as OpenAPIHono4 } from "@hono/zod-openapi";
2360
+ import { createRoute as createRoute4, OpenAPIHono as OpenAPIHono4 } from "@hono/zod-openapi";
2361
+
2362
+ // ../../apps/server/src/schemas/files.ts
2363
+ import { z as z5 } from "@hono/zod-openapi";
2364
+ var ProviderFileInfoSchema = z5.object({
2365
+ id: z5.string(),
2366
+ filename: z5.string(),
2367
+ mime_type: z5.string(),
2368
+ size_bytes: z5.number(),
2369
+ created_at: z5.string(),
2370
+ downloadable: z5.boolean().optional(),
2371
+ status: z5.string().optional(),
2372
+ purpose: z5.string().optional(),
2373
+ available: z5.boolean().optional()
2374
+ }).openapi("ProviderFileInfo");
2375
+ var UploadFileFormSchema = z5.object({
2376
+ file: z5.instanceof(File).openapi({ type: "string", format: "binary" })
2377
+ });
2378
+ var FilesResponseSchema = z5.object({
2379
+ files: z5.array(ProviderFileInfoSchema)
2380
+ });
2381
+ var FileStatusesBodySchema = z5.object({
2382
+ fileIds: z5.array(z5.string())
2383
+ });
2384
+ var FileStatusInfoSchema = z5.object({
2385
+ id: z5.string(),
2386
+ status: z5.string().optional(),
2387
+ available: z5.boolean().optional()
2388
+ });
2389
+ var FileStatusesResponseSchema = z5.object({
2390
+ files: z5.array(FileStatusInfoSchema)
2391
+ });
2392
+ var FileParamsSchema = z5.object({
2393
+ id: z5.string().min(1)
2394
+ });
2395
+ var FileDownloadResponseSchema = z5.object({
2396
+ url: z5.string(),
2397
+ expires_at: z5.string().optional()
2398
+ });
2361
2399
 
2362
2400
  // ../../apps/server/src/services/files/upload.ts
2363
2401
  import {
@@ -2411,21 +2449,38 @@ async function getUserFileStatuses(fileIds) {
2411
2449
  // ../../apps/server/src/routes/files.ts
2412
2450
  var filesRoute = new OpenAPIHono4();
2413
2451
  var MAX_UPLOAD_BYTES = 100 * 1024 * 1024;
2414
- filesRoute.post("/files", async (c) => {
2415
- let body;
2416
- try {
2417
- body = await c.req.parseBody();
2418
- } catch (error) {
2419
- return jsonError(error, 400);
2420
- }
2421
- const file = body.file;
2422
- if (!(file instanceof File) || file.size === 0) {
2423
- return c.json({ error: { message: "file is required" } }, 400);
2424
- }
2425
- if (file.size > MAX_UPLOAD_BYTES) {
2426
- return c.json({ error: { message: "file too large" } }, 413);
2452
+ var uploadFileRoute = createRoute4({
2453
+ method: "post",
2454
+ path: "/files",
2455
+ operationId: "uploadFile",
2456
+ request: {
2457
+ body: {
2458
+ required: true,
2459
+ content: { "multipart/form-data": { schema: UploadFileFormSchema } }
2460
+ }
2461
+ },
2462
+ responses: {
2463
+ 201: {
2464
+ description: "Upload a workspace file",
2465
+ content: { "application/json": { schema: ProviderFileInfoSchema } }
2466
+ },
2467
+ 413: {
2468
+ description: "File exceeds the upload size limit",
2469
+ content: { "application/json": { schema: ErrorResponseSchema } }
2470
+ },
2471
+ ...errorResponses
2427
2472
  }
2428
- try {
2473
+ });
2474
+ filesRoute.openapi(
2475
+ uploadFileRoute,
2476
+ async (c) => {
2477
+ const { file } = c.req.valid("form");
2478
+ if (file.size === 0) {
2479
+ return c.json({ error: { message: "file is required" } }, 400);
2480
+ }
2481
+ if (file.size > MAX_UPLOAD_BYTES) {
2482
+ return c.json({ error: { message: "file too large" } }, 413);
2483
+ }
2429
2484
  const content = new Uint8Array(await file.arrayBuffer());
2430
2485
  const info = await uploadUserFile({
2431
2486
  content,
@@ -2433,80 +2488,109 @@ filesRoute.post("/files", async (c) => {
2433
2488
  mimeType: file.type || void 0
2434
2489
  });
2435
2490
  return c.json(info, 201);
2436
- } catch (error) {
2437
- return jsonError(error);
2491
+ },
2492
+ (result, c) => {
2493
+ if (!result.success) return c.json({ error: { message: "file is required" } }, 400);
2438
2494
  }
2439
- });
2440
- filesRoute.get("/files", async (c) => {
2441
- try {
2442
- const files = await listUserFiles();
2443
- return c.json({ files });
2444
- } catch (error) {
2445
- return jsonError(error);
2495
+ );
2496
+ var listFilesRoute = createRoute4({
2497
+ method: "get",
2498
+ path: "/files",
2499
+ operationId: "listFiles",
2500
+ responses: {
2501
+ 200: {
2502
+ description: "List workspace files",
2503
+ content: { "application/json": { schema: FilesResponseSchema } }
2504
+ },
2505
+ ...errorResponses
2446
2506
  }
2447
2507
  });
2448
- filesRoute.post("/files/status", async (c) => {
2449
- let body;
2450
- try {
2451
- body = await c.req.json();
2452
- } catch (error) {
2453
- return jsonError(error, 400);
2454
- }
2455
- const fileIds = body.fileIds;
2456
- if (!Array.isArray(fileIds) || fileIds.some((id) => typeof id !== "string")) {
2457
- return c.json({ error: { message: "fileIds (string[]) is required" } }, 400);
2458
- }
2459
- try {
2460
- const files = await getUserFileStatuses(fileIds);
2461
- return c.json({ files });
2462
- } catch (error) {
2463
- return jsonError(error);
2508
+ filesRoute.openapi(listFilesRoute, async (c) => {
2509
+ const files = await listUserFiles();
2510
+ return c.json({ files }, 200);
2511
+ });
2512
+ var getFileStatusesRoute = createRoute4({
2513
+ method: "post",
2514
+ path: "/files/status",
2515
+ operationId: "getFileStatuses",
2516
+ request: {
2517
+ body: {
2518
+ required: true,
2519
+ content: { "application/json": { schema: FileStatusesBodySchema } }
2520
+ }
2521
+ },
2522
+ responses: {
2523
+ 200: {
2524
+ description: "Get file scan statuses",
2525
+ content: { "application/json": { schema: FileStatusesResponseSchema } }
2526
+ },
2527
+ ...errorResponses
2464
2528
  }
2465
2529
  });
2466
- filesRoute.get("/files/:id/download", async (c) => {
2467
- const id = c.req.param("id");
2468
- if (!id) {
2469
- return c.json({ error: { message: "file id is required" } }, 400);
2530
+ filesRoute.openapi(
2531
+ getFileStatusesRoute,
2532
+ async (c) => {
2533
+ const { fileIds } = c.req.valid("json");
2534
+ const files = await getUserFileStatuses(fileIds);
2535
+ return c.json({ files }, 200);
2536
+ },
2537
+ (result, c) => {
2538
+ if (!result.success) return c.json({ error: { message: "fileIds (string[]) is required" } }, 400);
2470
2539
  }
2471
- try {
2472
- const result = await getUserFileDownloadUrl(id);
2473
- return c.json(result);
2474
- } catch (error) {
2475
- return jsonError(error);
2540
+ );
2541
+ var downloadFileRoute = createRoute4({
2542
+ method: "get",
2543
+ path: "/files/{id}/download",
2544
+ operationId: "downloadFile",
2545
+ request: { params: FileParamsSchema },
2546
+ responses: {
2547
+ 200: {
2548
+ description: "Resolve a short-lived file download URL",
2549
+ content: { "application/json": { schema: FileDownloadResponseSchema } }
2550
+ },
2551
+ ...errorResponses
2476
2552
  }
2477
2553
  });
2478
- filesRoute.delete("/files/:id", async (c) => {
2479
- const id = c.req.param("id");
2480
- if (!id) {
2481
- return c.json({ error: { message: "file id is required" } }, 400);
2482
- }
2483
- try {
2484
- await deleteUserFile(id);
2485
- return c.body(null, 204);
2486
- } catch (error) {
2487
- return jsonError(error);
2554
+ filesRoute.openapi(downloadFileRoute, async (c) => {
2555
+ const { id } = c.req.valid("param");
2556
+ const result = await getUserFileDownloadUrl(id);
2557
+ return c.json(result, 200);
2558
+ });
2559
+ var deleteFileRoute = createRoute4({
2560
+ method: "delete",
2561
+ path: "/files/{id}",
2562
+ operationId: "deleteFile",
2563
+ request: { params: FileParamsSchema },
2564
+ responses: {
2565
+ 204: { description: "File deleted" },
2566
+ ...errorResponses
2488
2567
  }
2489
2568
  });
2569
+ filesRoute.openapi(deleteFileRoute, async (c) => {
2570
+ const { id } = c.req.valid("param");
2571
+ await deleteUserFile(id);
2572
+ return c.body(null, 204);
2573
+ });
2490
2574
 
2491
2575
  // ../../apps/server/src/routes/models.ts
2492
- import { createRoute as createRoute4, OpenAPIHono as OpenAPIHono5 } from "@hono/zod-openapi";
2576
+ import { createRoute as createRoute5, OpenAPIHono as OpenAPIHono5 } from "@hono/zod-openapi";
2493
2577
  import { listProviderModelsForContext } from "@openagentpack/sdk";
2494
2578
 
2495
2579
  // ../../apps/server/src/schemas/models.ts
2496
- import { z as z5 } from "@hono/zod-openapi";
2497
- var ModelOptionSchema = z5.object({
2498
- id: z5.string(),
2499
- display_name: z5.string(),
2500
- is_enabled: z5.boolean().optional(),
2501
- is_new: z5.boolean().optional()
2580
+ import { z as z6 } from "@hono/zod-openapi";
2581
+ var ModelOptionSchema = z6.object({
2582
+ id: z6.string(),
2583
+ display_name: z6.string(),
2584
+ is_enabled: z6.boolean().optional(),
2585
+ is_new: z6.boolean().optional()
2502
2586
  });
2503
- var ModelsResponseSchema = z5.object({
2504
- models: z5.array(ModelOptionSchema)
2587
+ var ModelsResponseSchema = z6.object({
2588
+ models: z6.array(ModelOptionSchema)
2505
2589
  });
2506
2590
 
2507
2591
  // ../../apps/server/src/routes/models.ts
2508
2592
  var modelsRoute = new OpenAPIHono5();
2509
- var listModelsRoute = createRoute4({
2593
+ var listModelsRoute = createRoute5({
2510
2594
  method: "get",
2511
2595
  path: "/models",
2512
2596
  responses: {
@@ -2534,73 +2618,73 @@ modelsRoute.openapi(listModelsRoute, async (c) => {
2534
2618
  });
2535
2619
 
2536
2620
  // ../../apps/server/src/routes/sessions/index.ts
2537
- import { createRoute as createRoute9, OpenAPIHono as OpenAPIHono10 } from "@hono/zod-openapi";
2621
+ import { createRoute as createRoute10, OpenAPIHono as OpenAPIHono10 } from "@hono/zod-openapi";
2538
2622
 
2539
2623
  // ../../apps/server/src/schemas/sessions.ts
2540
- import { z as z6 } from "@hono/zod-openapi";
2624
+ import { z as z7 } from "@hono/zod-openapi";
2541
2625
  import { SessionEventSchema, SessionSchema } from "@openagentpack/sdk";
2542
- var SessionListResponseSchema = z6.object({
2543
- data: z6.array(SessionSchema),
2544
- next_page_token: z6.string().nullish()
2626
+ var SessionListResponseSchema = z7.object({
2627
+ data: z7.array(SessionSchema),
2628
+ next_page_token: z7.string().nullish()
2545
2629
  }).openapi("SessionListResponse");
2546
- var SessionDetailResponseSchema = z6.object({
2630
+ var SessionDetailResponseSchema = z7.object({
2547
2631
  session: SessionSchema,
2548
- events: z6.array(SessionEventSchema),
2549
- events_next_page_token: z6.string().nullish()
2632
+ events: z7.array(SessionEventSchema),
2633
+ events_next_page_token: z7.string().nullish()
2550
2634
  }).openapi("SessionDetailResponse");
2551
- var SessionEventsPageResponseSchema = z6.object({
2552
- events: z6.array(SessionEventSchema),
2553
- events_next_page_token: z6.string().nullish()
2635
+ var SessionEventsPageResponseSchema = z7.object({
2636
+ events: z7.array(SessionEventSchema),
2637
+ events_next_page_token: z7.string().nullish()
2554
2638
  }).openapi("SessionEventsPageResponse");
2555
- var SessionDeleteResponseSchema = z6.object({
2556
- session_id: z6.string(),
2557
- deleted: z6.boolean()
2639
+ var SessionDeleteResponseSchema = z7.object({
2640
+ session_id: z7.string(),
2641
+ deleted: z7.boolean()
2558
2642
  }).openapi("SessionDeleteResponse");
2559
- var SessionsQuerySchema = z6.object({
2643
+ var SessionsQuerySchema = z7.object({
2560
2644
  // Non-numeric values resolve to `undefined` so the handler clamps to a
2561
2645
  // default instead of the request being rejected with a 400.
2562
- limit: z6.preprocess((value) => {
2646
+ limit: z7.preprocess((value) => {
2563
2647
  const parsed = Number(value);
2564
2648
  return Number.isFinite(parsed) ? parsed : void 0;
2565
- }, z6.number().int().optional()),
2566
- agentId: z6.string().optional(),
2649
+ }, z7.number().int().optional()),
2650
+ agentId: z7.string().optional(),
2567
2651
  // Opaque cursor for the next page (provider's next_page / next_page_token, passed through verbatim).
2568
- pageToken: z6.string().optional()
2652
+ pageToken: z7.string().optional()
2569
2653
  });
2570
- var SessionDetailQuerySchema = z6.object({
2571
- agentId: z6.string().optional()
2654
+ var SessionDetailQuerySchema = z7.object({
2655
+ agentId: z7.string().optional()
2572
2656
  });
2573
- var SessionEventsQuerySchema = z6.object({
2574
- agentId: z6.string().optional(),
2575
- pageToken: z6.string().optional(),
2576
- limit: z6.preprocess((value) => {
2657
+ var SessionEventsQuerySchema = z7.object({
2658
+ agentId: z7.string().optional(),
2659
+ pageToken: z7.string().optional(),
2660
+ limit: z7.preprocess((value) => {
2577
2661
  const parsed = Number(value);
2578
2662
  return Number.isFinite(parsed) ? parsed : void 0;
2579
- }, z6.number().int().optional())
2663
+ }, z7.number().int().optional())
2580
2664
  });
2581
- var SessionParamsSchema = z6.object({
2582
- sessionId: z6.string()
2665
+ var SessionParamsSchema = z7.object({
2666
+ sessionId: z7.string()
2583
2667
  });
2584
- var CreateSessionBodySchema = z6.object({
2585
- agentId: z6.string(),
2586
- prompt: z6.string().min(1),
2668
+ var CreateSessionBodySchema = z7.object({
2669
+ agentId: z7.string(),
2670
+ prompt: z7.string().min(1),
2587
2671
  // Required: a session must be pinned to a cloud environment (sandbox). Both transports
2588
2672
  // enforce this so Mode A (REST/OpenAPI) and Mode B (console) reject env-less creates.
2589
- environmentId: z6.string().min(1),
2673
+ environmentId: z7.string().min(1),
2590
2674
  // Optional: cloud vault ids to bind a user-supplied credential so the sandbox receives it.
2591
2675
  // Top-level binding shape matches the console createSession.
2592
- vaultIds: z6.array(z6.string()).optional(),
2593
- title: z6.string().optional(),
2676
+ vaultIds: z7.array(z7.string()).optional(),
2677
+ title: z7.string().optional(),
2594
2678
  // Uploaded files to mount as session resources so the task can read the user's files.
2595
2679
  // Each file needs a mount_path (provider rejects a file resource without one).
2596
- files: z6.array(z6.object({ fileId: z6.string(), mountPath: z6.string() })).optional(),
2680
+ files: z7.array(z7.object({ fileId: z7.string(), mountPath: z7.string() })).optional(),
2597
2681
  // Model the agent should run for this session. If present, createSession applies it
2598
2682
  // to the agent config immediately before starting the run.
2599
- model: z6.string().optional()
2683
+ model: z7.string().optional()
2600
2684
  });
2601
- var SendMessageBodySchema = z6.object({
2602
- agentId: z6.string().optional(),
2603
- message: z6.string().min(1)
2685
+ var SendMessageBodySchema = z7.object({
2686
+ agentId: z7.string().optional(),
2687
+ message: z7.string().min(1)
2604
2688
  });
2605
2689
 
2606
2690
  // ../../apps/server/src/services/sessions/event-sanitizer.ts
@@ -2611,9 +2695,9 @@ function shouldIncludeDebugRaw(request) {
2611
2695
  }
2612
2696
 
2613
2697
  // ../../apps/server/src/routes/sessions/detail.ts
2614
- import { createRoute as createRoute5, OpenAPIHono as OpenAPIHono6 } from "@hono/zod-openapi";
2698
+ import { createRoute as createRoute6, OpenAPIHono as OpenAPIHono6 } from "@hono/zod-openapi";
2615
2699
  var sessionsDetailRoute = new OpenAPIHono6();
2616
- var getSessionRoute = createRoute5({
2700
+ var getSessionRoute = createRoute6({
2617
2701
  method: "get",
2618
2702
  path: "/sessions/{sessionId}",
2619
2703
  request: {
@@ -2642,7 +2726,7 @@ sessionsDetailRoute.openapi(getSessionRoute, async (c) => {
2642
2726
  200
2643
2727
  );
2644
2728
  });
2645
- var deleteSessionRoute = createRoute5({
2729
+ var deleteSessionRoute = createRoute6({
2646
2730
  method: "delete",
2647
2731
  path: "/sessions/{sessionId}",
2648
2732
  request: {
@@ -2665,9 +2749,9 @@ sessionsDetailRoute.openapi(deleteSessionRoute, async (c) => {
2665
2749
  });
2666
2750
 
2667
2751
  // ../../apps/server/src/routes/sessions/events.ts
2668
- import { createRoute as createRoute6, OpenAPIHono as OpenAPIHono7 } from "@hono/zod-openapi";
2752
+ import { createRoute as createRoute7, OpenAPIHono as OpenAPIHono7 } from "@hono/zod-openapi";
2669
2753
  var sessionsEventsRoute = new OpenAPIHono7();
2670
- var listSessionEventsRoute = createRoute6({
2754
+ var listSessionEventsRoute = createRoute7({
2671
2755
  method: "get",
2672
2756
  path: "/sessions/{sessionId}/events",
2673
2757
  request: {
@@ -2704,9 +2788,9 @@ sessionsEventsRoute.openapi(listSessionEventsRoute, async (c) => {
2704
2788
  });
2705
2789
 
2706
2790
  // ../../apps/server/src/routes/sessions/messages.ts
2707
- import { createRoute as createRoute7, OpenAPIHono as OpenAPIHono8 } from "@hono/zod-openapi";
2791
+ import { createRoute as createRoute8, OpenAPIHono as OpenAPIHono8 } from "@hono/zod-openapi";
2708
2792
  var sessionsMessagesRoute = new OpenAPIHono8();
2709
- var sendMessageRoute = createRoute7({
2793
+ var sendMessageRoute = createRoute8({
2710
2794
  method: "post",
2711
2795
  path: "/sessions/{sessionId}/messages",
2712
2796
  request: {
@@ -2735,15 +2819,15 @@ sessionsMessagesRoute.openapi(sendMessageRoute, async (c) => {
2735
2819
  });
2736
2820
 
2737
2821
  // ../../apps/server/src/routes/sessions/stream.ts
2738
- import { createRoute as createRoute8, OpenAPIHono as OpenAPIHono9, z as z7 } from "@hono/zod-openapi";
2822
+ import { createRoute as createRoute9, OpenAPIHono as OpenAPIHono9, z as z8 } from "@hono/zod-openapi";
2739
2823
  var sessionsStreamRoute = new OpenAPIHono9();
2740
- var SessionStreamQuerySchema = z7.object({
2741
- after: z7.preprocess((value) => {
2824
+ var SessionStreamQuerySchema = z8.object({
2825
+ after: z8.preprocess((value) => {
2742
2826
  const parsed = Number(value);
2743
2827
  return Number.isFinite(parsed) ? parsed : void 0;
2744
- }, z7.number().int().optional())
2828
+ }, z8.number().int().optional())
2745
2829
  });
2746
- var streamSessionRoute = createRoute8({
2830
+ var streamSessionRoute = createRoute9({
2747
2831
  method: "get",
2748
2832
  path: "/sessions/{sessionId}/stream",
2749
2833
  request: {
@@ -2755,7 +2839,7 @@ var streamSessionRoute = createRoute8({
2755
2839
  description: "Stream session events as Server-Sent Events",
2756
2840
  content: {
2757
2841
  "text/event-stream": {
2758
- schema: z7.string().openapi({
2842
+ schema: z8.string().openapi({
2759
2843
  description: 'SSE frames with event types "event", "done", and "ping".'
2760
2844
  })
2761
2845
  }
@@ -2866,7 +2950,7 @@ data: ${data}
2866
2950
 
2867
2951
  // ../../apps/server/src/routes/sessions/index.ts
2868
2952
  var sessionsRoute = new OpenAPIHono10();
2869
- var listSessionsRoute = createRoute9({
2953
+ var listSessionsRoute = createRoute10({
2870
2954
  method: "get",
2871
2955
  path: "/sessions",
2872
2956
  request: {
@@ -2892,7 +2976,7 @@ sessionsRoute.openapi(listSessionsRoute, async (c) => {
2892
2976
  });
2893
2977
  return c.json({ data: sessions, next_page_token: nextPageToken ?? null }, 200);
2894
2978
  });
2895
- var createSessionRoute = createRoute9({
2979
+ var createSessionRoute = createRoute10({
2896
2980
  method: "post",
2897
2981
  path: "/sessions",
2898
2982
  request: {
@@ -2934,7 +3018,52 @@ sessionsRoute.route("/", sessionsMessagesRoute);
2934
3018
  sessionsRoute.route("/", sessionsStreamRoute);
2935
3019
 
2936
3020
  // ../../apps/server/src/routes/skills.ts
2937
- import { OpenAPIHono as OpenAPIHono11 } from "@hono/zod-openapi";
3021
+ import { createRoute as createRoute11, OpenAPIHono as OpenAPIHono11 } from "@hono/zod-openapi";
3022
+
3023
+ // ../../apps/server/src/schemas/skills.ts
3024
+ import { z as z9 } from "@hono/zod-openapi";
3025
+ var ProviderSkillInfoSchema = z9.object({
3026
+ id: z9.string(),
3027
+ name: z9.string(),
3028
+ description: z9.string().optional(),
3029
+ source: z9.enum(["custom", "official"]),
3030
+ status: z9.enum(["checking", "active", "rejected", "deleted"]),
3031
+ latest_version: z9.string().optional(),
3032
+ created_at: z9.string().optional(),
3033
+ updated_at: z9.string().optional()
3034
+ }).openapi("ProviderSkillInfo");
3035
+ var UploadSkillFileFormSchema = z9.object({
3036
+ file: z9.instanceof(File).openapi({ type: "string", format: "binary" })
3037
+ });
3038
+ var CreateSkillBodySchema = z9.object({
3039
+ fileId: z9.string().min(1)
3040
+ });
3041
+ var WarmSkillBodySchema = z9.object({
3042
+ name: z9.string().min(1),
3043
+ url: z9.string().min(1)
3044
+ });
3045
+ var WarmSkillResponseSchema = z9.object({
3046
+ ok: z9.literal(true)
3047
+ });
3048
+ var SkillsQuerySchema = z9.object({
3049
+ source: z9.enum(["custom", "official"]).optional()
3050
+ });
3051
+ var SkillsResponseSchema = z9.object({
3052
+ skills: z9.array(ProviderSkillInfoSchema)
3053
+ });
3054
+ var SkillStatusesBodySchema = z9.object({
3055
+ skillIds: z9.array(z9.string())
3056
+ });
3057
+ var SkillStatusInfoSchema = z9.object({
3058
+ id: z9.string(),
3059
+ status: z9.enum(["checking", "active", "rejected", "deleted"]).optional()
3060
+ });
3061
+ var SkillStatusesResponseSchema = z9.object({
3062
+ skills: z9.array(SkillStatusInfoSchema)
3063
+ });
3064
+ var SkillParamsSchema = z9.object({
3065
+ id: z9.string().min(1)
3066
+ });
2938
3067
 
2939
3068
  // ../../apps/server/src/services/skills/manage.ts
2940
3069
  import {
@@ -3036,145 +3165,209 @@ async function warmSkillByUrl(name, url) {
3036
3165
  // ../../apps/server/src/routes/skills.ts
3037
3166
  var skillsRoute = new OpenAPIHono11();
3038
3167
  var MAX_UPLOAD_BYTES2 = 100 * 1024 * 1024;
3039
- skillsRoute.post("/skills/upload-file", async (c) => {
3040
- let body;
3041
- try {
3042
- body = await c.req.parseBody();
3043
- } catch (error) {
3044
- return jsonError(error, 400);
3045
- }
3046
- const file = body.file;
3047
- if (!(file instanceof File) || file.size === 0) {
3048
- return c.json({ error: { message: "file is required" } }, 400);
3049
- }
3050
- if (!file.name.toLowerCase().endsWith(".zip")) {
3051
- return c.json({ error: { message: "skill file must be a .zip" } }, 400);
3052
- }
3053
- if (file.size > MAX_UPLOAD_BYTES2) {
3054
- return c.json({ error: { message: "file too large" } }, 413);
3168
+ var uploadSkillFileRoute = createRoute11({
3169
+ method: "post",
3170
+ path: "/skills/upload-file",
3171
+ operationId: "uploadSkillFile",
3172
+ request: {
3173
+ body: {
3174
+ required: true,
3175
+ content: { "multipart/form-data": { schema: UploadSkillFileFormSchema } }
3176
+ }
3177
+ },
3178
+ responses: {
3179
+ 201: {
3180
+ description: "Upload a skill archive as a file pending audit",
3181
+ content: { "application/json": { schema: ProviderFileInfoSchema } }
3182
+ },
3183
+ 413: {
3184
+ description: "Skill archive exceeds the upload size limit",
3185
+ content: { "application/json": { schema: ErrorResponseSchema } }
3186
+ },
3187
+ ...errorResponses
3055
3188
  }
3056
- try {
3189
+ });
3190
+ skillsRoute.openapi(
3191
+ uploadSkillFileRoute,
3192
+ async (c) => {
3193
+ const { file } = c.req.valid("form");
3194
+ if (file.size === 0) return c.json({ error: { message: "file is required" } }, 400);
3195
+ if (!file.name.toLowerCase().endsWith(".zip")) {
3196
+ return c.json({ error: { message: "skill file must be a .zip" } }, 400);
3197
+ }
3198
+ if (file.size > MAX_UPLOAD_BYTES2) return c.json({ error: { message: "file too large" } }, 413);
3057
3199
  const content = new Uint8Array(await file.arrayBuffer());
3058
3200
  const info = await uploadUserSkillFile({ content, filename: file.name });
3059
3201
  return c.json(info, 201);
3060
- } catch (error) {
3061
- return jsonError(error);
3062
- }
3063
- });
3064
- skillsRoute.post("/skills", async (c) => {
3065
- let body;
3066
- try {
3067
- body = await c.req.json();
3068
- } catch (error) {
3069
- return jsonError(error, 400);
3202
+ },
3203
+ (result, c) => {
3204
+ if (!result.success) return c.json({ error: { message: "file is required" } }, 400);
3070
3205
  }
3071
- const fileId = body.fileId;
3072
- if (typeof fileId !== "string" || fileId.length === 0) {
3073
- return c.json({ error: { message: "fileId is required" } }, 400);
3206
+ );
3207
+ var createSkillRoute = createRoute11({
3208
+ method: "post",
3209
+ path: "/skills",
3210
+ operationId: "createSkill",
3211
+ request: {
3212
+ body: {
3213
+ required: true,
3214
+ content: { "application/json": { schema: CreateSkillBodySchema } }
3215
+ }
3216
+ },
3217
+ responses: {
3218
+ 201: {
3219
+ description: "Create a skill from an audited file",
3220
+ content: { "application/json": { schema: ProviderSkillInfoSchema } }
3221
+ },
3222
+ ...errorResponses
3074
3223
  }
3075
- try {
3224
+ });
3225
+ skillsRoute.openapi(
3226
+ createSkillRoute,
3227
+ async (c) => {
3228
+ const { fileId } = c.req.valid("json");
3076
3229
  const info = await createUserSkillFromFile(fileId);
3077
3230
  return c.json(info, 201);
3078
- } catch (error) {
3079
- return jsonError(error);
3080
- }
3081
- });
3082
- skillsRoute.post("/skills/warm", async (c) => {
3083
- let body;
3084
- try {
3085
- body = await c.req.json();
3086
- } catch (error) {
3087
- return jsonError(error, 400);
3231
+ },
3232
+ (result, c) => {
3233
+ if (!result.success) return c.json({ error: { message: "fileId is required" } }, 400);
3088
3234
  }
3089
- const { name, url } = body;
3090
- if (typeof name !== "string" || !name || typeof url !== "string" || !url) {
3091
- return c.json({ error: { message: "name and url are required" } }, 400);
3235
+ );
3236
+ var warmSkillRoute = createRoute11({
3237
+ method: "post",
3238
+ path: "/skills/warm",
3239
+ operationId: "warmSkill",
3240
+ request: {
3241
+ body: {
3242
+ required: true,
3243
+ content: { "application/json": { schema: WarmSkillBodySchema } }
3244
+ }
3245
+ },
3246
+ responses: {
3247
+ 200: {
3248
+ description: "Warm a custom skill until it is active",
3249
+ content: { "application/json": { schema: WarmSkillResponseSchema } }
3250
+ },
3251
+ ...errorResponses
3092
3252
  }
3093
- try {
3253
+ });
3254
+ skillsRoute.openapi(
3255
+ warmSkillRoute,
3256
+ async (c) => {
3257
+ const { name, url } = c.req.valid("json");
3094
3258
  await warmSkillByUrl(name, url);
3095
3259
  return c.json({ ok: true }, 200);
3096
- } catch (error) {
3097
- return jsonError(error);
3098
- }
3099
- });
3100
- skillsRoute.get("/skills", async (c) => {
3101
- const source = c.req.query("source");
3102
- if (source !== void 0 && source !== "custom" && source !== "official") {
3103
- return c.json({ error: { message: "source must be 'custom' or 'official'" } }, 400);
3260
+ },
3261
+ (result, c) => {
3262
+ if (!result.success) return c.json({ error: { message: "name and url are required" } }, 400);
3104
3263
  }
3105
- try {
3106
- const skills = await listUserSkills(source);
3107
- return c.json({ skills });
3108
- } catch (error) {
3109
- return jsonError(error);
3264
+ );
3265
+ var listSkillsRoute = createRoute11({
3266
+ method: "get",
3267
+ path: "/skills",
3268
+ operationId: "listSkills",
3269
+ request: { query: SkillsQuerySchema },
3270
+ responses: {
3271
+ 200: {
3272
+ description: "List custom or official skills",
3273
+ content: { "application/json": { schema: SkillsResponseSchema } }
3274
+ },
3275
+ ...errorResponses
3110
3276
  }
3111
3277
  });
3112
- skillsRoute.post("/skills/status", async (c) => {
3113
- let body;
3114
- try {
3115
- body = await c.req.json();
3116
- } catch (error) {
3117
- return jsonError(error, 400);
3118
- }
3119
- const skillIds = body.skillIds;
3120
- if (!Array.isArray(skillIds) || skillIds.some((id) => typeof id !== "string")) {
3121
- return c.json({ error: { message: "skillIds (string[]) is required" } }, 400);
3278
+ skillsRoute.openapi(
3279
+ listSkillsRoute,
3280
+ async (c) => {
3281
+ const { source } = c.req.valid("query");
3282
+ const skills = await listUserSkills(source);
3283
+ return c.json({ skills }, 200);
3284
+ },
3285
+ (result, c) => {
3286
+ if (!result.success) {
3287
+ return c.json({ error: { message: "source must be 'custom' or 'official'" } }, 400);
3288
+ }
3122
3289
  }
3123
- try {
3124
- const skills = await getUserSkillStatuses(skillIds);
3125
- return c.json({ skills });
3126
- } catch (error) {
3127
- return jsonError(error);
3290
+ );
3291
+ var getSkillStatusesRoute = createRoute11({
3292
+ method: "post",
3293
+ path: "/skills/status",
3294
+ operationId: "getSkillStatuses",
3295
+ request: {
3296
+ body: {
3297
+ required: true,
3298
+ content: { "application/json": { schema: SkillStatusesBodySchema } }
3299
+ }
3300
+ },
3301
+ responses: {
3302
+ 200: {
3303
+ description: "Get skill scan statuses",
3304
+ content: { "application/json": { schema: SkillStatusesResponseSchema } }
3305
+ },
3306
+ ...errorResponses
3128
3307
  }
3129
3308
  });
3130
- skillsRoute.delete("/skills/:id", async (c) => {
3131
- const id = c.req.param("id");
3132
- if (!id) {
3133
- return c.json({ error: { message: "skill id is required" } }, 400);
3309
+ skillsRoute.openapi(
3310
+ getSkillStatusesRoute,
3311
+ async (c) => {
3312
+ const { skillIds } = c.req.valid("json");
3313
+ const skills = await getUserSkillStatuses(skillIds);
3314
+ return c.json({ skills }, 200);
3315
+ },
3316
+ (result, c) => {
3317
+ if (!result.success) return c.json({ error: { message: "skillIds (string[]) is required" } }, 400);
3134
3318
  }
3135
- try {
3136
- await deleteUserSkill(id);
3137
- return c.body(null, 204);
3138
- } catch (error) {
3139
- return jsonError(error);
3319
+ );
3320
+ var deleteSkillRoute = createRoute11({
3321
+ method: "delete",
3322
+ path: "/skills/{id}",
3323
+ operationId: "deleteSkill",
3324
+ request: { params: SkillParamsSchema },
3325
+ responses: {
3326
+ 204: { description: "Skill deleted" },
3327
+ ...errorResponses
3140
3328
  }
3141
3329
  });
3330
+ skillsRoute.openapi(deleteSkillRoute, async (c) => {
3331
+ const { id } = c.req.valid("param");
3332
+ await deleteUserSkill(id);
3333
+ return c.body(null, 204);
3334
+ });
3142
3335
 
3143
3336
  // ../../apps/server/src/routes/vaults.ts
3144
- import { createRoute as createRoute10, OpenAPIHono as OpenAPIHono12 } from "@hono/zod-openapi";
3337
+ import { createRoute as createRoute12, OpenAPIHono as OpenAPIHono12 } from "@hono/zod-openapi";
3145
3338
  import { createCloudVault, deleteCloudVault, listCloudVaults } from "@openagentpack/sdk";
3146
3339
 
3147
3340
  // ../../apps/server/src/schemas/vaults.ts
3148
- import { z as z8 } from "@hono/zod-openapi";
3341
+ import { z as z10 } from "@hono/zod-openapi";
3149
3342
  import { CloudVaultSchema } from "@openagentpack/sdk";
3150
3343
  import { CloudVaultSchema as CloudVaultSchema2 } from "@openagentpack/sdk";
3151
- var CloudVaultsResponseSchema = z8.object({
3152
- vaults: z8.array(CloudVaultSchema)
3344
+ var CloudVaultsResponseSchema = z10.object({
3345
+ vaults: z10.array(CloudVaultSchema)
3153
3346
  });
3154
- var CreateVaultBodySchema = z8.object({
3155
- name: z8.string().min(1),
3156
- metadata: z8.record(z8.string(), z8.string()).optional(),
3347
+ var CreateVaultBodySchema = z10.object({
3348
+ name: z10.string().min(1),
3349
+ metadata: z10.record(z10.string(), z10.string()).optional(),
3157
3350
  // The DASHSCOPE_API_KEY stored as the vault's credential secret value. Optional: Mode B
3158
3351
  // supplies the user's key; Mode A (local) omits it and the server injects it from its own
3159
3352
  // DASHSCOPE_API_KEY env. (Mode B never reaches this REST route — it goes via console RPC.)
3160
- key: z8.string().min(1).optional()
3353
+ key: z10.string().min(1).optional()
3161
3354
  });
3162
- var CreateVaultResponseSchema = z8.object({
3163
- id: z8.string().nullable(),
3164
- type: z8.string(),
3165
- version: z8.number().optional()
3355
+ var CreateVaultResponseSchema = z10.object({
3356
+ id: z10.string().nullable(),
3357
+ type: z10.string(),
3358
+ version: z10.number().optional()
3166
3359
  });
3167
- var DeleteVaultResponseSchema = z8.object({
3168
- id: z8.string(),
3169
- type: z8.string()
3360
+ var DeleteVaultResponseSchema = z10.object({
3361
+ id: z10.string(),
3362
+ type: z10.string()
3170
3363
  });
3171
- var VaultParamsSchema = z8.object({
3172
- vaultId: z8.string().min(1)
3364
+ var VaultParamsSchema = z10.object({
3365
+ vaultId: z10.string().min(1)
3173
3366
  });
3174
3367
 
3175
3368
  // ../../apps/server/src/routes/vaults.ts
3176
3369
  var vaultsRoute = new OpenAPIHono12();
3177
- var listVaultsRoute = createRoute10({
3370
+ var listVaultsRoute = createRoute12({
3178
3371
  method: "get",
3179
3372
  path: "/vaults",
3180
3373
  responses: {
@@ -3189,7 +3382,7 @@ vaultsRoute.openapi(listVaultsRoute, async (c) => {
3189
3382
  const vaults = await withAgentRuntime(DEFAULT_AGENT_ID, (ctx) => listCloudVaults(ctx));
3190
3383
  return c.json({ vaults }, 200);
3191
3384
  });
3192
- var createVaultRoute = createRoute10({
3385
+ var createVaultRoute = createRoute12({
3193
3386
  method: "post",
3194
3387
  path: "/vaults",
3195
3388
  request: {
@@ -3232,7 +3425,7 @@ vaultsRoute.openapi(createVaultRoute, async (c) => {
3232
3425
  );
3233
3426
  return c.json(vault, 200);
3234
3427
  });
3235
- var deleteVaultRoute = createRoute10({
3428
+ var deleteVaultRoute = createRoute12({
3236
3429
  method: "delete",
3237
3430
  path: "/vaults/{vaultId}",
3238
3431
  request: {