@openagentpack/playground 0.0.2-beta.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.
@@ -875,6 +875,10 @@ var qoder_default = [
875
875
  {
876
876
  name: "image_gen",
877
877
  enabled: true
878
+ },
879
+ {
880
+ name: "deliver_artifacts",
881
+ enabled: true
878
882
  }
879
883
  ],
880
884
  defaultConfig: {
@@ -883,13 +887,7 @@ var qoder_default = [
883
887
  type: "builtin_toolkit"
884
888
  }
885
889
  ],
886
- skills: [
887
- {
888
- type: "official",
889
- id: "skill_N2U0MDAwYWM2NDQ0NGFkNjljMz",
890
- version: "1.0"
891
- }
892
- ],
890
+ skills: [],
893
891
  mcpServers: []
894
892
  }
895
893
  ];
@@ -2194,7 +2192,7 @@ async function writeProviderConfig(input) {
2194
2192
  // ../../apps/server/src/schemas/config.ts
2195
2193
  import { z as z3 } from "@hono/zod-openapi";
2196
2194
  var AgentsConfigSchema = z3.object({
2197
- AGENTS_PROVIDER: z3.enum(AGENTS_CONFIG_PROVIDERS2).optional()
2195
+ AGENTS_PROVIDER: z3.enum(AGENTS_CONFIG_PROVIDERS2)
2198
2196
  }).catchall(z3.string()).openapi("AgentsConfig");
2199
2197
  var AgentsConfigSnapshotSchema = z3.object({
2200
2198
  AGENTS_PROVIDER: z3.enum(AGENTS_CONFIG_PROVIDERS2).optional()
@@ -2359,7 +2357,45 @@ environmentsRoute.openapi(deleteEnvironmentRoute, async (c) => {
2359
2357
  });
2360
2358
 
2361
2359
  // ../../apps/server/src/routes/files.ts
2362
- 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
+ });
2363
2399
 
2364
2400
  // ../../apps/server/src/services/files/upload.ts
2365
2401
  import {
@@ -2413,21 +2449,38 @@ async function getUserFileStatuses(fileIds) {
2413
2449
  // ../../apps/server/src/routes/files.ts
2414
2450
  var filesRoute = new OpenAPIHono4();
2415
2451
  var MAX_UPLOAD_BYTES = 100 * 1024 * 1024;
2416
- filesRoute.post("/files", async (c) => {
2417
- let body;
2418
- try {
2419
- body = await c.req.parseBody();
2420
- } catch (error) {
2421
- return jsonError(error, 400);
2422
- }
2423
- const file = body.file;
2424
- if (!(file instanceof File) || file.size === 0) {
2425
- return c.json({ error: { message: "file is required" } }, 400);
2426
- }
2427
- if (file.size > MAX_UPLOAD_BYTES) {
2428
- 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
2429
2472
  }
2430
- 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
+ }
2431
2484
  const content = new Uint8Array(await file.arrayBuffer());
2432
2485
  const info = await uploadUserFile({
2433
2486
  content,
@@ -2435,80 +2488,109 @@ filesRoute.post("/files", async (c) => {
2435
2488
  mimeType: file.type || void 0
2436
2489
  });
2437
2490
  return c.json(info, 201);
2438
- } catch (error) {
2439
- return jsonError(error);
2491
+ },
2492
+ (result, c) => {
2493
+ if (!result.success) return c.json({ error: { message: "file is required" } }, 400);
2440
2494
  }
2441
- });
2442
- filesRoute.get("/files", async (c) => {
2443
- try {
2444
- const files = await listUserFiles();
2445
- return c.json({ files });
2446
- } catch (error) {
2447
- 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
2448
2506
  }
2449
2507
  });
2450
- filesRoute.post("/files/status", async (c) => {
2451
- let body;
2452
- try {
2453
- body = await c.req.json();
2454
- } catch (error) {
2455
- return jsonError(error, 400);
2456
- }
2457
- const fileIds = body.fileIds;
2458
- if (!Array.isArray(fileIds) || fileIds.some((id) => typeof id !== "string")) {
2459
- return c.json({ error: { message: "fileIds (string[]) is required" } }, 400);
2460
- }
2461
- try {
2462
- const files = await getUserFileStatuses(fileIds);
2463
- return c.json({ files });
2464
- } catch (error) {
2465
- 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
2466
2528
  }
2467
2529
  });
2468
- filesRoute.get("/files/:id/download", async (c) => {
2469
- const id = c.req.param("id");
2470
- if (!id) {
2471
- 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);
2472
2539
  }
2473
- try {
2474
- const result = await getUserFileDownloadUrl(id);
2475
- return c.json(result);
2476
- } catch (error) {
2477
- 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
2478
2552
  }
2479
2553
  });
2480
- filesRoute.delete("/files/:id", async (c) => {
2481
- const id = c.req.param("id");
2482
- if (!id) {
2483
- return c.json({ error: { message: "file id is required" } }, 400);
2484
- }
2485
- try {
2486
- await deleteUserFile(id);
2487
- return c.body(null, 204);
2488
- } catch (error) {
2489
- 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
2490
2567
  }
2491
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
+ });
2492
2574
 
2493
2575
  // ../../apps/server/src/routes/models.ts
2494
- import { createRoute as createRoute4, OpenAPIHono as OpenAPIHono5 } from "@hono/zod-openapi";
2576
+ import { createRoute as createRoute5, OpenAPIHono as OpenAPIHono5 } from "@hono/zod-openapi";
2495
2577
  import { listProviderModelsForContext } from "@openagentpack/sdk";
2496
2578
 
2497
2579
  // ../../apps/server/src/schemas/models.ts
2498
- import { z as z5 } from "@hono/zod-openapi";
2499
- var ModelOptionSchema = z5.object({
2500
- id: z5.string(),
2501
- display_name: z5.string(),
2502
- is_enabled: z5.boolean().optional(),
2503
- 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()
2504
2586
  });
2505
- var ModelsResponseSchema = z5.object({
2506
- models: z5.array(ModelOptionSchema)
2587
+ var ModelsResponseSchema = z6.object({
2588
+ models: z6.array(ModelOptionSchema)
2507
2589
  });
2508
2590
 
2509
2591
  // ../../apps/server/src/routes/models.ts
2510
2592
  var modelsRoute = new OpenAPIHono5();
2511
- var listModelsRoute = createRoute4({
2593
+ var listModelsRoute = createRoute5({
2512
2594
  method: "get",
2513
2595
  path: "/models",
2514
2596
  responses: {
@@ -2536,73 +2618,73 @@ modelsRoute.openapi(listModelsRoute, async (c) => {
2536
2618
  });
2537
2619
 
2538
2620
  // ../../apps/server/src/routes/sessions/index.ts
2539
- import { createRoute as createRoute9, OpenAPIHono as OpenAPIHono10 } from "@hono/zod-openapi";
2621
+ import { createRoute as createRoute10, OpenAPIHono as OpenAPIHono10 } from "@hono/zod-openapi";
2540
2622
 
2541
2623
  // ../../apps/server/src/schemas/sessions.ts
2542
- import { z as z6 } from "@hono/zod-openapi";
2624
+ import { z as z7 } from "@hono/zod-openapi";
2543
2625
  import { SessionEventSchema, SessionSchema } from "@openagentpack/sdk";
2544
- var SessionListResponseSchema = z6.object({
2545
- data: z6.array(SessionSchema),
2546
- next_page_token: z6.string().nullish()
2626
+ var SessionListResponseSchema = z7.object({
2627
+ data: z7.array(SessionSchema),
2628
+ next_page_token: z7.string().nullish()
2547
2629
  }).openapi("SessionListResponse");
2548
- var SessionDetailResponseSchema = z6.object({
2630
+ var SessionDetailResponseSchema = z7.object({
2549
2631
  session: SessionSchema,
2550
- events: z6.array(SessionEventSchema),
2551
- events_next_page_token: z6.string().nullish()
2632
+ events: z7.array(SessionEventSchema),
2633
+ events_next_page_token: z7.string().nullish()
2552
2634
  }).openapi("SessionDetailResponse");
2553
- var SessionEventsPageResponseSchema = z6.object({
2554
- events: z6.array(SessionEventSchema),
2555
- 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()
2556
2638
  }).openapi("SessionEventsPageResponse");
2557
- var SessionDeleteResponseSchema = z6.object({
2558
- session_id: z6.string(),
2559
- deleted: z6.boolean()
2639
+ var SessionDeleteResponseSchema = z7.object({
2640
+ session_id: z7.string(),
2641
+ deleted: z7.boolean()
2560
2642
  }).openapi("SessionDeleteResponse");
2561
- var SessionsQuerySchema = z6.object({
2643
+ var SessionsQuerySchema = z7.object({
2562
2644
  // Non-numeric values resolve to `undefined` so the handler clamps to a
2563
2645
  // default instead of the request being rejected with a 400.
2564
- limit: z6.preprocess((value) => {
2646
+ limit: z7.preprocess((value) => {
2565
2647
  const parsed = Number(value);
2566
2648
  return Number.isFinite(parsed) ? parsed : void 0;
2567
- }, z6.number().int().optional()),
2568
- agentId: z6.string().optional(),
2649
+ }, z7.number().int().optional()),
2650
+ agentId: z7.string().optional(),
2569
2651
  // Opaque cursor for the next page (provider's next_page / next_page_token, passed through verbatim).
2570
- pageToken: z6.string().optional()
2652
+ pageToken: z7.string().optional()
2571
2653
  });
2572
- var SessionDetailQuerySchema = z6.object({
2573
- agentId: z6.string().optional()
2654
+ var SessionDetailQuerySchema = z7.object({
2655
+ agentId: z7.string().optional()
2574
2656
  });
2575
- var SessionEventsQuerySchema = z6.object({
2576
- agentId: z6.string().optional(),
2577
- pageToken: z6.string().optional(),
2578
- limit: z6.preprocess((value) => {
2657
+ var SessionEventsQuerySchema = z7.object({
2658
+ agentId: z7.string().optional(),
2659
+ pageToken: z7.string().optional(),
2660
+ limit: z7.preprocess((value) => {
2579
2661
  const parsed = Number(value);
2580
2662
  return Number.isFinite(parsed) ? parsed : void 0;
2581
- }, z6.number().int().optional())
2663
+ }, z7.number().int().optional())
2582
2664
  });
2583
- var SessionParamsSchema = z6.object({
2584
- sessionId: z6.string()
2665
+ var SessionParamsSchema = z7.object({
2666
+ sessionId: z7.string()
2585
2667
  });
2586
- var CreateSessionBodySchema = z6.object({
2587
- agentId: z6.string(),
2588
- prompt: z6.string().min(1),
2668
+ var CreateSessionBodySchema = z7.object({
2669
+ agentId: z7.string(),
2670
+ prompt: z7.string().min(1),
2589
2671
  // Required: a session must be pinned to a cloud environment (sandbox). Both transports
2590
2672
  // enforce this so Mode A (REST/OpenAPI) and Mode B (console) reject env-less creates.
2591
- environmentId: z6.string().min(1),
2673
+ environmentId: z7.string().min(1),
2592
2674
  // Optional: cloud vault ids to bind a user-supplied credential so the sandbox receives it.
2593
2675
  // Top-level binding shape matches the console createSession.
2594
- vaultIds: z6.array(z6.string()).optional(),
2595
- title: z6.string().optional(),
2676
+ vaultIds: z7.array(z7.string()).optional(),
2677
+ title: z7.string().optional(),
2596
2678
  // Uploaded files to mount as session resources so the task can read the user's files.
2597
2679
  // Each file needs a mount_path (provider rejects a file resource without one).
2598
- 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(),
2599
2681
  // Model the agent should run for this session. If present, createSession applies it
2600
2682
  // to the agent config immediately before starting the run.
2601
- model: z6.string().optional()
2683
+ model: z7.string().optional()
2602
2684
  });
2603
- var SendMessageBodySchema = z6.object({
2604
- agentId: z6.string().optional(),
2605
- message: z6.string().min(1)
2685
+ var SendMessageBodySchema = z7.object({
2686
+ agentId: z7.string().optional(),
2687
+ message: z7.string().min(1)
2606
2688
  });
2607
2689
 
2608
2690
  // ../../apps/server/src/services/sessions/event-sanitizer.ts
@@ -2613,9 +2695,9 @@ function shouldIncludeDebugRaw(request) {
2613
2695
  }
2614
2696
 
2615
2697
  // ../../apps/server/src/routes/sessions/detail.ts
2616
- import { createRoute as createRoute5, OpenAPIHono as OpenAPIHono6 } from "@hono/zod-openapi";
2698
+ import { createRoute as createRoute6, OpenAPIHono as OpenAPIHono6 } from "@hono/zod-openapi";
2617
2699
  var sessionsDetailRoute = new OpenAPIHono6();
2618
- var getSessionRoute = createRoute5({
2700
+ var getSessionRoute = createRoute6({
2619
2701
  method: "get",
2620
2702
  path: "/sessions/{sessionId}",
2621
2703
  request: {
@@ -2644,7 +2726,7 @@ sessionsDetailRoute.openapi(getSessionRoute, async (c) => {
2644
2726
  200
2645
2727
  );
2646
2728
  });
2647
- var deleteSessionRoute = createRoute5({
2729
+ var deleteSessionRoute = createRoute6({
2648
2730
  method: "delete",
2649
2731
  path: "/sessions/{sessionId}",
2650
2732
  request: {
@@ -2667,9 +2749,9 @@ sessionsDetailRoute.openapi(deleteSessionRoute, async (c) => {
2667
2749
  });
2668
2750
 
2669
2751
  // ../../apps/server/src/routes/sessions/events.ts
2670
- import { createRoute as createRoute6, OpenAPIHono as OpenAPIHono7 } from "@hono/zod-openapi";
2752
+ import { createRoute as createRoute7, OpenAPIHono as OpenAPIHono7 } from "@hono/zod-openapi";
2671
2753
  var sessionsEventsRoute = new OpenAPIHono7();
2672
- var listSessionEventsRoute = createRoute6({
2754
+ var listSessionEventsRoute = createRoute7({
2673
2755
  method: "get",
2674
2756
  path: "/sessions/{sessionId}/events",
2675
2757
  request: {
@@ -2706,9 +2788,9 @@ sessionsEventsRoute.openapi(listSessionEventsRoute, async (c) => {
2706
2788
  });
2707
2789
 
2708
2790
  // ../../apps/server/src/routes/sessions/messages.ts
2709
- import { createRoute as createRoute7, OpenAPIHono as OpenAPIHono8 } from "@hono/zod-openapi";
2791
+ import { createRoute as createRoute8, OpenAPIHono as OpenAPIHono8 } from "@hono/zod-openapi";
2710
2792
  var sessionsMessagesRoute = new OpenAPIHono8();
2711
- var sendMessageRoute = createRoute7({
2793
+ var sendMessageRoute = createRoute8({
2712
2794
  method: "post",
2713
2795
  path: "/sessions/{sessionId}/messages",
2714
2796
  request: {
@@ -2737,15 +2819,15 @@ sessionsMessagesRoute.openapi(sendMessageRoute, async (c) => {
2737
2819
  });
2738
2820
 
2739
2821
  // ../../apps/server/src/routes/sessions/stream.ts
2740
- 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";
2741
2823
  var sessionsStreamRoute = new OpenAPIHono9();
2742
- var SessionStreamQuerySchema = z7.object({
2743
- after: z7.preprocess((value) => {
2824
+ var SessionStreamQuerySchema = z8.object({
2825
+ after: z8.preprocess((value) => {
2744
2826
  const parsed = Number(value);
2745
2827
  return Number.isFinite(parsed) ? parsed : void 0;
2746
- }, z7.number().int().optional())
2828
+ }, z8.number().int().optional())
2747
2829
  });
2748
- var streamSessionRoute = createRoute8({
2830
+ var streamSessionRoute = createRoute9({
2749
2831
  method: "get",
2750
2832
  path: "/sessions/{sessionId}/stream",
2751
2833
  request: {
@@ -2757,7 +2839,7 @@ var streamSessionRoute = createRoute8({
2757
2839
  description: "Stream session events as Server-Sent Events",
2758
2840
  content: {
2759
2841
  "text/event-stream": {
2760
- schema: z7.string().openapi({
2842
+ schema: z8.string().openapi({
2761
2843
  description: 'SSE frames with event types "event", "done", and "ping".'
2762
2844
  })
2763
2845
  }
@@ -2868,7 +2950,7 @@ data: ${data}
2868
2950
 
2869
2951
  // ../../apps/server/src/routes/sessions/index.ts
2870
2952
  var sessionsRoute = new OpenAPIHono10();
2871
- var listSessionsRoute = createRoute9({
2953
+ var listSessionsRoute = createRoute10({
2872
2954
  method: "get",
2873
2955
  path: "/sessions",
2874
2956
  request: {
@@ -2894,7 +2976,7 @@ sessionsRoute.openapi(listSessionsRoute, async (c) => {
2894
2976
  });
2895
2977
  return c.json({ data: sessions, next_page_token: nextPageToken ?? null }, 200);
2896
2978
  });
2897
- var createSessionRoute = createRoute9({
2979
+ var createSessionRoute = createRoute10({
2898
2980
  method: "post",
2899
2981
  path: "/sessions",
2900
2982
  request: {
@@ -2936,7 +3018,52 @@ sessionsRoute.route("/", sessionsMessagesRoute);
2936
3018
  sessionsRoute.route("/", sessionsStreamRoute);
2937
3019
 
2938
3020
  // ../../apps/server/src/routes/skills.ts
2939
- 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
+ });
2940
3067
 
2941
3068
  // ../../apps/server/src/services/skills/manage.ts
2942
3069
  import {
@@ -3038,145 +3165,209 @@ async function warmSkillByUrl(name, url) {
3038
3165
  // ../../apps/server/src/routes/skills.ts
3039
3166
  var skillsRoute = new OpenAPIHono11();
3040
3167
  var MAX_UPLOAD_BYTES2 = 100 * 1024 * 1024;
3041
- skillsRoute.post("/skills/upload-file", async (c) => {
3042
- let body;
3043
- try {
3044
- body = await c.req.parseBody();
3045
- } catch (error) {
3046
- return jsonError(error, 400);
3047
- }
3048
- const file = body.file;
3049
- if (!(file instanceof File) || file.size === 0) {
3050
- return c.json({ error: { message: "file is required" } }, 400);
3051
- }
3052
- if (!file.name.toLowerCase().endsWith(".zip")) {
3053
- return c.json({ error: { message: "skill file must be a .zip" } }, 400);
3054
- }
3055
- if (file.size > MAX_UPLOAD_BYTES2) {
3056
- 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
3057
3188
  }
3058
- 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);
3059
3199
  const content = new Uint8Array(await file.arrayBuffer());
3060
3200
  const info = await uploadUserSkillFile({ content, filename: file.name });
3061
3201
  return c.json(info, 201);
3062
- } catch (error) {
3063
- return jsonError(error);
3064
- }
3065
- });
3066
- skillsRoute.post("/skills", async (c) => {
3067
- let body;
3068
- try {
3069
- body = await c.req.json();
3070
- } catch (error) {
3071
- return jsonError(error, 400);
3202
+ },
3203
+ (result, c) => {
3204
+ if (!result.success) return c.json({ error: { message: "file is required" } }, 400);
3072
3205
  }
3073
- const fileId = body.fileId;
3074
- if (typeof fileId !== "string" || fileId.length === 0) {
3075
- 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
3076
3223
  }
3077
- try {
3224
+ });
3225
+ skillsRoute.openapi(
3226
+ createSkillRoute,
3227
+ async (c) => {
3228
+ const { fileId } = c.req.valid("json");
3078
3229
  const info = await createUserSkillFromFile(fileId);
3079
3230
  return c.json(info, 201);
3080
- } catch (error) {
3081
- return jsonError(error);
3082
- }
3083
- });
3084
- skillsRoute.post("/skills/warm", async (c) => {
3085
- let body;
3086
- try {
3087
- body = await c.req.json();
3088
- } catch (error) {
3089
- return jsonError(error, 400);
3231
+ },
3232
+ (result, c) => {
3233
+ if (!result.success) return c.json({ error: { message: "fileId is required" } }, 400);
3090
3234
  }
3091
- const { name, url } = body;
3092
- if (typeof name !== "string" || !name || typeof url !== "string" || !url) {
3093
- 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
3094
3252
  }
3095
- try {
3253
+ });
3254
+ skillsRoute.openapi(
3255
+ warmSkillRoute,
3256
+ async (c) => {
3257
+ const { name, url } = c.req.valid("json");
3096
3258
  await warmSkillByUrl(name, url);
3097
3259
  return c.json({ ok: true }, 200);
3098
- } catch (error) {
3099
- return jsonError(error);
3100
- }
3101
- });
3102
- skillsRoute.get("/skills", async (c) => {
3103
- const source = c.req.query("source");
3104
- if (source !== void 0 && source !== "custom" && source !== "official") {
3105
- 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);
3106
3263
  }
3107
- try {
3108
- const skills = await listUserSkills(source);
3109
- return c.json({ skills });
3110
- } catch (error) {
3111
- 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
3112
3276
  }
3113
3277
  });
3114
- skillsRoute.post("/skills/status", async (c) => {
3115
- let body;
3116
- try {
3117
- body = await c.req.json();
3118
- } catch (error) {
3119
- return jsonError(error, 400);
3120
- }
3121
- const skillIds = body.skillIds;
3122
- if (!Array.isArray(skillIds) || skillIds.some((id) => typeof id !== "string")) {
3123
- 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
+ }
3124
3289
  }
3125
- try {
3126
- const skills = await getUserSkillStatuses(skillIds);
3127
- return c.json({ skills });
3128
- } catch (error) {
3129
- 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
3130
3307
  }
3131
3308
  });
3132
- skillsRoute.delete("/skills/:id", async (c) => {
3133
- const id = c.req.param("id");
3134
- if (!id) {
3135
- 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);
3136
3318
  }
3137
- try {
3138
- await deleteUserSkill(id);
3139
- return c.body(null, 204);
3140
- } catch (error) {
3141
- 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
3142
3328
  }
3143
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
+ });
3144
3335
 
3145
3336
  // ../../apps/server/src/routes/vaults.ts
3146
- import { createRoute as createRoute10, OpenAPIHono as OpenAPIHono12 } from "@hono/zod-openapi";
3337
+ import { createRoute as createRoute12, OpenAPIHono as OpenAPIHono12 } from "@hono/zod-openapi";
3147
3338
  import { createCloudVault, deleteCloudVault, listCloudVaults } from "@openagentpack/sdk";
3148
3339
 
3149
3340
  // ../../apps/server/src/schemas/vaults.ts
3150
- import { z as z8 } from "@hono/zod-openapi";
3341
+ import { z as z10 } from "@hono/zod-openapi";
3151
3342
  import { CloudVaultSchema } from "@openagentpack/sdk";
3152
3343
  import { CloudVaultSchema as CloudVaultSchema2 } from "@openagentpack/sdk";
3153
- var CloudVaultsResponseSchema = z8.object({
3154
- vaults: z8.array(CloudVaultSchema)
3344
+ var CloudVaultsResponseSchema = z10.object({
3345
+ vaults: z10.array(CloudVaultSchema)
3155
3346
  });
3156
- var CreateVaultBodySchema = z8.object({
3157
- name: z8.string().min(1),
3158
- 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(),
3159
3350
  // The DASHSCOPE_API_KEY stored as the vault's credential secret value. Optional: Mode B
3160
3351
  // supplies the user's key; Mode A (local) omits it and the server injects it from its own
3161
3352
  // DASHSCOPE_API_KEY env. (Mode B never reaches this REST route — it goes via console RPC.)
3162
- key: z8.string().min(1).optional()
3353
+ key: z10.string().min(1).optional()
3163
3354
  });
3164
- var CreateVaultResponseSchema = z8.object({
3165
- id: z8.string().nullable(),
3166
- type: z8.string(),
3167
- version: z8.number().optional()
3355
+ var CreateVaultResponseSchema = z10.object({
3356
+ id: z10.string().nullable(),
3357
+ type: z10.string(),
3358
+ version: z10.number().optional()
3168
3359
  });
3169
- var DeleteVaultResponseSchema = z8.object({
3170
- id: z8.string(),
3171
- type: z8.string()
3360
+ var DeleteVaultResponseSchema = z10.object({
3361
+ id: z10.string(),
3362
+ type: z10.string()
3172
3363
  });
3173
- var VaultParamsSchema = z8.object({
3174
- vaultId: z8.string().min(1)
3364
+ var VaultParamsSchema = z10.object({
3365
+ vaultId: z10.string().min(1)
3175
3366
  });
3176
3367
 
3177
3368
  // ../../apps/server/src/routes/vaults.ts
3178
3369
  var vaultsRoute = new OpenAPIHono12();
3179
- var listVaultsRoute = createRoute10({
3370
+ var listVaultsRoute = createRoute12({
3180
3371
  method: "get",
3181
3372
  path: "/vaults",
3182
3373
  responses: {
@@ -3191,7 +3382,7 @@ vaultsRoute.openapi(listVaultsRoute, async (c) => {
3191
3382
  const vaults = await withAgentRuntime(DEFAULT_AGENT_ID, (ctx) => listCloudVaults(ctx));
3192
3383
  return c.json({ vaults }, 200);
3193
3384
  });
3194
- var createVaultRoute = createRoute10({
3385
+ var createVaultRoute = createRoute12({
3195
3386
  method: "post",
3196
3387
  path: "/vaults",
3197
3388
  request: {
@@ -3234,7 +3425,7 @@ vaultsRoute.openapi(createVaultRoute, async (c) => {
3234
3425
  );
3235
3426
  return c.json(vault, 200);
3236
3427
  });
3237
- var deleteVaultRoute = createRoute10({
3428
+ var deleteVaultRoute = createRoute12({
3238
3429
  method: "delete",
3239
3430
  path: "/vaults/{vaultId}",
3240
3431
  request: {
@@ -3327,7 +3518,11 @@ function injectPlaygroundRuntimeMarker(html) {
3327
3518
  return html.replace("<head>", '<head>\n <meta name="agents-runtime" content="playground" />');
3328
3519
  }
3329
3520
  async function startServer() {
3521
+ const cliProvider = process.env.AGENTS_CLI_PROVIDER?.trim();
3330
3522
  await bootstrapRuntimeCredentials2();
3523
+ if (cliProvider) {
3524
+ process.env.AGENTS_PROVIDER = cliProvider;
3525
+ }
3331
3526
  const preferred = Number(process.env.PORT ?? DEFAULT_PLAYGROUND_PORT);
3332
3527
  const port = await resolveListenPort(preferred);
3333
3528
  if (port !== preferred) {