@tonyclaw/agent-inspector 3.0.7 → 3.0.9

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 (73) hide show
  1. package/.output/cli.js +245 -171
  2. package/.output/nitro.json +1 -1
  3. package/.output/public/assets/{CompareDrawer-C0Kbsm-Q.js → CompareDrawer-CJKL4LMm.js} +1 -1
  4. package/.output/public/assets/ProxyViewerContainer-DBUy29O-.js +106 -0
  5. package/.output/public/assets/ReplayDialog-BYanl-a_.js +1 -0
  6. package/.output/public/assets/{RequestAnatomy-fa0JXy5p.js → RequestAnatomy-DvPz1jqE.js} +1 -1
  7. package/.output/public/assets/ResponseView-sZnxp9GN.js +3 -0
  8. package/.output/public/assets/StreamingChunkSequence-G-tiYiBd.js +1 -0
  9. package/.output/public/assets/{_sessionId-D5fYH2C0.js → _sessionId-_hDcsmXq.js} +1 -1
  10. package/.output/public/assets/agent-inspector-58K1_MsC.ico +0 -0
  11. package/.output/public/assets/index-DAPAWsAd.js +1 -0
  12. package/.output/public/assets/index-DspnLqUW.css +1 -0
  13. package/.output/public/assets/{index-BEsqvywM.js → index-SuOSQb2_.js} +1 -1
  14. package/.output/public/assets/{json-viewer-B0QRbMSf.js → json-viewer-yQdhgjaw.js} +1 -1
  15. package/.output/public/assets/{main-CuKZD7n0.js → main-CgjcDxjR.js} +2 -2
  16. package/.output/server/_libs/radix-ui__react-dialog.mjs +2 -2
  17. package/.output/server/{_sessionId-DdBTK3qm.mjs → _sessionId-BGISf2En.mjs} +3 -3
  18. package/.output/server/_ssr/{CompareDrawer-m82cVZ73.mjs → CompareDrawer-s-UF9gW3.mjs} +2 -2
  19. package/.output/server/_ssr/{ProxyViewerContainer-7geuf78f.mjs → ProxyViewerContainer-C0Sbz9ED.mjs} +1033 -530
  20. package/.output/server/_ssr/{ReplayDialog-B8RlWLLH.mjs → ReplayDialog-DvS8gvJr.mjs} +58 -23
  21. package/.output/server/_ssr/{RequestAnatomy-BE7pmwpv.mjs → RequestAnatomy-BwhWglJL.mjs} +2 -2
  22. package/.output/server/_ssr/{ResponseView-D-sDsdQr.mjs → ResponseView-wBVreqQf.mjs} +2 -2
  23. package/.output/server/_ssr/{StreamingChunkSequence-DU_hThJr.mjs → StreamingChunkSequence-Dr6eg-MJ.mjs} +30 -20
  24. package/.output/server/_ssr/{index-D0sV8UbE.mjs → index-B98Wia1X.mjs} +2 -2
  25. package/.output/server/_ssr/index.mjs +2 -2
  26. package/.output/server/_ssr/{json-viewer-CaDh1zrw.mjs → json-viewer-D7L8y0FH.mjs} +2 -2
  27. package/.output/server/_ssr/{router-Zh2iZ_u0.mjs → router-g9mo0nWT.mjs} +459 -196
  28. package/.output/server/_tanstack-start-manifest_v-CbGc-o50.mjs +4 -0
  29. package/.output/server/index.mjs +76 -69
  30. package/package.json +1 -1
  31. package/src/assets/IDE/opencode.svg +1 -1
  32. package/src/assets/IDE/xiaomimimo.svg +1 -1
  33. package/src/cli/detect-tools.ts +2 -27
  34. package/src/cli/templates/codex-skill-onboard.ts +1 -1
  35. package/src/cli/templates/skill-onboard.ts +2 -3
  36. package/src/cli.ts +9 -86
  37. package/src/components/ProxyViewer.tsx +249 -37
  38. package/src/components/ProxyViewerContainer.tsx +167 -22
  39. package/src/components/clients/ClientLogo.tsx +38 -3
  40. package/src/components/ecosystem/AgentLabDialog.tsx +204 -3
  41. package/src/components/groups/GroupsDialog.tsx +28 -40
  42. package/src/components/providers/ImportWizardDialog.tsx +51 -101
  43. package/src/components/providers/ProvidersPanel.tsx +82 -68
  44. package/src/components/providers/SettingsDialog.tsx +11 -12
  45. package/src/components/proxy-viewer/AgentTraceSummary.tsx +15 -23
  46. package/src/components/proxy-viewer/ReplayDialog.tsx +65 -22
  47. package/src/components/proxy-viewer/StreamingChunkSequence.tsx +33 -20
  48. package/src/components/proxy-viewer/TurnGroup.tsx +0 -16
  49. package/src/components/proxy-viewer/log-formats/anthropic.ts +5 -5
  50. package/src/components/proxy-viewer/log-formats/openai.ts +7 -10
  51. package/src/components/proxy-viewer/requestTools.ts +5 -2
  52. package/src/lib/apiClient.ts +43 -10
  53. package/src/lib/ecosystemContract.ts +32 -0
  54. package/src/lib/export-logs.ts +37 -3
  55. package/src/proxy/ecosystemRegistry.ts +244 -0
  56. package/src/proxy/ecosystemTasks.ts +153 -0
  57. package/src/proxy/platformCommands.ts +212 -0
  58. package/src/proxy/socketTracker.ts +84 -143
  59. package/src/routes/api/ecosystem.packages.$packageId.help.ts +16 -0
  60. package/src/routes/api/ecosystem.packages.$packageId.install.ts +16 -0
  61. package/src/routes/api/ecosystem.packages.$packageId.runner-presets.ts +19 -0
  62. package/src/routes/api/ecosystem.packages.$packageId.upgrade.ts +16 -0
  63. package/src/routes/api/ecosystem.packages.ts +1 -248
  64. package/src/routes/api/ecosystem.tasks.$taskId.ts +16 -0
  65. package/src/routes/api/ecosystem.tasks.ts +12 -0
  66. package/src/routes/api/providers.$providerId.test.log.ts +28 -24
  67. package/.output/public/assets/ProxyViewerContainer-p-rpYyiF.js +0 -106
  68. package/.output/public/assets/ReplayDialog-CM3dhP8v.js +0 -1
  69. package/.output/public/assets/ResponseView-Bq6sC7Ay.js +0 -3
  70. package/.output/public/assets/StreamingChunkSequence-CGOun3Df.js +0 -1
  71. package/.output/public/assets/index-C29Olfzt.js +0 -1
  72. package/.output/public/assets/index-DgANE0r3.css +0 -1
  73. package/.output/server/_tanstack-start-manifest_v-LCE-2AaF.mjs +0 -4
@@ -2,15 +2,15 @@ import { c as createRouter, a as createRootRoute, b as createFileRoute, l as laz
2
2
  import { j as jsxRuntimeExports } from "../_libs/react.mjs";
3
3
  import { S as SWRConfig } from "../_libs/swr.mjs";
4
4
  import { existsSync, readFileSync, mkdirSync, writeFileSync, renameSync, copyFileSync, unlinkSync, createReadStream, readdirSync, statSync, rmSync, cpSync, createWriteStream } from "node:fs";
5
- import fs, { readFile, mkdir, appendFile, writeFile, readdir, open, stat, unlink, rm, rename } from "node:fs/promises";
5
+ import fs, { mkdir, appendFile, readFile, writeFile, readdir, open, stat, unlink, rm, rename } from "node:fs/promises";
6
6
  import { createInterface } from "node:readline";
7
7
  import { Buffer } from "node:buffer";
8
- import path, { join, basename, dirname, isAbsolute, resolve, relative } from "node:path";
9
- import { randomUUID as randomUUID$1, createHash } from "node:crypto";
10
- import { execFile, exec, spawn } from "node:child_process";
8
+ import path, { basename, join, dirname, isAbsolute, resolve, relative } from "node:path";
9
+ import { randomUUID, createHash } from "node:crypto";
10
+ import { spawn, execFile } from "node:child_process";
11
11
  import { fileURLToPath } from "node:url";
12
12
  import { C as Conf } from "../_libs/conf.mjs";
13
- import { randomUUID } from "crypto";
13
+ import { randomUUID as randomUUID$1 } from "crypto";
14
14
  import { promisify } from "node:util";
15
15
  import { Worker } from "node:worker_threads";
16
16
  import { M as McpServer, W as WebStandardStreamableHTTPServerTransport, R as ResourceTemplate } from "../_libs/modelcontextprotocol__server.mjs";
@@ -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-DgANE0r3.css";
69
- const Route$E = createRootRoute({
68
+ const appCss = "/assets/index-DspnLqUW.css";
69
+ const Route$K = 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-D0sV8UbE.mjs");
112
- const Route$D = createFileRoute("/")({
111
+ const $$splitComponentImporter$1 = () => import("./index-B98Wia1X.mjs");
112
+ const Route$J = 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-DdBTK3qm.mjs");
155
- const Route$C = createFileRoute("/session/$sessionId")({
154
+ const $$splitComponentImporter = () => import("../_sessionId-BGISf2En.mjs");
155
+ const Route$I = createFileRoute("/session/$sessionId")({
156
156
  component: lazyRouteComponent($$splitComponentImporter, "component"),
157
157
  parseParams: (params) => ({
158
158
  sessionId: decodeSessionIdFromPath(params.sessionId)
@@ -5147,7 +5147,7 @@ function migrateLegacyProvider(provider, index, now) {
5147
5147
  const openaiBaseUrl = provider.openaiBaseUrl ?? (format === "openai" && baseUrl !== void 0 ? baseUrl : "");
5148
5148
  const openaiResponsesBaseUrl = provider.openaiResponsesBaseUrl ?? "";
5149
5149
  const candidate = {
5150
- id: provider.id ?? randomUUID(),
5150
+ id: provider.id ?? randomUUID$1(),
5151
5151
  name: name2,
5152
5152
  apiKey,
5153
5153
  model: provider.model,
@@ -5384,7 +5384,7 @@ function addProvider(name2, apiKey, format, baseUrl, models, authHeader, apiDocs
5384
5384
  }
5385
5385
  const newProvider = withBuiltinProviderModelMetadata(
5386
5386
  {
5387
- id: randomUUID(),
5387
+ id: randomUUID$1(),
5388
5388
  name: name2,
5389
5389
  apiKey: normalizedKey,
5390
5390
  format: format ?? (anthropicBaseUrl !== void 0 ? "anthropic" : openaiBaseUrl !== void 0 || openaiResponsesBaseUrl !== void 0 ? "openai" : void 0),
@@ -5499,7 +5499,7 @@ function importProviders(json) {
5499
5499
  const newProvider = withBuiltinProviderModelMetadata(
5500
5500
  {
5501
5501
  ...provider,
5502
- id: randomUUID(),
5502
+ id: randomUUID$1(),
5503
5503
  createdAt: now,
5504
5504
  updatedAt: now
5505
5505
  },
@@ -5603,7 +5603,6 @@ function findProviderByModel(model) {
5603
5603
  }
5604
5604
  return null;
5605
5605
  }
5606
- const execAsync = promisify(exec);
5607
5606
  const execFileAsync = promisify(execFile);
5608
5607
  const cache = /* @__PURE__ */ new Map();
5609
5608
  const CACHE_TTL_MS = 5 * 60 * 1e3;
@@ -5706,38 +5705,34 @@ async function lookupProcessInfo(pid) {
5706
5705
  const platform = process.platform;
5707
5706
  try {
5708
5707
  if (platform === "win32") {
5708
+ const psScript = [
5709
+ `$proc = Get-CimInstance Win32_Process -Filter "ProcessId=${pid}" -ErrorAction SilentlyContinue`,
5710
+ `if ($proc) { Write-Output $proc.CommandLine }`
5711
+ ].join("; ");
5709
5712
  const { stdout } = await execFileAsync(
5710
- "wmic.exe",
5711
- ["process", "where", `processid=${pid}`, "get", "commandline", "/value"],
5713
+ "powershell.exe",
5714
+ ["-NoProfile", "-NonInteractive", "-ExecutionPolicy", "Bypass", "-Command", psScript],
5712
5715
  {
5713
5716
  windowsHide: true,
5714
5717
  timeout: 3e3,
5715
5718
  maxBuffer: 64 * 1024
5716
5719
  }
5717
5720
  );
5718
- const lines = stdout.trim().split("\n").filter(Boolean);
5719
- for (const line of lines) {
5720
- if (line.includes("=")) {
5721
- const commandLine = (line.split("=")[1] ?? "").trim();
5722
- if (commandLine) {
5723
- return parseCommandLine(commandLine, "\\");
5724
- }
5725
- }
5726
- }
5721
+ const commandLine = stdout.trim();
5722
+ if (commandLine.length > 0) return parseCommandLine(commandLine, "\\");
5727
5723
  } else {
5728
5724
  try {
5729
- const { stdout } = await execAsync(`cat /proc/${pid}/cmdline 2>/dev/null | tr '\\0' ' '`, {
5730
- shell: "/bin/sh"
5731
- });
5732
- const commandLine = stdout.trim();
5725
+ const raw = await readFile(`/proc/${String(pid)}/cmdline`, "utf8");
5726
+ const commandLine = raw.replace(/\0/g, " ").trim();
5733
5727
  if (commandLine) {
5734
5728
  return parseCommandLine(commandLine, "/");
5735
5729
  }
5736
5730
  } catch {
5737
5731
  }
5738
5732
  if (platform === "darwin") {
5739
- const { stdout } = await execAsync(`ps -p ${pid} -o comm= 2>/dev/null`, {
5740
- shell: "/bin/sh"
5733
+ const { stdout } = await execFileAsync("ps", ["-p", String(pid), "-o", "comm="], {
5734
+ timeout: 3e3,
5735
+ maxBuffer: 64 * 1024
5741
5736
  });
5742
5737
  const exePath = stdout.trim();
5743
5738
  if (exePath) {
@@ -5755,12 +5750,12 @@ async function lookupRecentClient() {
5755
5750
  const platform = process.platform;
5756
5751
  try {
5757
5752
  if (platform === "win32") {
5758
- const { stdout: stdout2 } = await execFileAsync("netstat.exe", ["-ano", "-p", "TCP"], {
5753
+ const { stdout } = await execFileAsync("netstat.exe", ["-ano", "-p", "TCP"], {
5759
5754
  windowsHide: true,
5760
5755
  timeout: 2e3,
5761
5756
  maxBuffer: 2 * 1024 * 1024
5762
5757
  });
5763
- const client = pickNewestClientFromWindowsNetstat(stdout2.split("\n"), port);
5758
+ const client = pickNewestClientFromWindowsNetstat(stdout.split("\n"), port);
5764
5759
  if (client === null) {
5765
5760
  return { port: null, pid: null, cwd: null, projectFolder: null };
5766
5761
  }
@@ -5772,11 +5767,7 @@ async function lookupRecentClient() {
5772
5767
  projectFolder: projectFolder2
5773
5768
  };
5774
5769
  }
5775
- const { stdout } = await execAsync(
5776
- `netstat -tanp 2>/dev/null | grep ':${port}' | grep ESTAB || ss -tanp 2>/dev/null | grep ':${port}' | grep ESTAB`,
5777
- { shell: "/bin/sh" }
5778
- );
5779
- const lines = stdout.trim().split("\n").filter((line) => line.includes("ESTAB"));
5770
+ const lines = await readUnixEstablishedConnectionLines(port);
5780
5771
  const clientPid = pickNewestClientPidFromNetstat(lines, port);
5781
5772
  if (clientPid === null) {
5782
5773
  return { port: null, pid: null, cwd: null, projectFolder: null };
@@ -5795,12 +5786,12 @@ function pickNewestClientPidFromNetstat(lines, proxyPort) {
5795
5786
  for (const line of lines) {
5796
5787
  order++;
5797
5788
  const cols = line.trim().split(/\s+/);
5798
- if (cols.length < 7) continue;
5789
+ if (cols.length < 5) continue;
5799
5790
  const localAddr = cols[3] ?? "";
5800
5791
  const remoteAddr = cols[4] ?? "";
5801
5792
  const pidField = cols[6] ?? "";
5802
5793
  if (!remoteAddr.endsWith(proxyToken)) continue;
5803
- const pidMatch = pidField.match(/^(\d+)/);
5794
+ const pidMatch = pidField.match(/^(\d+)/) ?? line.match(/pid=(\d+)/);
5804
5795
  if (pidMatch === null) continue;
5805
5796
  const pid = parseInt(pidMatch[1] ?? "", 10);
5806
5797
  if (!Number.isInteger(pid) || pid <= 0) continue;
@@ -5812,6 +5803,25 @@ function pickNewestClientPidFromNetstat(lines, proxyPort) {
5812
5803
  candidates2.sort((a, b) => b.localPort - a.localPort || b.order - a.order);
5813
5804
  return candidates2[0]?.pid ?? null;
5814
5805
  }
5806
+ async function readUnixEstablishedConnectionLines(port) {
5807
+ const commands = [
5808
+ { command: "netstat", args: ["-tanp"] },
5809
+ { command: "ss", args: ["-tanp"] }
5810
+ ];
5811
+ for (const spec of commands) {
5812
+ try {
5813
+ const { stdout } = await execFileAsync(spec.command, spec.args, {
5814
+ timeout: 2e3,
5815
+ maxBuffer: 2 * 1024 * 1024
5816
+ });
5817
+ const portToken = `:${port}`;
5818
+ const lines = stdout.trim().split("\n").filter((line) => line.includes(portToken) && line.includes("ESTAB"));
5819
+ if (lines.length > 0) return lines;
5820
+ } catch {
5821
+ }
5822
+ }
5823
+ return [];
5824
+ }
5815
5825
  function parseAddressPort(address) {
5816
5826
  const match = address.match(/:(\d+)$/);
5817
5827
  if (match === null) return null;
@@ -5950,10 +5960,11 @@ async function lookupPidByLocalPort(clientPort) {
5950
5960
  const platform = process.platform;
5951
5961
  try {
5952
5962
  if (platform === "win32") {
5953
- const { stdout } = await execAsync(
5954
- `netstat -ano | findstr :${clientPort} | findstr ESTABLISHED`,
5955
- { shell: "cmd.exe", timeout: 2e3, windowsHide: true }
5956
- );
5963
+ const { stdout } = await execFileAsync("netstat.exe", ["-ano", "-p", "TCP"], {
5964
+ windowsHide: true,
5965
+ timeout: 2e3,
5966
+ maxBuffer: 2 * 1024 * 1024
5967
+ });
5957
5968
  const clientToken = `:${clientPort}`;
5958
5969
  for (const rawLine of stdout.split("\n")) {
5959
5970
  const line = rawLine.trim();
@@ -5961,6 +5972,8 @@ async function lookupPidByLocalPort(clientPort) {
5961
5972
  const cols = line.split(/\s+/);
5962
5973
  if (cols.length < 5) continue;
5963
5974
  const localAddr = cols[1] ?? "";
5975
+ const state = cols[3] ?? "";
5976
+ if (state !== "ESTABLISHED") continue;
5964
5977
  if (!localAddr.endsWith(clientToken)) continue;
5965
5978
  const pidStr = cols[cols.length - 1] ?? "";
5966
5979
  const parsed = parseInt(pidStr, 10);
@@ -5969,9 +5982,13 @@ async function lookupPidByLocalPort(clientPort) {
5969
5982
  return null;
5970
5983
  }
5971
5984
  try {
5972
- const { stdout } = await execAsync(
5973
- `ss -tanp state established 'sport = :${clientPort}' 2>/dev/null | tail -n +2 | head -n 1`,
5974
- { shell: "/bin/sh" }
5985
+ const { stdout } = await execFileAsync(
5986
+ "ss",
5987
+ ["-tanp", "state", "established", "sport", `= :${clientPort}`],
5988
+ {
5989
+ timeout: 2e3,
5990
+ maxBuffer: 2 * 1024 * 1024
5991
+ }
5975
5992
  );
5976
5993
  const match = stdout.match(/pid=(\d+)/);
5977
5994
  if (match !== null) {
@@ -5981,10 +5998,12 @@ async function lookupPidByLocalPort(clientPort) {
5981
5998
  } catch {
5982
5999
  }
5983
6000
  try {
5984
- const { stdout } = await execAsync(
5985
- `lsof -ti tcp:${clientPort} -sTCP:ESTABLISHED 2>/dev/null`,
6001
+ const { stdout } = await execFileAsync(
6002
+ "lsof",
6003
+ ["-ti", `tcp:${clientPort}`, "-sTCP:ESTABLISHED"],
5986
6004
  {
5987
- shell: "/bin/sh"
6005
+ timeout: 2e3,
6006
+ maxBuffer: 64 * 1024
5988
6007
  }
5989
6008
  );
5990
6009
  const trimmed = stdout.trim().split("\n")[0] ?? "";
@@ -7135,7 +7154,7 @@ function getRawStreamDir() {
7135
7154
  return join(getDataDir(), "raw-streams");
7136
7155
  }
7137
7156
  function createRawStreamPath() {
7138
- return join(getRawStreamDir(), `${Date.now()}-${randomUUID$1()}.stream.tmp`);
7157
+ return join(getRawStreamDir(), `${Date.now()}-${randomUUID()}.stream.tmp`);
7139
7158
  }
7140
7159
  class RawStreamCapture {
7141
7160
  memoryLimitBytes;
@@ -7562,7 +7581,7 @@ async function handleProxy(req) {
7562
7581
  }
7563
7582
  return handleStreamingResponse(upstreamRes, req, startTime, upstreamUrl, log, captureFullDetails);
7564
7583
  }
7565
- const Route$B = createFileRoute("/proxy/$")({
7584
+ const Route$H = createFileRoute("/proxy/$")({
7566
7585
  server: {
7567
7586
  handlers: {
7568
7587
  GET: ({ request }) => handleProxy(request),
@@ -7583,7 +7602,7 @@ function parsePositiveInt$4(value) {
7583
7602
  function parseBooleanFlag(value) {
7584
7603
  return value === "1" || value === "true";
7585
7604
  }
7586
- const Route$A = createFileRoute("/api/sessions")({
7605
+ const Route$G = createFileRoute("/api/sessions")({
7587
7606
  server: {
7588
7607
  handlers: {
7589
7608
  GET: async ({ request }) => {
@@ -8369,17 +8388,17 @@ const GroupsFileSchema = object({
8369
8388
  function groupsFilePath() {
8370
8389
  return join(getDataDir(), "groups.json");
8371
8390
  }
8372
- function nowIso$1() {
8391
+ function nowIso$2() {
8373
8392
  return (/* @__PURE__ */ new Date()).toISOString();
8374
8393
  }
8375
8394
  function stableId$1(input) {
8376
8395
  return input.trim().replace(/[^A-Za-z0-9_.-]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 80);
8377
8396
  }
8378
8397
  function createGroupId() {
8379
- return `grp_${Date.now().toString(36)}_${randomUUID$1().slice(0, 8)}`;
8398
+ return `grp_${Date.now().toString(36)}_${randomUUID().slice(0, 8)}`;
8380
8399
  }
8381
8400
  function createMemberId() {
8382
- return `mem_${Date.now().toString(36)}_${randomUUID$1().slice(0, 8)}`;
8401
+ return `mem_${Date.now().toString(36)}_${randomUUID().slice(0, 8)}`;
8383
8402
  }
8384
8403
  function normalizeGroupId$1(input) {
8385
8404
  if (input === void 0) return createGroupId();
@@ -8449,7 +8468,7 @@ function createGroup(input) {
8449
8468
  const groupId = normalizeGroupId$1(parsed?.groupId);
8450
8469
  const existing = getGroup(groupId);
8451
8470
  if (existing !== null) return existing;
8452
- const timestamp = nowIso$1();
8471
+ const timestamp = nowIso$2();
8453
8472
  const group = {
8454
8473
  id: groupId,
8455
8474
  title: parsed?.title ?? `Inspector Group ${groupId}`,
@@ -8471,7 +8490,7 @@ function updateGroup(groupId, input) {
8471
8490
  const parsed = UpdateInspectorGroupInputSchema.parse(input);
8472
8491
  const groups = readGroups();
8473
8492
  let updatedGroup = null;
8474
- const updatedAt = nowIso$1();
8493
+ const updatedAt = nowIso$2();
8475
8494
  const updatedGroups = groups.map((group) => {
8476
8495
  if (group.id !== groupId) return group;
8477
8496
  updatedGroup = {
@@ -8571,7 +8590,7 @@ function upsertMember(group, input, updatedAt) {
8571
8590
  function addGroupSession(groupId, input) {
8572
8591
  const groups = readGroups();
8573
8592
  let updatedGroup = null;
8574
- const updatedAt = nowIso$1();
8593
+ const updatedAt = nowIso$2();
8575
8594
  const updatedGroups = groups.map((group) => {
8576
8595
  if (group.id !== groupId) return group;
8577
8596
  updatedGroup = upsertMember(group, input, updatedAt);
@@ -8603,14 +8622,14 @@ const RunsFileSchema = object({
8603
8622
  function runsFilePath() {
8604
8623
  return join(getDataDir(), "runs.json");
8605
8624
  }
8606
- function nowIso() {
8625
+ function nowIso$1() {
8607
8626
  return (/* @__PURE__ */ new Date()).toISOString();
8608
8627
  }
8609
8628
  function stableId(input) {
8610
8629
  return input.trim().replace(/[^A-Za-z0-9_.-]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 80);
8611
8630
  }
8612
8631
  function createRunId() {
8613
- return `run_${Date.now().toString(36)}_${randomUUID$1().slice(0, 8)}`;
8632
+ return `run_${Date.now().toString(36)}_${randomUUID().slice(0, 8)}`;
8614
8633
  }
8615
8634
  function normalizeRunId(input) {
8616
8635
  if (input === void 0) return createRunId();
@@ -8687,7 +8706,7 @@ function createRun(input) {
8687
8706
  const runId = normalizeRunId(parsed?.runId);
8688
8707
  const existing = getRun(runId);
8689
8708
  if (existing !== null) return existing;
8690
- const timestamp = nowIso();
8709
+ const timestamp = nowIso$1();
8691
8710
  const sessionId = normalizeSessionId(parsed?.sessionId, runId);
8692
8711
  const groupId = normalizeGroupId(parsed?.groupId);
8693
8712
  const run = {
@@ -8729,7 +8748,7 @@ function updateRun(runId, input) {
8729
8748
  const parsed = UpdateInspectorRunInputSchema.parse(input);
8730
8749
  const runs = readRuns();
8731
8750
  const run = runs.find((candidate) => candidate.id === runId) ?? null;
8732
- const updatedAt = nowIso();
8751
+ const updatedAt = nowIso$1();
8733
8752
  if (run === null) return null;
8734
8753
  const updatedRun = {
8735
8754
  ...run,
@@ -9048,7 +9067,7 @@ function parsePositiveInt$3(value, fallback) {
9048
9067
  if (!Number.isInteger(parsed) || parsed < 1) return fallback;
9049
9068
  return parsed;
9050
9069
  }
9051
- const Route$z = createFileRoute("/api/runs")({
9070
+ const Route$F = createFileRoute("/api/runs")({
9052
9071
  server: {
9053
9072
  handlers: {
9054
9073
  GET: ({ request }) => {
@@ -9094,7 +9113,7 @@ const ProviderInputSchema = object({
9094
9113
  modelMetadata: array(ProviderModelMetadataSchema).optional(),
9095
9114
  source: _enum(["company", "personal"]).optional()
9096
9115
  });
9097
- const Route$y = createFileRoute("/api/providers")({
9116
+ const Route$E = createFileRoute("/api/providers")({
9098
9117
  server: {
9099
9118
  handlers: {
9100
9119
  GET: ({ request }) => {
@@ -9129,7 +9148,7 @@ const Route$y = createFileRoute("/api/providers")({
9129
9148
  }
9130
9149
  }
9131
9150
  });
9132
- const Route$x = createFileRoute("/api/models")({
9151
+ const Route$D = createFileRoute("/api/models")({
9133
9152
  server: {
9134
9153
  handlers: {
9135
9154
  GET: () => Response.json(getModels())
@@ -9137,7 +9156,7 @@ const Route$x = createFileRoute("/api/models")({
9137
9156
  }
9138
9157
  });
9139
9158
  const name = "@tonyclaw/agent-inspector";
9140
- const version = "3.0.7";
9159
+ const version = "3.0.9";
9141
9160
  const packageJson = {
9142
9161
  name,
9143
9162
  version
@@ -12244,7 +12263,7 @@ const PROMPT_NAMES = [
12244
12263
  "inspector_generate_group_report",
12245
12264
  "inspector_extract_repro_steps"
12246
12265
  ];
12247
- const Route$w = createFileRoute("/api/mcp")({
12266
+ const Route$C = createFileRoute("/api/mcp")({
12248
12267
  server: {
12249
12268
  handlers: {
12250
12269
  // The SDK may issue either POST, GET, or DELETE. TanStack Start only
@@ -12363,7 +12382,7 @@ function parseOptionalPositiveInt(value) {
12363
12382
  if (!Number.isInteger(parsed) || parsed < 1) return { ok: false };
12364
12383
  return { ok: true, value: parsed };
12365
12384
  }
12366
- const Route$v = createFileRoute("/api/logs")({
12385
+ const Route$B = createFileRoute("/api/logs")({
12367
12386
  server: {
12368
12387
  handlers: {
12369
12388
  GET: async ({ request }) => {
@@ -12472,7 +12491,7 @@ const Route$v = createFileRoute("/api/logs")({
12472
12491
  }
12473
12492
  });
12474
12493
  logger.debug("Health endpoint loaded");
12475
- const Route$u = createFileRoute("/api/health")({
12494
+ const Route$A = createFileRoute("/api/health")({
12476
12495
  server: {
12477
12496
  handlers: {
12478
12497
  GET: () => {
@@ -12509,7 +12528,7 @@ function readDeleteEvidenceFlag$1(request) {
12509
12528
  return { ok: false };
12510
12529
  }
12511
12530
  }
12512
- const Route$t = createFileRoute("/api/groups")({
12531
+ const Route$z = createFileRoute("/api/groups")({
12513
12532
  server: {
12514
12533
  handlers: {
12515
12534
  GET: () => Response.json(listInspectorGroups()),
@@ -12553,7 +12572,7 @@ const RuntimeConfigPatchSchema = object({
12553
12572
  }).strict().refine((v) => Object.keys(v).length > 0, {
12554
12573
  message: "At least one field must be provided"
12555
12574
  });
12556
- const Route$s = createFileRoute("/api/config")({
12575
+ const Route$y = createFileRoute("/api/config")({
12557
12576
  server: {
12558
12577
  handlers: {
12559
12578
  GET: () => {
@@ -13162,7 +13181,7 @@ function parseFilters(url) {
13162
13181
  source: sourceResult.success ? sourceResult.data : void 0
13163
13182
  };
13164
13183
  }
13165
- const Route$r = createFileRoute("/api/alerts")({
13184
+ const Route$x = createFileRoute("/api/alerts")({
13166
13185
  server: {
13167
13186
  handlers: {
13168
13187
  GET: async ({ request }) => {
@@ -13187,7 +13206,7 @@ async function readJsonBody$4(request) {
13187
13206
  return { ok: false };
13188
13207
  }
13189
13208
  }
13190
- const Route$q = createFileRoute("/api/runs/$runId")({
13209
+ const Route$w = createFileRoute("/api/runs/$runId")({
13191
13210
  server: {
13192
13211
  handlers: {
13193
13212
  GET: ({ params }) => {
@@ -13662,7 +13681,7 @@ function scanExternalProviders() {
13662
13681
  }
13663
13682
  return { providers: filteredProviders, warnings };
13664
13683
  }
13665
- const Route$p = createFileRoute("/api/providers/scan")({
13684
+ const Route$v = createFileRoute("/api/providers/scan")({
13666
13685
  server: {
13667
13686
  handlers: {
13668
13687
  GET: () => {
@@ -13683,7 +13702,7 @@ const Route$p = createFileRoute("/api/providers/scan")({
13683
13702
  }
13684
13703
  });
13685
13704
  union([string(), object({ providers: unknown() })]);
13686
- const Route$o = createFileRoute("/api/providers/import")({
13705
+ const Route$u = createFileRoute("/api/providers/import")({
13687
13706
  server: {
13688
13707
  handlers: {
13689
13708
  POST: async ({ request }) => {
@@ -13716,7 +13735,7 @@ const Route$o = createFileRoute("/api/providers/import")({
13716
13735
  }
13717
13736
  }
13718
13737
  });
13719
- const Route$n = createFileRoute("/api/providers/export")({
13738
+ const Route$t = createFileRoute("/api/providers/export")({
13720
13739
  server: {
13721
13740
  handlers: {
13722
13741
  GET: ({ request }) => {
@@ -13750,7 +13769,7 @@ const ProviderUpdateSchema = object({
13750
13769
  modelMetadata: array(ProviderModelMetadataSchema).optional(),
13751
13770
  source: _enum(["company", "personal"]).optional()
13752
13771
  });
13753
- const Route$m = createFileRoute("/api/providers/$providerId")({
13772
+ const Route$s = createFileRoute("/api/providers/$providerId")({
13754
13773
  server: {
13755
13774
  handlers: {
13756
13775
  GET: ({ params, request }) => {
@@ -13785,7 +13804,7 @@ const Route$m = createFileRoute("/api/providers/$providerId")({
13785
13804
  }
13786
13805
  });
13787
13806
  const INITIAL_STREAM_LOG_LIMIT = 100;
13788
- const Route$l = createFileRoute("/api/logs/stream")({
13807
+ const Route$r = createFileRoute("/api/logs/stream")({
13789
13808
  server: {
13790
13809
  handlers: {
13791
13810
  GET: ({ request }) => {
@@ -14225,7 +14244,7 @@ function sessionNameFromImportFileName(fileName) {
14225
14244
  function isUploadedFile(value) {
14226
14245
  return value instanceof File;
14227
14246
  }
14228
- const Route$k = createFileRoute("/api/logs/import")({
14247
+ const Route$q = createFileRoute("/api/logs/import")({
14229
14248
  server: {
14230
14249
  handlers: {
14231
14250
  POST: async ({ request }) => {
@@ -14262,7 +14281,7 @@ const Route$k = createFileRoute("/api/logs/import")({
14262
14281
  }
14263
14282
  }
14264
14283
  });
14265
- const Route$j = createFileRoute("/api/logs/$id")({
14284
+ const Route$p = createFileRoute("/api/logs/$id")({
14266
14285
  server: {
14267
14286
  handlers: {
14268
14287
  GET: async ({ params }) => {
@@ -14799,7 +14818,7 @@ const SearchBodySchema = object({
14799
14818
  query: string().min(1),
14800
14819
  project: string().optional()
14801
14820
  });
14802
- const Route$i = createFileRoute("/api/knowledge/search")({
14821
+ const Route$o = createFileRoute("/api/knowledge/search")({
14803
14822
  server: {
14804
14823
  handlers: {
14805
14824
  GET: async ({ request }) => {
@@ -14821,7 +14840,7 @@ const Route$i = createFileRoute("/api/knowledge/search")({
14821
14840
  }
14822
14841
  }
14823
14842
  });
14824
- const Route$h = createFileRoute("/api/knowledge/project-context")({
14843
+ const Route$n = createFileRoute("/api/knowledge/project-context")({
14825
14844
  server: {
14826
14845
  handlers: {
14827
14846
  GET: async ({ request }) => {
@@ -14903,7 +14922,7 @@ function updateCandidateDraft(id, updates) {
14903
14922
  candidates.set(id, updated);
14904
14923
  return updated;
14905
14924
  }
14906
- const Route$g = createFileRoute("/api/knowledge/candidates")({
14925
+ const Route$m = createFileRoute("/api/knowledge/candidates")({
14907
14926
  server: {
14908
14927
  handlers: {
14909
14928
  GET: () => Response.json({ candidates: listCandidates() })
@@ -14938,7 +14957,7 @@ function readDeleteEvidenceFlag(request) {
14938
14957
  return { ok: false };
14939
14958
  }
14940
14959
  }
14941
- const Route$f = createFileRoute("/api/groups/$groupId")({
14960
+ const Route$l = createFileRoute("/api/groups/$groupId")({
14942
14961
  server: {
14943
14962
  handlers: {
14944
14963
  GET: ({ params }) => {
@@ -14985,6 +15004,16 @@ const Route$f = createFileRoute("/api/groups/$groupId")({
14985
15004
  }
14986
15005
  }
14987
15006
  });
15007
+ function platformCommand(command, args, platform = process.platform) {
15008
+ if (platform !== "win32") return { command, args: [...args] };
15009
+ return { command: "cmd.exe", args: ["/d", "/s", "/c", command, ...args] };
15010
+ }
15011
+ function npmCommand(platform = process.platform) {
15012
+ return platform === "win32" ? "npm.cmd" : "npm";
15013
+ }
15014
+ function npmSpawnCommand(args, platform = process.platform) {
15015
+ return platformCommand(npmCommand(platform), args, platform);
15016
+ }
14988
15017
  const ECOSYSTEM_PACKAGES = [
14989
15018
  {
14990
15019
  id: "inspector",
@@ -15065,15 +15094,13 @@ const RUNNER_PRESETS = [
15065
15094
  }
15066
15095
  ];
15067
15096
  const NPM_TIMEOUT_MS = 4e3;
15068
- function npmCommand() {
15069
- return process.platform === "win32" ? "npm.cmd" : "npm";
15070
- }
15071
15097
  function runNpm(args) {
15072
15098
  return new Promise((resolve2) => {
15099
+ const command = npmSpawnCommand(args);
15073
15100
  try {
15074
15101
  execFile(
15075
- npmCommand(),
15076
- [...args],
15102
+ command.command,
15103
+ command.args,
15077
15104
  { timeout: NPM_TIMEOUT_MS, windowsHide: true },
15078
15105
  (error, stdout) => {
15079
15106
  resolve2({
@@ -15175,7 +15202,138 @@ async function listEcosystemPackages() {
15175
15202
  ECOSYSTEM_PACKAGES.map((definition) => describePackage(definition, globalRoot))
15176
15203
  );
15177
15204
  }
15178
- const Route$e = createFileRoute("/api/ecosystem/packages")({
15205
+ function findEcosystemPackage(packageId) {
15206
+ return ECOSYSTEM_PACKAGES.find((definition) => definition.id === packageId) ?? null;
15207
+ }
15208
+ const MAX_TASKS = 50;
15209
+ const OUTPUT_LIMIT = 4e4;
15210
+ const INSTALL_TIMEOUT_MS = 12e4;
15211
+ const HELP_TIMEOUT_MS = 3e4;
15212
+ const tasks = /* @__PURE__ */ new Map();
15213
+ function nowIso() {
15214
+ return (/* @__PURE__ */ new Date()).toISOString();
15215
+ }
15216
+ function trimOutput(output) {
15217
+ if (output.length <= OUTPUT_LIMIT) return output;
15218
+ return output.slice(output.length - OUTPUT_LIMIT);
15219
+ }
15220
+ function appendTaskOutput(task, chunk) {
15221
+ task.output = trimOutput(`${task.output}${chunk}`);
15222
+ }
15223
+ function rememberTask(task) {
15224
+ tasks.set(task.id, task);
15225
+ while (tasks.size > MAX_TASKS) {
15226
+ const oldest = tasks.keys().next().value;
15227
+ if (typeof oldest !== "string") return;
15228
+ tasks.delete(oldest);
15229
+ }
15230
+ }
15231
+ function packageActionArgs(action, npmName) {
15232
+ switch (action) {
15233
+ case "install":
15234
+ case "upgrade":
15235
+ return ["install", "-g", npmName];
15236
+ case "help":
15237
+ return ["exec", "--yes", npmName, "--", "--help"];
15238
+ case "runner-presets":
15239
+ return ["exec", "--yes", "@tonyclaw/eval-harness", "--", "runner-presets"];
15240
+ }
15241
+ }
15242
+ function packageActionTimeout(action) {
15243
+ switch (action) {
15244
+ case "install":
15245
+ case "upgrade":
15246
+ return INSTALL_TIMEOUT_MS;
15247
+ case "help":
15248
+ case "runner-presets":
15249
+ return HELP_TIMEOUT_MS;
15250
+ }
15251
+ }
15252
+ function taskCommand(args) {
15253
+ return `${npmCommand()} ${args.join(" ")}`;
15254
+ }
15255
+ function completeTask(task, status, exitCode, error) {
15256
+ task.status = status;
15257
+ task.exitCode = exitCode;
15258
+ task.error = error;
15259
+ task.finishedAt = nowIso();
15260
+ }
15261
+ function getEcosystemTask(taskId) {
15262
+ return tasks.get(taskId) ?? null;
15263
+ }
15264
+ function listEcosystemTasks() {
15265
+ return [...tasks.values()].sort((left, right) => right.createdAt.localeCompare(left.createdAt));
15266
+ }
15267
+ function startEcosystemTask(packageId, action) {
15268
+ const definition = action === "runner-presets" ? findEcosystemPackage("eval-harness") : findEcosystemPackage(packageId);
15269
+ if (definition === null) return null;
15270
+ if (action === "runner-presets" && packageId !== "eval-harness") return null;
15271
+ const args = packageActionArgs(action, definition.npmName);
15272
+ const task = {
15273
+ id: randomUUID(),
15274
+ packageId: definition.id,
15275
+ npmName: definition.npmName,
15276
+ action,
15277
+ status: "queued",
15278
+ command: taskCommand(args),
15279
+ output: "",
15280
+ createdAt: nowIso(),
15281
+ startedAt: null,
15282
+ finishedAt: null,
15283
+ exitCode: null,
15284
+ error: null
15285
+ };
15286
+ rememberTask(task);
15287
+ const spawnCommand = npmSpawnCommand(args);
15288
+ const child = spawn(spawnCommand.command, spawnCommand.args, {
15289
+ windowsHide: true,
15290
+ shell: false,
15291
+ stdio: ["ignore", "pipe", "pipe"]
15292
+ });
15293
+ const timeout = setTimeout(() => {
15294
+ child.kill();
15295
+ appendTaskOutput(task, `
15296
+ Timed out after ${String(packageActionTimeout(action) / 1e3)}s.
15297
+ `);
15298
+ }, packageActionTimeout(action));
15299
+ task.status = "running";
15300
+ task.startedAt = nowIso();
15301
+ appendTaskOutput(task, `$ ${task.command}
15302
+ `);
15303
+ child.stdout.on("data", (chunk) => {
15304
+ appendTaskOutput(task, chunk.toString("utf8"));
15305
+ });
15306
+ child.stderr.on("data", (chunk) => {
15307
+ appendTaskOutput(task, chunk.toString("utf8"));
15308
+ });
15309
+ child.on("error", (error) => {
15310
+ clearTimeout(timeout);
15311
+ appendTaskOutput(task, `
15312
+ ${error.message}
15313
+ `);
15314
+ completeTask(task, "failed", null, error.message);
15315
+ });
15316
+ child.on("close", (code) => {
15317
+ clearTimeout(timeout);
15318
+ if (task.status === "failed") return;
15319
+ if (code === 0) {
15320
+ completeTask(task, "succeeded", code, null);
15321
+ return;
15322
+ }
15323
+ completeTask(task, "failed", code, `Command exited with code ${String(code ?? "unknown")}`);
15324
+ });
15325
+ return task;
15326
+ }
15327
+ const Route$k = createFileRoute("/api/ecosystem/tasks")({
15328
+ server: {
15329
+ handlers: {
15330
+ GET: () => {
15331
+ return Response.json({ tasks: listEcosystemTasks() });
15332
+ }
15333
+ }
15334
+ }
15335
+ });
15336
+ const Route$j = createFileRoute("/api/ecosystem/packages")({
15179
15337
  server: {
15180
15338
  handlers: {
15181
15339
  GET: async () => {
@@ -15188,7 +15346,7 @@ const Route$e = createFileRoute("/api/ecosystem/packages")({
15188
15346
  }
15189
15347
  }
15190
15348
  });
15191
- const Route$d = createFileRoute("/api/config/paths")({
15349
+ const Route$i = createFileRoute("/api/config/paths")({
15192
15350
  server: {
15193
15351
  handlers: {
15194
15352
  GET: () => {
@@ -15205,7 +15363,7 @@ function parsePositiveInt(value) {
15205
15363
  if (!Number.isInteger(parsed) || parsed < 1) return void 0;
15206
15364
  return parsed;
15207
15365
  }
15208
- const Route$c = createFileRoute("/api/alerts/summary")({
15366
+ const Route$h = createFileRoute("/api/alerts/summary")({
15209
15367
  server: {
15210
15368
  handlers: {
15211
15369
  GET: async ({ request }) => {
@@ -15228,7 +15386,7 @@ async function readJsonBody$2(request) {
15228
15386
  return { ok: false };
15229
15387
  }
15230
15388
  }
15231
- const Route$b = createFileRoute("/api/runs/$runId/evidence")({
15389
+ const Route$g = createFileRoute("/api/runs/$runId/evidence")({
15232
15390
  server: {
15233
15391
  handlers: {
15234
15392
  GET: ({ params }) => {
@@ -15958,7 +16116,7 @@ async function testStreamingEndpoint(baseUrl, provider, path2, model, protocol)
15958
16116
  clearTimeout(timeoutId);
15959
16117
  }
15960
16118
  }
15961
- const Route$a = createFileRoute("/api/providers/$providerId/test")({
16119
+ const Route$f = createFileRoute("/api/providers/$providerId/test")({
15962
16120
  server: {
15963
16121
  handlers: {
15964
16122
  POST: async ({ params }) => {
@@ -16003,9 +16161,9 @@ const Route$a = createFileRoute("/api/providers/$providerId/test")({
16003
16161
  openaiChat: { nonStreaming: notConfigured, streaming: notConfigured },
16004
16162
  openaiResponses: { nonStreaming: notConfigured, streaming: notConfigured }
16005
16163
  };
16006
- const tasks = [];
16164
+ const tasks2 = [];
16007
16165
  if (anthropicUrl !== void 0) {
16008
- tasks.push(
16166
+ tasks2.push(
16009
16167
  testEndpoint(anthropicUrl, p, "/v1/messages", usageModel, "anthropic").then((r) => {
16010
16168
  modelResults.anthropic.nonStreaming = r;
16011
16169
  }),
@@ -16017,7 +16175,7 @@ const Route$a = createFileRoute("/api/providers/$providerId/test")({
16017
16175
  );
16018
16176
  }
16019
16177
  if (openaiUrl !== void 0) {
16020
- tasks.push(
16178
+ tasks2.push(
16021
16179
  testEndpoint(openaiUrl, p, "/v1/chat/completions", usageModel, "openaiChat").then(
16022
16180
  (r) => {
16023
16181
  modelResults.openai.nonStreaming = r;
@@ -16037,7 +16195,7 @@ const Route$a = createFileRoute("/api/providers/$providerId/test")({
16037
16195
  );
16038
16196
  }
16039
16197
  if (openaiResponsesUrl !== void 0) {
16040
- tasks.push(
16198
+ tasks2.push(
16041
16199
  testEndpoint(
16042
16200
  openaiResponsesUrl,
16043
16201
  p,
@@ -16058,7 +16216,7 @@ const Route$a = createFileRoute("/api/providers/$providerId/test")({
16058
16216
  })
16059
16217
  );
16060
16218
  }
16061
- await Promise.all(tasks);
16219
+ await Promise.all(tasks2);
16062
16220
  results.models[displayName] = modelResults;
16063
16221
  }
16064
16222
  await Promise.all(modelsToTest.map((displayName) => testOneModel(displayName)));
@@ -16099,7 +16257,7 @@ async function readRegistryJson(response) {
16099
16257
  return null;
16100
16258
  }
16101
16259
  }
16102
- const Route$9 = createFileRoute("/api/providers/$providerId/model-metadata")({
16260
+ const Route$e = createFileRoute("/api/providers/$providerId/model-metadata")({
16103
16261
  server: {
16104
16262
  handlers: {
16105
16263
  POST: async ({ params, request }) => {
@@ -16189,7 +16347,7 @@ const Route$9 = createFileRoute("/api/providers/$providerId/model-metadata")({
16189
16347
  const ReplayRequestSchema = object({
16190
16348
  modifiedBody: string()
16191
16349
  });
16192
- const Route$8 = createFileRoute("/api/logs/$id/replay")({
16350
+ const Route$d = createFileRoute("/api/logs/$id/replay")({
16193
16351
  server: {
16194
16352
  handlers: {
16195
16353
  POST: async ({ params, request }) => {
@@ -16390,7 +16548,7 @@ const Route$8 = createFileRoute("/api/logs/$id/replay")({
16390
16548
  }
16391
16549
  }
16392
16550
  });
16393
- const Route$7 = createFileRoute("/api/logs/$id/chunks")({
16551
+ const Route$c = createFileRoute("/api/logs/$id/chunks")({
16394
16552
  server: {
16395
16553
  handlers: {
16396
16554
  GET: async ({ params }) => {
@@ -16497,7 +16655,7 @@ function parseIntegerParam(value, fallback) {
16497
16655
  if (!Number.isInteger(parsed)) return fallback;
16498
16656
  return parsed;
16499
16657
  }
16500
- const Route$6 = createFileRoute("/api/logs/$id/body")({
16658
+ const Route$b = createFileRoute("/api/logs/$id/body")({
16501
16659
  server: {
16502
16660
  handlers: {
16503
16661
  GET: async ({ params, request }) => {
@@ -16535,7 +16693,7 @@ const CandidateUpdateSchema = object({
16535
16693
  object({
16536
16694
  candidate: KnowledgeCandidateSchema
16537
16695
  });
16538
- const Route$5 = createFileRoute("/api/knowledge/candidates/$candidateId")({
16696
+ const Route$a = createFileRoute("/api/knowledge/candidates/$candidateId")({
16539
16697
  server: {
16540
16698
  handlers: {
16541
16699
  PATCH: async ({ params, request }) => {
@@ -16572,7 +16730,7 @@ async function readJsonBody$1(request) {
16572
16730
  return { ok: false };
16573
16731
  }
16574
16732
  }
16575
- const Route$4 = createFileRoute("/api/groups/$groupId/sessions")({
16733
+ const Route$9 = createFileRoute("/api/groups/$groupId/sessions")({
16576
16734
  server: {
16577
16735
  handlers: {
16578
16736
  GET: ({ params }) => {
@@ -16612,7 +16770,7 @@ async function readJsonBody(request) {
16612
16770
  return { ok: false };
16613
16771
  }
16614
16772
  }
16615
- const Route$3 = createFileRoute("/api/groups/$groupId/evidence")({
16773
+ const Route$8 = createFileRoute("/api/groups/$groupId/evidence")({
16616
16774
  server: {
16617
16775
  handlers: {
16618
16776
  GET: ({ params }) => {
@@ -16647,6 +16805,19 @@ const Route$3 = createFileRoute("/api/groups/$groupId/evidence")({
16647
16805
  }
16648
16806
  }
16649
16807
  });
16808
+ const Route$7 = createFileRoute("/api/ecosystem/tasks/$taskId")({
16809
+ server: {
16810
+ handlers: {
16811
+ GET: ({ params }) => {
16812
+ const task = getEcosystemTask(params.taskId);
16813
+ if (task === null) {
16814
+ return Response.json({ error: "Unknown ecosystem task" }, { status: 404 });
16815
+ }
16816
+ return Response.json({ task });
16817
+ }
16818
+ }
16819
+ }
16820
+ });
16650
16821
  const ProviderTestErrorTypeSchema = _enum([
16651
16822
  "timeout",
16652
16823
  "network_unreachable",
@@ -16808,6 +16979,18 @@ function getResultTokensPerSecond(result) {
16808
16979
  totalStreamMs: getResultTotalStreamMs(result)
16809
16980
  });
16810
16981
  }
16982
+ function providerTestClientFields(providerName) {
16983
+ const cwd = process.cwd();
16984
+ return {
16985
+ userAgent: "Agent Inspector Provider Test",
16986
+ origin: null,
16987
+ isTest: true,
16988
+ providerName,
16989
+ clientPid: process.pid,
16990
+ clientCwd: cwd,
16991
+ clientProjectFolder: basename(cwd)
16992
+ };
16993
+ }
16811
16994
  async function logModelResults(displayName, providerName, providerSessionId, anthropicUrl, openaiChatUrl, openaiResponsesUrl, modelResults, captureFullDetails) {
16812
16995
  const usageModel = getModelUsageName(displayName, providerName);
16813
16996
  if (anthropicUrl !== void 0) {
@@ -16835,11 +17018,8 @@ async function logModelResults(displayName, providerName, providerSessionId, ant
16835
17018
  totalStreamMs: null,
16836
17019
  tokensPerSecond: null,
16837
17020
  streaming: false,
16838
- userAgent: "provider-test",
16839
- origin: null,
16840
17021
  apiFormat: "anthropic",
16841
- isTest: true,
16842
- providerName,
17022
+ ...providerTestClientFields(providerName),
16843
17023
  headers: captureFullDetails ? getResultHeaders(nonStreamingResult) : void 0
16844
17024
  });
16845
17025
  const streamingRequestBody = JSON.stringify(
@@ -16864,11 +17044,8 @@ async function logModelResults(displayName, providerName, providerSessionId, ant
16864
17044
  tokensPerSecond: getResultTokensPerSecond(streamingResult),
16865
17045
  streaming: true,
16866
17046
  streamingChunks: captureFullDetails ? streamingResult.streamingChunks : void 0,
16867
- userAgent: "provider-test",
16868
- origin: null,
16869
17047
  apiFormat: "anthropic",
16870
- isTest: true,
16871
- providerName,
17048
+ ...providerTestClientFields(providerName),
16872
17049
  headers: captureFullDetails ? getResultHeaders(streamingResult) : void 0
16873
17050
  });
16874
17051
  }
@@ -16898,11 +17075,8 @@ async function logModelResults(displayName, providerName, providerSessionId, ant
16898
17075
  totalStreamMs: null,
16899
17076
  tokensPerSecond: null,
16900
17077
  streaming: false,
16901
- userAgent: "provider-test",
16902
- origin: null,
16903
17078
  apiFormat: "openai",
16904
- isTest: true,
16905
- providerName,
17079
+ ...providerTestClientFields(providerName),
16906
17080
  headers: captureFullDetails ? getResultHeaders(nonStreamingResult) : void 0
16907
17081
  });
16908
17082
  const streamingRequestBody = JSON.stringify(
@@ -16927,11 +17101,8 @@ async function logModelResults(displayName, providerName, providerSessionId, ant
16927
17101
  tokensPerSecond: getResultTokensPerSecond(streamingResult),
16928
17102
  streaming: true,
16929
17103
  streamingChunks: captureFullDetails ? streamingResult.streamingChunks : void 0,
16930
- userAgent: "provider-test",
16931
- origin: null,
16932
17104
  apiFormat: "openai",
16933
- isTest: true,
16934
- providerName,
17105
+ ...providerTestClientFields(providerName),
16935
17106
  headers: captureFullDetails ? getResultHeaders(streamingResult) : void 0
16936
17107
  });
16937
17108
  }
@@ -16963,11 +17134,8 @@ async function logModelResults(displayName, providerName, providerSessionId, ant
16963
17134
  totalStreamMs: null,
16964
17135
  tokensPerSecond: null,
16965
17136
  streaming: false,
16966
- userAgent: "provider-test",
16967
- origin: null,
16968
17137
  apiFormat: "openai",
16969
- isTest: true,
16970
- providerName,
17138
+ ...providerTestClientFields(providerName),
16971
17139
  headers: captureFullDetails ? getResultHeaders(nonStreamingResult) : void 0
16972
17140
  });
16973
17141
  const streamingRequestBody = JSON.stringify(
@@ -16992,17 +17160,14 @@ async function logModelResults(displayName, providerName, providerSessionId, ant
16992
17160
  tokensPerSecond: getResultTokensPerSecond(streamingResult),
16993
17161
  streaming: true,
16994
17162
  streamingChunks: captureFullDetails ? streamingResult.streamingChunks : void 0,
16995
- userAgent: "provider-test",
16996
- origin: null,
16997
17163
  apiFormat: "openai",
16998
- isTest: true,
16999
- providerName,
17164
+ ...providerTestClientFields(providerName),
17000
17165
  headers: captureFullDetails ? getResultHeaders(streamingResult) : void 0
17001
17166
  });
17002
17167
  }
17003
17168
  }
17004
17169
  }
17005
- const Route$2 = createFileRoute("/api/providers/$providerId/test/log")({
17170
+ const Route$6 = createFileRoute("/api/providers/$providerId/test/log")({
17006
17171
  server: {
17007
17172
  handlers: {
17008
17173
  POST: async ({ params, request }) => {
@@ -17142,7 +17307,7 @@ function getLogsForCandidateScope(scopeId) {
17142
17307
  if (direct.length > 0) return direct;
17143
17308
  return getFilteredLogs().filter((log) => getCandidateScopeId(log) === scopeId);
17144
17309
  }
17145
- const Route$1 = createFileRoute("/api/knowledge/sessions/$sessionId/candidates")({
17310
+ const Route$5 = createFileRoute("/api/knowledge/sessions/$sessionId/candidates")({
17146
17311
  server: {
17147
17312
  handlers: {
17148
17313
  POST: ({ params }) => {
@@ -17153,7 +17318,7 @@ const Route$1 = createFileRoute("/api/knowledge/sessions/$sessionId/candidates")
17153
17318
  }
17154
17319
  }
17155
17320
  });
17156
- const Route = createFileRoute("/api/knowledge/candidates/$candidateId/promote")({
17321
+ const Route$4 = createFileRoute("/api/knowledge/candidates/$candidateId/promote")({
17157
17322
  server: {
17158
17323
  handlers: {
17159
17324
  POST: async ({ params }) => {
@@ -17175,206 +17340,291 @@ const Route = createFileRoute("/api/knowledge/candidates/$candidateId/promote")(
17175
17340
  }
17176
17341
  }
17177
17342
  });
17178
- const IndexRoute = Route$D.update({
17343
+ const Route$3 = createFileRoute("/api/ecosystem/packages/$packageId/upgrade")({
17344
+ server: {
17345
+ handlers: {
17346
+ POST: ({ params }) => {
17347
+ const task = startEcosystemTask(params.packageId, "upgrade");
17348
+ if (task === null) {
17349
+ return Response.json({ error: "Unknown ecosystem package" }, { status: 404 });
17350
+ }
17351
+ return Response.json({ task });
17352
+ }
17353
+ }
17354
+ }
17355
+ });
17356
+ const Route$2 = createFileRoute("/api/ecosystem/packages/$packageId/runner-presets")({
17357
+ server: {
17358
+ handlers: {
17359
+ POST: ({ params }) => {
17360
+ const task = startEcosystemTask(params.packageId, "runner-presets");
17361
+ if (task === null) {
17362
+ return Response.json(
17363
+ { error: "Runner presets are only available for Eval Harness" },
17364
+ { status: 404 }
17365
+ );
17366
+ }
17367
+ return Response.json({ task });
17368
+ }
17369
+ }
17370
+ }
17371
+ });
17372
+ const Route$1 = createFileRoute("/api/ecosystem/packages/$packageId/install")({
17373
+ server: {
17374
+ handlers: {
17375
+ POST: ({ params }) => {
17376
+ const task = startEcosystemTask(params.packageId, "install");
17377
+ if (task === null) {
17378
+ return Response.json({ error: "Unknown ecosystem package" }, { status: 404 });
17379
+ }
17380
+ return Response.json({ task });
17381
+ }
17382
+ }
17383
+ }
17384
+ });
17385
+ const Route = createFileRoute("/api/ecosystem/packages/$packageId/help")({
17386
+ server: {
17387
+ handlers: {
17388
+ POST: ({ params }) => {
17389
+ const task = startEcosystemTask(params.packageId, "help");
17390
+ if (task === null) {
17391
+ return Response.json({ error: "Unknown ecosystem package" }, { status: 404 });
17392
+ }
17393
+ return Response.json({ task });
17394
+ }
17395
+ }
17396
+ }
17397
+ });
17398
+ const IndexRoute = Route$J.update({
17179
17399
  id: "/",
17180
17400
  path: "/",
17181
- getParentRoute: () => Route$E
17401
+ getParentRoute: () => Route$K
17182
17402
  });
17183
- const SessionSessionIdRoute = Route$C.update({
17403
+ const SessionSessionIdRoute = Route$I.update({
17184
17404
  id: "/session/$sessionId",
17185
17405
  path: "/session/$sessionId",
17186
- getParentRoute: () => Route$E
17406
+ getParentRoute: () => Route$K
17187
17407
  });
17188
- const ProxySplatRoute = Route$B.update({
17408
+ const ProxySplatRoute = Route$H.update({
17189
17409
  id: "/proxy/$",
17190
17410
  path: "/proxy/$",
17191
- getParentRoute: () => Route$E
17411
+ getParentRoute: () => Route$K
17192
17412
  });
17193
- const ApiSessionsRoute = Route$A.update({
17413
+ const ApiSessionsRoute = Route$G.update({
17194
17414
  id: "/api/sessions",
17195
17415
  path: "/api/sessions",
17196
- getParentRoute: () => Route$E
17416
+ getParentRoute: () => Route$K
17197
17417
  });
17198
- const ApiRunsRoute = Route$z.update({
17418
+ const ApiRunsRoute = Route$F.update({
17199
17419
  id: "/api/runs",
17200
17420
  path: "/api/runs",
17201
- getParentRoute: () => Route$E
17421
+ getParentRoute: () => Route$K
17202
17422
  });
17203
- const ApiProvidersRoute = Route$y.update({
17423
+ const ApiProvidersRoute = Route$E.update({
17204
17424
  id: "/api/providers",
17205
17425
  path: "/api/providers",
17206
- getParentRoute: () => Route$E
17426
+ getParentRoute: () => Route$K
17207
17427
  });
17208
- const ApiModelsRoute = Route$x.update({
17428
+ const ApiModelsRoute = Route$D.update({
17209
17429
  id: "/api/models",
17210
17430
  path: "/api/models",
17211
- getParentRoute: () => Route$E
17431
+ getParentRoute: () => Route$K
17212
17432
  });
17213
- const ApiMcpRoute = Route$w.update({
17433
+ const ApiMcpRoute = Route$C.update({
17214
17434
  id: "/api/mcp",
17215
17435
  path: "/api/mcp",
17216
- getParentRoute: () => Route$E
17436
+ getParentRoute: () => Route$K
17217
17437
  });
17218
- const ApiLogsRoute = Route$v.update({
17438
+ const ApiLogsRoute = Route$B.update({
17219
17439
  id: "/api/logs",
17220
17440
  path: "/api/logs",
17221
- getParentRoute: () => Route$E
17441
+ getParentRoute: () => Route$K
17222
17442
  });
17223
- const ApiHealthRoute = Route$u.update({
17443
+ const ApiHealthRoute = Route$A.update({
17224
17444
  id: "/api/health",
17225
17445
  path: "/api/health",
17226
- getParentRoute: () => Route$E
17446
+ getParentRoute: () => Route$K
17227
17447
  });
17228
- const ApiGroupsRoute = Route$t.update({
17448
+ const ApiGroupsRoute = Route$z.update({
17229
17449
  id: "/api/groups",
17230
17450
  path: "/api/groups",
17231
- getParentRoute: () => Route$E
17451
+ getParentRoute: () => Route$K
17232
17452
  });
17233
- const ApiConfigRoute = Route$s.update({
17453
+ const ApiConfigRoute = Route$y.update({
17234
17454
  id: "/api/config",
17235
17455
  path: "/api/config",
17236
- getParentRoute: () => Route$E
17456
+ getParentRoute: () => Route$K
17237
17457
  });
17238
- const ApiAlertsRoute = Route$r.update({
17458
+ const ApiAlertsRoute = Route$x.update({
17239
17459
  id: "/api/alerts",
17240
17460
  path: "/api/alerts",
17241
- getParentRoute: () => Route$E
17461
+ getParentRoute: () => Route$K
17242
17462
  });
17243
- const ApiRunsRunIdRoute = Route$q.update({
17463
+ const ApiRunsRunIdRoute = Route$w.update({
17244
17464
  id: "/$runId",
17245
17465
  path: "/$runId",
17246
17466
  getParentRoute: () => ApiRunsRoute
17247
17467
  });
17248
- const ApiProvidersScanRoute = Route$p.update({
17468
+ const ApiProvidersScanRoute = Route$v.update({
17249
17469
  id: "/scan",
17250
17470
  path: "/scan",
17251
17471
  getParentRoute: () => ApiProvidersRoute
17252
17472
  });
17253
- const ApiProvidersImportRoute = Route$o.update({
17473
+ const ApiProvidersImportRoute = Route$u.update({
17254
17474
  id: "/import",
17255
17475
  path: "/import",
17256
17476
  getParentRoute: () => ApiProvidersRoute
17257
17477
  });
17258
- const ApiProvidersExportRoute = Route$n.update({
17478
+ const ApiProvidersExportRoute = Route$t.update({
17259
17479
  id: "/export",
17260
17480
  path: "/export",
17261
17481
  getParentRoute: () => ApiProvidersRoute
17262
17482
  });
17263
- const ApiProvidersProviderIdRoute = Route$m.update({
17483
+ const ApiProvidersProviderIdRoute = Route$s.update({
17264
17484
  id: "/$providerId",
17265
17485
  path: "/$providerId",
17266
17486
  getParentRoute: () => ApiProvidersRoute
17267
17487
  });
17268
- const ApiLogsStreamRoute = Route$l.update({
17488
+ const ApiLogsStreamRoute = Route$r.update({
17269
17489
  id: "/stream",
17270
17490
  path: "/stream",
17271
17491
  getParentRoute: () => ApiLogsRoute
17272
17492
  });
17273
- const ApiLogsImportRoute = Route$k.update({
17493
+ const ApiLogsImportRoute = Route$q.update({
17274
17494
  id: "/import",
17275
17495
  path: "/import",
17276
17496
  getParentRoute: () => ApiLogsRoute
17277
17497
  });
17278
- const ApiLogsIdRoute = Route$j.update({
17498
+ const ApiLogsIdRoute = Route$p.update({
17279
17499
  id: "/$id",
17280
17500
  path: "/$id",
17281
17501
  getParentRoute: () => ApiLogsRoute
17282
17502
  });
17283
- const ApiKnowledgeSearchRoute = Route$i.update({
17503
+ const ApiKnowledgeSearchRoute = Route$o.update({
17284
17504
  id: "/api/knowledge/search",
17285
17505
  path: "/api/knowledge/search",
17286
- getParentRoute: () => Route$E
17506
+ getParentRoute: () => Route$K
17287
17507
  });
17288
- const ApiKnowledgeProjectContextRoute = Route$h.update({
17508
+ const ApiKnowledgeProjectContextRoute = Route$n.update({
17289
17509
  id: "/api/knowledge/project-context",
17290
17510
  path: "/api/knowledge/project-context",
17291
- getParentRoute: () => Route$E
17511
+ getParentRoute: () => Route$K
17292
17512
  });
17293
- const ApiKnowledgeCandidatesRoute = Route$g.update({
17513
+ const ApiKnowledgeCandidatesRoute = Route$m.update({
17294
17514
  id: "/api/knowledge/candidates",
17295
17515
  path: "/api/knowledge/candidates",
17296
- getParentRoute: () => Route$E
17516
+ getParentRoute: () => Route$K
17297
17517
  });
17298
- const ApiGroupsGroupIdRoute = Route$f.update({
17518
+ const ApiGroupsGroupIdRoute = Route$l.update({
17299
17519
  id: "/$groupId",
17300
17520
  path: "/$groupId",
17301
17521
  getParentRoute: () => ApiGroupsRoute
17302
17522
  });
17303
- const ApiEcosystemPackagesRoute = Route$e.update({
17523
+ const ApiEcosystemTasksRoute = Route$k.update({
17524
+ id: "/api/ecosystem/tasks",
17525
+ path: "/api/ecosystem/tasks",
17526
+ getParentRoute: () => Route$K
17527
+ });
17528
+ const ApiEcosystemPackagesRoute = Route$j.update({
17304
17529
  id: "/api/ecosystem/packages",
17305
17530
  path: "/api/ecosystem/packages",
17306
- getParentRoute: () => Route$E
17531
+ getParentRoute: () => Route$K
17307
17532
  });
17308
- const ApiConfigPathsRoute = Route$d.update({
17533
+ const ApiConfigPathsRoute = Route$i.update({
17309
17534
  id: "/paths",
17310
17535
  path: "/paths",
17311
17536
  getParentRoute: () => ApiConfigRoute
17312
17537
  });
17313
- const ApiAlertsSummaryRoute = Route$c.update({
17538
+ const ApiAlertsSummaryRoute = Route$h.update({
17314
17539
  id: "/summary",
17315
17540
  path: "/summary",
17316
17541
  getParentRoute: () => ApiAlertsRoute
17317
17542
  });
17318
- const ApiRunsRunIdEvidenceRoute = Route$b.update({
17543
+ const ApiRunsRunIdEvidenceRoute = Route$g.update({
17319
17544
  id: "/evidence",
17320
17545
  path: "/evidence",
17321
17546
  getParentRoute: () => ApiRunsRunIdRoute
17322
17547
  });
17323
- const ApiProvidersProviderIdTestRoute = Route$a.update({
17548
+ const ApiProvidersProviderIdTestRoute = Route$f.update({
17324
17549
  id: "/test",
17325
17550
  path: "/test",
17326
17551
  getParentRoute: () => ApiProvidersProviderIdRoute
17327
17552
  });
17328
- const ApiProvidersProviderIdModelMetadataRoute = Route$9.update({
17553
+ const ApiProvidersProviderIdModelMetadataRoute = Route$e.update({
17329
17554
  id: "/model-metadata",
17330
17555
  path: "/model-metadata",
17331
17556
  getParentRoute: () => ApiProvidersProviderIdRoute
17332
17557
  });
17333
- const ApiLogsIdReplayRoute = Route$8.update({
17558
+ const ApiLogsIdReplayRoute = Route$d.update({
17334
17559
  id: "/replay",
17335
17560
  path: "/replay",
17336
17561
  getParentRoute: () => ApiLogsIdRoute
17337
17562
  });
17338
- const ApiLogsIdChunksRoute = Route$7.update({
17563
+ const ApiLogsIdChunksRoute = Route$c.update({
17339
17564
  id: "/chunks",
17340
17565
  path: "/chunks",
17341
17566
  getParentRoute: () => ApiLogsIdRoute
17342
17567
  });
17343
- const ApiLogsIdBodyRoute = Route$6.update({
17568
+ const ApiLogsIdBodyRoute = Route$b.update({
17344
17569
  id: "/body",
17345
17570
  path: "/body",
17346
17571
  getParentRoute: () => ApiLogsIdRoute
17347
17572
  });
17348
- const ApiKnowledgeCandidatesCandidateIdRoute = Route$5.update({
17573
+ const ApiKnowledgeCandidatesCandidateIdRoute = Route$a.update({
17349
17574
  id: "/$candidateId",
17350
17575
  path: "/$candidateId",
17351
17576
  getParentRoute: () => ApiKnowledgeCandidatesRoute
17352
17577
  });
17353
- const ApiGroupsGroupIdSessionsRoute = Route$4.update({
17578
+ const ApiGroupsGroupIdSessionsRoute = Route$9.update({
17354
17579
  id: "/sessions",
17355
17580
  path: "/sessions",
17356
17581
  getParentRoute: () => ApiGroupsGroupIdRoute
17357
17582
  });
17358
- const ApiGroupsGroupIdEvidenceRoute = Route$3.update({
17583
+ const ApiGroupsGroupIdEvidenceRoute = Route$8.update({
17359
17584
  id: "/evidence",
17360
17585
  path: "/evidence",
17361
17586
  getParentRoute: () => ApiGroupsGroupIdRoute
17362
17587
  });
17363
- const ApiProvidersProviderIdTestLogRoute = Route$2.update({
17588
+ const ApiEcosystemTasksTaskIdRoute = Route$7.update({
17589
+ id: "/$taskId",
17590
+ path: "/$taskId",
17591
+ getParentRoute: () => ApiEcosystemTasksRoute
17592
+ });
17593
+ const ApiProvidersProviderIdTestLogRoute = Route$6.update({
17364
17594
  id: "/log",
17365
17595
  path: "/log",
17366
17596
  getParentRoute: () => ApiProvidersProviderIdTestRoute
17367
17597
  });
17368
- const ApiKnowledgeSessionsSessionIdCandidatesRoute = Route$1.update({
17598
+ const ApiKnowledgeSessionsSessionIdCandidatesRoute = Route$5.update({
17369
17599
  id: "/api/knowledge/sessions/$sessionId/candidates",
17370
17600
  path: "/api/knowledge/sessions/$sessionId/candidates",
17371
- getParentRoute: () => Route$E
17601
+ getParentRoute: () => Route$K
17372
17602
  });
17373
- const ApiKnowledgeCandidatesCandidateIdPromoteRoute = Route.update({
17603
+ const ApiKnowledgeCandidatesCandidateIdPromoteRoute = Route$4.update({
17374
17604
  id: "/promote",
17375
17605
  path: "/promote",
17376
17606
  getParentRoute: () => ApiKnowledgeCandidatesCandidateIdRoute
17377
17607
  });
17608
+ const ApiEcosystemPackagesPackageIdUpgradeRoute = Route$3.update({
17609
+ id: "/$packageId/upgrade",
17610
+ path: "/$packageId/upgrade",
17611
+ getParentRoute: () => ApiEcosystemPackagesRoute
17612
+ });
17613
+ const ApiEcosystemPackagesPackageIdRunnerPresetsRoute = Route$2.update({
17614
+ id: "/$packageId/runner-presets",
17615
+ path: "/$packageId/runner-presets",
17616
+ getParentRoute: () => ApiEcosystemPackagesRoute
17617
+ });
17618
+ const ApiEcosystemPackagesPackageIdInstallRoute = Route$1.update({
17619
+ id: "/$packageId/install",
17620
+ path: "/$packageId/install",
17621
+ getParentRoute: () => ApiEcosystemPackagesRoute
17622
+ });
17623
+ const ApiEcosystemPackagesPackageIdHelpRoute = Route.update({
17624
+ id: "/$packageId/help",
17625
+ path: "/$packageId/help",
17626
+ getParentRoute: () => ApiEcosystemPackagesRoute
17627
+ });
17378
17628
  const ApiAlertsRouteChildren = {
17379
17629
  ApiAlertsSummaryRoute
17380
17630
  };
@@ -17444,6 +17694,17 @@ const ApiRunsRouteChildren = {
17444
17694
  ApiRunsRunIdRoute: ApiRunsRunIdRouteWithChildren
17445
17695
  };
17446
17696
  const ApiRunsRouteWithChildren = ApiRunsRoute._addFileChildren(ApiRunsRouteChildren);
17697
+ const ApiEcosystemPackagesRouteChildren = {
17698
+ ApiEcosystemPackagesPackageIdHelpRoute,
17699
+ ApiEcosystemPackagesPackageIdInstallRoute,
17700
+ ApiEcosystemPackagesPackageIdRunnerPresetsRoute,
17701
+ ApiEcosystemPackagesPackageIdUpgradeRoute
17702
+ };
17703
+ const ApiEcosystemPackagesRouteWithChildren = ApiEcosystemPackagesRoute._addFileChildren(ApiEcosystemPackagesRouteChildren);
17704
+ const ApiEcosystemTasksRouteChildren = {
17705
+ ApiEcosystemTasksTaskIdRoute
17706
+ };
17707
+ const ApiEcosystemTasksRouteWithChildren = ApiEcosystemTasksRoute._addFileChildren(ApiEcosystemTasksRouteChildren);
17447
17708
  const ApiKnowledgeCandidatesCandidateIdRouteChildren = {
17448
17709
  ApiKnowledgeCandidatesCandidateIdPromoteRoute
17449
17710
  };
@@ -17470,13 +17731,14 @@ const rootRouteChildren = {
17470
17731
  ApiSessionsRoute,
17471
17732
  ProxySplatRoute,
17472
17733
  SessionSessionIdRoute,
17473
- ApiEcosystemPackagesRoute,
17734
+ ApiEcosystemPackagesRoute: ApiEcosystemPackagesRouteWithChildren,
17735
+ ApiEcosystemTasksRoute: ApiEcosystemTasksRouteWithChildren,
17474
17736
  ApiKnowledgeCandidatesRoute: ApiKnowledgeCandidatesRouteWithChildren,
17475
17737
  ApiKnowledgeProjectContextRoute,
17476
17738
  ApiKnowledgeSearchRoute,
17477
17739
  ApiKnowledgeSessionsSessionIdCandidatesRoute
17478
17740
  };
17479
- const routeTree = Route$E._addFileChildren(rootRouteChildren)._addFileTypes();
17741
+ const routeTree = Route$K._addFileChildren(rootRouteChildren)._addFileTypes();
17480
17742
  function getRouter() {
17481
17743
  const router2 = createRouter({
17482
17744
  routeTree,
@@ -17518,7 +17780,8 @@ export {
17518
17780
  router as N,
17519
17781
  OpenAIRequestSchema as O,
17520
17782
  ProviderConfigSchema as P,
17521
- Route$C as R,
17783
+ Route$I as R,
17784
+ StreamingChunkSchema$1 as S,
17522
17785
  TimeDisplayFormatSchema as T,
17523
17786
  DEFAULT_SLOW_RESPONSE_THRESHOLD_SECONDS as a,
17524
17787
  DEFAULT_PROVIDER_TEST_TIMEOUT_SECONDS as b,