@tonyclaw/agent-inspector 3.0.12 → 3.0.14

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 (40) hide show
  1. package/.output/cli.js +72 -6
  2. package/.output/nitro.json +1 -1
  3. package/.output/public/assets/{CompareDrawer-BxgmeTyv.js → CompareDrawer-DDfwHQUi.js} +1 -1
  4. package/.output/public/assets/{ProxyViewerContainer-CchT6T-4.js → ProxyViewerContainer-CbNsaoQw.js} +41 -41
  5. package/.output/public/assets/{ReplayDialog-CMHVUtVB.js → ReplayDialog-D-26DMBt.js} +1 -1
  6. package/.output/public/assets/{RequestAnatomy-CpqHIkD1.js → RequestAnatomy-B6zNFqNX.js} +1 -1
  7. package/.output/public/assets/{ResponseView-BvhBiQ5k.js → ResponseView-Ccy95rWI.js} +2 -2
  8. package/.output/public/assets/{StreamingChunkSequence-CcNvFNPp.js → StreamingChunkSequence-yIiscGuE.js} +1 -1
  9. package/.output/public/assets/{_sessionId-D5z6C77f.js → _sessionId-BnMB0zab.js} +1 -1
  10. package/.output/public/assets/index-49RC4dlD.js +1 -0
  11. package/.output/public/assets/{index-CXcH69lm.js → index-BbtAIxbg.js} +1 -1
  12. package/.output/public/assets/index-DXKupW0r.css +1 -0
  13. package/.output/public/assets/{json-viewer-DjRQ00mw.js → json-viewer-C838cVmD.js} +1 -1
  14. package/.output/public/assets/{main-CkKubKth.js → main-BfN4culo.js} +2 -2
  15. package/.output/server/_libs/lucide-react.mjs +33 -33
  16. package/.output/server/{_sessionId-IP7wEbnv.mjs → _sessionId-DoprmwZV.mjs} +3 -3
  17. package/.output/server/_ssr/{CompareDrawer-B4qTq3I9.mjs → CompareDrawer-YMLJNxXR.mjs} +3 -3
  18. package/.output/server/_ssr/{ProxyViewerContainer-CCIJ1EcB.mjs → ProxyViewerContainer-C62eZnva.mjs} +215 -24
  19. package/.output/server/_ssr/{ReplayDialog-BgxCdCxM.mjs → ReplayDialog-NmN7Ukjo.mjs} +3 -3
  20. package/.output/server/_ssr/{RequestAnatomy-De3QDi_x.mjs → RequestAnatomy-Dawm2qxe.mjs} +2 -2
  21. package/.output/server/_ssr/{ResponseView-Dvibk8g5.mjs → ResponseView-BHyAY83t.mjs} +3 -3
  22. package/.output/server/_ssr/{StreamingChunkSequence-oAsweEag.mjs → StreamingChunkSequence-C4qgcJbg.mjs} +2 -2
  23. package/.output/server/_ssr/{index-BIlK7gMO.mjs → index-B2Pf6W_T.mjs} +2 -2
  24. package/.output/server/_ssr/index.mjs +2 -2
  25. package/.output/server/_ssr/{json-viewer-Dgo4oRbs.mjs → json-viewer-u67BASf8.mjs} +3 -3
  26. package/.output/server/_ssr/{router-DY_2TxnZ.mjs → router-CZhFVMGN.mjs} +267 -111
  27. package/.output/server/_tanstack-start-manifest_v-Dk2HfOoe.mjs +4 -0
  28. package/.output/server/index.mjs +73 -73
  29. package/README.md +32 -9
  30. package/package.json +1 -1
  31. package/src/cli.ts +95 -11
  32. package/src/components/ecosystem/AgentLabDialog.tsx +221 -10
  33. package/src/lib/ecosystemContract.ts +21 -1
  34. package/src/proxy/ecosystemRegistry.ts +52 -0
  35. package/src/proxy/ecosystemTasks.ts +95 -1
  36. package/src/routes/api/ecosystem.packages.ts +2 -1
  37. package/src/routes/api/ecosystem.recipes.$recipeId.run.ts +16 -0
  38. package/.output/public/assets/index-BIgsQvaF.css +0 -1
  39. package/.output/public/assets/index-C57MERBU.js +0 -1
  40. package/.output/server/_tanstack-start-manifest_v-CYOwyBpv.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-DXKupW0r.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-BIlK7gMO.mjs");
112
- const Route$J = createFileRoute("/")({
111
+ const $$splitComponentImporter$1 = () => import("./index-B2Pf6W_T.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-IP7wEbnv.mjs");
155
- const Route$I = createFileRoute("/session/$sessionId")({
154
+ const $$splitComponentImporter = () => import("../_sessionId-DoprmwZV.mjs");
155
+ const Route$J = createFileRoute("/session/$sessionId")({
156
156
  component: lazyRouteComponent($$splitComponentImporter, "component"),
157
157
  parseParams: (params) => ({
158
158
  sessionId: decodeSessionIdFromPath(params.sessionId)
@@ -7581,7 +7581,7 @@ async function handleProxy(req) {
7581
7581
  }
7582
7582
  return handleStreamingResponse(upstreamRes, req, startTime, upstreamUrl, log, captureFullDetails);
7583
7583
  }
7584
- const Route$H = createFileRoute("/proxy/$")({
7584
+ const Route$I = createFileRoute("/proxy/$")({
7585
7585
  server: {
7586
7586
  handlers: {
7587
7587
  GET: ({ request }) => handleProxy(request),
@@ -7602,7 +7602,7 @@ function parsePositiveInt$4(value) {
7602
7602
  function parseBooleanFlag(value) {
7603
7603
  return value === "1" || value === "true";
7604
7604
  }
7605
- const Route$G = createFileRoute("/api/sessions")({
7605
+ const Route$H = createFileRoute("/api/sessions")({
7606
7606
  server: {
7607
7607
  handlers: {
7608
7608
  GET: async ({ request }) => {
@@ -9067,7 +9067,7 @@ function parsePositiveInt$3(value, fallback) {
9067
9067
  if (!Number.isInteger(parsed) || parsed < 1) return fallback;
9068
9068
  return parsed;
9069
9069
  }
9070
- const Route$F = createFileRoute("/api/runs")({
9070
+ const Route$G = createFileRoute("/api/runs")({
9071
9071
  server: {
9072
9072
  handlers: {
9073
9073
  GET: ({ request }) => {
@@ -9113,7 +9113,7 @@ const ProviderInputSchema = object({
9113
9113
  modelMetadata: array(ProviderModelMetadataSchema).optional(),
9114
9114
  source: _enum(["company", "personal"]).optional()
9115
9115
  });
9116
- const Route$E = createFileRoute("/api/providers")({
9116
+ const Route$F = createFileRoute("/api/providers")({
9117
9117
  server: {
9118
9118
  handlers: {
9119
9119
  GET: ({ request }) => {
@@ -9148,7 +9148,7 @@ const Route$E = createFileRoute("/api/providers")({
9148
9148
  }
9149
9149
  }
9150
9150
  });
9151
- const Route$D = createFileRoute("/api/models")({
9151
+ const Route$E = createFileRoute("/api/models")({
9152
9152
  server: {
9153
9153
  handlers: {
9154
9154
  GET: () => Response.json(getModels())
@@ -9156,7 +9156,7 @@ const Route$D = createFileRoute("/api/models")({
9156
9156
  }
9157
9157
  });
9158
9158
  const name = "@tonyclaw/agent-inspector";
9159
- const version = "3.0.12";
9159
+ const version = "3.0.14";
9160
9160
  const packageJson = {
9161
9161
  name,
9162
9162
  version
@@ -12263,7 +12263,7 @@ const PROMPT_NAMES = [
12263
12263
  "inspector_generate_group_report",
12264
12264
  "inspector_extract_repro_steps"
12265
12265
  ];
12266
- const Route$C = createFileRoute("/api/mcp")({
12266
+ const Route$D = createFileRoute("/api/mcp")({
12267
12267
  server: {
12268
12268
  handlers: {
12269
12269
  // The SDK may issue either POST, GET, or DELETE. TanStack Start only
@@ -12382,7 +12382,7 @@ function parseOptionalPositiveInt(value) {
12382
12382
  if (!Number.isInteger(parsed) || parsed < 1) return { ok: false };
12383
12383
  return { ok: true, value: parsed };
12384
12384
  }
12385
- const Route$B = createFileRoute("/api/logs")({
12385
+ const Route$C = createFileRoute("/api/logs")({
12386
12386
  server: {
12387
12387
  handlers: {
12388
12388
  GET: async ({ request }) => {
@@ -12500,7 +12500,7 @@ const Route$B = createFileRoute("/api/logs")({
12500
12500
  }
12501
12501
  });
12502
12502
  logger.debug("Health endpoint loaded");
12503
- const Route$A = createFileRoute("/api/health")({
12503
+ const Route$B = createFileRoute("/api/health")({
12504
12504
  server: {
12505
12505
  handlers: {
12506
12506
  GET: () => {
@@ -12537,7 +12537,7 @@ function readDeleteEvidenceFlag$1(request) {
12537
12537
  return { ok: false };
12538
12538
  }
12539
12539
  }
12540
- const Route$z = createFileRoute("/api/groups")({
12540
+ const Route$A = createFileRoute("/api/groups")({
12541
12541
  server: {
12542
12542
  handlers: {
12543
12543
  GET: () => Response.json(listInspectorGroups()),
@@ -12581,7 +12581,7 @@ const RuntimeConfigPatchSchema = object({
12581
12581
  }).strict().refine((v) => Object.keys(v).length > 0, {
12582
12582
  message: "At least one field must be provided"
12583
12583
  });
12584
- const Route$y = createFileRoute("/api/config")({
12584
+ const Route$z = createFileRoute("/api/config")({
12585
12585
  server: {
12586
12586
  handlers: {
12587
12587
  GET: () => {
@@ -13190,7 +13190,7 @@ function parseFilters(url) {
13190
13190
  source: sourceResult.success ? sourceResult.data : void 0
13191
13191
  };
13192
13192
  }
13193
- const Route$x = createFileRoute("/api/alerts")({
13193
+ const Route$y = createFileRoute("/api/alerts")({
13194
13194
  server: {
13195
13195
  handlers: {
13196
13196
  GET: async ({ request }) => {
@@ -13215,7 +13215,7 @@ async function readJsonBody$4(request) {
13215
13215
  return { ok: false };
13216
13216
  }
13217
13217
  }
13218
- const Route$w = createFileRoute("/api/runs/$runId")({
13218
+ const Route$x = createFileRoute("/api/runs/$runId")({
13219
13219
  server: {
13220
13220
  handlers: {
13221
13221
  GET: ({ params }) => {
@@ -13690,7 +13690,7 @@ function scanExternalProviders() {
13690
13690
  }
13691
13691
  return { providers: filteredProviders, warnings };
13692
13692
  }
13693
- const Route$v = createFileRoute("/api/providers/scan")({
13693
+ const Route$w = createFileRoute("/api/providers/scan")({
13694
13694
  server: {
13695
13695
  handlers: {
13696
13696
  GET: () => {
@@ -13711,7 +13711,7 @@ const Route$v = createFileRoute("/api/providers/scan")({
13711
13711
  }
13712
13712
  });
13713
13713
  union([string(), object({ providers: unknown() })]);
13714
- const Route$u = createFileRoute("/api/providers/import")({
13714
+ const Route$v = createFileRoute("/api/providers/import")({
13715
13715
  server: {
13716
13716
  handlers: {
13717
13717
  POST: async ({ request }) => {
@@ -13744,7 +13744,7 @@ const Route$u = createFileRoute("/api/providers/import")({
13744
13744
  }
13745
13745
  }
13746
13746
  });
13747
- const Route$t = createFileRoute("/api/providers/export")({
13747
+ const Route$u = createFileRoute("/api/providers/export")({
13748
13748
  server: {
13749
13749
  handlers: {
13750
13750
  GET: ({ request }) => {
@@ -13778,7 +13778,7 @@ const ProviderUpdateSchema = object({
13778
13778
  modelMetadata: array(ProviderModelMetadataSchema).optional(),
13779
13779
  source: _enum(["company", "personal"]).optional()
13780
13780
  });
13781
- const Route$s = createFileRoute("/api/providers/$providerId")({
13781
+ const Route$t = createFileRoute("/api/providers/$providerId")({
13782
13782
  server: {
13783
13783
  handlers: {
13784
13784
  GET: ({ params, request }) => {
@@ -13813,7 +13813,7 @@ const Route$s = createFileRoute("/api/providers/$providerId")({
13813
13813
  }
13814
13814
  });
13815
13815
  const INITIAL_STREAM_LOG_LIMIT = 100;
13816
- const Route$r = createFileRoute("/api/logs/stream")({
13816
+ const Route$s = createFileRoute("/api/logs/stream")({
13817
13817
  server: {
13818
13818
  handlers: {
13819
13819
  GET: ({ request }) => {
@@ -14253,7 +14253,7 @@ function sessionNameFromImportFileName(fileName) {
14253
14253
  function isUploadedFile(value) {
14254
14254
  return value instanceof File;
14255
14255
  }
14256
- const Route$q = createFileRoute("/api/logs/import")({
14256
+ const Route$r = createFileRoute("/api/logs/import")({
14257
14257
  server: {
14258
14258
  handlers: {
14259
14259
  POST: async ({ request }) => {
@@ -14290,7 +14290,7 @@ const Route$q = createFileRoute("/api/logs/import")({
14290
14290
  }
14291
14291
  }
14292
14292
  });
14293
- const Route$p = createFileRoute("/api/logs/$id")({
14293
+ const Route$q = createFileRoute("/api/logs/$id")({
14294
14294
  server: {
14295
14295
  handlers: {
14296
14296
  GET: async ({ params }) => {
@@ -14827,7 +14827,7 @@ const SearchBodySchema = object({
14827
14827
  query: string().min(1),
14828
14828
  project: string().optional()
14829
14829
  });
14830
- const Route$o = createFileRoute("/api/knowledge/search")({
14830
+ const Route$p = createFileRoute("/api/knowledge/search")({
14831
14831
  server: {
14832
14832
  handlers: {
14833
14833
  GET: async ({ request }) => {
@@ -14849,7 +14849,7 @@ const Route$o = createFileRoute("/api/knowledge/search")({
14849
14849
  }
14850
14850
  }
14851
14851
  });
14852
- const Route$n = createFileRoute("/api/knowledge/project-context")({
14852
+ const Route$o = createFileRoute("/api/knowledge/project-context")({
14853
14853
  server: {
14854
14854
  handlers: {
14855
14855
  GET: async ({ request }) => {
@@ -14931,7 +14931,7 @@ function updateCandidateDraft(id, updates) {
14931
14931
  candidates.set(id, updated);
14932
14932
  return updated;
14933
14933
  }
14934
- const Route$m = createFileRoute("/api/knowledge/candidates")({
14934
+ const Route$n = createFileRoute("/api/knowledge/candidates")({
14935
14935
  server: {
14936
14936
  handlers: {
14937
14937
  GET: () => Response.json({ candidates: listCandidates() })
@@ -14966,7 +14966,7 @@ function readDeleteEvidenceFlag(request) {
14966
14966
  return { ok: false };
14967
14967
  }
14968
14968
  }
14969
- const Route$l = createFileRoute("/api/groups/$groupId")({
14969
+ const Route$m = createFileRoute("/api/groups/$groupId")({
14970
14970
  server: {
14971
14971
  handlers: {
14972
14972
  GET: ({ params }) => {
@@ -15102,6 +15102,48 @@ const RUNNER_PRESETS = [
15102
15102
  agentsDir: ".claude/agents"
15103
15103
  }
15104
15104
  ];
15105
+ const LAB_RECIPES = [
15106
+ {
15107
+ id: "inspector-mcp-smoke",
15108
+ title: "Inspector MCP smoke",
15109
+ stage: "Validate",
15110
+ packageId: "eval-harness",
15111
+ description: "Check that the running Inspector exposes the MCP tools eval-harness expects.",
15112
+ command: "npx @tonyclaw/eval-harness check-inspector-mcp",
15113
+ requiresSession: false,
15114
+ runnable: true
15115
+ },
15116
+ {
15117
+ id: "session-evidence-smoke",
15118
+ title: "Session evidence smoke",
15119
+ stage: "Capture",
15120
+ packageId: "eval-harness",
15121
+ description: "Create a lightweight Inspector evidence run from the latest captured logs or selected session.",
15122
+ command: 'npx @tonyclaw/eval-harness inspector-smoke --title "TonyClaw Lab smoke" --latest-log-limit 5',
15123
+ requiresSession: false,
15124
+ runnable: true
15125
+ },
15126
+ {
15127
+ id: "runner-presets-json",
15128
+ title: "Runner presets JSON",
15129
+ stage: "Connect",
15130
+ packageId: "eval-harness",
15131
+ description: "Export runner adapter baselines as machine-readable JSON for CI or docs.",
15132
+ command: "npx @tonyclaw/eval-harness runner-presets --format json",
15133
+ requiresSession: false,
15134
+ runnable: true
15135
+ },
15136
+ {
15137
+ id: "local-smoke-batch",
15138
+ title: "Local smoke batch",
15139
+ stage: "Evaluate",
15140
+ packageId: "eval-harness",
15141
+ description: "Run one short local Jenkins-like evaluation using explicit project/work directories.",
15142
+ command: "npx @tonyclaw/eval-harness run-once --smoke --project-source <project> --work-source <work> --count 1 --parallel 1",
15143
+ requiresSession: false,
15144
+ runnable: false
15145
+ }
15146
+ ];
15105
15147
  const NPM_TIMEOUT_MS = 4e3;
15106
15148
  function runNpm(args) {
15107
15149
  return new Promise((resolve2) => {
@@ -15214,10 +15256,14 @@ async function listEcosystemPackages() {
15214
15256
  function findEcosystemPackage(packageId) {
15215
15257
  return ECOSYSTEM_PACKAGES.find((definition) => definition.id === packageId) ?? null;
15216
15258
  }
15259
+ function findEcosystemRecipe(recipeId) {
15260
+ return LAB_RECIPES.find((recipe) => recipe.id === recipeId) ?? null;
15261
+ }
15217
15262
  const MAX_TASKS = 50;
15218
15263
  const OUTPUT_LIMIT = 4e4;
15219
15264
  const INSTALL_TIMEOUT_MS = 12e4;
15220
15265
  const HELP_TIMEOUT_MS = 3e4;
15266
+ const RECIPE_TIMEOUT_MS = 9e4;
15221
15267
  const tasks = /* @__PURE__ */ new Map();
15222
15268
  function nowIso() {
15223
15269
  return (/* @__PURE__ */ new Date()).toISOString();
@@ -15246,8 +15292,31 @@ function packageActionArgs(action, npmName) {
15246
15292
  return ["exec", "--yes", npmName, "--", "--help"];
15247
15293
  case "runner-presets":
15248
15294
  return ["exec", "--yes", "@tonyclaw/eval-harness", "--", "runner-presets"];
15295
+ case "recipe":
15296
+ return ["exec", "--yes", npmName, "--", "--help"];
15249
15297
  }
15250
15298
  }
15299
+ function recipeActionArgs(recipeId) {
15300
+ const execPrefix = ["exec", "--yes", "@tonyclaw/eval-harness", "--"];
15301
+ switch (recipeId) {
15302
+ case "inspector-mcp-smoke":
15303
+ return [...execPrefix, "check-inspector-mcp"];
15304
+ case "session-evidence-smoke":
15305
+ return [
15306
+ ...execPrefix,
15307
+ "inspector-smoke",
15308
+ "--title",
15309
+ "TonyClaw Lab smoke",
15310
+ "--latest-log-limit",
15311
+ "5"
15312
+ ];
15313
+ case "runner-presets-json":
15314
+ return [...execPrefix, "runner-presets", "--format", "json"];
15315
+ case "local-smoke-batch":
15316
+ return null;
15317
+ }
15318
+ return null;
15319
+ }
15251
15320
  function packageActionTimeout(action) {
15252
15321
  switch (action) {
15253
15322
  case "install":
@@ -15256,6 +15325,8 @@ function packageActionTimeout(action) {
15256
15325
  case "help":
15257
15326
  case "runner-presets":
15258
15327
  return HELP_TIMEOUT_MS;
15328
+ case "recipe":
15329
+ return RECIPE_TIMEOUT_MS;
15259
15330
  }
15260
15331
  }
15261
15332
  function taskCommand(args) {
@@ -15282,6 +15353,7 @@ function startEcosystemTask(packageId, action) {
15282
15353
  id: randomUUID(),
15283
15354
  packageId: definition.id,
15284
15355
  npmName: definition.npmName,
15356
+ recipeId: null,
15285
15357
  action,
15286
15358
  status: "queued",
15287
15359
  command: taskCommand(args),
@@ -15333,7 +15405,71 @@ ${error.message}
15333
15405
  });
15334
15406
  return task;
15335
15407
  }
15336
- const Route$k = createFileRoute("/api/ecosystem/tasks")({
15408
+ function startEcosystemRecipeTask(recipeId) {
15409
+ const recipe = findEcosystemRecipe(recipeId);
15410
+ if (recipe === null) return null;
15411
+ if (!recipe.runnable) return null;
15412
+ const definition = findEcosystemPackage(recipe.packageId);
15413
+ if (definition === null) return null;
15414
+ const args = recipeActionArgs(recipe.id);
15415
+ if (args === null) return null;
15416
+ const task = {
15417
+ id: randomUUID(),
15418
+ packageId: definition.id,
15419
+ npmName: definition.npmName,
15420
+ recipeId: recipe.id,
15421
+ action: "recipe",
15422
+ status: "queued",
15423
+ command: taskCommand(args),
15424
+ output: "",
15425
+ createdAt: nowIso(),
15426
+ startedAt: null,
15427
+ finishedAt: null,
15428
+ exitCode: null,
15429
+ error: null
15430
+ };
15431
+ rememberTask(task);
15432
+ const spawnCommand = npmSpawnCommand(args);
15433
+ const child = spawn(spawnCommand.command, spawnCommand.args, {
15434
+ windowsHide: true,
15435
+ shell: false,
15436
+ stdio: ["ignore", "pipe", "pipe"]
15437
+ });
15438
+ const timeout = setTimeout(() => {
15439
+ child.kill();
15440
+ appendTaskOutput(task, `
15441
+ Timed out after ${String(RECIPE_TIMEOUT_MS / 1e3)}s.
15442
+ `);
15443
+ }, RECIPE_TIMEOUT_MS);
15444
+ task.status = "running";
15445
+ task.startedAt = nowIso();
15446
+ appendTaskOutput(task, `$ ${task.command}
15447
+ `);
15448
+ child.stdout.on("data", (chunk) => {
15449
+ appendTaskOutput(task, chunk.toString("utf8"));
15450
+ });
15451
+ child.stderr.on("data", (chunk) => {
15452
+ appendTaskOutput(task, chunk.toString("utf8"));
15453
+ });
15454
+ child.on("error", (error) => {
15455
+ clearTimeout(timeout);
15456
+ appendTaskOutput(task, `
15457
+ ${error.message}
15458
+ `);
15459
+ completeTask(task, "failed", null, error.message);
15460
+ });
15461
+ child.on("close", (code) => {
15462
+ clearTimeout(timeout);
15463
+ if (task.status === "failed") return;
15464
+ if (code === 0) {
15465
+ completeTask(task, "succeeded", code, null);
15466
+ return;
15467
+ }
15468
+ completeTask(task, "failed", code, `Command exited with code ${String(code ?? "unknown")}`);
15469
+ });
15470
+ return task;
15471
+ }
15472
+ const Route$l = createFileRoute("/api/ecosystem/tasks")({
15337
15473
  server: {
15338
15474
  handlers: {
15339
15475
  GET: () => {
@@ -15342,20 +15478,21 @@ const Route$k = createFileRoute("/api/ecosystem/tasks")({
15342
15478
  }
15343
15479
  }
15344
15480
  });
15345
- const Route$j = createFileRoute("/api/ecosystem/packages")({
15481
+ const Route$k = createFileRoute("/api/ecosystem/packages")({
15346
15482
  server: {
15347
15483
  handlers: {
15348
15484
  GET: async () => {
15349
15485
  return Response.json({
15350
15486
  checkedAt: (/* @__PURE__ */ new Date()).toISOString(),
15351
15487
  packages: await listEcosystemPackages(),
15352
- runnerPresets: RUNNER_PRESETS
15488
+ runnerPresets: RUNNER_PRESETS,
15489
+ recipes: LAB_RECIPES
15353
15490
  });
15354
15491
  }
15355
15492
  }
15356
15493
  }
15357
15494
  });
15358
- const Route$i = createFileRoute("/api/config/paths")({
15495
+ const Route$j = createFileRoute("/api/config/paths")({
15359
15496
  server: {
15360
15497
  handlers: {
15361
15498
  GET: () => {
@@ -15372,7 +15509,7 @@ function parsePositiveInt(value) {
15372
15509
  if (!Number.isInteger(parsed) || parsed < 1) return void 0;
15373
15510
  return parsed;
15374
15511
  }
15375
- const Route$h = createFileRoute("/api/alerts/summary")({
15512
+ const Route$i = createFileRoute("/api/alerts/summary")({
15376
15513
  server: {
15377
15514
  handlers: {
15378
15515
  GET: async ({ request }) => {
@@ -15395,7 +15532,7 @@ async function readJsonBody$2(request) {
15395
15532
  return { ok: false };
15396
15533
  }
15397
15534
  }
15398
- const Route$g = createFileRoute("/api/runs/$runId/evidence")({
15535
+ const Route$h = createFileRoute("/api/runs/$runId/evidence")({
15399
15536
  server: {
15400
15537
  handlers: {
15401
15538
  GET: ({ params }) => {
@@ -16125,7 +16262,7 @@ async function testStreamingEndpoint(baseUrl, provider, path2, model, protocol)
16125
16262
  clearTimeout(timeoutId);
16126
16263
  }
16127
16264
  }
16128
- const Route$f = createFileRoute("/api/providers/$providerId/test")({
16265
+ const Route$g = createFileRoute("/api/providers/$providerId/test")({
16129
16266
  server: {
16130
16267
  handlers: {
16131
16268
  POST: async ({ params }) => {
@@ -16266,7 +16403,7 @@ async function readRegistryJson(response) {
16266
16403
  return null;
16267
16404
  }
16268
16405
  }
16269
- const Route$e = createFileRoute("/api/providers/$providerId/model-metadata")({
16406
+ const Route$f = createFileRoute("/api/providers/$providerId/model-metadata")({
16270
16407
  server: {
16271
16408
  handlers: {
16272
16409
  POST: async ({ params, request }) => {
@@ -16356,7 +16493,7 @@ const Route$e = createFileRoute("/api/providers/$providerId/model-metadata")({
16356
16493
  const ReplayRequestSchema = object({
16357
16494
  modifiedBody: string()
16358
16495
  });
16359
- const Route$d = createFileRoute("/api/logs/$id/replay")({
16496
+ const Route$e = createFileRoute("/api/logs/$id/replay")({
16360
16497
  server: {
16361
16498
  handlers: {
16362
16499
  POST: async ({ params, request }) => {
@@ -16557,7 +16694,7 @@ const Route$d = createFileRoute("/api/logs/$id/replay")({
16557
16694
  }
16558
16695
  }
16559
16696
  });
16560
- const Route$c = createFileRoute("/api/logs/$id/chunks")({
16697
+ const Route$d = createFileRoute("/api/logs/$id/chunks")({
16561
16698
  server: {
16562
16699
  handlers: {
16563
16700
  GET: async ({ params }) => {
@@ -16664,7 +16801,7 @@ function parseIntegerParam(value, fallback) {
16664
16801
  if (!Number.isInteger(parsed)) return fallback;
16665
16802
  return parsed;
16666
16803
  }
16667
- const Route$b = createFileRoute("/api/logs/$id/body")({
16804
+ const Route$c = createFileRoute("/api/logs/$id/body")({
16668
16805
  server: {
16669
16806
  handlers: {
16670
16807
  GET: async ({ params, request }) => {
@@ -16702,7 +16839,7 @@ const CandidateUpdateSchema = object({
16702
16839
  object({
16703
16840
  candidate: KnowledgeCandidateSchema
16704
16841
  });
16705
- const Route$a = createFileRoute("/api/knowledge/candidates/$candidateId")({
16842
+ const Route$b = createFileRoute("/api/knowledge/candidates/$candidateId")({
16706
16843
  server: {
16707
16844
  handlers: {
16708
16845
  PATCH: async ({ params, request }) => {
@@ -16739,7 +16876,7 @@ async function readJsonBody$1(request) {
16739
16876
  return { ok: false };
16740
16877
  }
16741
16878
  }
16742
- const Route$9 = createFileRoute("/api/groups/$groupId/sessions")({
16879
+ const Route$a = createFileRoute("/api/groups/$groupId/sessions")({
16743
16880
  server: {
16744
16881
  handlers: {
16745
16882
  GET: ({ params }) => {
@@ -16779,7 +16916,7 @@ async function readJsonBody(request) {
16779
16916
  return { ok: false };
16780
16917
  }
16781
16918
  }
16782
- const Route$8 = createFileRoute("/api/groups/$groupId/evidence")({
16919
+ const Route$9 = createFileRoute("/api/groups/$groupId/evidence")({
16783
16920
  server: {
16784
16921
  handlers: {
16785
16922
  GET: ({ params }) => {
@@ -16814,7 +16951,7 @@ const Route$8 = createFileRoute("/api/groups/$groupId/evidence")({
16814
16951
  }
16815
16952
  }
16816
16953
  });
16817
- const Route$7 = createFileRoute("/api/ecosystem/tasks/$taskId")({
16954
+ const Route$8 = createFileRoute("/api/ecosystem/tasks/$taskId")({
16818
16955
  server: {
16819
16956
  handlers: {
16820
16957
  GET: ({ params }) => {
@@ -17176,7 +17313,7 @@ async function logModelResults(displayName, providerName, providerSessionId, ant
17176
17313
  }
17177
17314
  }
17178
17315
  }
17179
- const Route$6 = createFileRoute("/api/providers/$providerId/test/log")({
17316
+ const Route$7 = createFileRoute("/api/providers/$providerId/test/log")({
17180
17317
  server: {
17181
17318
  handlers: {
17182
17319
  POST: async ({ params, request }) => {
@@ -17316,7 +17453,7 @@ function getLogsForCandidateScope(scopeId) {
17316
17453
  if (direct.length > 0) return direct;
17317
17454
  return getFilteredLogs().filter((log) => getCandidateScopeId(log) === scopeId);
17318
17455
  }
17319
- const Route$5 = createFileRoute("/api/knowledge/sessions/$sessionId/candidates")({
17456
+ const Route$6 = createFileRoute("/api/knowledge/sessions/$sessionId/candidates")({
17320
17457
  server: {
17321
17458
  handlers: {
17322
17459
  POST: ({ params }) => {
@@ -17327,7 +17464,7 @@ const Route$5 = createFileRoute("/api/knowledge/sessions/$sessionId/candidates")
17327
17464
  }
17328
17465
  }
17329
17466
  });
17330
- const Route$4 = createFileRoute("/api/knowledge/candidates/$candidateId/promote")({
17467
+ const Route$5 = createFileRoute("/api/knowledge/candidates/$candidateId/promote")({
17331
17468
  server: {
17332
17469
  handlers: {
17333
17470
  POST: async ({ params }) => {
@@ -17349,6 +17486,19 @@ const Route$4 = createFileRoute("/api/knowledge/candidates/$candidateId/promote"
17349
17486
  }
17350
17487
  }
17351
17488
  });
17489
+ const Route$4 = createFileRoute("/api/ecosystem/recipes/$recipeId/run")({
17490
+ server: {
17491
+ handlers: {
17492
+ POST: ({ params }) => {
17493
+ const task = startEcosystemRecipeTask(params.recipeId);
17494
+ if (task === null) {
17495
+ return Response.json({ error: "Unknown ecosystem recipe" }, { status: 404 });
17496
+ }
17497
+ return Response.json({ task });
17498
+ }
17499
+ }
17500
+ }
17501
+ });
17352
17502
  const Route$3 = createFileRoute("/api/ecosystem/packages/$packageId/upgrade")({
17353
17503
  server: {
17354
17504
  handlers: {
@@ -17404,216 +17554,221 @@ const Route = createFileRoute("/api/ecosystem/packages/$packageId/help")({
17404
17554
  }
17405
17555
  }
17406
17556
  });
17407
- const IndexRoute = Route$J.update({
17557
+ const IndexRoute = Route$K.update({
17408
17558
  id: "/",
17409
17559
  path: "/",
17410
- getParentRoute: () => Route$K
17560
+ getParentRoute: () => Route$L
17411
17561
  });
17412
- const SessionSessionIdRoute = Route$I.update({
17562
+ const SessionSessionIdRoute = Route$J.update({
17413
17563
  id: "/session/$sessionId",
17414
17564
  path: "/session/$sessionId",
17415
- getParentRoute: () => Route$K
17565
+ getParentRoute: () => Route$L
17416
17566
  });
17417
- const ProxySplatRoute = Route$H.update({
17567
+ const ProxySplatRoute = Route$I.update({
17418
17568
  id: "/proxy/$",
17419
17569
  path: "/proxy/$",
17420
- getParentRoute: () => Route$K
17570
+ getParentRoute: () => Route$L
17421
17571
  });
17422
- const ApiSessionsRoute = Route$G.update({
17572
+ const ApiSessionsRoute = Route$H.update({
17423
17573
  id: "/api/sessions",
17424
17574
  path: "/api/sessions",
17425
- getParentRoute: () => Route$K
17575
+ getParentRoute: () => Route$L
17426
17576
  });
17427
- const ApiRunsRoute = Route$F.update({
17577
+ const ApiRunsRoute = Route$G.update({
17428
17578
  id: "/api/runs",
17429
17579
  path: "/api/runs",
17430
- getParentRoute: () => Route$K
17580
+ getParentRoute: () => Route$L
17431
17581
  });
17432
- const ApiProvidersRoute = Route$E.update({
17582
+ const ApiProvidersRoute = Route$F.update({
17433
17583
  id: "/api/providers",
17434
17584
  path: "/api/providers",
17435
- getParentRoute: () => Route$K
17585
+ getParentRoute: () => Route$L
17436
17586
  });
17437
- const ApiModelsRoute = Route$D.update({
17587
+ const ApiModelsRoute = Route$E.update({
17438
17588
  id: "/api/models",
17439
17589
  path: "/api/models",
17440
- getParentRoute: () => Route$K
17590
+ getParentRoute: () => Route$L
17441
17591
  });
17442
- const ApiMcpRoute = Route$C.update({
17592
+ const ApiMcpRoute = Route$D.update({
17443
17593
  id: "/api/mcp",
17444
17594
  path: "/api/mcp",
17445
- getParentRoute: () => Route$K
17595
+ getParentRoute: () => Route$L
17446
17596
  });
17447
- const ApiLogsRoute = Route$B.update({
17597
+ const ApiLogsRoute = Route$C.update({
17448
17598
  id: "/api/logs",
17449
17599
  path: "/api/logs",
17450
- getParentRoute: () => Route$K
17600
+ getParentRoute: () => Route$L
17451
17601
  });
17452
- const ApiHealthRoute = Route$A.update({
17602
+ const ApiHealthRoute = Route$B.update({
17453
17603
  id: "/api/health",
17454
17604
  path: "/api/health",
17455
- getParentRoute: () => Route$K
17605
+ getParentRoute: () => Route$L
17456
17606
  });
17457
- const ApiGroupsRoute = Route$z.update({
17607
+ const ApiGroupsRoute = Route$A.update({
17458
17608
  id: "/api/groups",
17459
17609
  path: "/api/groups",
17460
- getParentRoute: () => Route$K
17610
+ getParentRoute: () => Route$L
17461
17611
  });
17462
- const ApiConfigRoute = Route$y.update({
17612
+ const ApiConfigRoute = Route$z.update({
17463
17613
  id: "/api/config",
17464
17614
  path: "/api/config",
17465
- getParentRoute: () => Route$K
17615
+ getParentRoute: () => Route$L
17466
17616
  });
17467
- const ApiAlertsRoute = Route$x.update({
17617
+ const ApiAlertsRoute = Route$y.update({
17468
17618
  id: "/api/alerts",
17469
17619
  path: "/api/alerts",
17470
- getParentRoute: () => Route$K
17620
+ getParentRoute: () => Route$L
17471
17621
  });
17472
- const ApiRunsRunIdRoute = Route$w.update({
17622
+ const ApiRunsRunIdRoute = Route$x.update({
17473
17623
  id: "/$runId",
17474
17624
  path: "/$runId",
17475
17625
  getParentRoute: () => ApiRunsRoute
17476
17626
  });
17477
- const ApiProvidersScanRoute = Route$v.update({
17627
+ const ApiProvidersScanRoute = Route$w.update({
17478
17628
  id: "/scan",
17479
17629
  path: "/scan",
17480
17630
  getParentRoute: () => ApiProvidersRoute
17481
17631
  });
17482
- const ApiProvidersImportRoute = Route$u.update({
17632
+ const ApiProvidersImportRoute = Route$v.update({
17483
17633
  id: "/import",
17484
17634
  path: "/import",
17485
17635
  getParentRoute: () => ApiProvidersRoute
17486
17636
  });
17487
- const ApiProvidersExportRoute = Route$t.update({
17637
+ const ApiProvidersExportRoute = Route$u.update({
17488
17638
  id: "/export",
17489
17639
  path: "/export",
17490
17640
  getParentRoute: () => ApiProvidersRoute
17491
17641
  });
17492
- const ApiProvidersProviderIdRoute = Route$s.update({
17642
+ const ApiProvidersProviderIdRoute = Route$t.update({
17493
17643
  id: "/$providerId",
17494
17644
  path: "/$providerId",
17495
17645
  getParentRoute: () => ApiProvidersRoute
17496
17646
  });
17497
- const ApiLogsStreamRoute = Route$r.update({
17647
+ const ApiLogsStreamRoute = Route$s.update({
17498
17648
  id: "/stream",
17499
17649
  path: "/stream",
17500
17650
  getParentRoute: () => ApiLogsRoute
17501
17651
  });
17502
- const ApiLogsImportRoute = Route$q.update({
17652
+ const ApiLogsImportRoute = Route$r.update({
17503
17653
  id: "/import",
17504
17654
  path: "/import",
17505
17655
  getParentRoute: () => ApiLogsRoute
17506
17656
  });
17507
- const ApiLogsIdRoute = Route$p.update({
17657
+ const ApiLogsIdRoute = Route$q.update({
17508
17658
  id: "/$id",
17509
17659
  path: "/$id",
17510
17660
  getParentRoute: () => ApiLogsRoute
17511
17661
  });
17512
- const ApiKnowledgeSearchRoute = Route$o.update({
17662
+ const ApiKnowledgeSearchRoute = Route$p.update({
17513
17663
  id: "/api/knowledge/search",
17514
17664
  path: "/api/knowledge/search",
17515
- getParentRoute: () => Route$K
17665
+ getParentRoute: () => Route$L
17516
17666
  });
17517
- const ApiKnowledgeProjectContextRoute = Route$n.update({
17667
+ const ApiKnowledgeProjectContextRoute = Route$o.update({
17518
17668
  id: "/api/knowledge/project-context",
17519
17669
  path: "/api/knowledge/project-context",
17520
- getParentRoute: () => Route$K
17670
+ getParentRoute: () => Route$L
17521
17671
  });
17522
- const ApiKnowledgeCandidatesRoute = Route$m.update({
17672
+ const ApiKnowledgeCandidatesRoute = Route$n.update({
17523
17673
  id: "/api/knowledge/candidates",
17524
17674
  path: "/api/knowledge/candidates",
17525
- getParentRoute: () => Route$K
17675
+ getParentRoute: () => Route$L
17526
17676
  });
17527
- const ApiGroupsGroupIdRoute = Route$l.update({
17677
+ const ApiGroupsGroupIdRoute = Route$m.update({
17528
17678
  id: "/$groupId",
17529
17679
  path: "/$groupId",
17530
17680
  getParentRoute: () => ApiGroupsRoute
17531
17681
  });
17532
- const ApiEcosystemTasksRoute = Route$k.update({
17682
+ const ApiEcosystemTasksRoute = Route$l.update({
17533
17683
  id: "/api/ecosystem/tasks",
17534
17684
  path: "/api/ecosystem/tasks",
17535
- getParentRoute: () => Route$K
17685
+ getParentRoute: () => Route$L
17536
17686
  });
17537
- const ApiEcosystemPackagesRoute = Route$j.update({
17687
+ const ApiEcosystemPackagesRoute = Route$k.update({
17538
17688
  id: "/api/ecosystem/packages",
17539
17689
  path: "/api/ecosystem/packages",
17540
- getParentRoute: () => Route$K
17690
+ getParentRoute: () => Route$L
17541
17691
  });
17542
- const ApiConfigPathsRoute = Route$i.update({
17692
+ const ApiConfigPathsRoute = Route$j.update({
17543
17693
  id: "/paths",
17544
17694
  path: "/paths",
17545
17695
  getParentRoute: () => ApiConfigRoute
17546
17696
  });
17547
- const ApiAlertsSummaryRoute = Route$h.update({
17697
+ const ApiAlertsSummaryRoute = Route$i.update({
17548
17698
  id: "/summary",
17549
17699
  path: "/summary",
17550
17700
  getParentRoute: () => ApiAlertsRoute
17551
17701
  });
17552
- const ApiRunsRunIdEvidenceRoute = Route$g.update({
17702
+ const ApiRunsRunIdEvidenceRoute = Route$h.update({
17553
17703
  id: "/evidence",
17554
17704
  path: "/evidence",
17555
17705
  getParentRoute: () => ApiRunsRunIdRoute
17556
17706
  });
17557
- const ApiProvidersProviderIdTestRoute = Route$f.update({
17707
+ const ApiProvidersProviderIdTestRoute = Route$g.update({
17558
17708
  id: "/test",
17559
17709
  path: "/test",
17560
17710
  getParentRoute: () => ApiProvidersProviderIdRoute
17561
17711
  });
17562
- const ApiProvidersProviderIdModelMetadataRoute = Route$e.update({
17712
+ const ApiProvidersProviderIdModelMetadataRoute = Route$f.update({
17563
17713
  id: "/model-metadata",
17564
17714
  path: "/model-metadata",
17565
17715
  getParentRoute: () => ApiProvidersProviderIdRoute
17566
17716
  });
17567
- const ApiLogsIdReplayRoute = Route$d.update({
17717
+ const ApiLogsIdReplayRoute = Route$e.update({
17568
17718
  id: "/replay",
17569
17719
  path: "/replay",
17570
17720
  getParentRoute: () => ApiLogsIdRoute
17571
17721
  });
17572
- const ApiLogsIdChunksRoute = Route$c.update({
17722
+ const ApiLogsIdChunksRoute = Route$d.update({
17573
17723
  id: "/chunks",
17574
17724
  path: "/chunks",
17575
17725
  getParentRoute: () => ApiLogsIdRoute
17576
17726
  });
17577
- const ApiLogsIdBodyRoute = Route$b.update({
17727
+ const ApiLogsIdBodyRoute = Route$c.update({
17578
17728
  id: "/body",
17579
17729
  path: "/body",
17580
17730
  getParentRoute: () => ApiLogsIdRoute
17581
17731
  });
17582
- const ApiKnowledgeCandidatesCandidateIdRoute = Route$a.update({
17732
+ const ApiKnowledgeCandidatesCandidateIdRoute = Route$b.update({
17583
17733
  id: "/$candidateId",
17584
17734
  path: "/$candidateId",
17585
17735
  getParentRoute: () => ApiKnowledgeCandidatesRoute
17586
17736
  });
17587
- const ApiGroupsGroupIdSessionsRoute = Route$9.update({
17737
+ const ApiGroupsGroupIdSessionsRoute = Route$a.update({
17588
17738
  id: "/sessions",
17589
17739
  path: "/sessions",
17590
17740
  getParentRoute: () => ApiGroupsGroupIdRoute
17591
17741
  });
17592
- const ApiGroupsGroupIdEvidenceRoute = Route$8.update({
17742
+ const ApiGroupsGroupIdEvidenceRoute = Route$9.update({
17593
17743
  id: "/evidence",
17594
17744
  path: "/evidence",
17595
17745
  getParentRoute: () => ApiGroupsGroupIdRoute
17596
17746
  });
17597
- const ApiEcosystemTasksTaskIdRoute = Route$7.update({
17747
+ const ApiEcosystemTasksTaskIdRoute = Route$8.update({
17598
17748
  id: "/$taskId",
17599
17749
  path: "/$taskId",
17600
17750
  getParentRoute: () => ApiEcosystemTasksRoute
17601
17751
  });
17602
- const ApiProvidersProviderIdTestLogRoute = Route$6.update({
17752
+ const ApiProvidersProviderIdTestLogRoute = Route$7.update({
17603
17753
  id: "/log",
17604
17754
  path: "/log",
17605
17755
  getParentRoute: () => ApiProvidersProviderIdTestRoute
17606
17756
  });
17607
- const ApiKnowledgeSessionsSessionIdCandidatesRoute = Route$5.update({
17757
+ const ApiKnowledgeSessionsSessionIdCandidatesRoute = Route$6.update({
17608
17758
  id: "/api/knowledge/sessions/$sessionId/candidates",
17609
17759
  path: "/api/knowledge/sessions/$sessionId/candidates",
17610
- getParentRoute: () => Route$K
17760
+ getParentRoute: () => Route$L
17611
17761
  });
17612
- const ApiKnowledgeCandidatesCandidateIdPromoteRoute = Route$4.update({
17762
+ const ApiKnowledgeCandidatesCandidateIdPromoteRoute = Route$5.update({
17613
17763
  id: "/promote",
17614
17764
  path: "/promote",
17615
17765
  getParentRoute: () => ApiKnowledgeCandidatesCandidateIdRoute
17616
17766
  });
17767
+ const ApiEcosystemRecipesRecipeIdRunRoute = Route$4.update({
17768
+ id: "/api/ecosystem/recipes/$recipeId/run",
17769
+ path: "/api/ecosystem/recipes/$recipeId/run",
17770
+ getParentRoute: () => Route$L
17771
+ });
17617
17772
  const ApiEcosystemPackagesPackageIdUpgradeRoute = Route$3.update({
17618
17773
  id: "/$packageId/upgrade",
17619
17774
  path: "/$packageId/upgrade",
@@ -17745,9 +17900,10 @@ const rootRouteChildren = {
17745
17900
  ApiKnowledgeCandidatesRoute: ApiKnowledgeCandidatesRouteWithChildren,
17746
17901
  ApiKnowledgeProjectContextRoute,
17747
17902
  ApiKnowledgeSearchRoute,
17903
+ ApiEcosystemRecipesRecipeIdRunRoute,
17748
17904
  ApiKnowledgeSessionsSessionIdCandidatesRoute
17749
17905
  };
17750
- const routeTree = Route$K._addFileChildren(rootRouteChildren)._addFileTypes();
17906
+ const routeTree = Route$L._addFileChildren(rootRouteChildren)._addFileTypes();
17751
17907
  function getRouter() {
17752
17908
  const router2 = createRouter({
17753
17909
  routeTree,
@@ -17789,7 +17945,7 @@ export {
17789
17945
  router as N,
17790
17946
  OpenAIRequestSchema as O,
17791
17947
  ProviderConfigSchema as P,
17792
- Route$I as R,
17948
+ Route$J as R,
17793
17949
  StreamingChunkSchema$1 as S,
17794
17950
  TimeDisplayFormatSchema as T,
17795
17951
  DEFAULT_SLOW_RESPONSE_THRESHOLD_SECONDS as a,