@agent-inspect/studio 6.7.1 → 6.7.3
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.
- package/README.md +39 -9
- package/dist/index.cjs +35 -10
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.mjs +35 -10
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/path-guards.ts","../src/registry.ts","../src/db.ts","../src/import.ts","../src/registry-path.ts","../src/ingest/common.ts","../src/ingest/file-drop.ts","../src/context.ts","../src/ingest/token.ts","../src/ingest/http.ts","../src/html.ts","../src/project-data.ts","../src/auth.ts","../src/routes.ts","../src/server.ts","../src/ingest/github-artifact.ts","../src/ingest/bundle-upload.ts"],"names":["path","readFile","readdir","createHash","mkdir","resolveTraceDir","TraceDirectory","loadTraceMetadataList","resolveWorkspaceLocation","readWorkspaceManifestFile","stat","sendJson","handled","writeFile","access","copyFile"],"mappings":"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","file":"index.mjs","sourcesContent":["import path from \"node:path\";\n\nexport function isSafeRelativePath(p: string): boolean {\n const trimmed = p.trim();\n if (trimmed === \"\" || trimmed.startsWith(\"/\") || trimmed.startsWith(\"\\\\\")) return false;\n if (/^[a-zA-Z]:/.test(trimmed)) return false;\n return !trimmed.split(/[/\\\\]+/).some((seg) => seg === \"..\");\n}\n\nexport function resolveUnderRoot(root: string, ...segments: string[]): string {\n const resolvedRoot = path.resolve(root);\n const resolved = path.resolve(resolvedRoot, ...segments);\n assertPathUnderRoot(resolved, resolvedRoot);\n return resolved;\n}\n\nexport function assertPathUnderRoot(resolved: string, root: string): void {\n const rel = path.relative(path.resolve(root), path.resolve(resolved));\n if (rel.startsWith(\"..\") || path.isAbsolute(rel)) {\n throw new Error(\"path escapes allowed registry root\");\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { isSafeRelativePath } from \"./path-guards.js\";\n\nexport const STUDIO_REGISTRY_SCHEMA_VERSION = \"1.0\" as const;\nexport const STUDIO_REGISTRY_FILENAMES = [\n \"studio-registry.json\",\n \".agent-inspect/studio-registry.json\",\n] as const;\n\nexport interface StudioRegistryProject {\n id: string;\n path: string;\n label?: string;\n suiteConfigs?: string[];\n}\n\nexport interface StudioRegistryImport {\n ciArtifactsDir?: string;\n bundlesDir?: string;\n fileDropDir?: string;\n enabled?: boolean;\n}\n\nexport interface StudioRegistryGitHubIngest {\n enabled?: boolean;\n tokenEnv?: string;\n}\n\nexport interface StudioRegistryHttpIngest {\n enabled?: boolean;\n path?: string;\n tokenEnv?: string;\n maxBytes?: number;\n}\n\nexport interface StudioRegistryBundleUploadIngest {\n enabled?: boolean;\n maxBytes?: number;\n}\n\nexport interface StudioRegistryIngest {\n github?: StudioRegistryGitHubIngest;\n http?: StudioRegistryHttpIngest;\n bundleUpload?: StudioRegistryBundleUploadIngest;\n}\n\nexport interface StudioRegistry {\n schemaVersion: typeof STUDIO_REGISTRY_SCHEMA_VERSION;\n name: string;\n projects: StudioRegistryProject[];\n import?: StudioRegistryImport;\n ingest?: StudioRegistryIngest;\n}\n\nexport interface StudioRegistryParseResult {\n ok: boolean;\n registry?: StudioRegistry;\n errors: string[];\n warnings: string[];\n}\n\nconst MAX_REGISTRY_BYTES = 256 * 1024;\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport { isSafeRelativePath };\n\nexport function parseStudioRegistry(input: unknown): StudioRegistryParseResult {\n const errors: string[] = [];\n if (!isPlainObject(input)) {\n return { ok: false, errors: [\"registry must be a JSON object\"], warnings: [] };\n }\n if (input.schemaVersion !== STUDIO_REGISTRY_SCHEMA_VERSION) {\n errors.push(`schemaVersion must be \"${STUDIO_REGISTRY_SCHEMA_VERSION}\"`);\n }\n if (typeof input.name !== \"string\" || input.name.trim() === \"\") {\n errors.push(\"name must be a non-empty string\");\n }\n if (!Array.isArray(input.projects) || input.projects.length === 0) {\n errors.push(\"projects must be a non-empty array\");\n }\n\n const projects: StudioRegistryProject[] = [];\n if (Array.isArray(input.projects)) {\n for (const [index, item] of input.projects.entries()) {\n if (!isPlainObject(item)) {\n errors.push(`projects[${index}] must be an object`);\n continue;\n }\n const id = typeof item.id === \"string\" ? item.id.trim() : \"\";\n const projectPath = typeof item.path === \"string\" ? item.path.trim() : \"\";\n if (!id) errors.push(`projects[${index}].id must be a non-empty string`);\n if (!projectPath) errors.push(`projects[${index}].path must be a non-empty string`);\n const label = typeof item.label === \"string\" ? item.label.trim() : undefined;\n const suiteConfigs = Array.isArray(item.suiteConfigs)\n ? item.suiteConfigs.filter((value): value is string => typeof value === \"string\")\n : undefined;\n projects.push({\n id,\n path: projectPath,\n ...(label ? { label } : {}),\n ...(suiteConfigs && suiteConfigs.length > 0 ? { suiteConfigs } : {}),\n });\n }\n }\n\n let importConfig: StudioRegistryImport | undefined;\n if (input.import !== undefined) {\n if (!isPlainObject(input.import)) {\n errors.push(\"import must be an object\");\n } else {\n importConfig = {};\n if (input.import.ciArtifactsDir !== undefined) {\n const dir = String(input.import.ciArtifactsDir).trim();\n if (!isSafeRelativePath(dir)) {\n errors.push(\"import.ciArtifactsDir must be a safe relative path\");\n } else {\n importConfig.ciArtifactsDir = dir;\n }\n }\n if (input.import.bundlesDir !== undefined) {\n const dir = String(input.import.bundlesDir).trim();\n if (!isSafeRelativePath(dir)) {\n errors.push(\"import.bundlesDir must be a safe relative path\");\n } else {\n importConfig.bundlesDir = dir;\n }\n }\n if (input.import.fileDropDir !== undefined) {\n const dir = String(input.import.fileDropDir).trim();\n if (!isSafeRelativePath(dir)) {\n errors.push(\"import.fileDropDir must be a safe relative path\");\n } else {\n importConfig.fileDropDir = dir;\n }\n }\n if (input.import.enabled !== undefined) {\n if (typeof input.import.enabled !== \"boolean\") {\n errors.push(\"import.enabled must be a boolean\");\n } else {\n importConfig.enabled = input.import.enabled;\n }\n }\n }\n }\n\n let ingestConfig: StudioRegistryIngest | undefined;\n const ingestWarnings: string[] = [];\n if (input.ingest !== undefined) {\n if (!isPlainObject(input.ingest)) {\n errors.push(\"ingest must be an object\");\n } else {\n ingestConfig = {};\n if (input.ingest.github !== undefined) {\n if (!isPlainObject(input.ingest.github)) {\n errors.push(\"ingest.github must be an object\");\n } else {\n const github: StudioRegistryGitHubIngest = {};\n if (input.ingest.github.enabled !== undefined) {\n if (typeof input.ingest.github.enabled !== \"boolean\") {\n errors.push(\"ingest.github.enabled must be a boolean\");\n } else {\n github.enabled = input.ingest.github.enabled;\n }\n }\n if (input.ingest.github.tokenEnv !== undefined) {\n const tokenEnv = String(input.ingest.github.tokenEnv).trim();\n if (!/^[A-Z][A-Z0-9_]*$/.test(tokenEnv)) {\n errors.push(\"ingest.github.tokenEnv must be an uppercase env var name\");\n } else {\n github.tokenEnv = tokenEnv;\n }\n }\n ingestConfig.github = github;\n }\n }\n if (input.ingest.http !== undefined) {\n if (!isPlainObject(input.ingest.http)) {\n errors.push(\"ingest.http must be an object\");\n } else {\n const http: StudioRegistryHttpIngest = {};\n if (input.ingest.http.enabled !== undefined) {\n if (typeof input.ingest.http.enabled !== \"boolean\") {\n errors.push(\"ingest.http.enabled must be a boolean\");\n } else {\n http.enabled = input.ingest.http.enabled;\n }\n }\n if (input.ingest.http.path !== undefined) {\n const ingestPath = String(input.ingest.http.path).trim();\n if (!ingestPath.startsWith(\"/\") || ingestPath.includes(\"..\")) {\n errors.push(\"ingest.http.path must be an absolute safe path\");\n } else {\n http.path = ingestPath;\n }\n }\n if (input.ingest.http.tokenEnv !== undefined) {\n const tokenEnv = String(input.ingest.http.tokenEnv).trim();\n if (!/^[A-Z][A-Z0-9_]*$/.test(tokenEnv)) {\n errors.push(\"ingest.http.tokenEnv must be an uppercase env var name\");\n } else {\n http.tokenEnv = tokenEnv;\n }\n }\n if (input.ingest.http.maxBytes !== undefined) {\n const maxBytes = Number(input.ingest.http.maxBytes);\n if (!Number.isInteger(maxBytes) || maxBytes <= 0) {\n errors.push(\"ingest.http.maxBytes must be a positive integer\");\n } else {\n http.maxBytes = maxBytes;\n }\n }\n ingestConfig.http = http;\n }\n }\n if (input.ingest.bundleUpload !== undefined) {\n if (!isPlainObject(input.ingest.bundleUpload)) {\n errors.push(\"ingest.bundleUpload must be an object\");\n } else {\n const bundleUpload: StudioRegistryBundleUploadIngest = {};\n if (input.ingest.bundleUpload.enabled !== undefined) {\n if (typeof input.ingest.bundleUpload.enabled !== \"boolean\") {\n errors.push(\"ingest.bundleUpload.enabled must be a boolean\");\n } else {\n bundleUpload.enabled = input.ingest.bundleUpload.enabled;\n }\n }\n if (input.ingest.bundleUpload.maxBytes !== undefined) {\n const maxBytes = Number(input.ingest.bundleUpload.maxBytes);\n if (!Number.isInteger(maxBytes) || maxBytes <= 0) {\n errors.push(\"ingest.bundleUpload.maxBytes must be a positive integer\");\n } else {\n bundleUpload.maxBytes = maxBytes;\n }\n }\n ingestConfig.bundleUpload = bundleUpload;\n }\n }\n const knownIngestKeys = new Set([\"github\", \"http\", \"bundleUpload\"]);\n for (const key of Object.keys(input.ingest)) {\n if (!knownIngestKeys.has(key)) {\n ingestWarnings.push(`ignored unknown ingest key: ${key}`);\n }\n }\n }\n }\n\n if (errors.length > 0) return { ok: false, errors, warnings: ingestWarnings };\n\n return {\n ok: true,\n registry: {\n schemaVersion: STUDIO_REGISTRY_SCHEMA_VERSION,\n name: String(input.name).trim(),\n projects,\n ...(importConfig ? { import: importConfig } : {}),\n ...(ingestConfig ? { ingest: ingestConfig } : {}),\n },\n errors: [],\n warnings: ingestWarnings,\n };\n}\n\nexport async function readStudioRegistryFile(\n filePath: string,\n): Promise<StudioRegistryParseResult & { path: string }> {\n try {\n const raw = await readFile(filePath, \"utf8\");\n if (raw.length > MAX_REGISTRY_BYTES) {\n return {\n ok: false,\n path: filePath,\n errors: [\"registry file exceeds size limit\"],\n warnings: [],\n };\n }\n const parsed = parseStudioRegistry(JSON.parse(raw) as unknown);\n return { ...parsed, path: filePath };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false, path: filePath, errors: [message], warnings: [] };\n }\n}\n\nexport function resolveStudioRegistryPath(options: {\n workspacePath?: string;\n cwd?: string;\n}): string {\n if (options.workspacePath && options.workspacePath.trim() !== \"\") {\n return path.resolve(options.cwd ?? process.cwd(), options.workspacePath);\n }\n const cwd = path.resolve(options.cwd ?? process.cwd());\n return path.join(cwd, STUDIO_REGISTRY_FILENAMES[0]!);\n}\n\nexport function resolveRegistryProjectPath(\n registryDir: string,\n projectPath: string,\n): string {\n return path.isAbsolute(projectPath)\n ? path.resolve(projectPath)\n : path.resolve(registryDir, projectPath);\n}\n","import { mkdirSync } from \"node:fs\";\nimport path from \"node:path\";\n\nimport Database from \"better-sqlite3\";\n\nexport const STUDIO_DB_SCHEMA_VERSION = \"1.0\";\nexport const DEFAULT_STUDIO_DB_FILENAME = \"studio.db\";\n\nconst SCHEMA_SQL = `\nCREATE TABLE IF NOT EXISTS meta (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n);\nCREATE TABLE IF NOT EXISTS projects (\n id TEXT PRIMARY KEY,\n label TEXT,\n path TEXT NOT NULL,\n workspace_dir TEXT NOT NULL,\n project_name TEXT,\n redaction_profile TEXT,\n trace_count INTEGER NOT NULL DEFAULT 0,\n imported_at TEXT NOT NULL\n);\nCREATE TABLE IF NOT EXISTS runs (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n project_id TEXT NOT NULL,\n run_id TEXT NOT NULL,\n name TEXT,\n status TEXT,\n file TEXT,\n started_at REAL,\n duration_ms REAL,\n session_id TEXT,\n UNIQUE(project_id, run_id)\n);\nCREATE INDEX IF NOT EXISTS idx_runs_project ON runs(project_id);\nCREATE INDEX IF NOT EXISTS idx_runs_status ON runs(status);\nCREATE TABLE IF NOT EXISTS ingest_files (\n source_key TEXT PRIMARY KEY,\n source_name TEXT NOT NULL,\n dest_path TEXT NOT NULL,\n kind TEXT NOT NULL CHECK(kind IN ('ci', 'bundle')),\n content_hash TEXT NOT NULL,\n imported_at TEXT NOT NULL\n);\nCREATE INDEX IF NOT EXISTS idx_ingest_files_kind ON ingest_files(kind);\n`;\n\nexport interface StudioProjectRow {\n id: string;\n label: string | null;\n path: string;\n workspaceDir: string;\n projectName: string | null;\n redactionProfile: string | null;\n traceCount: number;\n importedAt: string;\n}\n\nexport interface StudioRunRow {\n projectId: string;\n runId: string;\n name?: string;\n status?: string;\n file?: string;\n startedAt?: number;\n durationMs?: number;\n sessionId?: string;\n}\n\nexport type IngestFileKind = \"ci\" | \"bundle\";\n\nexport interface IngestFileRow {\n sourceKey: string;\n sourceName: string;\n destPath: string;\n kind: IngestFileKind;\n contentHash: string;\n importedAt: string;\n}\n\nexport function resolveStudioDbPath(options: {\n dbPath?: string;\n cwd?: string;\n}): string {\n if (options.dbPath && options.dbPath.trim() !== \"\") {\n const raw = options.dbPath.trim();\n if (raw.startsWith(\"postgres://\") || raw.startsWith(\"postgresql://\")) {\n return raw;\n }\n return path.resolve(options.cwd ?? process.cwd(), raw);\n }\n return path.resolve(\n options.cwd ?? process.cwd(),\n \".agent-inspect\",\n DEFAULT_STUDIO_DB_FILENAME,\n );\n}\n\nexport function isPostgresDbPath(dbPath: string): boolean {\n return dbPath.startsWith(\"postgres://\") || dbPath.startsWith(\"postgresql://\");\n}\n\nexport function openStudioDb(dbPath: string): Database.Database {\n if (isPostgresDbPath(dbPath)) {\n throw new Error(\n \"Postgres studio databases are not supported; use a SQLite file path (preview only).\",\n );\n }\n const dir = path.dirname(dbPath);\n try {\n mkdirSync(dir, { recursive: true });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to create studio database directory: ${message}`);\n }\n const db = new Database(dbPath);\n db.pragma(\"journal_mode = WAL\");\n db.exec(SCHEMA_SQL);\n const insertMeta = db.prepare(\n \"INSERT INTO meta(key, value) VALUES(?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value\",\n );\n insertMeta.run(\"schemaVersion\", STUDIO_DB_SCHEMA_VERSION);\n insertMeta.run(\"driver\", \"better-sqlite3\");\n return db;\n}\n\nexport function upsertStudioProject(\n db: Database.Database,\n row: StudioProjectRow,\n): void {\n db.prepare(\n `INSERT INTO projects(id, label, path, workspace_dir, project_name, redaction_profile, trace_count, imported_at)\n VALUES (@id, @label, @path, @workspaceDir, @projectName, @redactionProfile, @traceCount, @importedAt)\n ON CONFLICT(id) DO UPDATE SET\n label = excluded.label,\n path = excluded.path,\n workspace_dir = excluded.workspace_dir,\n project_name = excluded.project_name,\n redaction_profile = excluded.redaction_profile,\n trace_count = excluded.trace_count,\n imported_at = excluded.imported_at`,\n ).run({\n id: row.id,\n label: row.label,\n path: row.path,\n workspaceDir: row.workspaceDir,\n projectName: row.projectName,\n redactionProfile: row.redactionProfile,\n traceCount: row.traceCount,\n importedAt: row.importedAt,\n });\n}\n\nexport function replaceProjectRuns(\n db: Database.Database,\n projectId: string,\n runs: StudioRunRow[],\n): void {\n const tx = db.transaction(() => {\n db.prepare(\"DELETE FROM runs WHERE project_id = ?\").run(projectId);\n const insert = db.prepare(\n `INSERT INTO runs(project_id, run_id, name, status, file, started_at, duration_ms, session_id)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n );\n for (const run of runs) {\n insert.run(\n projectId,\n run.runId,\n run.name ?? null,\n run.status ?? null,\n run.file ?? null,\n run.startedAt ?? null,\n run.durationMs ?? null,\n run.sessionId ?? null,\n );\n }\n });\n tx();\n}\n\nexport function listStudioProjects(db: Database.Database): StudioProjectRow[] {\n const rows = db\n .prepare(\n `SELECT id, label, path, workspace_dir AS workspaceDir, project_name AS projectName,\n redaction_profile AS redactionProfile, trace_count AS traceCount, imported_at AS importedAt\n FROM projects ORDER BY id ASC`,\n )\n .all() as StudioProjectRow[];\n return rows;\n}\n\nexport function getStudioProject(\n db: Database.Database,\n projectId: string,\n): StudioProjectRow | undefined {\n return db\n .prepare(\n `SELECT id, label, path, workspace_dir AS workspaceDir, project_name AS projectName,\n redaction_profile AS redactionProfile, trace_count AS traceCount, imported_at AS importedAt\n FROM projects WHERE id = ?`,\n )\n .get(projectId) as StudioProjectRow | undefined;\n}\n\nexport function listProjectRuns(\n db: Database.Database,\n projectId: string,\n limit = 200,\n): StudioRunRow[] {\n const rows = db\n .prepare(\n `SELECT project_id AS projectId, run_id AS runId, name, status, file,\n started_at AS startedAt, duration_ms AS durationMs, session_id AS sessionId\n FROM runs WHERE project_id = ? ORDER BY started_at DESC LIMIT ?`,\n )\n .all(projectId, limit) as StudioRunRow[];\n return rows;\n}\n\nexport function searchProjectRuns(\n db: Database.Database,\n projectId: string,\n query: string,\n limit = 50,\n): StudioRunRow[] {\n const pattern = `%${query}%`;\n return db\n .prepare(\n `SELECT project_id AS projectId, run_id AS runId, name, status, file,\n started_at AS startedAt, duration_ms AS durationMs, session_id AS sessionId\n FROM runs\n WHERE project_id = ?\n AND (run_id LIKE ? OR IFNULL(name, '') LIKE ? OR IFNULL(status, '') LIKE ?)\n ORDER BY started_at DESC\n LIMIT ?`,\n )\n .all(projectId, pattern, pattern, pattern, limit) as StudioRunRow[];\n}\n\nexport function findIngestFileBySourceKey(\n db: Database.Database,\n sourceKey: string,\n): IngestFileRow | undefined {\n return db\n .prepare(\n `SELECT source_key AS sourceKey, source_name AS sourceName, dest_path AS destPath,\n kind, content_hash AS contentHash, imported_at AS importedAt\n FROM ingest_files WHERE source_key = ?`,\n )\n .get(sourceKey) as IngestFileRow | undefined;\n}\n\nexport function insertIngestFile(db: Database.Database, row: IngestFileRow): void {\n db.prepare(\n `INSERT INTO ingest_files(source_key, source_name, dest_path, kind, content_hash, imported_at)\n VALUES (@sourceKey, @sourceName, @destPath, @kind, @contentHash, @importedAt)\n ON CONFLICT(source_key) DO UPDATE SET\n source_name = excluded.source_name,\n dest_path = excluded.dest_path,\n kind = excluded.kind,\n content_hash = excluded.content_hash,\n imported_at = excluded.imported_at`,\n ).run(row);\n}\n\nexport function listIngestFiles(\n db: Database.Database,\n kind?: IngestFileKind,\n): IngestFileRow[] {\n if (kind) {\n return db\n .prepare(\n `SELECT source_key AS sourceKey, source_name AS sourceName, dest_path AS destPath,\n kind, content_hash AS contentHash, imported_at AS importedAt\n FROM ingest_files WHERE kind = ? ORDER BY imported_at DESC`,\n )\n .all(kind) as IngestFileRow[];\n }\n return db\n .prepare(\n `SELECT source_key AS sourceKey, source_name AS sourceName, dest_path AS destPath,\n kind, content_hash AS contentHash, imported_at AS importedAt\n FROM ingest_files ORDER BY imported_at DESC`,\n )\n .all() as IngestFileRow[];\n}\n","import { readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type Database from \"better-sqlite3\";\nimport {\n TraceDirectory,\n loadTraceMetadataList,\n resolveTraceDir,\n} from \"agent-inspect/advanced\";\nimport {\n readWorkspaceManifestFile,\n resolveWorkspaceLocation,\n} from \"agent-inspect/workspace\";\n\nimport {\n replaceProjectRuns,\n upsertStudioProject,\n type StudioProjectRow,\n type StudioRunRow,\n} from \"./db.js\";\nimport {\n resolveRegistryProjectPath,\n type StudioRegistry,\n type StudioRegistryProject,\n} from \"./registry.js\";\n\nexport interface ImportedStudioProject extends StudioProjectRow {\n suiteConfigPaths: string[];\n}\n\nexport interface StudioImportResult {\n registryName: string;\n projects: ImportedStudioProject[];\n warnings: string[];\n}\n\nasync function discoverSuiteConfigs(\n projectRoot: string,\n configured?: string[],\n): Promise<string[]> {\n if (configured && configured.length > 0) {\n return configured.map((rel) => path.resolve(projectRoot, rel));\n }\n const found: string[] = [];\n try {\n const entries = await readdir(projectRoot);\n for (const entry of entries) {\n if (entry.endsWith(\".suite.json\")) {\n found.push(path.join(projectRoot, entry));\n }\n }\n } catch {\n // ignore unreadable project root\n }\n return found.sort();\n}\n\nasync function loadProjectRuns(\n workspaceDir: string,\n traceDirs: string[],\n): Promise<StudioRunRow[]> {\n const runs: StudioRunRow[] = [];\n for (const rel of traceDirs) {\n const traceDir = resolveTraceDir({ dir: path.join(workspaceDir, rel) });\n const td = new TraceDirectory({ dir: traceDir });\n const files = await td.list();\n const metas = await loadTraceMetadataList(traceDir, files, (fileName) =>\n td.getPath(fileName),\n );\n for (const meta of metas) {\n runs.push({\n projectId: \"\",\n runId: meta.runId,\n ...(meta.name !== undefined ? { name: meta.name } : {}),\n status: meta.status,\n file: path.basename(meta.filePath),\n ...(meta.startedAt !== undefined ? { startedAt: meta.startedAt } : {}),\n ...(meta.durationMs !== undefined ? { durationMs: meta.durationMs } : {}),\n });\n }\n }\n return runs.sort((a, b) => (b.startedAt ?? 0) - (a.startedAt ?? 0));\n}\n\nexport async function importStudioRegistry(options: {\n db: Database.Database;\n registry: StudioRegistry;\n registryPath: string;\n}): Promise<StudioImportResult> {\n const registryDir = path.dirname(options.registryPath);\n const warnings: string[] = [];\n const projects: ImportedStudioProject[] = [];\n const importedAt = new Date().toISOString();\n\n for (const project of options.registry.projects) {\n const imported = await importStudioProject({\n db: options.db,\n registryDir,\n project,\n importedAt,\n warnings,\n });\n if (imported) projects.push(imported);\n }\n\n return {\n registryName: options.registry.name,\n projects,\n warnings,\n };\n}\n\nasync function importStudioProject(options: {\n db: Database.Database;\n registryDir: string;\n project: StudioRegistryProject;\n importedAt: string;\n warnings: string[];\n}): Promise<ImportedStudioProject | undefined> {\n const projectRoot = resolveRegistryProjectPath(\n options.registryDir,\n options.project.path,\n );\n const location = resolveWorkspaceLocation(projectRoot);\n const manifestRead = await readWorkspaceManifestFile(location);\n if (!manifestRead.ok || manifestRead.manifest === undefined) {\n options.warnings.push(\n `project \"${options.project.id}\": ${manifestRead.errors.join(\"; \") || \"workspace.json missing\"}`,\n );\n return undefined;\n }\n\n const runs = await loadProjectRuns(\n location.workspaceDir,\n manifestRead.manifest.traceDirs,\n );\n const suiteConfigPaths = await discoverSuiteConfigs(\n projectRoot,\n options.project.suiteConfigs,\n );\n\n const row: StudioProjectRow = {\n id: options.project.id,\n label: options.project.label ?? options.project.id,\n path: projectRoot,\n workspaceDir: location.workspaceDir,\n projectName: manifestRead.manifest.project,\n redactionProfile: manifestRead.manifest.redactionProfile,\n traceCount: runs.length,\n importedAt: options.importedAt,\n };\n\n upsertStudioProject(options.db, row);\n replaceProjectRuns(\n options.db,\n options.project.id,\n runs.map((run) => ({ ...run, projectId: options.project.id })),\n );\n\n return { ...row, suiteConfigPaths };\n}\n","import { access } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { STUDIO_REGISTRY_FILENAMES } from \"./registry.js\";\n\nexport async function resolveStudioRegistryPath(options: {\n workspacePath?: string;\n cwd?: string;\n}): Promise<string> {\n if (options.workspacePath && options.workspacePath.trim() !== \"\") {\n return path.resolve(options.cwd ?? process.cwd(), options.workspacePath);\n }\n const cwd = path.resolve(options.cwd ?? process.cwd());\n for (const rel of STUDIO_REGISTRY_FILENAMES) {\n const candidate = path.join(cwd, rel);\n try {\n await access(candidate);\n return candidate;\n } catch {\n // try next candidate\n }\n }\n return path.join(cwd, STUDIO_REGISTRY_FILENAMES[0]!);\n}\n","import path from \"node:path\";\n\nimport type { StudioRegistry } from \"../registry.js\";\nimport { resolveUnderRoot } from \"../path-guards.js\";\n\nexport interface ResolvedImportDirs {\n registryDir: string;\n fileDropDir: string;\n ciArtifactsDir: string;\n bundlesDir: string;\n}\n\nexport function resolveImportDirs(\n registryPath: string,\n registry: StudioRegistry,\n): ResolvedImportDirs {\n const registryDir = path.dirname(registryPath);\n const importConfig = registry.import ?? {};\n const fileDropDir = importConfig.fileDropDir ?? \"imports/drop\";\n const ciArtifactsDir = importConfig.ciArtifactsDir ?? \"imports/ci\";\n const bundlesDir = importConfig.bundlesDir ?? \"imports/bundles\";\n\n return {\n registryDir,\n fileDropDir: resolveUnderRoot(registryDir, fileDropDir),\n ciArtifactsDir: resolveUnderRoot(registryDir, ciArtifactsDir),\n bundlesDir: resolveUnderRoot(registryDir, bundlesDir),\n };\n}\n\nexport function uniqueDestPath(destDir: string, fileName: string, contentHash: string): string {\n const ext = path.extname(fileName);\n const base = path.basename(fileName, ext);\n const shortHash = contentHash.slice(0, 8);\n return path.join(destDir, `${base}-${shortHash}${ext}`);\n}\n\nexport function sanitizeSafeErrorMessage(message: string, secret?: string): string {\n if (!secret || secret.length < 4) return message;\n return message.split(secret).join(\"[redacted]\");\n}\n\nexport function parseGitHubRepo(repo: string): { owner: string; name: string } {\n const trimmed = repo.trim();\n const match = /^([A-Za-z0-9_.-]+)\\/([A-Za-z0-9_.-]+)$/.exec(trimmed);\n if (!match) {\n throw new Error(\"repo must be in owner/name format\");\n }\n return { owner: match[1]!, name: match[2]! };\n}\n\nexport function buildGitHubArtifactSourceKey(options: {\n owner: string;\n repo: string;\n runId: string;\n artifactName: string;\n}): string {\n return `github:${options.owner}/${options.repo}/runs/${options.runId}/${options.artifactName}`;\n}\n","import { createHash } from \"node:crypto\";\nimport {\n copyFile,\n mkdir,\n readdir,\n readFile,\n rename,\n stat,\n} from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type Database from \"better-sqlite3\";\n\nimport {\n findIngestFileBySourceKey,\n insertIngestFile,\n openStudioDb,\n resolveStudioDbPath,\n type IngestFileKind,\n} from \"../db.js\";\nimport { assertPathUnderRoot, resolveUnderRoot } from \"../path-guards.js\";\nimport { readStudioRegistryFile, type StudioRegistry } from \"../registry.js\";\nimport { resolveStudioRegistryPath } from \"../registry-path.js\";\nimport { resolveImportDirs, uniqueDestPath } from \"./common.js\";\n\nexport const FILE_DROP_ARCHIVE_DIR = \".imported\";\n\nconst CI_EXTENSIONS = [\".jsonl\", \".suite.json\"] as const;\nconst BUNDLE_EXTENSIONS = [\".tgz\", \".zip\"] as const;\n\nexport interface FileDropImportOptions {\n db: Database.Database;\n registryPath: string;\n registry: StudioRegistry;\n /** Explicit opt-in required — ingest is disabled by default. */\n enabled: boolean;\n /** Override drop directory (CLI `--dir`). */\n dropDir?: string;\n /** Move successfully imported files into `dropDir/.imported/` instead of leaving copies. */\n archiveAfterImport?: boolean;\n}\n\nexport interface FileDropImportedFile {\n sourceKey: string;\n sourceName: string;\n destPath: string;\n kind: IngestFileKind;\n contentHash: string;\n archived: boolean;\n}\n\nexport interface FileDropImportResult {\n skipped: boolean;\n reason?: string;\n scanned: number;\n imported: number;\n skippedFiles: number;\n errors: string[];\n warnings: string[];\n files: FileDropImportedFile[];\n}\n\nfunction classifyFile(fileName: string): IngestFileKind | undefined {\n const lower = fileName.toLowerCase();\n if (CI_EXTENSIONS.some((ext) => lower.endsWith(ext))) return \"ci\";\n if (BUNDLE_EXTENSIONS.some((ext) => lower.endsWith(ext))) return \"bundle\";\n return undefined;\n}\n\nasync function hashFile(filePath: string): Promise<string> {\n const data = await readFile(filePath);\n return createHash(\"sha256\").update(data).digest(\"hex\");\n}\n\nasync function importOneFile(options: {\n db: Database.Database;\n sourcePath: string;\n sourceKey: string;\n fileName: string;\n kind: IngestFileKind;\n destDir: string;\n archiveAfterImport: boolean;\n archiveDir: string;\n importedAt: string;\n contentHash: string;\n}): Promise<FileDropImportedFile> {\n const destPath = uniqueDestPath(options.destDir, options.fileName, options.contentHash);\n assertPathUnderRoot(destPath, path.dirname(options.destDir));\n\n await mkdir(options.destDir, { recursive: true });\n await copyFile(options.sourcePath, destPath);\n\n insertIngestFile(options.db, {\n sourceKey: options.sourceKey,\n sourceName: options.fileName,\n destPath,\n kind: options.kind,\n contentHash: options.contentHash,\n importedAt: options.importedAt,\n });\n\n let archived = false;\n if (options.archiveAfterImport) {\n await mkdir(options.archiveDir, { recursive: true });\n const archiveTarget = path.join(options.archiveDir, options.fileName);\n await rename(options.sourcePath, archiveTarget);\n archived = true;\n }\n\n return {\n sourceKey: options.sourceKey,\n sourceName: options.fileName,\n destPath,\n kind: options.kind,\n contentHash: options.contentHash,\n archived,\n };\n}\n\nexport async function importFileDrop(\n options: FileDropImportOptions,\n): Promise<FileDropImportResult> {\n const warnings: string[] = [];\n const errors: string[] = [];\n const files: FileDropImportedFile[] = [];\n\n if (!options.enabled) {\n return {\n skipped: true,\n reason: \"file-drop ingest is disabled; pass --ingest file-drop or use studio import drop\",\n scanned: 0,\n imported: 0,\n skippedFiles: 0,\n errors,\n warnings,\n files,\n };\n }\n\n const dirs = resolveImportDirs(options.registryPath, options.registry);\n let dropDir: string;\n try {\n dropDir = options.dropDir\n ? path.isAbsolute(options.dropDir)\n ? (assertPathUnderRoot(options.dropDir, dirs.registryDir), options.dropDir)\n : resolveUnderRoot(dirs.registryDir, options.dropDir)\n : dirs.fileDropDir;\n assertPathUnderRoot(dropDir, dirs.registryDir);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n skipped: false,\n scanned: 0,\n imported: 0,\n skippedFiles: 0,\n errors: [message],\n warnings,\n files,\n };\n }\n\n let entries: string[];\n try {\n entries = await readdir(dropDir);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n skipped: false,\n scanned: 0,\n imported: 0,\n skippedFiles: 0,\n errors: [`unable to read file-drop directory: ${message}`],\n warnings,\n files,\n };\n }\n\n const importedAt = new Date().toISOString();\n const archiveDir = path.join(dropDir, FILE_DROP_ARCHIVE_DIR);\n let scanned = 0;\n let imported = 0;\n let skippedFiles = 0;\n\n for (const entry of entries.sort()) {\n if (entry === FILE_DROP_ARCHIVE_DIR || entry.startsWith(\".\")) continue;\n\n const sourcePath = path.join(dropDir, entry);\n let fileStat;\n try {\n fileStat = await stat(sourcePath);\n } catch {\n warnings.push(`skipped unreadable entry: ${entry}`);\n continue;\n }\n if (!fileStat.isFile()) continue;\n\n const kind = classifyFile(entry);\n if (!kind) continue;\n\n scanned += 1;\n const sourceKey = entry;\n let contentHash: string;\n try {\n contentHash = await hashFile(sourcePath);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n errors.push(`failed to read ${entry}: ${message}`);\n continue;\n }\n\n const existing = findIngestFileBySourceKey(options.db, sourceKey);\n if (existing && existing.contentHash === contentHash) {\n skippedFiles += 1;\n continue;\n }\n\n const destDir = kind === \"ci\" ? dirs.ciArtifactsDir : dirs.bundlesDir;\n try {\n const importedFile = await importOneFile({\n db: options.db,\n sourcePath,\n sourceKey,\n fileName: entry,\n kind,\n destDir,\n archiveAfterImport: options.archiveAfterImport === true,\n archiveDir,\n importedAt,\n contentHash,\n });\n files.push(importedFile);\n imported += 1;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n errors.push(`failed to import ${entry}: ${message}`);\n }\n }\n\n return {\n skipped: false,\n scanned,\n imported,\n skippedFiles,\n errors,\n warnings,\n files,\n };\n}\n\nexport async function importFileDropFromRegistry(options: {\n db: Database.Database;\n registryPath: string;\n registry: StudioRegistry;\n enabled: boolean;\n dropDir?: string;\n archiveAfterImport?: boolean;\n}): Promise<FileDropImportResult> {\n return importFileDrop({\n db: options.db,\n registryPath: options.registryPath,\n registry: options.registry,\n enabled: options.enabled,\n ...(options.dropDir !== undefined ? { dropDir: options.dropDir } : {}),\n ...(options.archiveAfterImport !== undefined\n ? { archiveAfterImport: options.archiveAfterImport }\n : {}),\n });\n}\n\nexport async function runStudioFileDropImport(options: {\n workspacePath?: string;\n dbPath?: string;\n cwd?: string;\n dropDir?: string;\n archiveAfterImport?: boolean;\n}): Promise<FileDropImportResult> {\n const cwd = options.cwd ?? process.cwd();\n const registryPath = await resolveStudioRegistryPath({\n ...(options.workspacePath !== undefined ? { workspacePath: options.workspacePath } : {}),\n cwd,\n });\n const registryRead = await readStudioRegistryFile(registryPath);\n if (!registryRead.ok || registryRead.registry === undefined) {\n throw new Error(registryRead.errors.join(\"; \") || \"invalid studio registry\");\n }\n\n const dbPath = resolveStudioDbPath({\n ...(options.dbPath !== undefined ? { dbPath: options.dbPath } : {}),\n cwd,\n });\n const db = openStudioDb(dbPath);\n\n return importFileDropFromRegistry({\n db,\n registryPath,\n registry: registryRead.registry,\n enabled: true,\n ...(options.dropDir !== undefined ? { dropDir: options.dropDir } : {}),\n ...(options.archiveAfterImport !== undefined\n ? { archiveAfterImport: options.archiveAfterImport }\n : {}),\n });\n}\n","import type Database from \"better-sqlite3\";\n\nimport { importStudioRegistry, type ImportedStudioProject, type StudioImportResult } from \"./import.js\";\nimport { importFileDropFromRegistry, type FileDropImportResult } from \"./ingest/file-drop.js\";\nimport {\n openStudioDb,\n resolveStudioDbPath,\n type StudioProjectRow,\n} from \"./db.js\";\nimport {\n readStudioRegistryFile,\n type StudioRegistry,\n} from \"./registry.js\";\nimport { resolveStudioRegistryPath } from \"./registry-path.js\";\nimport type { StudioServerOptions } from \"./types.js\";\n\nexport interface StudioContext {\n db: Database.Database;\n dbPath: string;\n registryPath: string;\n registry: StudioRegistry;\n importResult: StudioImportResult;\n fileDropResult?: FileDropImportResult;\n projects: ImportedStudioProject[];\n}\n\nexport async function createStudioContext(\n options: StudioServerOptions = {},\n): Promise<StudioContext> {\n const cwd = options.cwd ?? process.cwd();\n const registryPath = await resolveStudioRegistryPath({\n ...(options.workspacePath !== undefined ? { workspacePath: options.workspacePath } : {}),\n cwd,\n });\n const registryRead = await readStudioRegistryFile(registryPath);\n if (!registryRead.ok || registryRead.registry === undefined) {\n throw new Error(registryRead.errors.join(\"; \") || \"invalid studio registry\");\n }\n\n const dbPath = resolveStudioDbPath({\n ...(options.dbPath !== undefined ? { dbPath: options.dbPath } : {}),\n cwd,\n });\n const db = openStudioDb(dbPath);\n const importResult = await importStudioRegistry({\n db,\n registry: registryRead.registry,\n registryPath,\n });\n\n let fileDropResult: FileDropImportResult | undefined;\n if (options.ingestFileDrop === true) {\n fileDropResult = await importFileDropFromRegistry({\n db,\n registryPath,\n registry: registryRead.registry,\n enabled: true,\n ...(options.archiveFileDrop === true ? { archiveAfterImport: true } : {}),\n });\n }\n\n return {\n db,\n dbPath,\n registryPath,\n registry: registryRead.registry,\n importResult,\n ...(fileDropResult !== undefined ? { fileDropResult } : {}),\n projects: importResult.projects,\n };\n}\n\nexport function summarizeProjects(projects: StudioProjectRow[]) {\n return projects.map((project) => ({\n id: project.id,\n label: project.label ?? project.id,\n projectName: project.projectName,\n traceCount: project.traceCount,\n redactionProfile: project.redactionProfile,\n importedAt: project.importedAt,\n }));\n}\n","import { timingSafeEqual } from \"node:crypto\";\n\nconst DEFAULT_INGEST_TOKEN_ENV = \"STUDIO_INGEST_TOKEN\";\n\nexport function resolveIngestTokenEnv(options: {\n tokenEnv?: string;\n registryTokenEnv?: string;\n}): string {\n const envName = options.tokenEnv?.trim() || options.registryTokenEnv?.trim() || DEFAULT_INGEST_TOKEN_ENV;\n if (!/^[A-Z][A-Z0-9_]*$/.test(envName)) {\n throw new Error(\"ingest token env name must be an uppercase identifier\");\n }\n return envName;\n}\n\nexport function resolveIngestToken(envName: string): string | undefined {\n const token = process.env[envName]?.trim();\n return token && token.length > 0 ? token : undefined;\n}\n\nexport function extractIngestTokenFromRequest(headers: {\n authorization?: string | string[] | undefined;\n \"x-agentinspect-token\"?: string | string[] | undefined;\n \"x-agent-inspect-token\"?: string | string[] | undefined;\n}): string | undefined {\n const headerToken =\n firstHeader(headers[\"x-agentinspect-token\"]) ??\n firstHeader(headers[\"x-agent-inspect-token\"]);\n if (headerToken) return headerToken;\n\n const auth = firstHeader(headers.authorization);\n if (auth?.startsWith(\"Bearer \")) {\n const token = auth.slice(\"Bearer \".length).trim();\n return token.length > 0 ? token : undefined;\n }\n return undefined;\n}\n\nfunction firstHeader(value: string | string[] | undefined): string | undefined {\n if (Array.isArray(value)) return value[0]?.trim();\n return value?.trim();\n}\n\nexport function isIngestTokenValid(provided: string | undefined, expected: string | undefined): boolean {\n if (!provided || !expected) return false;\n const providedBuf = Buffer.from(provided);\n const expectedBuf = Buffer.from(expected);\n if (providedBuf.length !== expectedBuf.length) return false;\n return timingSafeEqual(providedBuf, expectedBuf);\n}\n","import { createHash } from \"node:crypto\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\n\nimport type { StudioContext } from \"../context.js\";\nimport { insertIngestFile } from \"../db.js\";\nimport { importStudioRegistry } from \"../import.js\";\nimport type { StudioServerOptions } from \"../types.js\";\nimport {\n buildGitHubArtifactSourceKey,\n resolveImportDirs,\n sanitizeSafeErrorMessage,\n uniqueDestPath,\n} from \"./common.js\";\nimport { assertPathUnderRoot } from \"../path-guards.js\";\nimport {\n extractIngestTokenFromRequest,\n isIngestTokenValid,\n resolveIngestToken,\n resolveIngestTokenEnv,\n} from \"./token.js\";\n\nexport const DEFAULT_HTTP_INGEST_BASE_PATH = \"/api/ingest\";\nexport const HTTP_INGEST_BUNDLE_PATH = \"/api/ingest/bundle\";\nexport const HTTP_INGEST_ARTIFACT_PATH = \"/api/ingest/artifact\";\nexport const DEFAULT_MAX_INGEST_BYTES = 52_428_800;\n\nexport interface HttpIngestConfig {\n enabled: boolean;\n basePath: string;\n tokenEnv: string;\n maxBytes: number;\n}\n\nexport function resolveHttpIngestConfig(\n options: StudioServerOptions,\n registryEnabled?: boolean,\n): HttpIngestConfig {\n const http = options.context?.registry.ingest?.http;\n const enabled = options.ingestHttp === true || registryEnabled === true || http?.enabled === true;\n const basePath = (http?.path ?? DEFAULT_HTTP_INGEST_BASE_PATH).trim() || DEFAULT_HTTP_INGEST_BASE_PATH;\n const tokenEnv = resolveIngestTokenEnv({\n ...(options.ingestTokenEnv !== undefined ? { tokenEnv: options.ingestTokenEnv } : {}),\n ...(http?.tokenEnv !== undefined ? { registryTokenEnv: http.tokenEnv } : {}),\n });\n const maxBytes = http?.maxBytes ?? DEFAULT_MAX_INGEST_BYTES;\n return { enabled, basePath, tokenEnv, maxBytes };\n}\n\nfunction sendJson(res: ServerResponse, status: number, body: unknown): void {\n res.writeHead(status, {\n \"content-type\": \"application/json; charset=utf-8\",\n \"cache-control\": \"no-store\",\n });\n res.end(JSON.stringify(body));\n}\n\nexport async function readBoundedRequestBody(\n req: IncomingMessage,\n maxBytes: number,\n): Promise<Buffer> {\n const chunks: Buffer[] = [];\n let total = 0;\n for await (const chunk of req) {\n const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n total += buf.length;\n if (total > maxBytes) {\n throw new Error(\"request body exceeds size limit\");\n }\n chunks.push(buf);\n }\n return Buffer.concat(chunks);\n}\n\nexport function isHttpIngestRoute(pathname: string, config: HttpIngestConfig): boolean {\n return (\n pathname === HTTP_INGEST_BUNDLE_PATH ||\n pathname === HTTP_INGEST_ARTIFACT_PATH ||\n pathname === `${config.basePath}/bundle` ||\n pathname === `${config.basePath}/artifact`\n );\n}\n\nexport async function handleHttpIngestRequest(\n req: IncomingMessage,\n res: ServerResponse,\n ctx: StudioContext,\n options: StudioServerOptions,\n pathname: string,\n): Promise<boolean> {\n const config = resolveHttpIngestConfig(options, ctx.registry.ingest?.http?.enabled);\n if (!isHttpIngestRoute(pathname, config)) return false;\n\n if (!config.enabled) {\n sendJson(res, 404, { error: \"HTTP ingest is disabled\" });\n return true;\n }\n\n if (req.method !== \"POST\") {\n sendJson(res, 405, { error: \"Method not allowed\" });\n return true;\n }\n\n const expectedToken = resolveIngestToken(config.tokenEnv);\n const providedToken = extractIngestTokenFromRequest(req.headers);\n if (!isIngestTokenValid(providedToken, expectedToken)) {\n sendJson(res, 403, { error: \"Invalid or missing ingest token\" });\n return true;\n }\n\n let body: Buffer;\n try {\n body = await readBoundedRequestBody(req, config.maxBytes);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const status = message.includes(\"size limit\") ? 413 : 400;\n sendJson(res, status, { error: sanitizeSafeErrorMessage(message, expectedToken) });\n return true;\n }\n\n if (body.length === 0) {\n sendJson(res, 400, { error: \"Empty request body\" });\n return true;\n }\n\n try {\n const isBundle =\n pathname === HTTP_INGEST_BUNDLE_PATH || pathname === `${config.basePath}/bundle`;\n const isArtifact =\n pathname === HTTP_INGEST_ARTIFACT_PATH || pathname === `${config.basePath}/artifact`;\n if (!isBundle && !isArtifact) {\n sendJson(res, 404, { error: \"Unknown ingest route\" });\n return true;\n }\n\n const dirs = resolveImportDirs(ctx.registryPath, ctx.registry);\n const contentHash = createHash(\"sha256\").update(body).digest(\"hex\");\n const importedAt = new Date().toISOString();\n const fileName = isBundle ? `http-bundle-${contentHash.slice(0, 8)}.bin` : `http-artifact-${contentHash.slice(0, 8)}.zip`;\n const destDir = isBundle ? dirs.bundlesDir : dirs.ciArtifactsDir;\n const destPath = uniqueDestPath(destDir, fileName, contentHash);\n assertPathUnderRoot(destPath, dirs.registryDir);\n\n await mkdir(destDir, { recursive: true });\n await writeFile(destPath, body);\n\n const sourceKey = isBundle\n ? `http:bundle:${contentHash}`\n : buildGitHubArtifactSourceKey({\n owner: \"http\",\n repo: \"ingest\",\n runId: importedAt,\n artifactName: fileName,\n });\n\n insertIngestFile(ctx.db, {\n sourceKey,\n sourceName: fileName,\n destPath,\n kind: isBundle ? \"bundle\" : \"ci\",\n contentHash,\n importedAt,\n });\n\n const registryImport = await importStudioRegistry({\n db: ctx.db,\n registry: ctx.registry,\n registryPath: ctx.registryPath,\n });\n\n sendJson(res, 200, {\n ok: true,\n imported: true,\n kind: isBundle ? \"bundle\" : \"artifact\",\n destPath,\n warnings: registryImport.warnings,\n });\n return true;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n sendJson(res, 500, { error: sanitizeSafeErrorMessage(message, expectedToken) });\n return true;\n }\n}\n","export const studioIndexHtml = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta http-equiv=\"Content-Security-Policy\" content=\"default-src 'self'; style-src 'unsafe-inline'; script-src 'unsafe-inline'\" />\n <title>AgentInspect Studio</title>\n <style>\n body { font-family: system-ui, sans-serif; margin: 0; line-height: 1.4; color: #111; }\n header { padding: 1rem 1.5rem; border-bottom: 1px solid #ddd; background: #fafafa; }\n nav a { margin-right: 1rem; color: #0b57d0; text-decoration: none; }\n nav a.active { font-weight: 600; text-decoration: underline; }\n main { padding: 1.5rem; max-width: 1100px; }\n .muted { color: #666; }\n table { border-collapse: collapse; width: 100%; margin: 1rem 0; }\n th, td { border: 1px solid #ddd; padding: 0.5rem; text-align: left; vertical-align: top; }\n th { background: #f6f6f6; }\n pre { background: #f4f4f5; padding: 1rem; overflow: auto; max-height: 60vh; }\n .error { color: #b42318; }\n </style>\n</head>\n<body>\n <header>\n <h1>AgentInspect Studio</h1>\n <p class=\"muted\">Self-hosted, read-only. SQLite only. JSONL remains canonical.</p>\n <nav id=\"nav\">\n <a href=\"#projects\" data-page=\"projects\">Projects</a>\n <a href=\"#runs\" data-page=\"runs\">Runs</a>\n <a href=\"#sessions\" data-page=\"sessions\">Sessions</a>\n <a href=\"#suites\" data-page=\"suites\">Suites</a>\n <a href=\"#safety\" data-page=\"safety\">Safety</a>\n <a href=\"#imports\" data-page=\"imports\">Imports</a>\n <a href=\"#search\" data-page=\"search\">Search</a>\n </nav>\n </header>\n <main id=\"content\"><p class=\"muted\">Loading…</p></main>\n <script>\n function escapeHtml(value) {\n return String(value ?? \"\")\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll('\"', \""\")\n .replaceAll(\"'\", \"'\");\n }\n\n let state = { projects: [], projectId: null };\n\n async function api(path) {\n const res = await fetch(path);\n const data = await res.json();\n if (!res.ok) throw new Error(data.error || res.statusText);\n return data;\n }\n\n function setPage(page) {\n document.querySelectorAll(\"#nav a\").forEach((a) => {\n a.classList.toggle(\"active\", a.dataset.page === page);\n });\n }\n\n function renderProjects() {\n setPage(\"projects\");\n const rows = state.projects.map((p) =>\n '<tr><td><a href=\"#runs\" data-select-project=\"' + escapeHtml(p.id) + '\">' +\n escapeHtml(p.label || p.id) + '</a></td><td>' + escapeHtml(p.traceCount) +\n '</td><td>' + escapeHtml(p.path) + '</td></tr>'\n ).join(\"\");\n document.getElementById(\"content\").innerHTML =\n '<h2>Projects</h2><table><thead><tr><th>Project</th><th>Runs</th><th>Path</th></tr></thead><tbody>' +\n (rows || '<tr><td colspan=\"3\">No projects imported</td></tr>') + '</tbody></table>';\n document.querySelectorAll(\"[data-select-project]\").forEach((el) => {\n el.addEventListener(\"click\", (ev) => {\n ev.preventDefault();\n state.projectId = el.getAttribute(\"data-select-project\");\n location.hash = \"runs\";\n renderRuns();\n });\n });\n }\n\n async function renderRuns() {\n setPage(\"runs\");\n if (!state.projectId && state.projects[0]) state.projectId = state.projects[0].id;\n if (!state.projectId) {\n document.getElementById(\"content\").innerHTML = '<p>Select a project first.</p>';\n return;\n }\n const data = await api(\"/api/projects/\" + encodeURIComponent(state.projectId) + \"/runs\");\n const rows = (data.runs || []).map((r) =>\n '<tr><td>' + escapeHtml(r.runId) + '</td><td>' + escapeHtml(r.status) +\n '</td><td>' + escapeHtml(r.name) + '</td><td>' + escapeHtml(r.durationMs) + '</td></tr>'\n ).join(\"\");\n document.getElementById(\"content\").innerHTML =\n '<h2>Runs — ' + escapeHtml(state.projectId) + '</h2>' +\n '<table><thead><tr><th>Run ID</th><th>Status</th><th>Name</th><th>Duration ms</th></tr></thead><tbody>' +\n rows + '</tbody></table>';\n }\n\n async function renderSimple(title, path) {\n setPage(title.toLowerCase());\n if (!state.projectId && state.projects[0]) state.projectId = state.projects[0].id;\n const data = await api(\"/api/projects/\" + encodeURIComponent(state.projectId) + \"/\" + path);\n document.getElementById(\"content\").innerHTML =\n '<h2>' + escapeHtml(title) + '</h2><pre>' + escapeHtml(JSON.stringify(data, null, 2)) + '</pre>';\n }\n\n async function renderImports() {\n setPage(\"imports\");\n const health = await api(\"/api/health\");\n document.getElementById(\"content\").innerHTML =\n '<h2>Imports</h2><p>Registry: ' + escapeHtml(health.registryName) + '</p>' +\n '<pre>' + escapeHtml(JSON.stringify(health.warnings || [], null, 2)) + '</pre>';\n }\n\n async function renderSearch() {\n setPage(\"search\");\n if (!state.projectId && state.projects[0]) state.projectId = state.projects[0].id;\n document.getElementById(\"content\").innerHTML =\n '<h2>Search</h2><p><input id=\"q\" placeholder=\"run id or name\" /> <button id=\"go\">Search</button></p><pre id=\"out\"></pre>';\n document.getElementById(\"go\").onclick = async () => {\n const q = document.getElementById(\"q\").value;\n const data = await api(\"/api/search?projectId=\" + encodeURIComponent(state.projectId) + \"&q=\" + encodeURIComponent(q));\n document.getElementById(\"out\").textContent = JSON.stringify(data, null, 2);\n };\n }\n\n async function boot() {\n const health = await api(\"/api/health\");\n const projects = await api(\"/api/projects\");\n state.projects = projects.projects || health.projects || [];\n const page = (location.hash || \"#projects\").slice(1);\n if (page === \"runs\") return renderRuns();\n if (page === \"sessions\") return renderSimple(\"Sessions\", \"sessions\");\n if (page === \"suites\") return renderSimple(\"Suites\", \"suites\");\n if (page === \"safety\") return renderSimple(\"Safety\", \"redaction\");\n if (page === \"imports\") return renderImports();\n if (page === \"search\") return renderSearch();\n return renderProjects();\n }\n\n window.addEventListener(\"hashchange\", () => boot().catch(showError));\n function showError(err) {\n document.getElementById(\"content\").innerHTML = '<p class=\"error\">' + escapeHtml(String(err)) + '</p>';\n }\n boot().catch(showError);\n </script>\n</body>\n</html>`;\n","import { readdir, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type Database from \"better-sqlite3\";\nimport {\n TraceDirectory,\n buildRunTimeline,\n buildSessionIndex,\n extractOutcomesFromTraceEvents,\n loadSessionRunRecords,\n loadTraceMetadataList,\n resolveTraceDir,\n runSuite,\n searchTraces,\n} from \"agent-inspect/advanced\";\nimport { createRunStatusRule, runTraceChecks } from \"agent-inspect/checks\";\nimport { diffRuns, manualTraceEventsToComparableRun } from \"agent-inspect/diff\";\nimport { persistedInspectEventsToTraceEvents } from \"agent-inspect/persisted\";\nimport { openTrace } from \"agent-inspect/readers\";\nimport {\n readWorkspaceManifestFile,\n resolveWorkspaceLocation,\n} from \"agent-inspect/workspace\";\n\nimport { getStudioProject, listProjectRuns, searchProjectRuns } from \"./db.js\";\nimport type { ImportedStudioProject } from \"./import.js\";\n\nexport interface StudioProjectContext {\n project: ImportedStudioProject;\n}\n\nexport function getImportedProject(\n db: Database.Database,\n projects: ImportedStudioProject[],\n projectId: string,\n): StudioProjectContext | undefined {\n const cached = projects.find((item) => item.id === projectId);\n if (cached) return { project: cached };\n const row = getStudioProject(db, projectId);\n if (!row) return undefined;\n return {\n project: {\n ...row,\n suiteConfigPaths: [],\n },\n };\n}\n\nasync function loadTraceDirMetas(workspaceDir: string, traceDirs: string[]) {\n const metas = [];\n for (const rel of traceDirs) {\n const traceDir = resolveTraceDir({ dir: path.join(workspaceDir, rel) });\n const td = new TraceDirectory({ dir: traceDir });\n const files = await td.list();\n const listed = await loadTraceMetadataList(traceDir, files, (fileName) =>\n td.getPath(fileName),\n );\n metas.push(...listed);\n }\n return metas;\n}\n\nexport async function loadProjectRunsView(\n ctx: StudioProjectContext,\n db: Database.Database,\n limit = 200,\n) {\n return listProjectRuns(db, ctx.project.id, limit);\n}\n\nexport async function loadProjectSessionsView(ctx: StudioProjectContext) {\n const location = resolveWorkspaceLocation(ctx.project.path);\n const manifestRead = await readWorkspaceManifestFile(location);\n const traceDirs = manifestRead.manifest?.traceDirs ?? [\"runs\"];\n const metas = await loadTraceDirMetas(ctx.project.workspaceDir, traceDirs);\n const runs = await loadSessionRunRecords(metas);\n return buildSessionIndex(runs, { correlateByGroupId: true });\n}\n\nexport async function loadProjectSuitesView(ctx: StudioProjectContext) {\n const suites = [];\n for (const configPath of ctx.project.suiteConfigPaths) {\n try {\n const result = await runSuite({\n configPath,\n cwd: path.dirname(configPath),\n });\n suites.push({\n suiteName: result.suiteName,\n configPath: result.configPath,\n ok: result.ok,\n status: result.status,\n summary: result.summary,\n cases: result.cases.map((item) => ({\n id: item.id,\n status: item.status,\n ...(item.runId !== undefined ? { runId: item.runId } : {}),\n ...(item.message !== undefined ? { message: item.message } : {}),\n })),\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n suites.push({\n suiteName: path.basename(configPath),\n configPath,\n ok: false,\n status: \"error\" as const,\n summary: { total: 0, passed: 0, failed: 0, skipped: 0 },\n cases: [],\n error: message,\n });\n }\n }\n return { suites };\n}\n\nexport async function loadProjectChecksView(ctx: StudioProjectContext) {\n const metas = await loadTraceDirMetas(ctx.project.workspaceDir, [\"runs\"]);\n const results = [];\n for (const meta of metas.slice(0, 20)) {\n try {\n const read = await openTrace({ type: \"file\", path: meta.filePath });\n const result = runTraceChecks(\n { read },\n { rules: [createRunStatusRule()], select: [\"run.status\"], runId: meta.runId },\n );\n results.push({\n runId: meta.runId,\n ok: result.ok,\n summary: result.summary,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n results.push({ runId: meta.runId, ok: false, error: message });\n }\n }\n return { checks: results };\n}\n\nexport async function loadProjectSearchView(\n ctx: StudioProjectContext,\n db: Database.Database,\n params: URLSearchParams,\n) {\n const q = params.get(\"q\")?.trim() ?? \"\";\n if (q) {\n return {\n query: q,\n results: searchProjectRuns(\n db,\n ctx.project.id,\n q,\n Number(params.get(\"limit\") ?? 50),\n ),\n };\n }\n const metas = await loadTraceDirMetas(ctx.project.workspaceDir, [\"runs\"]);\n const traceDir = resolveTraceDir({\n dir: path.join(ctx.project.workspaceDir, \"runs\"),\n });\n const results = await searchTraces(metas, {\n traceDir,\n ...(params.get(\"status\")\n ? { status: params.get(\"status\") as \"success\" | \"error\" | \"running\" | \"unknown\" }\n : {}),\n ...(params.get(\"name\") ? { name: params.get(\"name\") ?? undefined } : {}),\n ...(params.get(\"tool\") ? { tool: params.get(\"tool\") ?? undefined } : {}),\n limit: Number(params.get(\"limit\") ?? 50),\n });\n return { query: q, results };\n}\n\nexport async function loadProjectDiffView(\n ctx: StudioProjectContext,\n params: URLSearchParams,\n) {\n const leftRunId = params.get(\"left\");\n const rightRunId = params.get(\"right\");\n if (!leftRunId || !rightRunId) {\n throw new Error(\"left and right run ids are required.\");\n }\n const metas = await loadTraceDirMetas(ctx.project.workspaceDir, [\"runs\"]);\n const leftMeta = metas.find((item) => item.runId === leftRunId);\n const rightMeta = metas.find((item) => item.runId === rightRunId);\n if (!leftMeta || !rightMeta) {\n throw new Error(\"One or both runs were not found in the project workspace.\");\n }\n const leftRead = await openTrace({ type: \"file\", path: leftMeta.filePath });\n const rightRead = await openTrace({ type: \"file\", path: rightMeta.filePath });\n const diff = diffRuns(\n manualTraceEventsToComparableRun(\n persistedInspectEventsToTraceEvents(leftRead.events),\n ),\n manualTraceEventsToComparableRun(\n persistedInspectEventsToTraceEvents(rightRead.events),\n ),\n );\n return {\n leftRunId,\n rightRunId,\n summary: diff.summary,\n differences: diff.differences.slice(0, 50).map((item) => ({\n kind: item.kind,\n message: item.message,\n })),\n };\n}\n\nexport async function loadProjectReportsView(ctx: StudioProjectContext) {\n const reportsDir = path.join(ctx.project.workspaceDir, \"reports\");\n const reports: Array<{ name: string; path: string; sizeBytes: number }> = [];\n try {\n const files = await readdir(reportsDir);\n for (const file of files) {\n const filePath = path.join(reportsDir, file);\n const info = await stat(filePath);\n if (!info.isFile()) continue;\n reports.push({ name: file, path: filePath, sizeBytes: info.size });\n }\n } catch {\n // missing reports dir\n }\n return { reports: reports.sort((a, b) => a.name.localeCompare(b.name)) };\n}\n\nexport async function loadProjectObservationsView(ctx: StudioProjectContext) {\n const metas = await loadTraceDirMetas(ctx.project.workspaceDir, [\"runs\"]);\n const observations = [];\n for (const meta of metas.slice(0, 20)) {\n try {\n const read = await openTrace({ type: \"file\", path: meta.filePath });\n const legacy = persistedInspectEventsToTraceEvents(read.events);\n observations.push({\n runId: meta.runId,\n items: extractOutcomesFromTraceEvents(legacy),\n timeline: buildRunTimeline(legacy, { focus: \"all\" }).entries\n .filter((entry) => entry.type === \"tool\")\n .map((entry) => entry.name),\n });\n } catch {\n observations.push({ runId: meta.runId, items: [], timeline: [] });\n }\n }\n return { observations };\n}\n\nexport async function loadProjectGuardrailsView(ctx: StudioProjectContext) {\n return {\n guardrails: {\n message:\n \"Guardrail evaluation is available via CLI (`agent-inspect scan`). Studio surfaces structural status only in v6.0.\",\n redactionProfile: ctx.project.redactionProfile ?? \"share\",\n circuitWarnings: [],\n },\n };\n}\n\nexport async function loadProjectRedactionView(ctx: StudioProjectContext) {\n return {\n redaction: {\n profile: ctx.project.redactionProfile ?? \"share\",\n hint: \"Structural share-safety posture from workspace.json — not certification.\",\n bundleCommand: `npx agent-inspect bundle <runId> --profile ${ctx.project.redactionProfile ?? \"share\"}`,\n },\n };\n}\n\nexport async function loadBundleExportView(\n ctx: StudioProjectContext,\n params: URLSearchParams,\n) {\n const runId = params.get(\"runId\");\n if (!runId) {\n throw new Error(\"runId query parameter is required.\");\n }\n return {\n projectId: ctx.project.id,\n runId,\n readOnly: true,\n redactionProfile: ctx.project.redactionProfile ?? \"share\",\n cliHint: `npx agent-inspect bundle ${runId} --profile ${ctx.project.redactionProfile ?? \"share\"} --dir ${path.join(ctx.project.workspaceDir, \"runs\")}`,\n note: \"Studio does not mutate traces or upload bundles. Run the CLI locally to assemble a share-safe bundle.\",\n };\n}\n","import type { IncomingMessage } from \"node:http\";\n\nimport type { StudioServerOptions } from \"./types.js\";\n\nexport type StudioAuthMode = \"none\" | \"basic\";\n\nexport function resolveStudioAuthMode(options: StudioServerOptions): StudioAuthMode {\n return options.auth === \"basic\" ? \"basic\" : \"none\";\n}\n\nexport function resolveStudioPassword(options: StudioServerOptions): string | undefined {\n if (!options.passwordEnv) return undefined;\n const value = process.env[options.passwordEnv]?.trim();\n return value && value.length > 0 ? value : undefined;\n}\n\nfunction parseBasicAuth(header: string | undefined): string | undefined {\n if (!header || !header.startsWith(\"Basic \")) return undefined;\n try {\n const decoded = Buffer.from(header.slice(6), \"base64\").toString(\"utf8\");\n const separator = decoded.indexOf(\":\");\n if (separator < 0) return undefined;\n return decoded.slice(separator + 1);\n } catch {\n return undefined;\n }\n}\n\nexport function isStudioRequestAuthorized(\n req: IncomingMessage,\n options: StudioServerOptions,\n): boolean {\n const mode = resolveStudioAuthMode(options);\n if (mode === \"none\") return true;\n const expected = resolveStudioPassword(options);\n if (!expected) return false;\n const provided = parseBasicAuth(req.headers.authorization);\n return provided === expected;\n}\n\nexport function studioAuthRequiredResponse(): {\n status: number;\n body: { error: string };\n headers: Record<string, string>;\n} {\n return {\n status: 401,\n body: { error: \"Unauthorized\" },\n headers: {\n \"www-authenticate\": 'Basic realm=\"AgentInspect Studio\"',\n },\n };\n}\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\n\nimport {\n getImportedProject,\n loadBundleExportView,\n loadProjectChecksView,\n loadProjectDiffView,\n loadProjectGuardrailsView,\n loadProjectObservationsView,\n loadProjectRedactionView,\n loadProjectReportsView,\n loadProjectRunsView,\n loadProjectSearchView,\n loadProjectSessionsView,\n loadProjectSuitesView,\n} from \"./project-data.js\";\nimport { summarizeProjects, type StudioContext } from \"./context.js\";\nimport type { StudioServerOptions } from \"./types.js\";\nimport { isStudioRequestAuthorized, studioAuthRequiredResponse } from \"./auth.js\";\n\nfunction sendJson(\n res: ServerResponse,\n status: number,\n body: unknown,\n headers: Record<string, string> = {},\n): void {\n const payload = JSON.stringify(body);\n res.writeHead(status, {\n \"content-type\": \"application/json; charset=utf-8\",\n \"cache-control\": \"no-store\",\n ...headers,\n });\n res.end(payload);\n}\n\nfunction notFound(res: ServerResponse, message: string): void {\n sendJson(res, 404, { error: message });\n}\n\nfunction decodeSegment(segment: string | undefined): string {\n if (!segment) return \"\";\n try {\n return decodeURIComponent(segment);\n } catch {\n return segment;\n }\n}\n\nexport async function handleStudioRoute(\n req: IncomingMessage,\n res: ServerResponse,\n ctx: StudioContext,\n options: StudioServerOptions,\n pathname: string,\n url: URL,\n): Promise<boolean> {\n if (!isStudioRequestAuthorized(req, options)) {\n const auth = studioAuthRequiredResponse();\n sendJson(res, auth.status, auth.body, auth.headers);\n return true;\n }\n\n if (pathname === \"/api/health\") {\n sendJson(res, 200, {\n ok: true,\n readOnly: true,\n mode: \"studio\",\n registryName: ctx.registry.name,\n registryPath: ctx.registryPath,\n dbPath: ctx.dbPath,\n projects: summarizeProjects(ctx.projects),\n warnings: ctx.importResult.warnings,\n });\n return true;\n }\n\n if (pathname === \"/api/projects\") {\n sendJson(res, 200, {\n registryName: ctx.registry.name,\n projects: summarizeProjects(ctx.projects),\n warnings: ctx.importResult.warnings,\n });\n return true;\n }\n\n const projectMatch = pathname.match(/^\\/api\\/projects\\/([^/]+)(?:\\/(.*))?$/);\n if (projectMatch) {\n const projectId = decodeSegment(projectMatch[1]);\n const subpath = projectMatch[2] ?? \"\";\n const projectCtx = getImportedProject(ctx.db, ctx.projects, projectId);\n if (!projectCtx) {\n notFound(res, `Project not found: ${projectId}`);\n return true;\n }\n\n if (subpath === \"runs\" || subpath === \"\") {\n sendJson(res, 200, {\n projectId,\n runs: await loadProjectRunsView(projectCtx, ctx.db),\n });\n return true;\n }\n if (subpath === \"sessions\") {\n sendJson(res, 200, {\n projectId,\n ...(await loadProjectSessionsView(projectCtx)),\n });\n return true;\n }\n if (subpath === \"suites\") {\n sendJson(res, 200, {\n projectId,\n ...(await loadProjectSuitesView(projectCtx)),\n });\n return true;\n }\n if (subpath === \"checks\") {\n sendJson(res, 200, {\n projectId,\n ...(await loadProjectChecksView(projectCtx)),\n });\n return true;\n }\n if (subpath === \"observations\") {\n sendJson(res, 200, {\n projectId,\n ...(await loadProjectObservationsView(projectCtx)),\n });\n return true;\n }\n if (subpath === \"guardrails\") {\n sendJson(res, 200, {\n projectId,\n ...(await loadProjectGuardrailsView(projectCtx)),\n });\n return true;\n }\n if (subpath === \"redaction\") {\n sendJson(res, 200, {\n projectId,\n ...(await loadProjectRedactionView(projectCtx)),\n });\n return true;\n }\n if (subpath === \"reports\") {\n sendJson(res, 200, {\n projectId,\n ...(await loadProjectReportsView(projectCtx)),\n });\n return true;\n }\n\n notFound(res, `Unknown project route: /${subpath}`);\n return true;\n }\n\n if (pathname === \"/api/search\") {\n const projectId = url.searchParams.get(\"projectId\");\n if (!projectId) {\n sendJson(res, 400, { error: \"projectId query parameter is required.\" });\n return true;\n }\n const projectCtx = getImportedProject(ctx.db, ctx.projects, projectId);\n if (!projectCtx) {\n notFound(res, `Project not found: ${projectId}`);\n return true;\n }\n sendJson(res, 200, {\n projectId,\n ...(await loadProjectSearchView(projectCtx, ctx.db, url.searchParams)),\n });\n return true;\n }\n\n if (pathname === \"/api/diff\") {\n const projectId = url.searchParams.get(\"projectId\");\n if (!projectId) {\n sendJson(res, 400, { error: \"projectId query parameter is required.\" });\n return true;\n }\n const projectCtx = getImportedProject(ctx.db, ctx.projects, projectId);\n if (!projectCtx) {\n notFound(res, `Project not found: ${projectId}`);\n return true;\n }\n try {\n sendJson(res, 200, {\n projectId,\n ...(await loadProjectDiffView(projectCtx, url.searchParams)),\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n sendJson(res, 400, { error: message });\n }\n return true;\n }\n\n if (pathname === \"/api/reports\") {\n const projectId = url.searchParams.get(\"projectId\");\n if (!projectId) {\n sendJson(res, 400, { error: \"projectId query parameter is required.\" });\n return true;\n }\n const projectCtx = getImportedProject(ctx.db, ctx.projects, projectId);\n if (!projectCtx) {\n notFound(res, `Project not found: ${projectId}`);\n return true;\n }\n sendJson(res, 200, {\n projectId,\n ...(await loadProjectReportsView(projectCtx)),\n });\n return true;\n }\n\n if (pathname === \"/api/bundles/export\") {\n const projectId = url.searchParams.get(\"projectId\");\n if (!projectId) {\n sendJson(res, 400, { error: \"projectId query parameter is required.\" });\n return true;\n }\n const projectCtx = getImportedProject(ctx.db, ctx.projects, projectId);\n if (!projectCtx) {\n notFound(res, `Project not found: ${projectId}`);\n return true;\n }\n try {\n sendJson(res, 200, await loadBundleExportView(projectCtx, url.searchParams));\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n sendJson(res, 400, { error: message });\n }\n return true;\n }\n\n return false;\n}\n","import { createServer, type Server, type ServerResponse } from \"node:http\";\n\nimport { createStudioContext, type StudioContext } from \"./context.js\";\nimport { handleHttpIngestRequest, isHttpIngestRoute, resolveHttpIngestConfig } from \"./ingest/http.js\";\nimport { studioIndexHtml } from \"./html.js\";\nimport { handleStudioRoute } from \"./routes.js\";\nimport type { StudioServerInfo, StudioServerOptions } from \"./types.js\";\n\nconst DEFAULT_HOST = \"127.0.0.1\";\nconst DEFAULT_PORT = 7340;\n\nfunction badRequest(res: ServerResponse, message: string): void {\n res.writeHead(400, {\n \"content-type\": \"application/json; charset=utf-8\",\n \"cache-control\": \"no-store\",\n });\n res.end(JSON.stringify({ error: message }));\n}\n\nfunction resolveHost(options: StudioServerOptions): string {\n if (options.server === true) {\n return options.host ?? \"0.0.0.0\";\n }\n return options.host ?? DEFAULT_HOST;\n}\n\nexport function createStudioServer(options: StudioServerOptions = {}): Server {\n const host = resolveHost(options);\n const port = options.port ?? DEFAULT_PORT;\n let contextPromise: Promise<StudioContext> | undefined = options.context\n ? Promise.resolve(options.context)\n : undefined;\n\n if (host === \"0.0.0.0\") {\n console.warn(\n \"[AgentInspect studio] Binding to 0.0.0.0 exposes workspace evidence on the network. Use 127.0.0.1 unless you accept that risk.\",\n );\n if (options.auth !== \"basic\") {\n console.warn(\n \"[AgentInspect studio] Non-localhost binding without --auth basic is discouraged for production use.\",\n );\n }\n }\n\n const server = createServer(async (req, res) => {\n try {\n const method = req.method ?? \"GET\";\n const url = new URL(req.url ?? \"/\", `http://${host}:${port}`);\n const pathname = url.pathname;\n\n if (!contextPromise) {\n contextPromise = createStudioContext(options);\n }\n const ctx = await contextPromise;\n const httpConfig = resolveHttpIngestConfig(options, ctx.registry.ingest?.http?.enabled);\n\n if (isHttpIngestRoute(pathname, httpConfig)) {\n const handled = await handleHttpIngestRequest(req, res, ctx, options, pathname);\n if (handled) return;\n }\n\n if (method !== \"GET\" && method !== \"HEAD\") {\n return badRequest(res, \"Only GET is supported.\");\n }\n\n if (pathname === \"/\" || pathname === \"/index.html\") {\n if (req.method === \"HEAD\") {\n res.writeHead(200, { \"content-type\": \"text/html; charset=utf-8\" });\n res.end();\n return;\n }\n res.writeHead(200, { \"content-type\": \"text/html; charset=utf-8\" });\n res.end(studioIndexHtml);\n return;\n }\n\n const handled = await handleStudioRoute(req, res, ctx, options, pathname, url);\n if (!handled) {\n res.writeHead(404, {\n \"content-type\": \"application/json; charset=utf-8\",\n \"cache-control\": \"no-store\",\n });\n res.end(JSON.stringify({ error: `Unknown route: ${pathname}` }));\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n res.writeHead(500, {\n \"content-type\": \"application/json; charset=utf-8\",\n \"cache-control\": \"no-store\",\n });\n res.end(JSON.stringify({ error: message }));\n }\n });\n\n return server;\n}\n\nexport async function startStudioServer(\n options: StudioServerOptions = {},\n): Promise<StudioServerInfo> {\n const host = resolveHost(options);\n const port = options.port ?? DEFAULT_PORT;\n const ctx = options.context ?? (await createStudioContext(options));\n const server = createStudioServer({ ...options, context: ctx });\n\n return new Promise((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(port, host, () => {\n const address = server.address();\n const resolvedPort =\n typeof address === \"object\" && address ? address.port : port;\n resolve({\n host,\n port: resolvedPort,\n url: `http://${host === \"0.0.0.0\" ? \"127.0.0.1\" : host}:${resolvedPort}/`,\n mode: \"studio\",\n ...(options.workspacePath !== undefined\n ? { workspacePath: options.workspacePath }\n : {}),\n dbPath: ctx.dbPath,\n registryName: ctx.registry.name,\n projectCount: ctx.projects.length,\n });\n });\n });\n}\n","import { createHash } from \"node:crypto\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\n\nimport type Database from \"better-sqlite3\";\n\nimport {\n findIngestFileBySourceKey,\n insertIngestFile,\n openStudioDb,\n resolveStudioDbPath,\n type IngestFileKind,\n} from \"../db.js\";\nimport { importStudioRegistry } from \"../import.js\";\nimport { assertPathUnderRoot } from \"../path-guards.js\";\nimport { readStudioRegistryFile, type StudioRegistry } from \"../registry.js\";\nimport { resolveStudioRegistryPath } from \"../registry-path.js\";\nimport {\n buildGitHubArtifactSourceKey,\n parseGitHubRepo,\n resolveImportDirs,\n sanitizeSafeErrorMessage,\n uniqueDestPath,\n} from \"./common.js\";\n\nconst DEFAULT_GITHUB_TOKEN_ENV = \"GITHUB_TOKEN\";\nconst GITHUB_API_BASE = \"https://api.github.com\";\nconst MAX_ARTIFACT_BYTES = 52_428_800;\n\nexport type StudioFetch = typeof fetch;\n\nexport interface GitHubArtifactImportOptions {\n db: Database.Database;\n registryPath: string;\n registry: StudioRegistry;\n repo: string;\n runId: string;\n artifactName: string;\n /** Explicit opt-in required — disabled by default. */\n enabled: boolean;\n tokenEnv?: string;\n fetchImpl?: StudioFetch;\n}\n\nexport interface GitHubArtifactImportResult {\n skipped: boolean;\n reason?: string;\n imported: boolean;\n destPath?: string;\n sourceKey?: string;\n contentHash?: string;\n registryImportWarnings: string[];\n errors: string[];\n}\n\ninterface GitHubArtifactsResponse {\n artifacts?: Array<{\n id?: number;\n name?: string;\n archive_download_url?: string;\n expired?: boolean;\n size_in_bytes?: number;\n }>;\n}\n\nfunction resolveTokenEnv(registry: StudioRegistry, override?: string): string {\n const fromRegistry = registry.ingest?.github?.tokenEnv?.trim();\n const envName = override?.trim() || fromRegistry || DEFAULT_GITHUB_TOKEN_ENV;\n if (!/^[A-Z][A-Z0-9_]*$/.test(envName)) {\n throw new Error(\"token env name must be an uppercase identifier\");\n }\n return envName;\n}\n\nfunction resolveToken(envName: string): string {\n const token = process.env[envName]?.trim();\n if (!token) {\n throw new Error(`missing GitHub token in environment variable ${envName}`);\n }\n return token;\n}\n\nfunction githubHeaders(token: string): Record<string, string> {\n return {\n Authorization: `Bearer ${token}`,\n Accept: \"application/vnd.github+json\",\n \"X-GitHub-Api-Version\": \"2022-11-28\",\n \"User-Agent\": \"agent-inspect-studio-ingest\",\n };\n}\n\nasync function readResponseBody(\n response: Response,\n maxBytes: number,\n): Promise<Buffer> {\n const lengthHeader = response.headers.get(\"content-length\");\n if (lengthHeader) {\n const length = Number(lengthHeader);\n if (Number.isFinite(length) && length > maxBytes) {\n throw new Error(\"artifact exceeds size limit\");\n }\n }\n const arrayBuffer = await response.arrayBuffer();\n if (arrayBuffer.byteLength > maxBytes) {\n throw new Error(\"artifact exceeds size limit\");\n }\n return Buffer.from(arrayBuffer);\n}\n\nexport async function downloadGitHubArtifactArchive(options: {\n repo: string;\n runId: string;\n artifactName: string;\n token: string;\n fetchImpl?: StudioFetch;\n}): Promise<Buffer> {\n const fetchFn = options.fetchImpl ?? fetch;\n const { owner, name } = parseGitHubRepo(options.repo);\n const runId = options.runId.trim();\n const artifactName = options.artifactName.trim();\n if (!/^\\d+$/.test(runId)) {\n throw new Error(\"run-id must be a numeric workflow run id\");\n }\n if (artifactName === \"\") {\n throw new Error(\"artifact name must be non-empty\");\n }\n\n const listUrl = `${GITHUB_API_BASE}/repos/${owner}/${name}/actions/runs/${runId}/artifacts`;\n const listResponse = await fetchFn(listUrl, {\n headers: githubHeaders(options.token),\n });\n if (!listResponse.ok) {\n throw new Error(`GitHub artifact lookup failed (${listResponse.status})`);\n }\n\n const payload = (await listResponse.json()) as GitHubArtifactsResponse;\n const artifact = payload.artifacts?.find((item) => item.name === artifactName);\n if (!artifact?.archive_download_url) {\n throw new Error(`artifact not found for run ${runId}: ${artifactName}`);\n }\n if (artifact.expired === true) {\n throw new Error(`artifact expired for run ${runId}: ${artifactName}`);\n }\n if (\n typeof artifact.size_in_bytes === \"number\" &&\n artifact.size_in_bytes > MAX_ARTIFACT_BYTES\n ) {\n throw new Error(\"artifact exceeds size limit\");\n }\n\n const downloadResponse = await fetchFn(artifact.archive_download_url, {\n headers: githubHeaders(options.token),\n redirect: \"follow\",\n });\n if (!downloadResponse.ok) {\n throw new Error(`GitHub artifact download failed (${downloadResponse.status})`);\n }\n\n return readResponseBody(downloadResponse, MAX_ARTIFACT_BYTES);\n}\n\nexport async function importGitHubArtifact(\n options: GitHubArtifactImportOptions,\n): Promise<GitHubArtifactImportResult> {\n const registryImportWarnings: string[] = [];\n const errors: string[] = [];\n\n if (!options.enabled) {\n return {\n skipped: true,\n reason: \"GitHub artifact ingest is disabled; use studio import github explicitly\",\n imported: false,\n registryImportWarnings,\n errors,\n };\n }\n\n let token: string | undefined;\n let tokenEnv: string | undefined;\n try {\n const { owner, name } = parseGitHubRepo(options.repo);\n tokenEnv = resolveTokenEnv(options.registry, options.tokenEnv);\n token = resolveToken(tokenEnv);\n const sourceKey = buildGitHubArtifactSourceKey({\n owner,\n repo: name,\n runId: options.runId,\n artifactName: options.artifactName,\n });\n\n const archive = await downloadGitHubArtifactArchive({\n repo: options.repo,\n runId: options.runId,\n artifactName: options.artifactName,\n token,\n ...(options.fetchImpl !== undefined ? { fetchImpl: options.fetchImpl } : {}),\n });\n\n const contentHash = createHash(\"sha256\").update(archive).digest(\"hex\");\n const existing = findIngestFileBySourceKey(options.db, sourceKey);\n if (existing && existing.contentHash === contentHash) {\n return {\n skipped: false,\n imported: false,\n sourceKey,\n contentHash,\n destPath: existing.destPath,\n registryImportWarnings,\n errors,\n };\n }\n\n const dirs = resolveImportDirs(options.registryPath, options.registry);\n const fileName = `${options.artifactName}.zip`;\n const destPath = uniqueDestPath(dirs.bundlesDir, fileName, contentHash);\n assertPathUnderRoot(destPath, dirs.registryDir);\n\n await mkdir(dirs.bundlesDir, { recursive: true });\n await writeFile(destPath, archive);\n\n const importedAt = new Date().toISOString();\n insertIngestFile(options.db, {\n sourceKey,\n sourceName: fileName,\n destPath,\n kind: \"bundle\" satisfies IngestFileKind,\n contentHash,\n importedAt,\n });\n\n const registryImport = await importStudioRegistry({\n db: options.db,\n registry: options.registry,\n registryPath: options.registryPath,\n });\n registryImportWarnings.push(...registryImport.warnings);\n\n return {\n skipped: false,\n imported: true,\n sourceKey,\n contentHash,\n destPath,\n registryImportWarnings,\n errors,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n errors.push(sanitizeSafeErrorMessage(message, token));\n return {\n skipped: false,\n imported: false,\n registryImportWarnings,\n errors,\n };\n }\n}\n\nexport async function runStudioGitHubArtifactImport(options: {\n workspacePath?: string;\n dbPath?: string;\n cwd?: string;\n repo: string;\n runId: string;\n artifact: string;\n tokenEnv?: string;\n fetchImpl?: StudioFetch;\n}): Promise<GitHubArtifactImportResult> {\n const cwd = options.cwd ?? process.cwd();\n const registryPath = await resolveStudioRegistryPath({\n ...(options.workspacePath !== undefined ? { workspacePath: options.workspacePath } : {}),\n cwd,\n });\n const registryRead = await readStudioRegistryFile(registryPath);\n if (!registryRead.ok || registryRead.registry === undefined) {\n throw new Error(registryRead.errors.join(\"; \") || \"invalid studio registry\");\n }\n\n const dbPath = resolveStudioDbPath({\n ...(options.dbPath !== undefined ? { dbPath: options.dbPath } : {}),\n cwd,\n });\n const db = openStudioDb(dbPath);\n\n return importGitHubArtifact({\n db,\n registryPath,\n registry: registryRead.registry,\n repo: options.repo,\n runId: options.runId,\n artifactName: options.artifact,\n enabled: true,\n ...(options.tokenEnv !== undefined ? { tokenEnv: options.tokenEnv } : {}),\n ...(options.fetchImpl !== undefined ? { fetchImpl: options.fetchImpl } : {}),\n });\n}\n","import { createHash } from \"node:crypto\";\nimport { access, copyFile, mkdir, readFile, readdir, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type Database from \"better-sqlite3\";\n\nimport {\n findIngestFileBySourceKey,\n insertIngestFile,\n openStudioDb,\n resolveStudioDbPath,\n} from \"../db.js\";\nimport { importStudioRegistry } from \"../import.js\";\nimport { assertPathUnderRoot } from \"../path-guards.js\";\nimport { readStudioRegistryFile } from \"../registry.js\";\nimport { resolveStudioRegistryPath } from \"../registry-path.js\";\nimport { resolveImportDirs, uniqueDestPath } from \"./common.js\";\n\nexport interface BundleUploadImportOptions {\n db: Database.Database;\n registryPath: string;\n registry: import(\"../registry.js\").StudioRegistry;\n bundlePath: string;\n enabled: boolean;\n}\n\nexport interface BundleUploadImportResult {\n skipped: boolean;\n reason?: string;\n imported: boolean;\n destPath?: string;\n sourceKey?: string;\n errors: string[];\n registryImportWarnings: string[];\n}\n\ninterface BundleMetadataShape {\n agentInspectVersion?: string;\n redactionProfile?: string;\n runIds?: string[];\n files?: string[];\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function validateBundleDirectory(bundleDir: string): Promise<string[]> {\n const errors: string[] = [];\n const metadataPath = path.join(bundleDir, \"metadata.json\");\n if (!(await pathExists(metadataPath))) {\n errors.push(\"bundle missing metadata.json\");\n return errors;\n }\n try {\n const raw = await readFile(metadataPath, \"utf8\");\n const parsed = JSON.parse(raw) as BundleMetadataShape;\n if (typeof parsed.agentInspectVersion !== \"string\") {\n errors.push(\"bundle metadata.json missing agentInspectVersion\");\n }\n if (!Array.isArray(parsed.runIds) || parsed.runIds.length === 0) {\n errors.push(\"bundle metadata.json missing runIds\");\n }\n } catch {\n errors.push(\"bundle metadata.json is invalid JSON\");\n }\n return errors;\n}\n\nasync function copyDirectoryRecursive(sourceDir: string, destDir: string): Promise<void> {\n await mkdir(destDir, { recursive: true });\n const entries = await readdir(sourceDir, { withFileTypes: true });\n for (const entry of entries) {\n const from = path.join(sourceDir, entry.name);\n const to = path.join(destDir, entry.name);\n if (entry.isDirectory()) {\n await copyDirectoryRecursive(from, to);\n } else if (entry.isFile()) {\n await copyFile(from, to);\n }\n }\n}\n\nexport async function importBundleUpload(\n options: BundleUploadImportOptions,\n): Promise<BundleUploadImportResult> {\n const registryImportWarnings: string[] = [];\n const errors: string[] = [];\n\n if (!options.enabled) {\n return {\n skipped: true,\n reason: \"bundle upload ingest is disabled; use studio import bundle explicitly\",\n imported: false,\n errors,\n registryImportWarnings,\n };\n }\n\n const bundlePath = path.resolve(options.bundlePath);\n let bundleStat;\n try {\n bundleStat = await stat(bundlePath);\n } catch {\n return {\n skipped: false,\n imported: false,\n errors: [\"bundle path does not exist\"],\n registryImportWarnings,\n };\n }\n\n if (!bundleStat.isDirectory()) {\n return {\n skipped: false,\n imported: false,\n errors: [\"bundle path must be a directory produced by agent-inspect bundle\"],\n registryImportWarnings,\n };\n }\n\n const validationErrors = await validateBundleDirectory(bundlePath);\n if (validationErrors.length > 0) {\n return {\n skipped: false,\n imported: false,\n errors: validationErrors,\n registryImportWarnings,\n };\n }\n\n const metadataRaw = await readFile(path.join(bundlePath, \"metadata.json\"), \"utf8\");\n const contentHash = createHash(\"sha256\").update(metadataRaw).digest(\"hex\");\n const sourceKey = `bundle:${bundlePath}`;\n const existing = findIngestFileBySourceKey(options.db, sourceKey);\n if (existing && existing.contentHash === contentHash) {\n return {\n skipped: false,\n imported: false,\n destPath: existing.destPath,\n sourceKey,\n errors,\n registryImportWarnings,\n };\n }\n\n const dirs = resolveImportDirs(options.registryPath, options.registry);\n const folderName = path.basename(bundlePath);\n const destPath = uniqueDestPath(dirs.bundlesDir, folderName, contentHash);\n assertPathUnderRoot(destPath, dirs.registryDir);\n\n try {\n await copyDirectoryRecursive(bundlePath, destPath);\n insertIngestFile(options.db, {\n sourceKey,\n sourceName: folderName,\n destPath,\n kind: \"bundle\",\n contentHash,\n importedAt: new Date().toISOString(),\n });\n const registryImport = await importStudioRegistry({\n db: options.db,\n registry: options.registry,\n registryPath: options.registryPath,\n });\n registryImportWarnings.push(...registryImport.warnings);\n return {\n skipped: false,\n imported: true,\n destPath,\n sourceKey,\n errors,\n registryImportWarnings,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n skipped: false,\n imported: false,\n errors: [message],\n registryImportWarnings,\n };\n }\n}\n\nexport async function runStudioBundleUploadImport(options: {\n workspacePath?: string;\n dbPath?: string;\n cwd?: string;\n bundlePath: string;\n}): Promise<BundleUploadImportResult> {\n const cwd = options.cwd ?? process.cwd();\n const registryPath = await resolveStudioRegistryPath({\n ...(options.workspacePath !== undefined ? { workspacePath: options.workspacePath } : {}),\n cwd,\n });\n const registryRead = await readStudioRegistryFile(registryPath);\n if (!registryRead.ok || registryRead.registry === undefined) {\n throw new Error(registryRead.errors.join(\"; \") || \"invalid studio registry\");\n }\n const dbPath = resolveStudioDbPath({\n ...(options.dbPath !== undefined ? { dbPath: options.dbPath } : {}),\n cwd,\n });\n const db = openStudioDb(dbPath);\n return importBundleUpload({\n db,\n registryPath,\n registry: registryRead.registry,\n bundlePath: options.bundlePath,\n enabled: true,\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/path-guards.ts","../src/registry.ts","../src/db.ts","../src/import.ts","../src/registry-path.ts","../src/ingest/common.ts","../src/ingest/file-drop.ts","../src/context.ts","../src/ingest/token.ts","../src/ingest/http.ts","../src/html.ts","../src/project-data.ts","../src/auth.ts","../src/routes.ts","../src/server.ts","../src/ingest/github-artifact.ts","../src/ingest/bundle-upload.ts"],"names":["path","readFile","readdir","createHash","mkdir","resolveTraceDir","TraceDirectory","loadTraceMetadataList","resolveWorkspaceLocation","readWorkspaceManifestFile","stat","timingSafeEqual","sendJson","handled","writeFile","access","copyFile"],"mappings":"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","file":"index.mjs","sourcesContent":["import path from \"node:path\";\n\nexport function isSafeRelativePath(p: string): boolean {\n const trimmed = p.trim();\n if (trimmed === \"\" || trimmed.startsWith(\"/\") || trimmed.startsWith(\"\\\\\")) return false;\n if (/^[a-zA-Z]:/.test(trimmed)) return false;\n return !trimmed.split(/[/\\\\]+/).some((seg) => seg === \"..\");\n}\n\nexport function resolveUnderRoot(root: string, ...segments: string[]): string {\n const resolvedRoot = path.resolve(root);\n const resolved = path.resolve(resolvedRoot, ...segments);\n assertPathUnderRoot(resolved, resolvedRoot);\n return resolved;\n}\n\nexport function assertPathUnderRoot(resolved: string, root: string): void {\n const rel = path.relative(path.resolve(root), path.resolve(resolved));\n if (rel.startsWith(\"..\") || path.isAbsolute(rel)) {\n throw new Error(\"path escapes allowed registry root\");\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { isSafeRelativePath } from \"./path-guards.js\";\n\nexport const STUDIO_REGISTRY_SCHEMA_VERSION = \"1.0\" as const;\nexport const STUDIO_REGISTRY_FILENAMES = [\n \"studio-registry.json\",\n \".agent-inspect/studio-registry.json\",\n] as const;\n\nexport interface StudioRegistryProject {\n id: string;\n path: string;\n label?: string;\n suiteConfigs?: string[];\n}\n\nexport interface StudioRegistryImport {\n ciArtifactsDir?: string;\n bundlesDir?: string;\n fileDropDir?: string;\n enabled?: boolean;\n}\n\nexport interface StudioRegistryGitHubIngest {\n enabled?: boolean;\n tokenEnv?: string;\n}\n\nexport interface StudioRegistryHttpIngest {\n enabled?: boolean;\n path?: string;\n tokenEnv?: string;\n maxBytes?: number;\n}\n\nexport interface StudioRegistryBundleUploadIngest {\n enabled?: boolean;\n maxBytes?: number;\n}\n\nexport interface StudioRegistryIngest {\n github?: StudioRegistryGitHubIngest;\n http?: StudioRegistryHttpIngest;\n bundleUpload?: StudioRegistryBundleUploadIngest;\n}\n\nexport interface StudioRegistry {\n schemaVersion: typeof STUDIO_REGISTRY_SCHEMA_VERSION;\n name: string;\n projects: StudioRegistryProject[];\n import?: StudioRegistryImport;\n ingest?: StudioRegistryIngest;\n}\n\nexport interface StudioRegistryParseResult {\n ok: boolean;\n registry?: StudioRegistry;\n errors: string[];\n warnings: string[];\n}\n\nconst MAX_REGISTRY_BYTES = 256 * 1024;\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport { isSafeRelativePath };\n\nexport function parseStudioRegistry(input: unknown): StudioRegistryParseResult {\n const errors: string[] = [];\n if (!isPlainObject(input)) {\n return { ok: false, errors: [\"registry must be a JSON object\"], warnings: [] };\n }\n if (input.schemaVersion !== STUDIO_REGISTRY_SCHEMA_VERSION) {\n errors.push(`schemaVersion must be \"${STUDIO_REGISTRY_SCHEMA_VERSION}\"`);\n }\n if (typeof input.name !== \"string\" || input.name.trim() === \"\") {\n errors.push(\"name must be a non-empty string\");\n }\n if (!Array.isArray(input.projects) || input.projects.length === 0) {\n errors.push(\"projects must be a non-empty array\");\n }\n\n const projects: StudioRegistryProject[] = [];\n if (Array.isArray(input.projects)) {\n for (const [index, item] of input.projects.entries()) {\n if (!isPlainObject(item)) {\n errors.push(`projects[${index}] must be an object`);\n continue;\n }\n const id = typeof item.id === \"string\" ? item.id.trim() : \"\";\n const projectPath = typeof item.path === \"string\" ? item.path.trim() : \"\";\n if (!id) errors.push(`projects[${index}].id must be a non-empty string`);\n if (!projectPath) errors.push(`projects[${index}].path must be a non-empty string`);\n const label = typeof item.label === \"string\" ? item.label.trim() : undefined;\n const suiteConfigs = Array.isArray(item.suiteConfigs)\n ? item.suiteConfigs.filter((value): value is string => typeof value === \"string\")\n : undefined;\n projects.push({\n id,\n path: projectPath,\n ...(label ? { label } : {}),\n ...(suiteConfigs && suiteConfigs.length > 0 ? { suiteConfigs } : {}),\n });\n }\n }\n\n let importConfig: StudioRegistryImport | undefined;\n if (input.import !== undefined) {\n if (!isPlainObject(input.import)) {\n errors.push(\"import must be an object\");\n } else {\n importConfig = {};\n if (input.import.ciArtifactsDir !== undefined) {\n const dir = String(input.import.ciArtifactsDir).trim();\n if (!isSafeRelativePath(dir)) {\n errors.push(\"import.ciArtifactsDir must be a safe relative path\");\n } else {\n importConfig.ciArtifactsDir = dir;\n }\n }\n if (input.import.bundlesDir !== undefined) {\n const dir = String(input.import.bundlesDir).trim();\n if (!isSafeRelativePath(dir)) {\n errors.push(\"import.bundlesDir must be a safe relative path\");\n } else {\n importConfig.bundlesDir = dir;\n }\n }\n if (input.import.fileDropDir !== undefined) {\n const dir = String(input.import.fileDropDir).trim();\n if (!isSafeRelativePath(dir)) {\n errors.push(\"import.fileDropDir must be a safe relative path\");\n } else {\n importConfig.fileDropDir = dir;\n }\n }\n if (input.import.enabled !== undefined) {\n if (typeof input.import.enabled !== \"boolean\") {\n errors.push(\"import.enabled must be a boolean\");\n } else {\n importConfig.enabled = input.import.enabled;\n }\n }\n }\n }\n\n let ingestConfig: StudioRegistryIngest | undefined;\n const ingestWarnings: string[] = [];\n if (input.ingest !== undefined) {\n if (!isPlainObject(input.ingest)) {\n errors.push(\"ingest must be an object\");\n } else {\n ingestConfig = {};\n if (input.ingest.github !== undefined) {\n if (!isPlainObject(input.ingest.github)) {\n errors.push(\"ingest.github must be an object\");\n } else {\n const github: StudioRegistryGitHubIngest = {};\n if (input.ingest.github.enabled !== undefined) {\n if (typeof input.ingest.github.enabled !== \"boolean\") {\n errors.push(\"ingest.github.enabled must be a boolean\");\n } else {\n github.enabled = input.ingest.github.enabled;\n }\n }\n if (input.ingest.github.tokenEnv !== undefined) {\n const tokenEnv = String(input.ingest.github.tokenEnv).trim();\n if (!/^[A-Z][A-Z0-9_]*$/.test(tokenEnv)) {\n errors.push(\"ingest.github.tokenEnv must be an uppercase env var name\");\n } else {\n github.tokenEnv = tokenEnv;\n }\n }\n ingestConfig.github = github;\n }\n }\n if (input.ingest.http !== undefined) {\n if (!isPlainObject(input.ingest.http)) {\n errors.push(\"ingest.http must be an object\");\n } else {\n const http: StudioRegistryHttpIngest = {};\n if (input.ingest.http.enabled !== undefined) {\n if (typeof input.ingest.http.enabled !== \"boolean\") {\n errors.push(\"ingest.http.enabled must be a boolean\");\n } else {\n http.enabled = input.ingest.http.enabled;\n }\n }\n if (input.ingest.http.path !== undefined) {\n const ingestPath = String(input.ingest.http.path).trim();\n if (!ingestPath.startsWith(\"/\") || ingestPath.includes(\"..\")) {\n errors.push(\"ingest.http.path must be an absolute safe path\");\n } else {\n http.path = ingestPath;\n }\n }\n if (input.ingest.http.tokenEnv !== undefined) {\n const tokenEnv = String(input.ingest.http.tokenEnv).trim();\n if (!/^[A-Z][A-Z0-9_]*$/.test(tokenEnv)) {\n errors.push(\"ingest.http.tokenEnv must be an uppercase env var name\");\n } else {\n http.tokenEnv = tokenEnv;\n }\n }\n if (input.ingest.http.maxBytes !== undefined) {\n const maxBytes = Number(input.ingest.http.maxBytes);\n if (!Number.isInteger(maxBytes) || maxBytes <= 0) {\n errors.push(\"ingest.http.maxBytes must be a positive integer\");\n } else {\n http.maxBytes = maxBytes;\n }\n }\n ingestConfig.http = http;\n }\n }\n if (input.ingest.bundleUpload !== undefined) {\n if (!isPlainObject(input.ingest.bundleUpload)) {\n errors.push(\"ingest.bundleUpload must be an object\");\n } else {\n const bundleUpload: StudioRegistryBundleUploadIngest = {};\n if (input.ingest.bundleUpload.enabled !== undefined) {\n if (typeof input.ingest.bundleUpload.enabled !== \"boolean\") {\n errors.push(\"ingest.bundleUpload.enabled must be a boolean\");\n } else {\n bundleUpload.enabled = input.ingest.bundleUpload.enabled;\n }\n }\n if (input.ingest.bundleUpload.maxBytes !== undefined) {\n const maxBytes = Number(input.ingest.bundleUpload.maxBytes);\n if (!Number.isInteger(maxBytes) || maxBytes <= 0) {\n errors.push(\"ingest.bundleUpload.maxBytes must be a positive integer\");\n } else {\n bundleUpload.maxBytes = maxBytes;\n }\n }\n ingestConfig.bundleUpload = bundleUpload;\n }\n }\n const knownIngestKeys = new Set([\"github\", \"http\", \"bundleUpload\"]);\n for (const key of Object.keys(input.ingest)) {\n if (!knownIngestKeys.has(key)) {\n ingestWarnings.push(`ignored unknown ingest key: ${key}`);\n }\n }\n }\n }\n\n if (errors.length > 0) return { ok: false, errors, warnings: ingestWarnings };\n\n return {\n ok: true,\n registry: {\n schemaVersion: STUDIO_REGISTRY_SCHEMA_VERSION,\n name: String(input.name).trim(),\n projects,\n ...(importConfig ? { import: importConfig } : {}),\n ...(ingestConfig ? { ingest: ingestConfig } : {}),\n },\n errors: [],\n warnings: ingestWarnings,\n };\n}\n\nexport async function readStudioRegistryFile(\n filePath: string,\n): Promise<StudioRegistryParseResult & { path: string }> {\n try {\n const raw = await readFile(filePath, \"utf8\");\n if (raw.length > MAX_REGISTRY_BYTES) {\n return {\n ok: false,\n path: filePath,\n errors: [\"registry file exceeds size limit\"],\n warnings: [],\n };\n }\n const parsed = parseStudioRegistry(JSON.parse(raw) as unknown);\n return { ...parsed, path: filePath };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false, path: filePath, errors: [message], warnings: [] };\n }\n}\n\nexport function resolveStudioRegistryPath(options: {\n workspacePath?: string;\n cwd?: string;\n}): string {\n if (options.workspacePath && options.workspacePath.trim() !== \"\") {\n return path.resolve(options.cwd ?? process.cwd(), options.workspacePath);\n }\n const cwd = path.resolve(options.cwd ?? process.cwd());\n return path.join(cwd, STUDIO_REGISTRY_FILENAMES[0]!);\n}\n\nexport function resolveRegistryProjectPath(\n registryDir: string,\n projectPath: string,\n): string {\n return path.isAbsolute(projectPath)\n ? path.resolve(projectPath)\n : path.resolve(registryDir, projectPath);\n}\n","import { mkdirSync } from \"node:fs\";\nimport path from \"node:path\";\n\nimport Database from \"better-sqlite3\";\n\nexport const STUDIO_DB_SCHEMA_VERSION = \"1.0\";\nexport const DEFAULT_STUDIO_DB_FILENAME = \"studio.db\";\n\nconst SCHEMA_SQL = `\nCREATE TABLE IF NOT EXISTS meta (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n);\nCREATE TABLE IF NOT EXISTS projects (\n id TEXT PRIMARY KEY,\n label TEXT,\n path TEXT NOT NULL,\n workspace_dir TEXT NOT NULL,\n project_name TEXT,\n redaction_profile TEXT,\n trace_count INTEGER NOT NULL DEFAULT 0,\n imported_at TEXT NOT NULL\n);\nCREATE TABLE IF NOT EXISTS runs (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n project_id TEXT NOT NULL,\n run_id TEXT NOT NULL,\n name TEXT,\n status TEXT,\n file TEXT,\n started_at REAL,\n duration_ms REAL,\n session_id TEXT,\n UNIQUE(project_id, run_id)\n);\nCREATE INDEX IF NOT EXISTS idx_runs_project ON runs(project_id);\nCREATE INDEX IF NOT EXISTS idx_runs_status ON runs(status);\nCREATE TABLE IF NOT EXISTS ingest_files (\n source_key TEXT PRIMARY KEY,\n source_name TEXT NOT NULL,\n dest_path TEXT NOT NULL,\n kind TEXT NOT NULL CHECK(kind IN ('ci', 'bundle')),\n content_hash TEXT NOT NULL,\n imported_at TEXT NOT NULL\n);\nCREATE INDEX IF NOT EXISTS idx_ingest_files_kind ON ingest_files(kind);\n`;\n\nexport interface StudioProjectRow {\n id: string;\n label: string | null;\n path: string;\n workspaceDir: string;\n projectName: string | null;\n redactionProfile: string | null;\n traceCount: number;\n importedAt: string;\n}\n\nexport interface StudioRunRow {\n projectId: string;\n runId: string;\n name?: string;\n status?: string;\n file?: string;\n startedAt?: number;\n durationMs?: number;\n sessionId?: string;\n}\n\nexport type IngestFileKind = \"ci\" | \"bundle\";\n\nexport interface IngestFileRow {\n sourceKey: string;\n sourceName: string;\n destPath: string;\n kind: IngestFileKind;\n contentHash: string;\n importedAt: string;\n}\n\nexport function resolveStudioDbPath(options: {\n dbPath?: string;\n cwd?: string;\n}): string {\n if (options.dbPath && options.dbPath.trim() !== \"\") {\n const raw = options.dbPath.trim();\n if (raw.startsWith(\"postgres://\") || raw.startsWith(\"postgresql://\")) {\n return raw;\n }\n return path.resolve(options.cwd ?? process.cwd(), raw);\n }\n return path.resolve(\n options.cwd ?? process.cwd(),\n \".agent-inspect\",\n DEFAULT_STUDIO_DB_FILENAME,\n );\n}\n\nexport function isPostgresDbPath(dbPath: string): boolean {\n return dbPath.startsWith(\"postgres://\") || dbPath.startsWith(\"postgresql://\");\n}\n\nexport function openStudioDb(dbPath: string): Database.Database {\n if (isPostgresDbPath(dbPath)) {\n throw new Error(\n \"Postgres studio databases are not supported; use a SQLite file path (preview only).\",\n );\n }\n const dir = path.dirname(dbPath);\n try {\n mkdirSync(dir, { recursive: true });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to create studio database directory: ${message}`);\n }\n const db = new Database(dbPath);\n db.pragma(\"journal_mode = WAL\");\n db.exec(SCHEMA_SQL);\n const insertMeta = db.prepare(\n \"INSERT INTO meta(key, value) VALUES(?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value\",\n );\n insertMeta.run(\"schemaVersion\", STUDIO_DB_SCHEMA_VERSION);\n insertMeta.run(\"driver\", \"better-sqlite3\");\n return db;\n}\n\nexport function upsertStudioProject(\n db: Database.Database,\n row: StudioProjectRow,\n): void {\n db.prepare(\n `INSERT INTO projects(id, label, path, workspace_dir, project_name, redaction_profile, trace_count, imported_at)\n VALUES (@id, @label, @path, @workspaceDir, @projectName, @redactionProfile, @traceCount, @importedAt)\n ON CONFLICT(id) DO UPDATE SET\n label = excluded.label,\n path = excluded.path,\n workspace_dir = excluded.workspace_dir,\n project_name = excluded.project_name,\n redaction_profile = excluded.redaction_profile,\n trace_count = excluded.trace_count,\n imported_at = excluded.imported_at`,\n ).run({\n id: row.id,\n label: row.label,\n path: row.path,\n workspaceDir: row.workspaceDir,\n projectName: row.projectName,\n redactionProfile: row.redactionProfile,\n traceCount: row.traceCount,\n importedAt: row.importedAt,\n });\n}\n\nexport function replaceProjectRuns(\n db: Database.Database,\n projectId: string,\n runs: StudioRunRow[],\n): void {\n const tx = db.transaction(() => {\n db.prepare(\"DELETE FROM runs WHERE project_id = ?\").run(projectId);\n const insert = db.prepare(\n `INSERT INTO runs(project_id, run_id, name, status, file, started_at, duration_ms, session_id)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n );\n for (const run of runs) {\n insert.run(\n projectId,\n run.runId,\n run.name ?? null,\n run.status ?? null,\n run.file ?? null,\n run.startedAt ?? null,\n run.durationMs ?? null,\n run.sessionId ?? null,\n );\n }\n });\n tx();\n}\n\nexport function listStudioProjects(db: Database.Database): StudioProjectRow[] {\n const rows = db\n .prepare(\n `SELECT id, label, path, workspace_dir AS workspaceDir, project_name AS projectName,\n redaction_profile AS redactionProfile, trace_count AS traceCount, imported_at AS importedAt\n FROM projects ORDER BY id ASC`,\n )\n .all() as StudioProjectRow[];\n return rows;\n}\n\nexport function getStudioProject(\n db: Database.Database,\n projectId: string,\n): StudioProjectRow | undefined {\n return db\n .prepare(\n `SELECT id, label, path, workspace_dir AS workspaceDir, project_name AS projectName,\n redaction_profile AS redactionProfile, trace_count AS traceCount, imported_at AS importedAt\n FROM projects WHERE id = ?`,\n )\n .get(projectId) as StudioProjectRow | undefined;\n}\n\nexport function listProjectRuns(\n db: Database.Database,\n projectId: string,\n limit = 200,\n): StudioRunRow[] {\n const rows = db\n .prepare(\n `SELECT project_id AS projectId, run_id AS runId, name, status, file,\n started_at AS startedAt, duration_ms AS durationMs, session_id AS sessionId\n FROM runs WHERE project_id = ? ORDER BY started_at DESC LIMIT ?`,\n )\n .all(projectId, limit) as StudioRunRow[];\n return rows;\n}\n\nexport function searchProjectRuns(\n db: Database.Database,\n projectId: string,\n query: string,\n limit = 50,\n): StudioRunRow[] {\n const pattern = `%${query}%`;\n return db\n .prepare(\n `SELECT project_id AS projectId, run_id AS runId, name, status, file,\n started_at AS startedAt, duration_ms AS durationMs, session_id AS sessionId\n FROM runs\n WHERE project_id = ?\n AND (run_id LIKE ? OR IFNULL(name, '') LIKE ? OR IFNULL(status, '') LIKE ?)\n ORDER BY started_at DESC\n LIMIT ?`,\n )\n .all(projectId, pattern, pattern, pattern, limit) as StudioRunRow[];\n}\n\nexport function findIngestFileBySourceKey(\n db: Database.Database,\n sourceKey: string,\n): IngestFileRow | undefined {\n return db\n .prepare(\n `SELECT source_key AS sourceKey, source_name AS sourceName, dest_path AS destPath,\n kind, content_hash AS contentHash, imported_at AS importedAt\n FROM ingest_files WHERE source_key = ?`,\n )\n .get(sourceKey) as IngestFileRow | undefined;\n}\n\nexport function insertIngestFile(db: Database.Database, row: IngestFileRow): void {\n db.prepare(\n `INSERT INTO ingest_files(source_key, source_name, dest_path, kind, content_hash, imported_at)\n VALUES (@sourceKey, @sourceName, @destPath, @kind, @contentHash, @importedAt)\n ON CONFLICT(source_key) DO UPDATE SET\n source_name = excluded.source_name,\n dest_path = excluded.dest_path,\n kind = excluded.kind,\n content_hash = excluded.content_hash,\n imported_at = excluded.imported_at`,\n ).run(row);\n}\n\nexport function listIngestFiles(\n db: Database.Database,\n kind?: IngestFileKind,\n): IngestFileRow[] {\n if (kind) {\n return db\n .prepare(\n `SELECT source_key AS sourceKey, source_name AS sourceName, dest_path AS destPath,\n kind, content_hash AS contentHash, imported_at AS importedAt\n FROM ingest_files WHERE kind = ? ORDER BY imported_at DESC`,\n )\n .all(kind) as IngestFileRow[];\n }\n return db\n .prepare(\n `SELECT source_key AS sourceKey, source_name AS sourceName, dest_path AS destPath,\n kind, content_hash AS contentHash, imported_at AS importedAt\n FROM ingest_files ORDER BY imported_at DESC`,\n )\n .all() as IngestFileRow[];\n}\n","import { readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type Database from \"better-sqlite3\";\nimport {\n TraceDirectory,\n loadTraceMetadataList,\n resolveTraceDir,\n} from \"agent-inspect/advanced\";\nimport {\n readWorkspaceManifestFile,\n resolveWorkspaceLocation,\n} from \"agent-inspect/workspace\";\n\nimport {\n replaceProjectRuns,\n upsertStudioProject,\n type StudioProjectRow,\n type StudioRunRow,\n} from \"./db.js\";\nimport {\n resolveRegistryProjectPath,\n type StudioRegistry,\n type StudioRegistryProject,\n} from \"./registry.js\";\n\nexport interface ImportedStudioProject extends StudioProjectRow {\n suiteConfigPaths: string[];\n}\n\nexport interface StudioImportResult {\n registryName: string;\n projects: ImportedStudioProject[];\n warnings: string[];\n}\n\nasync function discoverSuiteConfigs(\n projectRoot: string,\n configured?: string[],\n): Promise<string[]> {\n if (configured && configured.length > 0) {\n return configured.map((rel) => path.resolve(projectRoot, rel));\n }\n const found: string[] = [];\n try {\n const entries = await readdir(projectRoot);\n for (const entry of entries) {\n if (entry.endsWith(\".suite.json\")) {\n found.push(path.join(projectRoot, entry));\n }\n }\n } catch {\n // ignore unreadable project root\n }\n return found.sort();\n}\n\nasync function loadProjectRuns(\n workspaceDir: string,\n traceDirs: string[],\n): Promise<StudioRunRow[]> {\n const runs: StudioRunRow[] = [];\n for (const rel of traceDirs) {\n const traceDir = resolveTraceDir({ dir: path.join(workspaceDir, rel) });\n const td = new TraceDirectory({ dir: traceDir });\n const files = await td.list();\n const metas = await loadTraceMetadataList(traceDir, files, (fileName) =>\n td.getPath(fileName),\n );\n for (const meta of metas) {\n runs.push({\n projectId: \"\",\n runId: meta.runId,\n ...(meta.name !== undefined ? { name: meta.name } : {}),\n status: meta.status,\n file: path.basename(meta.filePath),\n ...(meta.startedAt !== undefined ? { startedAt: meta.startedAt } : {}),\n ...(meta.durationMs !== undefined ? { durationMs: meta.durationMs } : {}),\n });\n }\n }\n return runs.sort((a, b) => (b.startedAt ?? 0) - (a.startedAt ?? 0));\n}\n\nexport async function importStudioRegistry(options: {\n db: Database.Database;\n registry: StudioRegistry;\n registryPath: string;\n}): Promise<StudioImportResult> {\n const registryDir = path.dirname(options.registryPath);\n const warnings: string[] = [];\n const projects: ImportedStudioProject[] = [];\n const importedAt = new Date().toISOString();\n\n for (const project of options.registry.projects) {\n const imported = await importStudioProject({\n db: options.db,\n registryDir,\n project,\n importedAt,\n warnings,\n });\n if (imported) projects.push(imported);\n }\n\n return {\n registryName: options.registry.name,\n projects,\n warnings,\n };\n}\n\nasync function importStudioProject(options: {\n db: Database.Database;\n registryDir: string;\n project: StudioRegistryProject;\n importedAt: string;\n warnings: string[];\n}): Promise<ImportedStudioProject | undefined> {\n const projectRoot = resolveRegistryProjectPath(\n options.registryDir,\n options.project.path,\n );\n const location = resolveWorkspaceLocation(projectRoot);\n const manifestRead = await readWorkspaceManifestFile(location);\n if (!manifestRead.ok || manifestRead.manifest === undefined) {\n options.warnings.push(\n `project \"${options.project.id}\": ${manifestRead.errors.join(\"; \") || \"workspace.json missing\"}`,\n );\n return undefined;\n }\n\n const runs = await loadProjectRuns(\n location.workspaceDir,\n manifestRead.manifest.traceDirs,\n );\n const suiteConfigPaths = await discoverSuiteConfigs(\n projectRoot,\n options.project.suiteConfigs,\n );\n\n const row: StudioProjectRow = {\n id: options.project.id,\n label: options.project.label ?? options.project.id,\n path: projectRoot,\n workspaceDir: location.workspaceDir,\n projectName: manifestRead.manifest.project,\n redactionProfile: manifestRead.manifest.redactionProfile,\n traceCount: runs.length,\n importedAt: options.importedAt,\n };\n\n upsertStudioProject(options.db, row);\n replaceProjectRuns(\n options.db,\n options.project.id,\n runs.map((run) => ({ ...run, projectId: options.project.id })),\n );\n\n return { ...row, suiteConfigPaths };\n}\n","import { access } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { STUDIO_REGISTRY_FILENAMES } from \"./registry.js\";\n\nexport async function resolveStudioRegistryPath(options: {\n workspacePath?: string;\n cwd?: string;\n}): Promise<string> {\n if (options.workspacePath && options.workspacePath.trim() !== \"\") {\n return path.resolve(options.cwd ?? process.cwd(), options.workspacePath);\n }\n const cwd = path.resolve(options.cwd ?? process.cwd());\n for (const rel of STUDIO_REGISTRY_FILENAMES) {\n const candidate = path.join(cwd, rel);\n try {\n await access(candidate);\n return candidate;\n } catch {\n // try next candidate\n }\n }\n return path.join(cwd, STUDIO_REGISTRY_FILENAMES[0]!);\n}\n","import path from \"node:path\";\n\nimport type { StudioRegistry } from \"../registry.js\";\nimport { resolveUnderRoot } from \"../path-guards.js\";\n\nexport interface ResolvedImportDirs {\n registryDir: string;\n fileDropDir: string;\n ciArtifactsDir: string;\n bundlesDir: string;\n}\n\nexport function resolveImportDirs(\n registryPath: string,\n registry: StudioRegistry,\n): ResolvedImportDirs {\n const registryDir = path.dirname(registryPath);\n const importConfig = registry.import ?? {};\n const fileDropDir = importConfig.fileDropDir ?? \"imports/drop\";\n const ciArtifactsDir = importConfig.ciArtifactsDir ?? \"imports/ci\";\n const bundlesDir = importConfig.bundlesDir ?? \"imports/bundles\";\n\n return {\n registryDir,\n fileDropDir: resolveUnderRoot(registryDir, fileDropDir),\n ciArtifactsDir: resolveUnderRoot(registryDir, ciArtifactsDir),\n bundlesDir: resolveUnderRoot(registryDir, bundlesDir),\n };\n}\n\nexport function uniqueDestPath(destDir: string, fileName: string, contentHash: string): string {\n const ext = path.extname(fileName);\n const base = path.basename(fileName, ext);\n const shortHash = contentHash.slice(0, 8);\n return path.join(destDir, `${base}-${shortHash}${ext}`);\n}\n\nexport function sanitizeSafeErrorMessage(message: string, secret?: string): string {\n if (!secret || secret.length < 4) return message;\n return message.split(secret).join(\"[redacted]\");\n}\n\nexport function parseGitHubRepo(repo: string): { owner: string; name: string } {\n const trimmed = repo.trim();\n const match = /^([A-Za-z0-9_.-]+)\\/([A-Za-z0-9_.-]+)$/.exec(trimmed);\n if (!match) {\n throw new Error(\"repo must be in owner/name format\");\n }\n return { owner: match[1]!, name: match[2]! };\n}\n\nexport function buildGitHubArtifactSourceKey(options: {\n owner: string;\n repo: string;\n runId: string;\n artifactName: string;\n}): string {\n return `github:${options.owner}/${options.repo}/runs/${options.runId}/${options.artifactName}`;\n}\n","import { createHash } from \"node:crypto\";\nimport {\n copyFile,\n mkdir,\n readdir,\n readFile,\n rename,\n stat,\n} from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type Database from \"better-sqlite3\";\n\nimport {\n findIngestFileBySourceKey,\n insertIngestFile,\n openStudioDb,\n resolveStudioDbPath,\n type IngestFileKind,\n} from \"../db.js\";\nimport { assertPathUnderRoot, resolveUnderRoot } from \"../path-guards.js\";\nimport { readStudioRegistryFile, type StudioRegistry } from \"../registry.js\";\nimport { resolveStudioRegistryPath } from \"../registry-path.js\";\nimport { resolveImportDirs, uniqueDestPath } from \"./common.js\";\n\nexport const FILE_DROP_ARCHIVE_DIR = \".imported\";\n\nconst CI_EXTENSIONS = [\".jsonl\", \".suite.json\"] as const;\nconst BUNDLE_EXTENSIONS = [\".tgz\", \".zip\"] as const;\n\nexport interface FileDropImportOptions {\n db: Database.Database;\n registryPath: string;\n registry: StudioRegistry;\n /** Explicit opt-in required — ingest is disabled by default. */\n enabled: boolean;\n /** Override drop directory (CLI `--dir`). */\n dropDir?: string;\n /** Move successfully imported files into `dropDir/.imported/` instead of leaving copies. */\n archiveAfterImport?: boolean;\n}\n\nexport interface FileDropImportedFile {\n sourceKey: string;\n sourceName: string;\n destPath: string;\n kind: IngestFileKind;\n contentHash: string;\n archived: boolean;\n}\n\nexport interface FileDropImportResult {\n skipped: boolean;\n reason?: string;\n scanned: number;\n imported: number;\n skippedFiles: number;\n errors: string[];\n warnings: string[];\n files: FileDropImportedFile[];\n}\n\nfunction classifyFile(fileName: string): IngestFileKind | undefined {\n const lower = fileName.toLowerCase();\n if (CI_EXTENSIONS.some((ext) => lower.endsWith(ext))) return \"ci\";\n if (BUNDLE_EXTENSIONS.some((ext) => lower.endsWith(ext))) return \"bundle\";\n return undefined;\n}\n\nasync function hashFile(filePath: string): Promise<string> {\n const data = await readFile(filePath);\n return createHash(\"sha256\").update(data).digest(\"hex\");\n}\n\nasync function importOneFile(options: {\n db: Database.Database;\n sourcePath: string;\n sourceKey: string;\n fileName: string;\n kind: IngestFileKind;\n destDir: string;\n archiveAfterImport: boolean;\n archiveDir: string;\n importedAt: string;\n contentHash: string;\n}): Promise<FileDropImportedFile> {\n const destPath = uniqueDestPath(options.destDir, options.fileName, options.contentHash);\n assertPathUnderRoot(destPath, path.dirname(options.destDir));\n\n await mkdir(options.destDir, { recursive: true });\n await copyFile(options.sourcePath, destPath);\n\n insertIngestFile(options.db, {\n sourceKey: options.sourceKey,\n sourceName: options.fileName,\n destPath,\n kind: options.kind,\n contentHash: options.contentHash,\n importedAt: options.importedAt,\n });\n\n let archived = false;\n if (options.archiveAfterImport) {\n await mkdir(options.archiveDir, { recursive: true });\n const archiveTarget = path.join(options.archiveDir, options.fileName);\n await rename(options.sourcePath, archiveTarget);\n archived = true;\n }\n\n return {\n sourceKey: options.sourceKey,\n sourceName: options.fileName,\n destPath,\n kind: options.kind,\n contentHash: options.contentHash,\n archived,\n };\n}\n\nexport async function importFileDrop(\n options: FileDropImportOptions,\n): Promise<FileDropImportResult> {\n const warnings: string[] = [];\n const errors: string[] = [];\n const files: FileDropImportedFile[] = [];\n\n if (!options.enabled) {\n return {\n skipped: true,\n reason: \"file-drop ingest is disabled; pass --ingest file-drop or use studio import drop\",\n scanned: 0,\n imported: 0,\n skippedFiles: 0,\n errors,\n warnings,\n files,\n };\n }\n\n const dirs = resolveImportDirs(options.registryPath, options.registry);\n let dropDir: string;\n try {\n dropDir = options.dropDir\n ? path.isAbsolute(options.dropDir)\n ? (assertPathUnderRoot(options.dropDir, dirs.registryDir), options.dropDir)\n : resolveUnderRoot(dirs.registryDir, options.dropDir)\n : dirs.fileDropDir;\n assertPathUnderRoot(dropDir, dirs.registryDir);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n skipped: false,\n scanned: 0,\n imported: 0,\n skippedFiles: 0,\n errors: [message],\n warnings,\n files,\n };\n }\n\n let entries: string[];\n try {\n entries = await readdir(dropDir);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n skipped: false,\n scanned: 0,\n imported: 0,\n skippedFiles: 0,\n errors: [`unable to read file-drop directory: ${message}`],\n warnings,\n files,\n };\n }\n\n const importedAt = new Date().toISOString();\n const archiveDir = path.join(dropDir, FILE_DROP_ARCHIVE_DIR);\n let scanned = 0;\n let imported = 0;\n let skippedFiles = 0;\n\n for (const entry of entries.sort()) {\n if (entry === FILE_DROP_ARCHIVE_DIR || entry.startsWith(\".\")) continue;\n\n const sourcePath = path.join(dropDir, entry);\n let fileStat;\n try {\n fileStat = await stat(sourcePath);\n } catch {\n warnings.push(`skipped unreadable entry: ${entry}`);\n continue;\n }\n if (!fileStat.isFile()) continue;\n\n const kind = classifyFile(entry);\n if (!kind) continue;\n\n scanned += 1;\n const sourceKey = entry;\n let contentHash: string;\n try {\n contentHash = await hashFile(sourcePath);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n errors.push(`failed to read ${entry}: ${message}`);\n continue;\n }\n\n const existing = findIngestFileBySourceKey(options.db, sourceKey);\n if (existing && existing.contentHash === contentHash) {\n skippedFiles += 1;\n continue;\n }\n\n const destDir = kind === \"ci\" ? dirs.ciArtifactsDir : dirs.bundlesDir;\n try {\n const importedFile = await importOneFile({\n db: options.db,\n sourcePath,\n sourceKey,\n fileName: entry,\n kind,\n destDir,\n archiveAfterImport: options.archiveAfterImport === true,\n archiveDir,\n importedAt,\n contentHash,\n });\n files.push(importedFile);\n imported += 1;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n errors.push(`failed to import ${entry}: ${message}`);\n }\n }\n\n return {\n skipped: false,\n scanned,\n imported,\n skippedFiles,\n errors,\n warnings,\n files,\n };\n}\n\nexport async function importFileDropFromRegistry(options: {\n db: Database.Database;\n registryPath: string;\n registry: StudioRegistry;\n enabled: boolean;\n dropDir?: string;\n archiveAfterImport?: boolean;\n}): Promise<FileDropImportResult> {\n return importFileDrop({\n db: options.db,\n registryPath: options.registryPath,\n registry: options.registry,\n enabled: options.enabled,\n ...(options.dropDir !== undefined ? { dropDir: options.dropDir } : {}),\n ...(options.archiveAfterImport !== undefined\n ? { archiveAfterImport: options.archiveAfterImport }\n : {}),\n });\n}\n\nexport async function runStudioFileDropImport(options: {\n workspacePath?: string;\n dbPath?: string;\n cwd?: string;\n dropDir?: string;\n archiveAfterImport?: boolean;\n}): Promise<FileDropImportResult> {\n const cwd = options.cwd ?? process.cwd();\n const registryPath = await resolveStudioRegistryPath({\n ...(options.workspacePath !== undefined ? { workspacePath: options.workspacePath } : {}),\n cwd,\n });\n const registryRead = await readStudioRegistryFile(registryPath);\n if (!registryRead.ok || registryRead.registry === undefined) {\n throw new Error(registryRead.errors.join(\"; \") || \"invalid studio registry\");\n }\n\n const dbPath = resolveStudioDbPath({\n ...(options.dbPath !== undefined ? { dbPath: options.dbPath } : {}),\n cwd,\n });\n const db = openStudioDb(dbPath);\n\n return importFileDropFromRegistry({\n db,\n registryPath,\n registry: registryRead.registry,\n enabled: true,\n ...(options.dropDir !== undefined ? { dropDir: options.dropDir } : {}),\n ...(options.archiveAfterImport !== undefined\n ? { archiveAfterImport: options.archiveAfterImport }\n : {}),\n });\n}\n","import type Database from \"better-sqlite3\";\n\nimport { importStudioRegistry, type ImportedStudioProject, type StudioImportResult } from \"./import.js\";\nimport { importFileDropFromRegistry, type FileDropImportResult } from \"./ingest/file-drop.js\";\nimport {\n openStudioDb,\n resolveStudioDbPath,\n type StudioProjectRow,\n} from \"./db.js\";\nimport {\n readStudioRegistryFile,\n type StudioRegistry,\n} from \"./registry.js\";\nimport { resolveStudioRegistryPath } from \"./registry-path.js\";\nimport type { StudioServerOptions } from \"./types.js\";\n\nexport interface StudioContext {\n db: Database.Database;\n dbPath: string;\n registryPath: string;\n registry: StudioRegistry;\n importResult: StudioImportResult;\n fileDropResult?: FileDropImportResult;\n projects: ImportedStudioProject[];\n}\n\nexport async function createStudioContext(\n options: StudioServerOptions = {},\n): Promise<StudioContext> {\n const cwd = options.cwd ?? process.cwd();\n const registryPath = await resolveStudioRegistryPath({\n ...(options.workspacePath !== undefined ? { workspacePath: options.workspacePath } : {}),\n cwd,\n });\n const registryRead = await readStudioRegistryFile(registryPath);\n if (!registryRead.ok || registryRead.registry === undefined) {\n throw new Error(registryRead.errors.join(\"; \") || \"invalid studio registry\");\n }\n\n const dbPath = resolveStudioDbPath({\n ...(options.dbPath !== undefined ? { dbPath: options.dbPath } : {}),\n cwd,\n });\n const db = openStudioDb(dbPath);\n const importResult = await importStudioRegistry({\n db,\n registry: registryRead.registry,\n registryPath,\n });\n\n let fileDropResult: FileDropImportResult | undefined;\n if (options.ingestFileDrop === true) {\n fileDropResult = await importFileDropFromRegistry({\n db,\n registryPath,\n registry: registryRead.registry,\n enabled: true,\n ...(options.archiveFileDrop === true ? { archiveAfterImport: true } : {}),\n });\n }\n\n return {\n db,\n dbPath,\n registryPath,\n registry: registryRead.registry,\n importResult,\n ...(fileDropResult !== undefined ? { fileDropResult } : {}),\n projects: importResult.projects,\n };\n}\n\nexport function summarizeProjects(projects: StudioProjectRow[]) {\n return projects.map((project) => ({\n id: project.id,\n label: project.label ?? project.id,\n projectName: project.projectName,\n traceCount: project.traceCount,\n redactionProfile: project.redactionProfile,\n importedAt: project.importedAt,\n }));\n}\n","import { timingSafeEqual } from \"node:crypto\";\n\nconst DEFAULT_INGEST_TOKEN_ENV = \"STUDIO_INGEST_TOKEN\";\n\nexport function resolveIngestTokenEnv(options: {\n tokenEnv?: string;\n registryTokenEnv?: string;\n}): string {\n const envName = options.tokenEnv?.trim() || options.registryTokenEnv?.trim() || DEFAULT_INGEST_TOKEN_ENV;\n if (!/^[A-Z][A-Z0-9_]*$/.test(envName)) {\n throw new Error(\"ingest token env name must be an uppercase identifier\");\n }\n return envName;\n}\n\nexport function resolveIngestToken(envName: string): string | undefined {\n const token = process.env[envName]?.trim();\n return token && token.length > 0 ? token : undefined;\n}\n\nexport function extractIngestTokenFromRequest(headers: {\n authorization?: string | string[] | undefined;\n \"x-agentinspect-token\"?: string | string[] | undefined;\n \"x-agent-inspect-token\"?: string | string[] | undefined;\n}): string | undefined {\n const headerToken =\n firstHeader(headers[\"x-agentinspect-token\"]) ??\n firstHeader(headers[\"x-agent-inspect-token\"]);\n if (headerToken) return headerToken;\n\n const auth = firstHeader(headers.authorization);\n if (auth?.startsWith(\"Bearer \")) {\n const token = auth.slice(\"Bearer \".length).trim();\n return token.length > 0 ? token : undefined;\n }\n return undefined;\n}\n\nfunction firstHeader(value: string | string[] | undefined): string | undefined {\n if (Array.isArray(value)) return value[0]?.trim();\n return value?.trim();\n}\n\nexport function isIngestTokenValid(provided: string | undefined, expected: string | undefined): boolean {\n if (!provided || !expected) return false;\n const providedBuf = Buffer.from(provided);\n const expectedBuf = Buffer.from(expected);\n if (providedBuf.length !== expectedBuf.length) return false;\n return timingSafeEqual(providedBuf, expectedBuf);\n}\n","import { createHash } from \"node:crypto\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\n\nimport type { StudioContext } from \"../context.js\";\nimport { insertIngestFile } from \"../db.js\";\nimport { importStudioRegistry } from \"../import.js\";\nimport type { StudioRegistryHttpIngest } from \"../registry.js\";\nimport type { StudioServerOptions } from \"../types.js\";\nimport {\n buildGitHubArtifactSourceKey,\n resolveImportDirs,\n sanitizeSafeErrorMessage,\n uniqueDestPath,\n} from \"./common.js\";\nimport { assertPathUnderRoot } from \"../path-guards.js\";\nimport {\n extractIngestTokenFromRequest,\n isIngestTokenValid,\n resolveIngestToken,\n resolveIngestTokenEnv,\n} from \"./token.js\";\n\nexport const DEFAULT_HTTP_INGEST_BASE_PATH = \"/api/ingest\";\nexport const HTTP_INGEST_BUNDLE_PATH = \"/api/ingest/bundle\";\nexport const HTTP_INGEST_ARTIFACT_PATH = \"/api/ingest/artifact\";\nexport const DEFAULT_MAX_INGEST_BYTES = 52_428_800;\n\nexport interface HttpIngestConfig {\n enabled: boolean;\n basePath: string;\n tokenEnv: string;\n maxBytes: number;\n}\n\nexport function resolveHttpIngestConfig(\n options: StudioServerOptions,\n registryHttp?: StudioRegistryHttpIngest,\n): HttpIngestConfig {\n // Prefer the resolved registry config: on the lazy-context path\n // (createStudioServer without options.context) options.context stays\n // undefined, and reading it here silently dropped registry path/tokenEnv/\n // maxBytes while only `enabled` was threaded through.\n const http = registryHttp ?? options.context?.registry.ingest?.http;\n const enabled = options.ingestHttp === true || http?.enabled === true;\n const basePath = (http?.path ?? DEFAULT_HTTP_INGEST_BASE_PATH).trim() || DEFAULT_HTTP_INGEST_BASE_PATH;\n const tokenEnv = resolveIngestTokenEnv({\n ...(options.ingestTokenEnv !== undefined ? { tokenEnv: options.ingestTokenEnv } : {}),\n ...(http?.tokenEnv !== undefined ? { registryTokenEnv: http.tokenEnv } : {}),\n });\n const maxBytes = http?.maxBytes ?? DEFAULT_MAX_INGEST_BYTES;\n return { enabled, basePath, tokenEnv, maxBytes };\n}\n\nfunction sendJson(res: ServerResponse, status: number, body: unknown): void {\n res.writeHead(status, {\n \"content-type\": \"application/json; charset=utf-8\",\n \"cache-control\": \"no-store\",\n });\n res.end(JSON.stringify(body));\n}\n\nexport async function readBoundedRequestBody(\n req: IncomingMessage,\n maxBytes: number,\n): Promise<Buffer> {\n const chunks: Buffer[] = [];\n let total = 0;\n for await (const chunk of req) {\n const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n total += buf.length;\n if (total > maxBytes) {\n throw new Error(\"request body exceeds size limit\");\n }\n chunks.push(buf);\n }\n return Buffer.concat(chunks);\n}\n\nexport function isHttpIngestRoute(pathname: string, config: HttpIngestConfig): boolean {\n return (\n pathname === HTTP_INGEST_BUNDLE_PATH ||\n pathname === HTTP_INGEST_ARTIFACT_PATH ||\n pathname === `${config.basePath}/bundle` ||\n pathname === `${config.basePath}/artifact`\n );\n}\n\nexport async function handleHttpIngestRequest(\n req: IncomingMessage,\n res: ServerResponse,\n ctx: StudioContext,\n options: StudioServerOptions,\n pathname: string,\n): Promise<boolean> {\n const config = resolveHttpIngestConfig(options, ctx.registry.ingest?.http);\n if (!isHttpIngestRoute(pathname, config)) return false;\n\n if (!config.enabled) {\n sendJson(res, 404, { error: \"HTTP ingest is disabled\" });\n return true;\n }\n\n if (req.method !== \"POST\") {\n sendJson(res, 405, { error: \"Method not allowed\" });\n return true;\n }\n\n const expectedToken = resolveIngestToken(config.tokenEnv);\n const providedToken = extractIngestTokenFromRequest(req.headers);\n if (!isIngestTokenValid(providedToken, expectedToken)) {\n sendJson(res, 403, { error: \"Invalid or missing ingest token\" });\n return true;\n }\n\n let body: Buffer;\n try {\n body = await readBoundedRequestBody(req, config.maxBytes);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const status = message.includes(\"size limit\") ? 413 : 400;\n sendJson(res, status, { error: sanitizeSafeErrorMessage(message, expectedToken) });\n return true;\n }\n\n if (body.length === 0) {\n sendJson(res, 400, { error: \"Empty request body\" });\n return true;\n }\n\n try {\n const isBundle =\n pathname === HTTP_INGEST_BUNDLE_PATH || pathname === `${config.basePath}/bundle`;\n const isArtifact =\n pathname === HTTP_INGEST_ARTIFACT_PATH || pathname === `${config.basePath}/artifact`;\n if (!isBundle && !isArtifact) {\n sendJson(res, 404, { error: \"Unknown ingest route\" });\n return true;\n }\n\n const dirs = resolveImportDirs(ctx.registryPath, ctx.registry);\n const contentHash = createHash(\"sha256\").update(body).digest(\"hex\");\n const importedAt = new Date().toISOString();\n const fileName = isBundle ? `http-bundle-${contentHash.slice(0, 8)}.bin` : `http-artifact-${contentHash.slice(0, 8)}.zip`;\n const destDir = isBundle ? dirs.bundlesDir : dirs.ciArtifactsDir;\n const destPath = uniqueDestPath(destDir, fileName, contentHash);\n assertPathUnderRoot(destPath, dirs.registryDir);\n\n await mkdir(destDir, { recursive: true });\n await writeFile(destPath, body);\n\n const sourceKey = isBundle\n ? `http:bundle:${contentHash}`\n : buildGitHubArtifactSourceKey({\n owner: \"http\",\n repo: \"ingest\",\n runId: importedAt,\n artifactName: fileName,\n });\n\n insertIngestFile(ctx.db, {\n sourceKey,\n sourceName: fileName,\n destPath,\n kind: isBundle ? \"bundle\" : \"ci\",\n contentHash,\n importedAt,\n });\n\n const registryImport = await importStudioRegistry({\n db: ctx.db,\n registry: ctx.registry,\n registryPath: ctx.registryPath,\n });\n\n sendJson(res, 200, {\n ok: true,\n imported: true,\n kind: isBundle ? \"bundle\" : \"artifact\",\n destPath,\n warnings: registryImport.warnings,\n });\n return true;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n sendJson(res, 500, { error: sanitizeSafeErrorMessage(message, expectedToken) });\n return true;\n }\n}\n","export const studioIndexHtml = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta http-equiv=\"Content-Security-Policy\" content=\"default-src 'self'; style-src 'unsafe-inline'; script-src 'unsafe-inline'\" />\n <title>AgentInspect Studio</title>\n <style>\n body { font-family: system-ui, sans-serif; margin: 0; line-height: 1.4; color: #111; }\n header { padding: 1rem 1.5rem; border-bottom: 1px solid #ddd; background: #fafafa; }\n nav a { margin-right: 1rem; color: #0b57d0; text-decoration: none; }\n nav a.active { font-weight: 600; text-decoration: underline; }\n main { padding: 1.5rem; max-width: 1100px; }\n .muted { color: #666; }\n table { border-collapse: collapse; width: 100%; margin: 1rem 0; }\n th, td { border: 1px solid #ddd; padding: 0.5rem; text-align: left; vertical-align: top; }\n th { background: #f6f6f6; }\n pre { background: #f4f4f5; padding: 1rem; overflow: auto; max-height: 60vh; }\n .error { color: #b42318; }\n </style>\n</head>\n<body>\n <header>\n <h1>AgentInspect Studio</h1>\n <p class=\"muted\">Self-hosted, read-only. SQLite only. JSONL remains canonical.</p>\n <nav id=\"nav\">\n <a href=\"#projects\" data-page=\"projects\">Projects</a>\n <a href=\"#runs\" data-page=\"runs\">Runs</a>\n <a href=\"#sessions\" data-page=\"sessions\">Sessions</a>\n <a href=\"#suites\" data-page=\"suites\">Suites</a>\n <a href=\"#safety\" data-page=\"safety\">Safety</a>\n <a href=\"#imports\" data-page=\"imports\">Imports</a>\n <a href=\"#search\" data-page=\"search\">Search</a>\n </nav>\n </header>\n <main id=\"content\"><p class=\"muted\">Loading…</p></main>\n <script>\n function escapeHtml(value) {\n return String(value ?? \"\")\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll('\"', \""\")\n .replaceAll(\"'\", \"'\");\n }\n\n let state = { projects: [], projectId: null };\n\n async function api(path) {\n const res = await fetch(path);\n const data = await res.json();\n if (!res.ok) throw new Error(data.error || res.statusText);\n return data;\n }\n\n function setPage(page) {\n document.querySelectorAll(\"#nav a\").forEach((a) => {\n a.classList.toggle(\"active\", a.dataset.page === page);\n });\n }\n\n function renderProjects() {\n setPage(\"projects\");\n const rows = state.projects.map((p) =>\n '<tr><td><a href=\"#runs\" data-select-project=\"' + escapeHtml(p.id) + '\">' +\n escapeHtml(p.label || p.id) + '</a></td><td>' + escapeHtml(p.traceCount) +\n '</td><td>' + escapeHtml(p.path) + '</td></tr>'\n ).join(\"\");\n document.getElementById(\"content\").innerHTML =\n '<h2>Projects</h2><table><thead><tr><th>Project</th><th>Runs</th><th>Path</th></tr></thead><tbody>' +\n (rows || '<tr><td colspan=\"3\">No projects imported</td></tr>') + '</tbody></table>';\n document.querySelectorAll(\"[data-select-project]\").forEach((el) => {\n el.addEventListener(\"click\", (ev) => {\n ev.preventDefault();\n state.projectId = el.getAttribute(\"data-select-project\");\n location.hash = \"runs\";\n renderRuns();\n });\n });\n }\n\n async function renderRuns() {\n setPage(\"runs\");\n if (!state.projectId && state.projects[0]) state.projectId = state.projects[0].id;\n if (!state.projectId) {\n document.getElementById(\"content\").innerHTML = '<p>Select a project first.</p>';\n return;\n }\n const data = await api(\"/api/projects/\" + encodeURIComponent(state.projectId) + \"/runs\");\n const rows = (data.runs || []).map((r) =>\n '<tr><td>' + escapeHtml(r.runId) + '</td><td>' + escapeHtml(r.status) +\n '</td><td>' + escapeHtml(r.name) + '</td><td>' + escapeHtml(r.durationMs) + '</td></tr>'\n ).join(\"\");\n document.getElementById(\"content\").innerHTML =\n '<h2>Runs — ' + escapeHtml(state.projectId) + '</h2>' +\n '<table><thead><tr><th>Run ID</th><th>Status</th><th>Name</th><th>Duration ms</th></tr></thead><tbody>' +\n rows + '</tbody></table>';\n }\n\n async function renderSimple(title, path) {\n setPage(title.toLowerCase());\n if (!state.projectId && state.projects[0]) state.projectId = state.projects[0].id;\n const data = await api(\"/api/projects/\" + encodeURIComponent(state.projectId) + \"/\" + path);\n document.getElementById(\"content\").innerHTML =\n '<h2>' + escapeHtml(title) + '</h2><pre>' + escapeHtml(JSON.stringify(data, null, 2)) + '</pre>';\n }\n\n async function renderImports() {\n setPage(\"imports\");\n const health = await api(\"/api/health\");\n document.getElementById(\"content\").innerHTML =\n '<h2>Imports</h2><p>Registry: ' + escapeHtml(health.registryName) + '</p>' +\n '<pre>' + escapeHtml(JSON.stringify(health.warnings || [], null, 2)) + '</pre>';\n }\n\n async function renderSearch() {\n setPage(\"search\");\n if (!state.projectId && state.projects[0]) state.projectId = state.projects[0].id;\n document.getElementById(\"content\").innerHTML =\n '<h2>Search</h2><p><input id=\"q\" placeholder=\"run id or name\" /> <button id=\"go\">Search</button></p><pre id=\"out\"></pre>';\n document.getElementById(\"go\").onclick = async () => {\n const q = document.getElementById(\"q\").value;\n const data = await api(\"/api/search?projectId=\" + encodeURIComponent(state.projectId) + \"&q=\" + encodeURIComponent(q));\n document.getElementById(\"out\").textContent = JSON.stringify(data, null, 2);\n };\n }\n\n async function boot() {\n const health = await api(\"/api/health\");\n const projects = await api(\"/api/projects\");\n state.projects = projects.projects || health.projects || [];\n const page = (location.hash || \"#projects\").slice(1);\n if (page === \"runs\") return renderRuns();\n if (page === \"sessions\") return renderSimple(\"Sessions\", \"sessions\");\n if (page === \"suites\") return renderSimple(\"Suites\", \"suites\");\n if (page === \"safety\") return renderSimple(\"Safety\", \"redaction\");\n if (page === \"imports\") return renderImports();\n if (page === \"search\") return renderSearch();\n return renderProjects();\n }\n\n window.addEventListener(\"hashchange\", () => boot().catch(showError));\n function showError(err) {\n document.getElementById(\"content\").innerHTML = '<p class=\"error\">' + escapeHtml(String(err)) + '</p>';\n }\n boot().catch(showError);\n </script>\n</body>\n</html>`;\n","import { readdir, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type Database from \"better-sqlite3\";\nimport {\n TraceDirectory,\n buildRunTimeline,\n buildSessionIndex,\n extractOutcomesFromTraceEvents,\n loadSessionRunRecords,\n loadTraceMetadataList,\n resolveTraceDir,\n runSuite,\n searchTraces,\n} from \"agent-inspect/advanced\";\nimport { createRunStatusRule, runTraceChecks } from \"agent-inspect/checks\";\nimport { diffRuns, manualTraceEventsToComparableRun } from \"agent-inspect/diff\";\nimport { persistedInspectEventsToTraceEvents } from \"agent-inspect/persisted\";\nimport { openTrace } from \"agent-inspect/readers\";\nimport {\n readWorkspaceManifestFile,\n resolveWorkspaceLocation,\n} from \"agent-inspect/workspace\";\n\nimport { getStudioProject, listProjectRuns, searchProjectRuns } from \"./db.js\";\nimport type { ImportedStudioProject } from \"./import.js\";\n\nexport interface StudioProjectContext {\n project: ImportedStudioProject;\n}\n\nexport function getImportedProject(\n db: Database.Database,\n projects: ImportedStudioProject[],\n projectId: string,\n): StudioProjectContext | undefined {\n const cached = projects.find((item) => item.id === projectId);\n if (cached) return { project: cached };\n const row = getStudioProject(db, projectId);\n if (!row) return undefined;\n return {\n project: {\n ...row,\n suiteConfigPaths: [],\n },\n };\n}\n\nasync function loadTraceDirMetas(workspaceDir: string, traceDirs: string[]) {\n const metas = [];\n for (const rel of traceDirs) {\n const traceDir = resolveTraceDir({ dir: path.join(workspaceDir, rel) });\n const td = new TraceDirectory({ dir: traceDir });\n const files = await td.list();\n const listed = await loadTraceMetadataList(traceDir, files, (fileName) =>\n td.getPath(fileName),\n );\n metas.push(...listed);\n }\n return metas;\n}\n\nexport async function loadProjectRunsView(\n ctx: StudioProjectContext,\n db: Database.Database,\n limit = 200,\n) {\n return listProjectRuns(db, ctx.project.id, limit);\n}\n\nexport async function loadProjectSessionsView(ctx: StudioProjectContext) {\n const location = resolveWorkspaceLocation(ctx.project.path);\n const manifestRead = await readWorkspaceManifestFile(location);\n const traceDirs = manifestRead.manifest?.traceDirs ?? [\"runs\"];\n const metas = await loadTraceDirMetas(ctx.project.workspaceDir, traceDirs);\n const runs = await loadSessionRunRecords(metas);\n return buildSessionIndex(runs, { correlateByGroupId: true });\n}\n\nexport async function loadProjectSuitesView(ctx: StudioProjectContext) {\n const suites = [];\n for (const configPath of ctx.project.suiteConfigPaths) {\n try {\n const result = await runSuite({\n configPath,\n cwd: path.dirname(configPath),\n });\n suites.push({\n suiteName: result.suiteName,\n configPath: result.configPath,\n ok: result.ok,\n status: result.status,\n summary: result.summary,\n cases: result.cases.map((item) => ({\n id: item.id,\n status: item.status,\n ...(item.runId !== undefined ? { runId: item.runId } : {}),\n ...(item.message !== undefined ? { message: item.message } : {}),\n })),\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n suites.push({\n suiteName: path.basename(configPath),\n configPath,\n ok: false,\n status: \"error\" as const,\n summary: { total: 0, passed: 0, failed: 0, skipped: 0 },\n cases: [],\n error: message,\n });\n }\n }\n return { suites };\n}\n\nexport async function loadProjectChecksView(ctx: StudioProjectContext) {\n const metas = await loadTraceDirMetas(ctx.project.workspaceDir, [\"runs\"]);\n const results = [];\n for (const meta of metas.slice(0, 20)) {\n try {\n const read = await openTrace({ type: \"file\", path: meta.filePath });\n const result = runTraceChecks(\n { read },\n { rules: [createRunStatusRule()], select: [\"run.status\"], runId: meta.runId },\n );\n results.push({\n runId: meta.runId,\n ok: result.ok,\n summary: result.summary,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n results.push({ runId: meta.runId, ok: false, error: message });\n }\n }\n return { checks: results };\n}\n\nexport async function loadProjectSearchView(\n ctx: StudioProjectContext,\n db: Database.Database,\n params: URLSearchParams,\n) {\n const q = params.get(\"q\")?.trim() ?? \"\";\n if (q) {\n return {\n query: q,\n results: searchProjectRuns(\n db,\n ctx.project.id,\n q,\n Number(params.get(\"limit\") ?? 50),\n ),\n };\n }\n const metas = await loadTraceDirMetas(ctx.project.workspaceDir, [\"runs\"]);\n const traceDir = resolveTraceDir({\n dir: path.join(ctx.project.workspaceDir, \"runs\"),\n });\n const results = await searchTraces(metas, {\n traceDir,\n ...(params.get(\"status\")\n ? { status: params.get(\"status\") as \"success\" | \"error\" | \"running\" | \"unknown\" }\n : {}),\n ...(params.get(\"name\") ? { name: params.get(\"name\") ?? undefined } : {}),\n ...(params.get(\"tool\") ? { tool: params.get(\"tool\") ?? undefined } : {}),\n limit: Number(params.get(\"limit\") ?? 50),\n });\n return { query: q, results };\n}\n\nexport async function loadProjectDiffView(\n ctx: StudioProjectContext,\n params: URLSearchParams,\n) {\n const leftRunId = params.get(\"left\");\n const rightRunId = params.get(\"right\");\n if (!leftRunId || !rightRunId) {\n throw new Error(\"left and right run ids are required.\");\n }\n const metas = await loadTraceDirMetas(ctx.project.workspaceDir, [\"runs\"]);\n const leftMeta = metas.find((item) => item.runId === leftRunId);\n const rightMeta = metas.find((item) => item.runId === rightRunId);\n if (!leftMeta || !rightMeta) {\n throw new Error(\"One or both runs were not found in the project workspace.\");\n }\n const leftRead = await openTrace({ type: \"file\", path: leftMeta.filePath });\n const rightRead = await openTrace({ type: \"file\", path: rightMeta.filePath });\n const diff = diffRuns(\n manualTraceEventsToComparableRun(\n persistedInspectEventsToTraceEvents(leftRead.events),\n ),\n manualTraceEventsToComparableRun(\n persistedInspectEventsToTraceEvents(rightRead.events),\n ),\n );\n return {\n leftRunId,\n rightRunId,\n summary: diff.summary,\n differences: diff.differences.slice(0, 50).map((item) => ({\n kind: item.kind,\n message: item.message,\n })),\n };\n}\n\nexport async function loadProjectReportsView(ctx: StudioProjectContext) {\n const reportsDir = path.join(ctx.project.workspaceDir, \"reports\");\n const reports: Array<{ name: string; path: string; sizeBytes: number }> = [];\n try {\n const files = await readdir(reportsDir);\n for (const file of files) {\n const filePath = path.join(reportsDir, file);\n const info = await stat(filePath);\n if (!info.isFile()) continue;\n reports.push({ name: file, path: filePath, sizeBytes: info.size });\n }\n } catch {\n // missing reports dir\n }\n return { reports: reports.sort((a, b) => a.name.localeCompare(b.name)) };\n}\n\nexport async function loadProjectObservationsView(ctx: StudioProjectContext) {\n const metas = await loadTraceDirMetas(ctx.project.workspaceDir, [\"runs\"]);\n const observations = [];\n for (const meta of metas.slice(0, 20)) {\n try {\n const read = await openTrace({ type: \"file\", path: meta.filePath });\n const legacy = persistedInspectEventsToTraceEvents(read.events);\n observations.push({\n runId: meta.runId,\n items: extractOutcomesFromTraceEvents(legacy),\n timeline: buildRunTimeline(legacy, { focus: \"all\" }).entries\n .filter((entry) => entry.type === \"tool\")\n .map((entry) => entry.name),\n });\n } catch {\n observations.push({ runId: meta.runId, items: [], timeline: [] });\n }\n }\n return { observations };\n}\n\nexport async function loadProjectGuardrailsView(ctx: StudioProjectContext) {\n return {\n guardrails: {\n message:\n \"Guardrail evaluation is available via CLI (`agent-inspect scan`). Studio surfaces structural status only in v6.0.\",\n redactionProfile: ctx.project.redactionProfile ?? \"share\",\n circuitWarnings: [],\n },\n };\n}\n\nexport async function loadProjectRedactionView(ctx: StudioProjectContext) {\n return {\n redaction: {\n profile: ctx.project.redactionProfile ?? \"share\",\n hint: \"Structural share-safety posture from workspace.json — not certification.\",\n bundleCommand: `npx agent-inspect bundle <runId> --profile ${ctx.project.redactionProfile ?? \"share\"}`,\n },\n };\n}\n\nexport async function loadBundleExportView(\n ctx: StudioProjectContext,\n params: URLSearchParams,\n) {\n const runId = params.get(\"runId\");\n if (!runId) {\n throw new Error(\"runId query parameter is required.\");\n }\n return {\n projectId: ctx.project.id,\n runId,\n readOnly: true,\n redactionProfile: ctx.project.redactionProfile ?? \"share\",\n cliHint: `npx agent-inspect bundle ${runId} --profile ${ctx.project.redactionProfile ?? \"share\"} --dir ${path.join(ctx.project.workspaceDir, \"runs\")}`,\n note: \"Studio does not mutate traces or upload bundles. Run the CLI locally to assemble a share-safe bundle.\",\n };\n}\n","import { createHash, timingSafeEqual } from \"node:crypto\";\nimport type { IncomingMessage } from \"node:http\";\n\nimport type { StudioServerOptions } from \"./types.js\";\n\nexport type StudioAuthMode = \"none\" | \"basic\";\n\nexport function resolveStudioAuthMode(options: StudioServerOptions): StudioAuthMode {\n return options.auth === \"basic\" ? \"basic\" : \"none\";\n}\n\nexport function resolveStudioPassword(options: StudioServerOptions): string | undefined {\n if (!options.passwordEnv) return undefined;\n const value = process.env[options.passwordEnv]?.trim();\n return value && value.length > 0 ? value : undefined;\n}\n\nfunction parseBasicAuth(header: string | undefined): string | undefined {\n if (!header || !header.startsWith(\"Basic \")) return undefined;\n try {\n const decoded = Buffer.from(header.slice(6), \"base64\").toString(\"utf8\");\n const separator = decoded.indexOf(\":\");\n if (separator < 0) return undefined;\n return decoded.slice(separator + 1);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Constant-time password comparison. Hashing both sides first keeps the\n * buffers equal length (required by timingSafeEqual) without leaking the\n * expected password length.\n */\nfunction timingSafePasswordEqual(provided: string, expected: string): boolean {\n const providedDigest = createHash(\"sha256\").update(provided, \"utf8\").digest();\n const expectedDigest = createHash(\"sha256\").update(expected, \"utf8\").digest();\n return timingSafeEqual(providedDigest, expectedDigest);\n}\n\nexport function isStudioRequestAuthorized(\n req: IncomingMessage,\n options: StudioServerOptions,\n): boolean {\n const mode = resolveStudioAuthMode(options);\n if (mode === \"none\") return true;\n const expected = resolveStudioPassword(options);\n if (!expected) return false;\n const provided = parseBasicAuth(req.headers.authorization);\n if (provided === undefined) return false;\n return timingSafePasswordEqual(provided, expected);\n}\n\nexport function studioAuthRequiredResponse(): {\n status: number;\n body: { error: string };\n headers: Record<string, string>;\n} {\n return {\n status: 401,\n body: { error: \"Unauthorized\" },\n headers: {\n \"www-authenticate\": 'Basic realm=\"AgentInspect Studio\"',\n },\n };\n}\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\n\nimport {\n getImportedProject,\n loadBundleExportView,\n loadProjectChecksView,\n loadProjectDiffView,\n loadProjectGuardrailsView,\n loadProjectObservationsView,\n loadProjectRedactionView,\n loadProjectReportsView,\n loadProjectRunsView,\n loadProjectSearchView,\n loadProjectSessionsView,\n loadProjectSuitesView,\n} from \"./project-data.js\";\nimport { summarizeProjects, type StudioContext } from \"./context.js\";\nimport type { StudioServerOptions } from \"./types.js\";\nimport { isStudioRequestAuthorized, studioAuthRequiredResponse } from \"./auth.js\";\n\nfunction sendJson(\n res: ServerResponse,\n status: number,\n body: unknown,\n headers: Record<string, string> = {},\n): void {\n const payload = JSON.stringify(body);\n res.writeHead(status, {\n \"content-type\": \"application/json; charset=utf-8\",\n \"cache-control\": \"no-store\",\n ...headers,\n });\n res.end(payload);\n}\n\nfunction notFound(res: ServerResponse, message: string): void {\n sendJson(res, 404, { error: message });\n}\n\nfunction decodeSegment(segment: string | undefined): string {\n if (!segment) return \"\";\n try {\n return decodeURIComponent(segment);\n } catch {\n return segment;\n }\n}\n\nexport async function handleStudioRoute(\n req: IncomingMessage,\n res: ServerResponse,\n ctx: StudioContext,\n options: StudioServerOptions,\n pathname: string,\n url: URL,\n): Promise<boolean> {\n if (!isStudioRequestAuthorized(req, options)) {\n const auth = studioAuthRequiredResponse();\n sendJson(res, auth.status, auth.body, auth.headers);\n return true;\n }\n\n if (pathname === \"/api/health\") {\n sendJson(res, 200, {\n ok: true,\n readOnly: true,\n mode: \"studio\",\n registryName: ctx.registry.name,\n registryPath: ctx.registryPath,\n dbPath: ctx.dbPath,\n projects: summarizeProjects(ctx.projects),\n warnings: ctx.importResult.warnings,\n });\n return true;\n }\n\n if (pathname === \"/api/projects\") {\n sendJson(res, 200, {\n registryName: ctx.registry.name,\n projects: summarizeProjects(ctx.projects),\n warnings: ctx.importResult.warnings,\n });\n return true;\n }\n\n const projectMatch = pathname.match(/^\\/api\\/projects\\/([^/]+)(?:\\/(.*))?$/);\n if (projectMatch) {\n const projectId = decodeSegment(projectMatch[1]);\n const subpath = projectMatch[2] ?? \"\";\n const projectCtx = getImportedProject(ctx.db, ctx.projects, projectId);\n if (!projectCtx) {\n notFound(res, `Project not found: ${projectId}`);\n return true;\n }\n\n if (subpath === \"runs\" || subpath === \"\") {\n sendJson(res, 200, {\n projectId,\n runs: await loadProjectRunsView(projectCtx, ctx.db),\n });\n return true;\n }\n if (subpath === \"sessions\") {\n sendJson(res, 200, {\n projectId,\n ...(await loadProjectSessionsView(projectCtx)),\n });\n return true;\n }\n if (subpath === \"suites\") {\n sendJson(res, 200, {\n projectId,\n ...(await loadProjectSuitesView(projectCtx)),\n });\n return true;\n }\n if (subpath === \"checks\") {\n sendJson(res, 200, {\n projectId,\n ...(await loadProjectChecksView(projectCtx)),\n });\n return true;\n }\n if (subpath === \"observations\") {\n sendJson(res, 200, {\n projectId,\n ...(await loadProjectObservationsView(projectCtx)),\n });\n return true;\n }\n if (subpath === \"guardrails\") {\n sendJson(res, 200, {\n projectId,\n ...(await loadProjectGuardrailsView(projectCtx)),\n });\n return true;\n }\n if (subpath === \"redaction\") {\n sendJson(res, 200, {\n projectId,\n ...(await loadProjectRedactionView(projectCtx)),\n });\n return true;\n }\n if (subpath === \"reports\") {\n sendJson(res, 200, {\n projectId,\n ...(await loadProjectReportsView(projectCtx)),\n });\n return true;\n }\n\n notFound(res, `Unknown project route: /${subpath}`);\n return true;\n }\n\n if (pathname === \"/api/search\") {\n const projectId = url.searchParams.get(\"projectId\");\n if (!projectId) {\n sendJson(res, 400, { error: \"projectId query parameter is required.\" });\n return true;\n }\n const projectCtx = getImportedProject(ctx.db, ctx.projects, projectId);\n if (!projectCtx) {\n notFound(res, `Project not found: ${projectId}`);\n return true;\n }\n sendJson(res, 200, {\n projectId,\n ...(await loadProjectSearchView(projectCtx, ctx.db, url.searchParams)),\n });\n return true;\n }\n\n if (pathname === \"/api/diff\") {\n const projectId = url.searchParams.get(\"projectId\");\n if (!projectId) {\n sendJson(res, 400, { error: \"projectId query parameter is required.\" });\n return true;\n }\n const projectCtx = getImportedProject(ctx.db, ctx.projects, projectId);\n if (!projectCtx) {\n notFound(res, `Project not found: ${projectId}`);\n return true;\n }\n try {\n sendJson(res, 200, {\n projectId,\n ...(await loadProjectDiffView(projectCtx, url.searchParams)),\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n sendJson(res, 400, { error: message });\n }\n return true;\n }\n\n if (pathname === \"/api/reports\") {\n const projectId = url.searchParams.get(\"projectId\");\n if (!projectId) {\n sendJson(res, 400, { error: \"projectId query parameter is required.\" });\n return true;\n }\n const projectCtx = getImportedProject(ctx.db, ctx.projects, projectId);\n if (!projectCtx) {\n notFound(res, `Project not found: ${projectId}`);\n return true;\n }\n sendJson(res, 200, {\n projectId,\n ...(await loadProjectReportsView(projectCtx)),\n });\n return true;\n }\n\n if (pathname === \"/api/bundles/export\") {\n const projectId = url.searchParams.get(\"projectId\");\n if (!projectId) {\n sendJson(res, 400, { error: \"projectId query parameter is required.\" });\n return true;\n }\n const projectCtx = getImportedProject(ctx.db, ctx.projects, projectId);\n if (!projectCtx) {\n notFound(res, `Project not found: ${projectId}`);\n return true;\n }\n try {\n sendJson(res, 200, await loadBundleExportView(projectCtx, url.searchParams));\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n sendJson(res, 400, { error: message });\n }\n return true;\n }\n\n return false;\n}\n","import { createServer, type Server, type ServerResponse } from \"node:http\";\n\nimport { createStudioContext, type StudioContext } from \"./context.js\";\nimport { handleHttpIngestRequest, isHttpIngestRoute, resolveHttpIngestConfig } from \"./ingest/http.js\";\nimport { studioIndexHtml } from \"./html.js\";\nimport { handleStudioRoute } from \"./routes.js\";\nimport type { StudioServerInfo, StudioServerOptions } from \"./types.js\";\n\nconst DEFAULT_HOST = \"127.0.0.1\";\nconst DEFAULT_PORT = 7340;\n\nfunction badRequest(res: ServerResponse, message: string): void {\n res.writeHead(400, {\n \"content-type\": \"application/json; charset=utf-8\",\n \"cache-control\": \"no-store\",\n });\n res.end(JSON.stringify({ error: message }));\n}\n\nfunction resolveHost(options: StudioServerOptions): string {\n if (options.server === true) {\n return options.host ?? \"0.0.0.0\";\n }\n return options.host ?? DEFAULT_HOST;\n}\n\nexport function createStudioServer(options: StudioServerOptions = {}): Server {\n const host = resolveHost(options);\n const port = options.port ?? DEFAULT_PORT;\n let contextPromise: Promise<StudioContext> | undefined = options.context\n ? Promise.resolve(options.context)\n : undefined;\n\n if (host === \"0.0.0.0\") {\n console.warn(\n \"[AgentInspect studio] Binding to 0.0.0.0 exposes workspace evidence on the network. Use 127.0.0.1 unless you accept that risk.\",\n );\n if (options.auth !== \"basic\") {\n console.warn(\n \"[AgentInspect studio] Non-localhost binding without --auth basic is discouraged for production use.\",\n );\n }\n }\n\n const server = createServer(async (req, res) => {\n try {\n const method = req.method ?? \"GET\";\n const url = new URL(req.url ?? \"/\", `http://${host}:${port}`);\n const pathname = url.pathname;\n\n if (!contextPromise) {\n contextPromise = createStudioContext(options);\n }\n const ctx = await contextPromise;\n const httpConfig = resolveHttpIngestConfig(options, ctx.registry.ingest?.http);\n\n if (isHttpIngestRoute(pathname, httpConfig)) {\n const handled = await handleHttpIngestRequest(req, res, ctx, options, pathname);\n if (handled) return;\n }\n\n if (method !== \"GET\" && method !== \"HEAD\") {\n return badRequest(res, \"Only GET is supported.\");\n }\n\n if (pathname === \"/\" || pathname === \"/index.html\") {\n if (req.method === \"HEAD\") {\n res.writeHead(200, { \"content-type\": \"text/html; charset=utf-8\" });\n res.end();\n return;\n }\n res.writeHead(200, { \"content-type\": \"text/html; charset=utf-8\" });\n res.end(studioIndexHtml);\n return;\n }\n\n const handled = await handleStudioRoute(req, res, ctx, options, pathname, url);\n if (!handled) {\n res.writeHead(404, {\n \"content-type\": \"application/json; charset=utf-8\",\n \"cache-control\": \"no-store\",\n });\n res.end(JSON.stringify({ error: `Unknown route: ${pathname}` }));\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n res.writeHead(500, {\n \"content-type\": \"application/json; charset=utf-8\",\n \"cache-control\": \"no-store\",\n });\n res.end(JSON.stringify({ error: message }));\n }\n });\n\n return server;\n}\n\nexport async function startStudioServer(\n options: StudioServerOptions = {},\n): Promise<StudioServerInfo> {\n const host = resolveHost(options);\n const port = options.port ?? DEFAULT_PORT;\n const ctx = options.context ?? (await createStudioContext(options));\n const server = createStudioServer({ ...options, context: ctx });\n\n return new Promise((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(port, host, () => {\n const address = server.address();\n const resolvedPort =\n typeof address === \"object\" && address ? address.port : port;\n resolve({\n host,\n port: resolvedPort,\n url: `http://${host === \"0.0.0.0\" ? \"127.0.0.1\" : host}:${resolvedPort}/`,\n mode: \"studio\",\n ...(options.workspacePath !== undefined\n ? { workspacePath: options.workspacePath }\n : {}),\n dbPath: ctx.dbPath,\n registryName: ctx.registry.name,\n projectCount: ctx.projects.length,\n });\n });\n });\n}\n","import { createHash } from \"node:crypto\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\n\nimport type Database from \"better-sqlite3\";\n\nimport {\n findIngestFileBySourceKey,\n insertIngestFile,\n openStudioDb,\n resolveStudioDbPath,\n type IngestFileKind,\n} from \"../db.js\";\nimport { importStudioRegistry } from \"../import.js\";\nimport { assertPathUnderRoot } from \"../path-guards.js\";\nimport { readStudioRegistryFile, type StudioRegistry } from \"../registry.js\";\nimport { resolveStudioRegistryPath } from \"../registry-path.js\";\nimport {\n buildGitHubArtifactSourceKey,\n parseGitHubRepo,\n resolveImportDirs,\n sanitizeSafeErrorMessage,\n uniqueDestPath,\n} from \"./common.js\";\n\nconst DEFAULT_GITHUB_TOKEN_ENV = \"GITHUB_TOKEN\";\nconst GITHUB_API_BASE = \"https://api.github.com\";\nconst MAX_ARTIFACT_BYTES = 52_428_800;\n\nexport type StudioFetch = typeof fetch;\n\nexport interface GitHubArtifactImportOptions {\n db: Database.Database;\n registryPath: string;\n registry: StudioRegistry;\n repo: string;\n runId: string;\n artifactName: string;\n /** Explicit opt-in required — disabled by default. */\n enabled: boolean;\n tokenEnv?: string;\n fetchImpl?: StudioFetch;\n}\n\nexport interface GitHubArtifactImportResult {\n skipped: boolean;\n reason?: string;\n imported: boolean;\n destPath?: string;\n sourceKey?: string;\n contentHash?: string;\n registryImportWarnings: string[];\n errors: string[];\n}\n\ninterface GitHubArtifactsResponse {\n artifacts?: Array<{\n id?: number;\n name?: string;\n archive_download_url?: string;\n expired?: boolean;\n size_in_bytes?: number;\n }>;\n}\n\nfunction resolveTokenEnv(registry: StudioRegistry, override?: string): string {\n const fromRegistry = registry.ingest?.github?.tokenEnv?.trim();\n const envName = override?.trim() || fromRegistry || DEFAULT_GITHUB_TOKEN_ENV;\n if (!/^[A-Z][A-Z0-9_]*$/.test(envName)) {\n throw new Error(\"token env name must be an uppercase identifier\");\n }\n return envName;\n}\n\nfunction resolveToken(envName: string): string {\n const token = process.env[envName]?.trim();\n if (!token) {\n throw new Error(`missing GitHub token in environment variable ${envName}`);\n }\n return token;\n}\n\nfunction githubHeaders(token: string): Record<string, string> {\n return {\n Authorization: `Bearer ${token}`,\n Accept: \"application/vnd.github+json\",\n \"X-GitHub-Api-Version\": \"2022-11-28\",\n \"User-Agent\": \"agent-inspect-studio-ingest\",\n };\n}\n\nasync function readResponseBody(\n response: Response,\n maxBytes: number,\n): Promise<Buffer> {\n const lengthHeader = response.headers.get(\"content-length\");\n if (lengthHeader) {\n const length = Number(lengthHeader);\n if (Number.isFinite(length) && length > maxBytes) {\n throw new Error(\"artifact exceeds size limit\");\n }\n }\n const arrayBuffer = await response.arrayBuffer();\n if (arrayBuffer.byteLength > maxBytes) {\n throw new Error(\"artifact exceeds size limit\");\n }\n return Buffer.from(arrayBuffer);\n}\n\nexport async function downloadGitHubArtifactArchive(options: {\n repo: string;\n runId: string;\n artifactName: string;\n token: string;\n fetchImpl?: StudioFetch;\n}): Promise<Buffer> {\n const fetchFn = options.fetchImpl ?? fetch;\n const { owner, name } = parseGitHubRepo(options.repo);\n const runId = options.runId.trim();\n const artifactName = options.artifactName.trim();\n if (!/^\\d+$/.test(runId)) {\n throw new Error(\"run-id must be a numeric workflow run id\");\n }\n if (artifactName === \"\") {\n throw new Error(\"artifact name must be non-empty\");\n }\n\n const listUrl = `${GITHUB_API_BASE}/repos/${owner}/${name}/actions/runs/${runId}/artifacts`;\n const listResponse = await fetchFn(listUrl, {\n headers: githubHeaders(options.token),\n });\n if (!listResponse.ok) {\n throw new Error(`GitHub artifact lookup failed (${listResponse.status})`);\n }\n\n const payload = (await listResponse.json()) as GitHubArtifactsResponse;\n const artifact = payload.artifacts?.find((item) => item.name === artifactName);\n if (!artifact?.archive_download_url) {\n throw new Error(`artifact not found for run ${runId}: ${artifactName}`);\n }\n if (artifact.expired === true) {\n throw new Error(`artifact expired for run ${runId}: ${artifactName}`);\n }\n if (\n typeof artifact.size_in_bytes === \"number\" &&\n artifact.size_in_bytes > MAX_ARTIFACT_BYTES\n ) {\n throw new Error(\"artifact exceeds size limit\");\n }\n\n const downloadResponse = await fetchFn(artifact.archive_download_url, {\n headers: githubHeaders(options.token),\n redirect: \"follow\",\n });\n if (!downloadResponse.ok) {\n throw new Error(`GitHub artifact download failed (${downloadResponse.status})`);\n }\n\n return readResponseBody(downloadResponse, MAX_ARTIFACT_BYTES);\n}\n\nexport async function importGitHubArtifact(\n options: GitHubArtifactImportOptions,\n): Promise<GitHubArtifactImportResult> {\n const registryImportWarnings: string[] = [];\n const errors: string[] = [];\n\n if (!options.enabled) {\n return {\n skipped: true,\n reason: \"GitHub artifact ingest is disabled; use studio import github explicitly\",\n imported: false,\n registryImportWarnings,\n errors,\n };\n }\n\n let token: string | undefined;\n let tokenEnv: string | undefined;\n try {\n const { owner, name } = parseGitHubRepo(options.repo);\n tokenEnv = resolveTokenEnv(options.registry, options.tokenEnv);\n token = resolveToken(tokenEnv);\n const sourceKey = buildGitHubArtifactSourceKey({\n owner,\n repo: name,\n runId: options.runId,\n artifactName: options.artifactName,\n });\n\n const archive = await downloadGitHubArtifactArchive({\n repo: options.repo,\n runId: options.runId,\n artifactName: options.artifactName,\n token,\n ...(options.fetchImpl !== undefined ? { fetchImpl: options.fetchImpl } : {}),\n });\n\n const contentHash = createHash(\"sha256\").update(archive).digest(\"hex\");\n const existing = findIngestFileBySourceKey(options.db, sourceKey);\n if (existing && existing.contentHash === contentHash) {\n return {\n skipped: false,\n imported: false,\n sourceKey,\n contentHash,\n destPath: existing.destPath,\n registryImportWarnings,\n errors,\n };\n }\n\n const dirs = resolveImportDirs(options.registryPath, options.registry);\n const fileName = `${options.artifactName}.zip`;\n const destPath = uniqueDestPath(dirs.bundlesDir, fileName, contentHash);\n assertPathUnderRoot(destPath, dirs.registryDir);\n\n await mkdir(dirs.bundlesDir, { recursive: true });\n await writeFile(destPath, archive);\n\n const importedAt = new Date().toISOString();\n insertIngestFile(options.db, {\n sourceKey,\n sourceName: fileName,\n destPath,\n kind: \"bundle\" satisfies IngestFileKind,\n contentHash,\n importedAt,\n });\n\n const registryImport = await importStudioRegistry({\n db: options.db,\n registry: options.registry,\n registryPath: options.registryPath,\n });\n registryImportWarnings.push(...registryImport.warnings);\n\n return {\n skipped: false,\n imported: true,\n sourceKey,\n contentHash,\n destPath,\n registryImportWarnings,\n errors,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n errors.push(sanitizeSafeErrorMessage(message, token));\n return {\n skipped: false,\n imported: false,\n registryImportWarnings,\n errors,\n };\n }\n}\n\nexport async function runStudioGitHubArtifactImport(options: {\n workspacePath?: string;\n dbPath?: string;\n cwd?: string;\n repo: string;\n runId: string;\n artifact: string;\n tokenEnv?: string;\n fetchImpl?: StudioFetch;\n}): Promise<GitHubArtifactImportResult> {\n const cwd = options.cwd ?? process.cwd();\n const registryPath = await resolveStudioRegistryPath({\n ...(options.workspacePath !== undefined ? { workspacePath: options.workspacePath } : {}),\n cwd,\n });\n const registryRead = await readStudioRegistryFile(registryPath);\n if (!registryRead.ok || registryRead.registry === undefined) {\n throw new Error(registryRead.errors.join(\"; \") || \"invalid studio registry\");\n }\n\n const dbPath = resolveStudioDbPath({\n ...(options.dbPath !== undefined ? { dbPath: options.dbPath } : {}),\n cwd,\n });\n const db = openStudioDb(dbPath);\n\n return importGitHubArtifact({\n db,\n registryPath,\n registry: registryRead.registry,\n repo: options.repo,\n runId: options.runId,\n artifactName: options.artifact,\n enabled: true,\n ...(options.tokenEnv !== undefined ? { tokenEnv: options.tokenEnv } : {}),\n ...(options.fetchImpl !== undefined ? { fetchImpl: options.fetchImpl } : {}),\n });\n}\n","import { createHash } from \"node:crypto\";\nimport { access, copyFile, mkdir, readFile, readdir, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type Database from \"better-sqlite3\";\n\nimport {\n findIngestFileBySourceKey,\n insertIngestFile,\n openStudioDb,\n resolveStudioDbPath,\n} from \"../db.js\";\nimport { importStudioRegistry } from \"../import.js\";\nimport { assertPathUnderRoot } from \"../path-guards.js\";\nimport { readStudioRegistryFile } from \"../registry.js\";\nimport { resolveStudioRegistryPath } from \"../registry-path.js\";\nimport { resolveImportDirs, uniqueDestPath } from \"./common.js\";\n\nexport interface BundleUploadImportOptions {\n db: Database.Database;\n registryPath: string;\n registry: import(\"../registry.js\").StudioRegistry;\n bundlePath: string;\n enabled: boolean;\n}\n\nexport interface BundleUploadImportResult {\n skipped: boolean;\n reason?: string;\n imported: boolean;\n destPath?: string;\n sourceKey?: string;\n errors: string[];\n registryImportWarnings: string[];\n}\n\ninterface BundleMetadataShape {\n agentInspectVersion?: string;\n redactionProfile?: string;\n runIds?: string[];\n files?: string[];\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function validateBundleDirectory(bundleDir: string): Promise<string[]> {\n const errors: string[] = [];\n const metadataPath = path.join(bundleDir, \"metadata.json\");\n if (!(await pathExists(metadataPath))) {\n errors.push(\"bundle missing metadata.json\");\n return errors;\n }\n try {\n const raw = await readFile(metadataPath, \"utf8\");\n const parsed = JSON.parse(raw) as BundleMetadataShape;\n if (typeof parsed.agentInspectVersion !== \"string\") {\n errors.push(\"bundle metadata.json missing agentInspectVersion\");\n }\n if (!Array.isArray(parsed.runIds) || parsed.runIds.length === 0) {\n errors.push(\"bundle metadata.json missing runIds\");\n }\n } catch {\n errors.push(\"bundle metadata.json is invalid JSON\");\n }\n return errors;\n}\n\n/**\n * Deterministic hash over the full bundle contents (sorted relative paths and\n * file bytes). Hashing only metadata.json let edited trace files slip past\n * dedup, so a re-imported bundle kept serving the stale copy.\n */\nasync function hashBundleContents(bundleDir: string): Promise<string> {\n const hash = createHash(\"sha256\");\n const walk = async (dir: string, relPrefix: string): Promise<void> => {\n const entries = (await readdir(dir, { withFileTypes: true })).sort((a, b) =>\n a.name.localeCompare(b.name),\n );\n for (const entry of entries) {\n const abs = path.join(dir, entry.name);\n const rel = relPrefix ? `${relPrefix}/${entry.name}` : entry.name;\n if (entry.isDirectory()) {\n await walk(abs, rel);\n } else if (entry.isFile()) {\n hash.update(rel);\n hash.update(\"\\0\");\n hash.update(await readFile(abs));\n hash.update(\"\\0\");\n }\n }\n };\n await walk(bundleDir, \"\");\n return hash.digest(\"hex\");\n}\n\nasync function copyDirectoryRecursive(sourceDir: string, destDir: string): Promise<void> {\n await mkdir(destDir, { recursive: true });\n const entries = await readdir(sourceDir, { withFileTypes: true });\n for (const entry of entries) {\n const from = path.join(sourceDir, entry.name);\n const to = path.join(destDir, entry.name);\n if (entry.isDirectory()) {\n await copyDirectoryRecursive(from, to);\n } else if (entry.isFile()) {\n await copyFile(from, to);\n }\n }\n}\n\nexport async function importBundleUpload(\n options: BundleUploadImportOptions,\n): Promise<BundleUploadImportResult> {\n const registryImportWarnings: string[] = [];\n const errors: string[] = [];\n\n if (!options.enabled) {\n return {\n skipped: true,\n reason: \"bundle upload ingest is disabled; use studio import bundle explicitly\",\n imported: false,\n errors,\n registryImportWarnings,\n };\n }\n\n const bundlePath = path.resolve(options.bundlePath);\n let bundleStat;\n try {\n bundleStat = await stat(bundlePath);\n } catch {\n return {\n skipped: false,\n imported: false,\n errors: [\"bundle path does not exist\"],\n registryImportWarnings,\n };\n }\n\n if (!bundleStat.isDirectory()) {\n return {\n skipped: false,\n imported: false,\n errors: [\"bundle path must be a directory produced by agent-inspect bundle\"],\n registryImportWarnings,\n };\n }\n\n const validationErrors = await validateBundleDirectory(bundlePath);\n if (validationErrors.length > 0) {\n return {\n skipped: false,\n imported: false,\n errors: validationErrors,\n registryImportWarnings,\n };\n }\n\n const contentHash = await hashBundleContents(bundlePath);\n const sourceKey = `bundle:${bundlePath}`;\n const existing = findIngestFileBySourceKey(options.db, sourceKey);\n if (existing && existing.contentHash === contentHash) {\n return {\n skipped: false,\n imported: false,\n destPath: existing.destPath,\n sourceKey,\n errors,\n registryImportWarnings,\n };\n }\n\n const dirs = resolveImportDirs(options.registryPath, options.registry);\n const folderName = path.basename(bundlePath);\n const destPath = uniqueDestPath(dirs.bundlesDir, folderName, contentHash);\n assertPathUnderRoot(destPath, dirs.registryDir);\n\n try {\n await copyDirectoryRecursive(bundlePath, destPath);\n insertIngestFile(options.db, {\n sourceKey,\n sourceName: folderName,\n destPath,\n kind: \"bundle\",\n contentHash,\n importedAt: new Date().toISOString(),\n });\n const registryImport = await importStudioRegistry({\n db: options.db,\n registry: options.registry,\n registryPath: options.registryPath,\n });\n registryImportWarnings.push(...registryImport.warnings);\n return {\n skipped: false,\n imported: true,\n destPath,\n sourceKey,\n errors,\n registryImportWarnings,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n skipped: false,\n imported: false,\n errors: [message],\n registryImportWarnings,\n };\n }\n}\n\nexport async function runStudioBundleUploadImport(options: {\n workspacePath?: string;\n dbPath?: string;\n cwd?: string;\n bundlePath: string;\n}): Promise<BundleUploadImportResult> {\n const cwd = options.cwd ?? process.cwd();\n const registryPath = await resolveStudioRegistryPath({\n ...(options.workspacePath !== undefined ? { workspacePath: options.workspacePath } : {}),\n cwd,\n });\n const registryRead = await readStudioRegistryFile(registryPath);\n if (!registryRead.ok || registryRead.registry === undefined) {\n throw new Error(registryRead.errors.join(\"; \") || \"invalid studio registry\");\n }\n const dbPath = resolveStudioDbPath({\n ...(options.dbPath !== undefined ? { dbPath: options.dbPath } : {}),\n cwd,\n });\n const db = openStudioDb(dbPath);\n return importBundleUpload({\n db,\n registryPath,\n registry: registryRead.registry,\n bundlePath: options.bundlePath,\n enabled: true,\n });\n}\n"]}
|