@tonyclaw/agent-inspector 3.0.13 → 3.0.15

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 (46) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/{CompareDrawer-BRV9ztWd.js → CompareDrawer-UaIxykqz.js} +1 -1
  3. package/.output/public/assets/ProxyViewerContainer-DlpfcX56.js +106 -0
  4. package/.output/public/assets/{ReplayDialog-B4b6aD0q.js → ReplayDialog-BFFomU1m.js} +1 -1
  5. package/.output/public/assets/{RequestAnatomy-ybH1l2Bp.js → RequestAnatomy-DKQJBt_c.js} +1 -1
  6. package/.output/public/assets/{ResponseView-DpPKgH-Y.js → ResponseView-D7yotmne.js} +2 -2
  7. package/.output/public/assets/{StreamingChunkSequence-9f_rtMzz.js → StreamingChunkSequence-Da-6WNFG.js} +1 -1
  8. package/.output/public/assets/{_sessionId-gEmO-b2f.js → _sessionId-ByTXLS-w.js} +1 -1
  9. package/.output/public/assets/{index-JgHKqbP1.js → index-BrM8t5mc.js} +1 -1
  10. package/.output/public/assets/index-CGpPRty8.js +1 -0
  11. package/.output/public/assets/index-HRfrFVYw.css +1 -0
  12. package/.output/public/assets/{json-viewer-DFpIPmLo.js → json-viewer-DyjXQdVu.js} +1 -1
  13. package/.output/public/assets/{main-YvdO47OP.js → main-Zv_gjZMb.js} +2 -2
  14. package/.output/server/_libs/lucide-react.mjs +216 -202
  15. package/.output/server/{_sessionId-wSX-l7m2.mjs → _sessionId-GcFhWT0i.mjs} +3 -3
  16. package/.output/server/_ssr/{CompareDrawer-R4d8V0Rv.mjs → CompareDrawer-BV7dw1TN.mjs} +3 -3
  17. package/.output/server/_ssr/{ProxyViewerContainer-CDtJhGg8.mjs → ProxyViewerContainer-CcgfvaS4.mjs} +931 -393
  18. package/.output/server/_ssr/{ReplayDialog-BvmLERpW.mjs → ReplayDialog-B7sBKxIO.mjs} +4 -4
  19. package/.output/server/_ssr/{RequestAnatomy-CH-oO6mY.mjs → RequestAnatomy-s_9Veje2.mjs} +3 -3
  20. package/.output/server/_ssr/{ResponseView-D7shbJw0.mjs → ResponseView-DsOFPCvF.mjs} +3 -3
  21. package/.output/server/_ssr/{StreamingChunkSequence-DB2YHGJj.mjs → StreamingChunkSequence-CyA1XtiF.mjs} +3 -3
  22. package/.output/server/_ssr/{index-CS4QLxuv.mjs → index-CDDRt201.mjs} +2 -2
  23. package/.output/server/_ssr/index.mjs +2 -2
  24. package/.output/server/_ssr/{json-viewer-HxOn73kS.mjs → json-viewer-BFV-xtRM.mjs} +3 -3
  25. package/.output/server/_ssr/{router-l4O3mQ4T.mjs → router-B2Q7vHPM.mjs} +321 -121
  26. package/.output/server/_tanstack-start-manifest_v-Dm_GmuRz.mjs +4 -0
  27. package/.output/server/index.mjs +73 -73
  28. package/README.md +24 -0
  29. package/package.json +1 -1
  30. package/src/components/ProxyViewer.tsx +470 -197
  31. package/src/components/ProxyViewerContainer.tsx +145 -17
  32. package/src/components/ecosystem/AgentLabDialog.tsx +221 -10
  33. package/src/components/proxy-viewer/ToolTraceEvents.tsx +36 -10
  34. package/src/components/proxy-viewer/TurnGroup.tsx +4 -1
  35. package/src/lib/ecosystemContract.ts +21 -1
  36. package/src/proxy/ecosystemRegistry.ts +52 -0
  37. package/src/proxy/ecosystemTasks.ts +95 -1
  38. package/src/proxy/formats/openai/codexMetadata.ts +61 -0
  39. package/src/proxy/formats/openai/handler.ts +8 -2
  40. package/src/routes/api/ecosystem.packages.ts +2 -1
  41. package/src/routes/api/ecosystem.recipes.$recipeId.run.ts +16 -0
  42. package/styles/globals.css +54 -0
  43. package/.output/public/assets/ProxyViewerContainer-BVsv8OFb.js +0 -106
  44. package/.output/public/assets/index-BIgsQvaF.css +0 -1
  45. package/.output/public/assets/index-CF3MPYb3.js +0 -1
  46. package/.output/server/_tanstack-start-manifest_v-Dckf_NHV.mjs +0 -4
@@ -65,8 +65,8 @@ import "../_libs/immediate.mjs";
65
65
  import "../_libs/setimmediate.mjs";
66
66
  import "../_libs/pako.mjs";
67
67
  const faviconSvg = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20role='img'%20aria-label='Agent%20Inspector'%3e%3cg%20fill='none'%20stroke='%23f59e0b'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'%20%3e%3cpath%20d='M5%2013%20C5%209%208%207%2012%207%20C16%207%2019%209%2019%2013%20C19%2016%2016%2018%2012%2018%20C8%2018%205%2016%205%2013%20Z'%20/%3e%3cpath%20d='M5%2011%20C3.5%209.5%201.5%2010%202%2012.5%20C2.5%2014%204%2013.5%205%2012.5'%20/%3e%3cpath%20d='M19%2011%20C20.5%209.5%2022.5%2010%2022%2012.5%20C21.5%2014%2020%2013.5%2019%2012.5'%20/%3e%3cline%20x1='10'%20y1='7'%20x2='9.5'%20y2='5'%20/%3e%3cline%20x1='14'%20y1='7'%20x2='14.5'%20y2='5'%20/%3e%3cline%20x1='6.5'%20y1='16'%20x2='4.5'%20y2='19.5'%20/%3e%3cline%20x1='9'%20y1='17.5'%20x2='8'%20y2='20.5'%20/%3e%3cline%20x1='15'%20y1='17.5'%20x2='16'%20y2='20.5'%20/%3e%3cline%20x1='17.5'%20y1='16'%20x2='19.5'%20y2='19.5'%20/%3e%3c/g%3e%3ccircle%20cx='9.5'%20cy='4.5'%20r='0.9'%20fill='%23f59e0b'%20/%3e%3ccircle%20cx='14.5'%20cy='4.5'%20r='0.9'%20fill='%23f59e0b'%20/%3e%3c/svg%3e";
68
- const appCss = "/assets/index-BIgsQvaF.css";
69
- const Route$K = createRootRoute({
68
+ const appCss = "/assets/index-HRfrFVYw.css";
69
+ const Route$L = createRootRoute({
70
70
  head: () => ({
71
71
  meta: [
72
72
  { charSet: "utf-8" },
@@ -108,8 +108,8 @@ function RootDocument({ children }) {
108
108
  ] })
109
109
  ] });
110
110
  }
111
- const $$splitComponentImporter$1 = () => import("./index-CS4QLxuv.mjs");
112
- const Route$J = createFileRoute("/")({
111
+ const $$splitComponentImporter$1 = () => import("./index-CDDRt201.mjs");
112
+ const Route$K = createFileRoute("/")({
113
113
  component: lazyRouteComponent($$splitComponentImporter$1, "component")
114
114
  });
115
115
  const B64URL_RE = /^[A-Za-z0-9_-]+$/;
@@ -151,8 +151,8 @@ function decodeSessionIdFromPath(encoded) {
151
151
  function getSessionPath(sessionId) {
152
152
  return `/session/${encodeSessionIdForPath(sessionId)}`;
153
153
  }
154
- const $$splitComponentImporter = () => import("../_sessionId-wSX-l7m2.mjs");
155
- const Route$I = createFileRoute("/session/$sessionId")({
154
+ const $$splitComponentImporter = () => import("../_sessionId-GcFhWT0i.mjs");
155
+ const Route$J = createFileRoute("/session/$sessionId")({
156
156
  component: lazyRouteComponent($$splitComponentImporter, "component"),
157
157
  parseParams: (params) => ({
158
158
  sessionId: decodeSessionIdFromPath(params.sessionId)
@@ -844,20 +844,20 @@ function extractSessionIdFromHeaders(headers) {
844
844
  return headers.get("x-agent-inspector-session-id") ?? headers.get("x-session-affinity");
845
845
  }
846
846
  function extractRequestMetadata(body, headers) {
847
- const headerSessionId = extractSessionIdFromHeaders(headers);
848
- if (body === null) return { model: null, sessionId: headerSessionId };
847
+ const headerSessionId2 = extractSessionIdFromHeaders(headers);
848
+ if (body === null) return { model: null, sessionId: headerSessionId2 };
849
849
  try {
850
850
  const json = JSON.parse(body);
851
851
  const loose = LooseRequestSchema.safeParse(json);
852
852
  if (loose.success) {
853
853
  return {
854
854
  model: loose.data.model ?? null,
855
- sessionId: loose.data.metadata?.user_id ?? headerSessionId
855
+ sessionId: loose.data.metadata?.user_id ?? headerSessionId2
856
856
  };
857
857
  }
858
858
  } catch {
859
859
  }
860
- return { model: null, sessionId: headerSessionId };
860
+ return { model: null, sessionId: headerSessionId2 };
861
861
  }
862
862
  const StreamingChunkSchema = object({
863
863
  index: number(),
@@ -1625,7 +1625,7 @@ function readStringOrNullField(entry, field) {
1625
1625
  if (typeof desc.value === "string") return desc.value;
1626
1626
  return null;
1627
1627
  }
1628
- function readStringField(entry, field) {
1628
+ function readStringField$1(entry, field) {
1629
1629
  return readStringOrNullField(entry, field) ?? "";
1630
1630
  }
1631
1631
  function readNumberOrNullField(entry, field) {
@@ -1670,9 +1670,9 @@ function readTextByteLength(entry, bytesField, textField) {
1670
1670
  function readLogIndexSummary(entry, id) {
1671
1671
  return {
1672
1672
  id,
1673
- timestamp: readStringField(entry, "timestamp"),
1674
- method: readStringField(entry, "method"),
1675
- path: readStringField(entry, "path"),
1673
+ timestamp: readStringField$1(entry, "timestamp"),
1674
+ method: readStringField$1(entry, "method"),
1675
+ path: readStringField$1(entry, "path"),
1676
1676
  model: readStringOrNullField(entry, "model"),
1677
1677
  sessionId: readStringOrNullField(entry, "sessionId"),
1678
1678
  responseStatus: readNumberOrNullField(entry, "responseStatus"),
@@ -4551,6 +4551,46 @@ function extractOpenAIStream(raw, log, fallbackModel, collectChunks = true) {
4551
4551
  }
4552
4552
  return extractChatCompletionsStream(events, log, fallbackModel, collectChunks);
4553
4553
  }
4554
+ const EMPTY_CODEX_CLIENT_METADATA = {
4555
+ sessionId: null,
4556
+ threadId: null,
4557
+ turnId: null,
4558
+ installationId: null,
4559
+ windowId: null
4560
+ };
4561
+ function readObjectField(value, field) {
4562
+ if (typeof value !== "object" || value === null || Array.isArray(value)) return void 0;
4563
+ return Object.getOwnPropertyDescriptor(value, field)?.value;
4564
+ }
4565
+ function readStringField(value, field) {
4566
+ const fieldValue = readObjectField(value, field);
4567
+ return typeof fieldValue === "string" && fieldValue.length > 0 ? fieldValue : null;
4568
+ }
4569
+ function parseNestedTurnMetadata(value) {
4570
+ if (typeof value !== "string" || value.length === 0) return null;
4571
+ try {
4572
+ return JSON.parse(value);
4573
+ } catch {
4574
+ return null;
4575
+ }
4576
+ }
4577
+ function extractCodexClientMetadata(rawRequest) {
4578
+ const clientMetadata = readObjectField(rawRequest, "client_metadata");
4579
+ if (clientMetadata === void 0) return EMPTY_CODEX_CLIENT_METADATA;
4580
+ const turnMetadata = parseNestedTurnMetadata(
4581
+ readObjectField(clientMetadata, "x-codex-turn-metadata")
4582
+ );
4583
+ return {
4584
+ sessionId: readStringField(clientMetadata, "session_id") ?? readStringField(turnMetadata, "session_id"),
4585
+ threadId: readStringField(clientMetadata, "thread_id") ?? readStringField(turnMetadata, "thread_id"),
4586
+ turnId: readStringField(clientMetadata, "turn_id") ?? readStringField(turnMetadata, "turn_id"),
4587
+ installationId: readStringField(clientMetadata, "x-codex-installation-id") ?? readStringField(turnMetadata, "installation_id"),
4588
+ windowId: readStringField(clientMetadata, "x-codex-window-id") ?? readStringField(turnMetadata, "window_id")
4589
+ };
4590
+ }
4591
+ function extractCodexSessionId(rawRequest) {
4592
+ return extractCodexClientMetadata(rawRequest).sessionId;
4593
+ }
4554
4594
  function emptyTokens() {
4555
4595
  return {
4556
4596
  inputTokens: null,
@@ -4559,6 +4599,10 @@ function emptyTokens() {
4559
4599
  cacheReadInputTokens: null
4560
4600
  };
4561
4601
  }
4602
+ function headerSessionId(headers) {
4603
+ if (headers === void 0) return null;
4604
+ return headers.get("x-agent-inspector-session-id") ?? headers.get("x-session-affinity");
4605
+ }
4562
4606
  const OpenAIFormatHandler = {
4563
4607
  format: "openai",
4564
4608
  parseRequest(rawBody, headers) {
@@ -4568,14 +4612,14 @@ const OpenAIFormatHandler = {
4568
4612
  if (result.success) {
4569
4613
  return {
4570
4614
  model: result.data.model,
4571
- sessionId: headers?.get("x-session-affinity") ?? null
4615
+ sessionId: extractCodexSessionId(json) ?? headerSessionId(headers)
4572
4616
  };
4573
4617
  }
4574
4618
  const responsesResult = OpenAIResponsesRequestSchema.safeParse(json);
4575
4619
  if (responsesResult.success) {
4576
4620
  return {
4577
4621
  model: responsesResult.data.model,
4578
- sessionId: headers?.get("x-session-affinity") ?? null
4622
+ sessionId: extractCodexSessionId(json) ?? headerSessionId(headers)
4579
4623
  };
4580
4624
  }
4581
4625
  return null;
@@ -7581,7 +7625,7 @@ async function handleProxy(req) {
7581
7625
  }
7582
7626
  return handleStreamingResponse(upstreamRes, req, startTime, upstreamUrl, log, captureFullDetails);
7583
7627
  }
7584
- const Route$H = createFileRoute("/proxy/$")({
7628
+ const Route$I = createFileRoute("/proxy/$")({
7585
7629
  server: {
7586
7630
  handlers: {
7587
7631
  GET: ({ request }) => handleProxy(request),
@@ -7602,7 +7646,7 @@ function parsePositiveInt$4(value) {
7602
7646
  function parseBooleanFlag(value) {
7603
7647
  return value === "1" || value === "true";
7604
7648
  }
7605
- const Route$G = createFileRoute("/api/sessions")({
7649
+ const Route$H = createFileRoute("/api/sessions")({
7606
7650
  server: {
7607
7651
  handlers: {
7608
7652
  GET: async ({ request }) => {
@@ -9067,7 +9111,7 @@ function parsePositiveInt$3(value, fallback) {
9067
9111
  if (!Number.isInteger(parsed) || parsed < 1) return fallback;
9068
9112
  return parsed;
9069
9113
  }
9070
- const Route$F = createFileRoute("/api/runs")({
9114
+ const Route$G = createFileRoute("/api/runs")({
9071
9115
  server: {
9072
9116
  handlers: {
9073
9117
  GET: ({ request }) => {
@@ -9113,7 +9157,7 @@ const ProviderInputSchema = object({
9113
9157
  modelMetadata: array(ProviderModelMetadataSchema).optional(),
9114
9158
  source: _enum(["company", "personal"]).optional()
9115
9159
  });
9116
- const Route$E = createFileRoute("/api/providers")({
9160
+ const Route$F = createFileRoute("/api/providers")({
9117
9161
  server: {
9118
9162
  handlers: {
9119
9163
  GET: ({ request }) => {
@@ -9148,7 +9192,7 @@ const Route$E = createFileRoute("/api/providers")({
9148
9192
  }
9149
9193
  }
9150
9194
  });
9151
- const Route$D = createFileRoute("/api/models")({
9195
+ const Route$E = createFileRoute("/api/models")({
9152
9196
  server: {
9153
9197
  handlers: {
9154
9198
  GET: () => Response.json(getModels())
@@ -9156,7 +9200,7 @@ const Route$D = createFileRoute("/api/models")({
9156
9200
  }
9157
9201
  });
9158
9202
  const name = "@tonyclaw/agent-inspector";
9159
- const version = "3.0.13";
9203
+ const version = "3.0.15";
9160
9204
  const packageJson = {
9161
9205
  name,
9162
9206
  version
@@ -12263,7 +12307,7 @@ const PROMPT_NAMES = [
12263
12307
  "inspector_generate_group_report",
12264
12308
  "inspector_extract_repro_steps"
12265
12309
  ];
12266
- const Route$C = createFileRoute("/api/mcp")({
12310
+ const Route$D = createFileRoute("/api/mcp")({
12267
12311
  server: {
12268
12312
  handlers: {
12269
12313
  // The SDK may issue either POST, GET, or DELETE. TanStack Start only
@@ -12382,7 +12426,7 @@ function parseOptionalPositiveInt(value) {
12382
12426
  if (!Number.isInteger(parsed) || parsed < 1) return { ok: false };
12383
12427
  return { ok: true, value: parsed };
12384
12428
  }
12385
- const Route$B = createFileRoute("/api/logs")({
12429
+ const Route$C = createFileRoute("/api/logs")({
12386
12430
  server: {
12387
12431
  handlers: {
12388
12432
  GET: async ({ request }) => {
@@ -12500,7 +12544,7 @@ const Route$B = createFileRoute("/api/logs")({
12500
12544
  }
12501
12545
  });
12502
12546
  logger.debug("Health endpoint loaded");
12503
- const Route$A = createFileRoute("/api/health")({
12547
+ const Route$B = createFileRoute("/api/health")({
12504
12548
  server: {
12505
12549
  handlers: {
12506
12550
  GET: () => {
@@ -12537,7 +12581,7 @@ function readDeleteEvidenceFlag$1(request) {
12537
12581
  return { ok: false };
12538
12582
  }
12539
12583
  }
12540
- const Route$z = createFileRoute("/api/groups")({
12584
+ const Route$A = createFileRoute("/api/groups")({
12541
12585
  server: {
12542
12586
  handlers: {
12543
12587
  GET: () => Response.json(listInspectorGroups()),
@@ -12581,7 +12625,7 @@ const RuntimeConfigPatchSchema = object({
12581
12625
  }).strict().refine((v) => Object.keys(v).length > 0, {
12582
12626
  message: "At least one field must be provided"
12583
12627
  });
12584
- const Route$y = createFileRoute("/api/config")({
12628
+ const Route$z = createFileRoute("/api/config")({
12585
12629
  server: {
12586
12630
  handlers: {
12587
12631
  GET: () => {
@@ -13190,7 +13234,7 @@ function parseFilters(url) {
13190
13234
  source: sourceResult.success ? sourceResult.data : void 0
13191
13235
  };
13192
13236
  }
13193
- const Route$x = createFileRoute("/api/alerts")({
13237
+ const Route$y = createFileRoute("/api/alerts")({
13194
13238
  server: {
13195
13239
  handlers: {
13196
13240
  GET: async ({ request }) => {
@@ -13215,7 +13259,7 @@ async function readJsonBody$4(request) {
13215
13259
  return { ok: false };
13216
13260
  }
13217
13261
  }
13218
- const Route$w = createFileRoute("/api/runs/$runId")({
13262
+ const Route$x = createFileRoute("/api/runs/$runId")({
13219
13263
  server: {
13220
13264
  handlers: {
13221
13265
  GET: ({ params }) => {
@@ -13690,7 +13734,7 @@ function scanExternalProviders() {
13690
13734
  }
13691
13735
  return { providers: filteredProviders, warnings };
13692
13736
  }
13693
- const Route$v = createFileRoute("/api/providers/scan")({
13737
+ const Route$w = createFileRoute("/api/providers/scan")({
13694
13738
  server: {
13695
13739
  handlers: {
13696
13740
  GET: () => {
@@ -13711,7 +13755,7 @@ const Route$v = createFileRoute("/api/providers/scan")({
13711
13755
  }
13712
13756
  });
13713
13757
  union([string(), object({ providers: unknown() })]);
13714
- const Route$u = createFileRoute("/api/providers/import")({
13758
+ const Route$v = createFileRoute("/api/providers/import")({
13715
13759
  server: {
13716
13760
  handlers: {
13717
13761
  POST: async ({ request }) => {
@@ -13744,7 +13788,7 @@ const Route$u = createFileRoute("/api/providers/import")({
13744
13788
  }
13745
13789
  }
13746
13790
  });
13747
- const Route$t = createFileRoute("/api/providers/export")({
13791
+ const Route$u = createFileRoute("/api/providers/export")({
13748
13792
  server: {
13749
13793
  handlers: {
13750
13794
  GET: ({ request }) => {
@@ -13778,7 +13822,7 @@ const ProviderUpdateSchema = object({
13778
13822
  modelMetadata: array(ProviderModelMetadataSchema).optional(),
13779
13823
  source: _enum(["company", "personal"]).optional()
13780
13824
  });
13781
- const Route$s = createFileRoute("/api/providers/$providerId")({
13825
+ const Route$t = createFileRoute("/api/providers/$providerId")({
13782
13826
  server: {
13783
13827
  handlers: {
13784
13828
  GET: ({ params, request }) => {
@@ -13813,7 +13857,7 @@ const Route$s = createFileRoute("/api/providers/$providerId")({
13813
13857
  }
13814
13858
  });
13815
13859
  const INITIAL_STREAM_LOG_LIMIT = 100;
13816
- const Route$r = createFileRoute("/api/logs/stream")({
13860
+ const Route$s = createFileRoute("/api/logs/stream")({
13817
13861
  server: {
13818
13862
  handlers: {
13819
13863
  GET: ({ request }) => {
@@ -14253,7 +14297,7 @@ function sessionNameFromImportFileName(fileName) {
14253
14297
  function isUploadedFile(value) {
14254
14298
  return value instanceof File;
14255
14299
  }
14256
- const Route$q = createFileRoute("/api/logs/import")({
14300
+ const Route$r = createFileRoute("/api/logs/import")({
14257
14301
  server: {
14258
14302
  handlers: {
14259
14303
  POST: async ({ request }) => {
@@ -14290,7 +14334,7 @@ const Route$q = createFileRoute("/api/logs/import")({
14290
14334
  }
14291
14335
  }
14292
14336
  });
14293
- const Route$p = createFileRoute("/api/logs/$id")({
14337
+ const Route$q = createFileRoute("/api/logs/$id")({
14294
14338
  server: {
14295
14339
  handlers: {
14296
14340
  GET: async ({ params }) => {
@@ -14827,7 +14871,7 @@ const SearchBodySchema = object({
14827
14871
  query: string().min(1),
14828
14872
  project: string().optional()
14829
14873
  });
14830
- const Route$o = createFileRoute("/api/knowledge/search")({
14874
+ const Route$p = createFileRoute("/api/knowledge/search")({
14831
14875
  server: {
14832
14876
  handlers: {
14833
14877
  GET: async ({ request }) => {
@@ -14849,7 +14893,7 @@ const Route$o = createFileRoute("/api/knowledge/search")({
14849
14893
  }
14850
14894
  }
14851
14895
  });
14852
- const Route$n = createFileRoute("/api/knowledge/project-context")({
14896
+ const Route$o = createFileRoute("/api/knowledge/project-context")({
14853
14897
  server: {
14854
14898
  handlers: {
14855
14899
  GET: async ({ request }) => {
@@ -14931,7 +14975,7 @@ function updateCandidateDraft(id, updates) {
14931
14975
  candidates.set(id, updated);
14932
14976
  return updated;
14933
14977
  }
14934
- const Route$m = createFileRoute("/api/knowledge/candidates")({
14978
+ const Route$n = createFileRoute("/api/knowledge/candidates")({
14935
14979
  server: {
14936
14980
  handlers: {
14937
14981
  GET: () => Response.json({ candidates: listCandidates() })
@@ -14966,7 +15010,7 @@ function readDeleteEvidenceFlag(request) {
14966
15010
  return { ok: false };
14967
15011
  }
14968
15012
  }
14969
- const Route$l = createFileRoute("/api/groups/$groupId")({
15013
+ const Route$m = createFileRoute("/api/groups/$groupId")({
14970
15014
  server: {
14971
15015
  handlers: {
14972
15016
  GET: ({ params }) => {
@@ -15102,6 +15146,48 @@ const RUNNER_PRESETS = [
15102
15146
  agentsDir: ".claude/agents"
15103
15147
  }
15104
15148
  ];
15149
+ const LAB_RECIPES = [
15150
+ {
15151
+ id: "inspector-mcp-smoke",
15152
+ title: "Inspector MCP smoke",
15153
+ stage: "Validate",
15154
+ packageId: "eval-harness",
15155
+ description: "Check that the running Inspector exposes the MCP tools eval-harness expects.",
15156
+ command: "npx @tonyclaw/eval-harness check-inspector-mcp",
15157
+ requiresSession: false,
15158
+ runnable: true
15159
+ },
15160
+ {
15161
+ id: "session-evidence-smoke",
15162
+ title: "Session evidence smoke",
15163
+ stage: "Capture",
15164
+ packageId: "eval-harness",
15165
+ description: "Create a lightweight Inspector evidence run from the latest captured logs or selected session.",
15166
+ command: 'npx @tonyclaw/eval-harness inspector-smoke --title "TonyClaw Lab smoke" --latest-log-limit 5',
15167
+ requiresSession: false,
15168
+ runnable: true
15169
+ },
15170
+ {
15171
+ id: "runner-presets-json",
15172
+ title: "Runner presets JSON",
15173
+ stage: "Connect",
15174
+ packageId: "eval-harness",
15175
+ description: "Export runner adapter baselines as machine-readable JSON for CI or docs.",
15176
+ command: "npx @tonyclaw/eval-harness runner-presets --format json",
15177
+ requiresSession: false,
15178
+ runnable: true
15179
+ },
15180
+ {
15181
+ id: "local-smoke-batch",
15182
+ title: "Local smoke batch",
15183
+ stage: "Evaluate",
15184
+ packageId: "eval-harness",
15185
+ description: "Run one short local Jenkins-like evaluation using explicit project/work directories.",
15186
+ command: "npx @tonyclaw/eval-harness run-once --smoke --project-source <project> --work-source <work> --count 1 --parallel 1",
15187
+ requiresSession: false,
15188
+ runnable: false
15189
+ }
15190
+ ];
15105
15191
  const NPM_TIMEOUT_MS = 4e3;
15106
15192
  function runNpm(args) {
15107
15193
  return new Promise((resolve2) => {
@@ -15214,10 +15300,14 @@ async function listEcosystemPackages() {
15214
15300
  function findEcosystemPackage(packageId) {
15215
15301
  return ECOSYSTEM_PACKAGES.find((definition) => definition.id === packageId) ?? null;
15216
15302
  }
15303
+ function findEcosystemRecipe(recipeId) {
15304
+ return LAB_RECIPES.find((recipe) => recipe.id === recipeId) ?? null;
15305
+ }
15217
15306
  const MAX_TASKS = 50;
15218
15307
  const OUTPUT_LIMIT = 4e4;
15219
15308
  const INSTALL_TIMEOUT_MS = 12e4;
15220
15309
  const HELP_TIMEOUT_MS = 3e4;
15310
+ const RECIPE_TIMEOUT_MS = 9e4;
15221
15311
  const tasks = /* @__PURE__ */ new Map();
15222
15312
  function nowIso() {
15223
15313
  return (/* @__PURE__ */ new Date()).toISOString();
@@ -15246,7 +15336,30 @@ function packageActionArgs(action, npmName) {
15246
15336
  return ["exec", "--yes", npmName, "--", "--help"];
15247
15337
  case "runner-presets":
15248
15338
  return ["exec", "--yes", "@tonyclaw/eval-harness", "--", "runner-presets"];
15339
+ case "recipe":
15340
+ return ["exec", "--yes", npmName, "--", "--help"];
15341
+ }
15342
+ }
15343
+ function recipeActionArgs(recipeId) {
15344
+ const execPrefix = ["exec", "--yes", "@tonyclaw/eval-harness", "--"];
15345
+ switch (recipeId) {
15346
+ case "inspector-mcp-smoke":
15347
+ return [...execPrefix, "check-inspector-mcp"];
15348
+ case "session-evidence-smoke":
15349
+ return [
15350
+ ...execPrefix,
15351
+ "inspector-smoke",
15352
+ "--title",
15353
+ "TonyClaw Lab smoke",
15354
+ "--latest-log-limit",
15355
+ "5"
15356
+ ];
15357
+ case "runner-presets-json":
15358
+ return [...execPrefix, "runner-presets", "--format", "json"];
15359
+ case "local-smoke-batch":
15360
+ return null;
15249
15361
  }
15362
+ return null;
15250
15363
  }
15251
15364
  function packageActionTimeout(action) {
15252
15365
  switch (action) {
@@ -15256,6 +15369,8 @@ function packageActionTimeout(action) {
15256
15369
  case "help":
15257
15370
  case "runner-presets":
15258
15371
  return HELP_TIMEOUT_MS;
15372
+ case "recipe":
15373
+ return RECIPE_TIMEOUT_MS;
15259
15374
  }
15260
15375
  }
15261
15376
  function taskCommand(args) {
@@ -15282,6 +15397,7 @@ function startEcosystemTask(packageId, action) {
15282
15397
  id: randomUUID(),
15283
15398
  packageId: definition.id,
15284
15399
  npmName: definition.npmName,
15400
+ recipeId: null,
15285
15401
  action,
15286
15402
  status: "queued",
15287
15403
  command: taskCommand(args),
@@ -15333,7 +15449,71 @@ ${error.message}
15333
15449
  });
15334
15450
  return task;
15335
15451
  }
15336
- const Route$k = createFileRoute("/api/ecosystem/tasks")({
15452
+ function startEcosystemRecipeTask(recipeId) {
15453
+ const recipe = findEcosystemRecipe(recipeId);
15454
+ if (recipe === null) return null;
15455
+ if (!recipe.runnable) return null;
15456
+ const definition = findEcosystemPackage(recipe.packageId);
15457
+ if (definition === null) return null;
15458
+ const args = recipeActionArgs(recipe.id);
15459
+ if (args === null) return null;
15460
+ const task = {
15461
+ id: randomUUID(),
15462
+ packageId: definition.id,
15463
+ npmName: definition.npmName,
15464
+ recipeId: recipe.id,
15465
+ action: "recipe",
15466
+ status: "queued",
15467
+ command: taskCommand(args),
15468
+ output: "",
15469
+ createdAt: nowIso(),
15470
+ startedAt: null,
15471
+ finishedAt: null,
15472
+ exitCode: null,
15473
+ error: null
15474
+ };
15475
+ rememberTask(task);
15476
+ const spawnCommand = npmSpawnCommand(args);
15477
+ const child = spawn(spawnCommand.command, spawnCommand.args, {
15478
+ windowsHide: true,
15479
+ shell: false,
15480
+ stdio: ["ignore", "pipe", "pipe"]
15481
+ });
15482
+ const timeout = setTimeout(() => {
15483
+ child.kill();
15484
+ appendTaskOutput(task, `
15485
+ Timed out after ${String(RECIPE_TIMEOUT_MS / 1e3)}s.
15486
+ `);
15487
+ }, RECIPE_TIMEOUT_MS);
15488
+ task.status = "running";
15489
+ task.startedAt = nowIso();
15490
+ appendTaskOutput(task, `$ ${task.command}
15491
+ `);
15492
+ child.stdout.on("data", (chunk) => {
15493
+ appendTaskOutput(task, chunk.toString("utf8"));
15494
+ });
15495
+ child.stderr.on("data", (chunk) => {
15496
+ appendTaskOutput(task, chunk.toString("utf8"));
15497
+ });
15498
+ child.on("error", (error) => {
15499
+ clearTimeout(timeout);
15500
+ appendTaskOutput(task, `
15501
+ ${error.message}
15502
+ `);
15503
+ completeTask(task, "failed", null, error.message);
15504
+ });
15505
+ child.on("close", (code) => {
15506
+ clearTimeout(timeout);
15507
+ if (task.status === "failed") return;
15508
+ if (code === 0) {
15509
+ completeTask(task, "succeeded", code, null);
15510
+ return;
15511
+ }
15512
+ completeTask(task, "failed", code, `Command exited with code ${String(code ?? "unknown")}`);
15513
+ });
15514
+ return task;
15515
+ }
15516
+ const Route$l = createFileRoute("/api/ecosystem/tasks")({
15337
15517
  server: {
15338
15518
  handlers: {
15339
15519
  GET: () => {
@@ -15342,20 +15522,21 @@ const Route$k = createFileRoute("/api/ecosystem/tasks")({
15342
15522
  }
15343
15523
  }
15344
15524
  });
15345
- const Route$j = createFileRoute("/api/ecosystem/packages")({
15525
+ const Route$k = createFileRoute("/api/ecosystem/packages")({
15346
15526
  server: {
15347
15527
  handlers: {
15348
15528
  GET: async () => {
15349
15529
  return Response.json({
15350
15530
  checkedAt: (/* @__PURE__ */ new Date()).toISOString(),
15351
15531
  packages: await listEcosystemPackages(),
15352
- runnerPresets: RUNNER_PRESETS
15532
+ runnerPresets: RUNNER_PRESETS,
15533
+ recipes: LAB_RECIPES
15353
15534
  });
15354
15535
  }
15355
15536
  }
15356
15537
  }
15357
15538
  });
15358
- const Route$i = createFileRoute("/api/config/paths")({
15539
+ const Route$j = createFileRoute("/api/config/paths")({
15359
15540
  server: {
15360
15541
  handlers: {
15361
15542
  GET: () => {
@@ -15372,7 +15553,7 @@ function parsePositiveInt(value) {
15372
15553
  if (!Number.isInteger(parsed) || parsed < 1) return void 0;
15373
15554
  return parsed;
15374
15555
  }
15375
- const Route$h = createFileRoute("/api/alerts/summary")({
15556
+ const Route$i = createFileRoute("/api/alerts/summary")({
15376
15557
  server: {
15377
15558
  handlers: {
15378
15559
  GET: async ({ request }) => {
@@ -15395,7 +15576,7 @@ async function readJsonBody$2(request) {
15395
15576
  return { ok: false };
15396
15577
  }
15397
15578
  }
15398
- const Route$g = createFileRoute("/api/runs/$runId/evidence")({
15579
+ const Route$h = createFileRoute("/api/runs/$runId/evidence")({
15399
15580
  server: {
15400
15581
  handlers: {
15401
15582
  GET: ({ params }) => {
@@ -16125,7 +16306,7 @@ async function testStreamingEndpoint(baseUrl, provider, path2, model, protocol)
16125
16306
  clearTimeout(timeoutId);
16126
16307
  }
16127
16308
  }
16128
- const Route$f = createFileRoute("/api/providers/$providerId/test")({
16309
+ const Route$g = createFileRoute("/api/providers/$providerId/test")({
16129
16310
  server: {
16130
16311
  handlers: {
16131
16312
  POST: async ({ params }) => {
@@ -16266,7 +16447,7 @@ async function readRegistryJson(response) {
16266
16447
  return null;
16267
16448
  }
16268
16449
  }
16269
- const Route$e = createFileRoute("/api/providers/$providerId/model-metadata")({
16450
+ const Route$f = createFileRoute("/api/providers/$providerId/model-metadata")({
16270
16451
  server: {
16271
16452
  handlers: {
16272
16453
  POST: async ({ params, request }) => {
@@ -16356,7 +16537,7 @@ const Route$e = createFileRoute("/api/providers/$providerId/model-metadata")({
16356
16537
  const ReplayRequestSchema = object({
16357
16538
  modifiedBody: string()
16358
16539
  });
16359
- const Route$d = createFileRoute("/api/logs/$id/replay")({
16540
+ const Route$e = createFileRoute("/api/logs/$id/replay")({
16360
16541
  server: {
16361
16542
  handlers: {
16362
16543
  POST: async ({ params, request }) => {
@@ -16557,7 +16738,7 @@ const Route$d = createFileRoute("/api/logs/$id/replay")({
16557
16738
  }
16558
16739
  }
16559
16740
  });
16560
- const Route$c = createFileRoute("/api/logs/$id/chunks")({
16741
+ const Route$d = createFileRoute("/api/logs/$id/chunks")({
16561
16742
  server: {
16562
16743
  handlers: {
16563
16744
  GET: async ({ params }) => {
@@ -16664,7 +16845,7 @@ function parseIntegerParam(value, fallback) {
16664
16845
  if (!Number.isInteger(parsed)) return fallback;
16665
16846
  return parsed;
16666
16847
  }
16667
- const Route$b = createFileRoute("/api/logs/$id/body")({
16848
+ const Route$c = createFileRoute("/api/logs/$id/body")({
16668
16849
  server: {
16669
16850
  handlers: {
16670
16851
  GET: async ({ params, request }) => {
@@ -16702,7 +16883,7 @@ const CandidateUpdateSchema = object({
16702
16883
  object({
16703
16884
  candidate: KnowledgeCandidateSchema
16704
16885
  });
16705
- const Route$a = createFileRoute("/api/knowledge/candidates/$candidateId")({
16886
+ const Route$b = createFileRoute("/api/knowledge/candidates/$candidateId")({
16706
16887
  server: {
16707
16888
  handlers: {
16708
16889
  PATCH: async ({ params, request }) => {
@@ -16739,7 +16920,7 @@ async function readJsonBody$1(request) {
16739
16920
  return { ok: false };
16740
16921
  }
16741
16922
  }
16742
- const Route$9 = createFileRoute("/api/groups/$groupId/sessions")({
16923
+ const Route$a = createFileRoute("/api/groups/$groupId/sessions")({
16743
16924
  server: {
16744
16925
  handlers: {
16745
16926
  GET: ({ params }) => {
@@ -16779,7 +16960,7 @@ async function readJsonBody(request) {
16779
16960
  return { ok: false };
16780
16961
  }
16781
16962
  }
16782
- const Route$8 = createFileRoute("/api/groups/$groupId/evidence")({
16963
+ const Route$9 = createFileRoute("/api/groups/$groupId/evidence")({
16783
16964
  server: {
16784
16965
  handlers: {
16785
16966
  GET: ({ params }) => {
@@ -16814,7 +16995,7 @@ const Route$8 = createFileRoute("/api/groups/$groupId/evidence")({
16814
16995
  }
16815
16996
  }
16816
16997
  });
16817
- const Route$7 = createFileRoute("/api/ecosystem/tasks/$taskId")({
16998
+ const Route$8 = createFileRoute("/api/ecosystem/tasks/$taskId")({
16818
16999
  server: {
16819
17000
  handlers: {
16820
17001
  GET: ({ params }) => {
@@ -17176,7 +17357,7 @@ async function logModelResults(displayName, providerName, providerSessionId, ant
17176
17357
  }
17177
17358
  }
17178
17359
  }
17179
- const Route$6 = createFileRoute("/api/providers/$providerId/test/log")({
17360
+ const Route$7 = createFileRoute("/api/providers/$providerId/test/log")({
17180
17361
  server: {
17181
17362
  handlers: {
17182
17363
  POST: async ({ params, request }) => {
@@ -17316,7 +17497,7 @@ function getLogsForCandidateScope(scopeId) {
17316
17497
  if (direct.length > 0) return direct;
17317
17498
  return getFilteredLogs().filter((log) => getCandidateScopeId(log) === scopeId);
17318
17499
  }
17319
- const Route$5 = createFileRoute("/api/knowledge/sessions/$sessionId/candidates")({
17500
+ const Route$6 = createFileRoute("/api/knowledge/sessions/$sessionId/candidates")({
17320
17501
  server: {
17321
17502
  handlers: {
17322
17503
  POST: ({ params }) => {
@@ -17327,7 +17508,7 @@ const Route$5 = createFileRoute("/api/knowledge/sessions/$sessionId/candidates")
17327
17508
  }
17328
17509
  }
17329
17510
  });
17330
- const Route$4 = createFileRoute("/api/knowledge/candidates/$candidateId/promote")({
17511
+ const Route$5 = createFileRoute("/api/knowledge/candidates/$candidateId/promote")({
17331
17512
  server: {
17332
17513
  handlers: {
17333
17514
  POST: async ({ params }) => {
@@ -17349,6 +17530,19 @@ const Route$4 = createFileRoute("/api/knowledge/candidates/$candidateId/promote"
17349
17530
  }
17350
17531
  }
17351
17532
  });
17533
+ const Route$4 = createFileRoute("/api/ecosystem/recipes/$recipeId/run")({
17534
+ server: {
17535
+ handlers: {
17536
+ POST: ({ params }) => {
17537
+ const task = startEcosystemRecipeTask(params.recipeId);
17538
+ if (task === null) {
17539
+ return Response.json({ error: "Unknown ecosystem recipe" }, { status: 404 });
17540
+ }
17541
+ return Response.json({ task });
17542
+ }
17543
+ }
17544
+ }
17545
+ });
17352
17546
  const Route$3 = createFileRoute("/api/ecosystem/packages/$packageId/upgrade")({
17353
17547
  server: {
17354
17548
  handlers: {
@@ -17404,216 +17598,221 @@ const Route = createFileRoute("/api/ecosystem/packages/$packageId/help")({
17404
17598
  }
17405
17599
  }
17406
17600
  });
17407
- const IndexRoute = Route$J.update({
17601
+ const IndexRoute = Route$K.update({
17408
17602
  id: "/",
17409
17603
  path: "/",
17410
- getParentRoute: () => Route$K
17604
+ getParentRoute: () => Route$L
17411
17605
  });
17412
- const SessionSessionIdRoute = Route$I.update({
17606
+ const SessionSessionIdRoute = Route$J.update({
17413
17607
  id: "/session/$sessionId",
17414
17608
  path: "/session/$sessionId",
17415
- getParentRoute: () => Route$K
17609
+ getParentRoute: () => Route$L
17416
17610
  });
17417
- const ProxySplatRoute = Route$H.update({
17611
+ const ProxySplatRoute = Route$I.update({
17418
17612
  id: "/proxy/$",
17419
17613
  path: "/proxy/$",
17420
- getParentRoute: () => Route$K
17614
+ getParentRoute: () => Route$L
17421
17615
  });
17422
- const ApiSessionsRoute = Route$G.update({
17616
+ const ApiSessionsRoute = Route$H.update({
17423
17617
  id: "/api/sessions",
17424
17618
  path: "/api/sessions",
17425
- getParentRoute: () => Route$K
17619
+ getParentRoute: () => Route$L
17426
17620
  });
17427
- const ApiRunsRoute = Route$F.update({
17621
+ const ApiRunsRoute = Route$G.update({
17428
17622
  id: "/api/runs",
17429
17623
  path: "/api/runs",
17430
- getParentRoute: () => Route$K
17624
+ getParentRoute: () => Route$L
17431
17625
  });
17432
- const ApiProvidersRoute = Route$E.update({
17626
+ const ApiProvidersRoute = Route$F.update({
17433
17627
  id: "/api/providers",
17434
17628
  path: "/api/providers",
17435
- getParentRoute: () => Route$K
17629
+ getParentRoute: () => Route$L
17436
17630
  });
17437
- const ApiModelsRoute = Route$D.update({
17631
+ const ApiModelsRoute = Route$E.update({
17438
17632
  id: "/api/models",
17439
17633
  path: "/api/models",
17440
- getParentRoute: () => Route$K
17634
+ getParentRoute: () => Route$L
17441
17635
  });
17442
- const ApiMcpRoute = Route$C.update({
17636
+ const ApiMcpRoute = Route$D.update({
17443
17637
  id: "/api/mcp",
17444
17638
  path: "/api/mcp",
17445
- getParentRoute: () => Route$K
17639
+ getParentRoute: () => Route$L
17446
17640
  });
17447
- const ApiLogsRoute = Route$B.update({
17641
+ const ApiLogsRoute = Route$C.update({
17448
17642
  id: "/api/logs",
17449
17643
  path: "/api/logs",
17450
- getParentRoute: () => Route$K
17644
+ getParentRoute: () => Route$L
17451
17645
  });
17452
- const ApiHealthRoute = Route$A.update({
17646
+ const ApiHealthRoute = Route$B.update({
17453
17647
  id: "/api/health",
17454
17648
  path: "/api/health",
17455
- getParentRoute: () => Route$K
17649
+ getParentRoute: () => Route$L
17456
17650
  });
17457
- const ApiGroupsRoute = Route$z.update({
17651
+ const ApiGroupsRoute = Route$A.update({
17458
17652
  id: "/api/groups",
17459
17653
  path: "/api/groups",
17460
- getParentRoute: () => Route$K
17654
+ getParentRoute: () => Route$L
17461
17655
  });
17462
- const ApiConfigRoute = Route$y.update({
17656
+ const ApiConfigRoute = Route$z.update({
17463
17657
  id: "/api/config",
17464
17658
  path: "/api/config",
17465
- getParentRoute: () => Route$K
17659
+ getParentRoute: () => Route$L
17466
17660
  });
17467
- const ApiAlertsRoute = Route$x.update({
17661
+ const ApiAlertsRoute = Route$y.update({
17468
17662
  id: "/api/alerts",
17469
17663
  path: "/api/alerts",
17470
- getParentRoute: () => Route$K
17664
+ getParentRoute: () => Route$L
17471
17665
  });
17472
- const ApiRunsRunIdRoute = Route$w.update({
17666
+ const ApiRunsRunIdRoute = Route$x.update({
17473
17667
  id: "/$runId",
17474
17668
  path: "/$runId",
17475
17669
  getParentRoute: () => ApiRunsRoute
17476
17670
  });
17477
- const ApiProvidersScanRoute = Route$v.update({
17671
+ const ApiProvidersScanRoute = Route$w.update({
17478
17672
  id: "/scan",
17479
17673
  path: "/scan",
17480
17674
  getParentRoute: () => ApiProvidersRoute
17481
17675
  });
17482
- const ApiProvidersImportRoute = Route$u.update({
17676
+ const ApiProvidersImportRoute = Route$v.update({
17483
17677
  id: "/import",
17484
17678
  path: "/import",
17485
17679
  getParentRoute: () => ApiProvidersRoute
17486
17680
  });
17487
- const ApiProvidersExportRoute = Route$t.update({
17681
+ const ApiProvidersExportRoute = Route$u.update({
17488
17682
  id: "/export",
17489
17683
  path: "/export",
17490
17684
  getParentRoute: () => ApiProvidersRoute
17491
17685
  });
17492
- const ApiProvidersProviderIdRoute = Route$s.update({
17686
+ const ApiProvidersProviderIdRoute = Route$t.update({
17493
17687
  id: "/$providerId",
17494
17688
  path: "/$providerId",
17495
17689
  getParentRoute: () => ApiProvidersRoute
17496
17690
  });
17497
- const ApiLogsStreamRoute = Route$r.update({
17691
+ const ApiLogsStreamRoute = Route$s.update({
17498
17692
  id: "/stream",
17499
17693
  path: "/stream",
17500
17694
  getParentRoute: () => ApiLogsRoute
17501
17695
  });
17502
- const ApiLogsImportRoute = Route$q.update({
17696
+ const ApiLogsImportRoute = Route$r.update({
17503
17697
  id: "/import",
17504
17698
  path: "/import",
17505
17699
  getParentRoute: () => ApiLogsRoute
17506
17700
  });
17507
- const ApiLogsIdRoute = Route$p.update({
17701
+ const ApiLogsIdRoute = Route$q.update({
17508
17702
  id: "/$id",
17509
17703
  path: "/$id",
17510
17704
  getParentRoute: () => ApiLogsRoute
17511
17705
  });
17512
- const ApiKnowledgeSearchRoute = Route$o.update({
17706
+ const ApiKnowledgeSearchRoute = Route$p.update({
17513
17707
  id: "/api/knowledge/search",
17514
17708
  path: "/api/knowledge/search",
17515
- getParentRoute: () => Route$K
17709
+ getParentRoute: () => Route$L
17516
17710
  });
17517
- const ApiKnowledgeProjectContextRoute = Route$n.update({
17711
+ const ApiKnowledgeProjectContextRoute = Route$o.update({
17518
17712
  id: "/api/knowledge/project-context",
17519
17713
  path: "/api/knowledge/project-context",
17520
- getParentRoute: () => Route$K
17714
+ getParentRoute: () => Route$L
17521
17715
  });
17522
- const ApiKnowledgeCandidatesRoute = Route$m.update({
17716
+ const ApiKnowledgeCandidatesRoute = Route$n.update({
17523
17717
  id: "/api/knowledge/candidates",
17524
17718
  path: "/api/knowledge/candidates",
17525
- getParentRoute: () => Route$K
17719
+ getParentRoute: () => Route$L
17526
17720
  });
17527
- const ApiGroupsGroupIdRoute = Route$l.update({
17721
+ const ApiGroupsGroupIdRoute = Route$m.update({
17528
17722
  id: "/$groupId",
17529
17723
  path: "/$groupId",
17530
17724
  getParentRoute: () => ApiGroupsRoute
17531
17725
  });
17532
- const ApiEcosystemTasksRoute = Route$k.update({
17726
+ const ApiEcosystemTasksRoute = Route$l.update({
17533
17727
  id: "/api/ecosystem/tasks",
17534
17728
  path: "/api/ecosystem/tasks",
17535
- getParentRoute: () => Route$K
17729
+ getParentRoute: () => Route$L
17536
17730
  });
17537
- const ApiEcosystemPackagesRoute = Route$j.update({
17731
+ const ApiEcosystemPackagesRoute = Route$k.update({
17538
17732
  id: "/api/ecosystem/packages",
17539
17733
  path: "/api/ecosystem/packages",
17540
- getParentRoute: () => Route$K
17734
+ getParentRoute: () => Route$L
17541
17735
  });
17542
- const ApiConfigPathsRoute = Route$i.update({
17736
+ const ApiConfigPathsRoute = Route$j.update({
17543
17737
  id: "/paths",
17544
17738
  path: "/paths",
17545
17739
  getParentRoute: () => ApiConfigRoute
17546
17740
  });
17547
- const ApiAlertsSummaryRoute = Route$h.update({
17741
+ const ApiAlertsSummaryRoute = Route$i.update({
17548
17742
  id: "/summary",
17549
17743
  path: "/summary",
17550
17744
  getParentRoute: () => ApiAlertsRoute
17551
17745
  });
17552
- const ApiRunsRunIdEvidenceRoute = Route$g.update({
17746
+ const ApiRunsRunIdEvidenceRoute = Route$h.update({
17553
17747
  id: "/evidence",
17554
17748
  path: "/evidence",
17555
17749
  getParentRoute: () => ApiRunsRunIdRoute
17556
17750
  });
17557
- const ApiProvidersProviderIdTestRoute = Route$f.update({
17751
+ const ApiProvidersProviderIdTestRoute = Route$g.update({
17558
17752
  id: "/test",
17559
17753
  path: "/test",
17560
17754
  getParentRoute: () => ApiProvidersProviderIdRoute
17561
17755
  });
17562
- const ApiProvidersProviderIdModelMetadataRoute = Route$e.update({
17756
+ const ApiProvidersProviderIdModelMetadataRoute = Route$f.update({
17563
17757
  id: "/model-metadata",
17564
17758
  path: "/model-metadata",
17565
17759
  getParentRoute: () => ApiProvidersProviderIdRoute
17566
17760
  });
17567
- const ApiLogsIdReplayRoute = Route$d.update({
17761
+ const ApiLogsIdReplayRoute = Route$e.update({
17568
17762
  id: "/replay",
17569
17763
  path: "/replay",
17570
17764
  getParentRoute: () => ApiLogsIdRoute
17571
17765
  });
17572
- const ApiLogsIdChunksRoute = Route$c.update({
17766
+ const ApiLogsIdChunksRoute = Route$d.update({
17573
17767
  id: "/chunks",
17574
17768
  path: "/chunks",
17575
17769
  getParentRoute: () => ApiLogsIdRoute
17576
17770
  });
17577
- const ApiLogsIdBodyRoute = Route$b.update({
17771
+ const ApiLogsIdBodyRoute = Route$c.update({
17578
17772
  id: "/body",
17579
17773
  path: "/body",
17580
17774
  getParentRoute: () => ApiLogsIdRoute
17581
17775
  });
17582
- const ApiKnowledgeCandidatesCandidateIdRoute = Route$a.update({
17776
+ const ApiKnowledgeCandidatesCandidateIdRoute = Route$b.update({
17583
17777
  id: "/$candidateId",
17584
17778
  path: "/$candidateId",
17585
17779
  getParentRoute: () => ApiKnowledgeCandidatesRoute
17586
17780
  });
17587
- const ApiGroupsGroupIdSessionsRoute = Route$9.update({
17781
+ const ApiGroupsGroupIdSessionsRoute = Route$a.update({
17588
17782
  id: "/sessions",
17589
17783
  path: "/sessions",
17590
17784
  getParentRoute: () => ApiGroupsGroupIdRoute
17591
17785
  });
17592
- const ApiGroupsGroupIdEvidenceRoute = Route$8.update({
17786
+ const ApiGroupsGroupIdEvidenceRoute = Route$9.update({
17593
17787
  id: "/evidence",
17594
17788
  path: "/evidence",
17595
17789
  getParentRoute: () => ApiGroupsGroupIdRoute
17596
17790
  });
17597
- const ApiEcosystemTasksTaskIdRoute = Route$7.update({
17791
+ const ApiEcosystemTasksTaskIdRoute = Route$8.update({
17598
17792
  id: "/$taskId",
17599
17793
  path: "/$taskId",
17600
17794
  getParentRoute: () => ApiEcosystemTasksRoute
17601
17795
  });
17602
- const ApiProvidersProviderIdTestLogRoute = Route$6.update({
17796
+ const ApiProvidersProviderIdTestLogRoute = Route$7.update({
17603
17797
  id: "/log",
17604
17798
  path: "/log",
17605
17799
  getParentRoute: () => ApiProvidersProviderIdTestRoute
17606
17800
  });
17607
- const ApiKnowledgeSessionsSessionIdCandidatesRoute = Route$5.update({
17801
+ const ApiKnowledgeSessionsSessionIdCandidatesRoute = Route$6.update({
17608
17802
  id: "/api/knowledge/sessions/$sessionId/candidates",
17609
17803
  path: "/api/knowledge/sessions/$sessionId/candidates",
17610
- getParentRoute: () => Route$K
17804
+ getParentRoute: () => Route$L
17611
17805
  });
17612
- const ApiKnowledgeCandidatesCandidateIdPromoteRoute = Route$4.update({
17806
+ const ApiKnowledgeCandidatesCandidateIdPromoteRoute = Route$5.update({
17613
17807
  id: "/promote",
17614
17808
  path: "/promote",
17615
17809
  getParentRoute: () => ApiKnowledgeCandidatesCandidateIdRoute
17616
17810
  });
17811
+ const ApiEcosystemRecipesRecipeIdRunRoute = Route$4.update({
17812
+ id: "/api/ecosystem/recipes/$recipeId/run",
17813
+ path: "/api/ecosystem/recipes/$recipeId/run",
17814
+ getParentRoute: () => Route$L
17815
+ });
17617
17816
  const ApiEcosystemPackagesPackageIdUpgradeRoute = Route$3.update({
17618
17817
  id: "/$packageId/upgrade",
17619
17818
  path: "/$packageId/upgrade",
@@ -17745,9 +17944,10 @@ const rootRouteChildren = {
17745
17944
  ApiKnowledgeCandidatesRoute: ApiKnowledgeCandidatesRouteWithChildren,
17746
17945
  ApiKnowledgeProjectContextRoute,
17747
17946
  ApiKnowledgeSearchRoute,
17947
+ ApiEcosystemRecipesRecipeIdRunRoute,
17748
17948
  ApiKnowledgeSessionsSessionIdCandidatesRoute
17749
17949
  };
17750
- const routeTree = Route$K._addFileChildren(rootRouteChildren)._addFileTypes();
17950
+ const routeTree = Route$L._addFileChildren(rootRouteChildren)._addFileTypes();
17751
17951
  function getRouter() {
17752
17952
  const router2 = createRouter({
17753
17953
  routeTree,
@@ -17789,7 +17989,7 @@ export {
17789
17989
  router as N,
17790
17990
  OpenAIRequestSchema as O,
17791
17991
  ProviderConfigSchema as P,
17792
- Route$I as R,
17992
+ Route$J as R,
17793
17993
  StreamingChunkSchema$1 as S,
17794
17994
  TimeDisplayFormatSchema as T,
17795
17995
  DEFAULT_SLOW_RESPONSE_THRESHOLD_SECONDS as a,