@agent-inspect/studio 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +47 -0
- package/dist/index.cjs +1004 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +99 -0
- package/dist/index.d.ts +99 -0
- package/dist/index.mjs +991 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/registry.ts","../src/db.ts","../src/import.ts","../src/registry-path.ts","../src/context.ts","../src/html.ts","../src/project-data.ts","../src/auth.ts","../src/routes.ts","../src/server.ts"],"names":["readFile","path","mkdir","Database","readdir","resolveTraceDir","TraceDirectory","loadTraceMetadataList","resolveWorkspaceLocation","readWorkspaceManifestFile","access","loadSessionRunRecords","buildSessionIndex","runSuite","openTrace","runTraceChecks","createRunStatusRule","searchTraces","diff","diffRuns","manualTraceEventsToComparableRun","persistedInspectEventsToTraceEvents","stat","extractOutcomesFromTraceEvents","buildRunTimeline","createServer"],"mappings":"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","file":"index.cjs","sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\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}\n\nexport interface StudioRegistry {\n schemaVersion: typeof STUDIO_REGISTRY_SCHEMA_VERSION;\n name: string;\n projects: StudioRegistryProject[];\n import?: StudioRegistryImport;\n}\n\nexport interface StudioRegistryParseResult {\n ok: boolean;\n registry?: StudioRegistry;\n errors: 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\nfunction 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 parseStudioRegistry(input: unknown): StudioRegistryParseResult {\n const errors: string[] = [];\n if (!isPlainObject(input)) {\n return { ok: false, errors: [\"registry must be a JSON object\"] };\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 }\n }\n\n if (errors.length > 0) return { ok: false, errors };\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 },\n errors: [],\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 { ok: false, path: filePath, errors: [\"registry file exceeds size limit\"] };\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] };\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 { mkdir } from \"node:fs/promises\";\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);\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 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 implemented in v6.0.0; use a SQLite file path.\",\n );\n }\n const dir = path.dirname(dbPath);\n void mkdir(dir, { recursive: true });\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","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 type Database from \"better-sqlite3\";\n\nimport { importStudioRegistry, type ImportedStudioProject, type StudioImportResult } from \"./import.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 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 return {\n db,\n dbPath,\n registryPath,\n registry: registryRead.registry,\n importResult,\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","export const studioIndexHtml = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <title>AgentInspect Studio</title>\n <style>\n body { font-family: system-ui, sans-serif; margin: 1.5rem; line-height: 1.4; }\n h1 { font-size: 1.25rem; }\n .muted { color: #666; }\n </style>\n</head>\n<body>\n <h1>AgentInspect Studio</h1>\n <p class=\"muted\">Self-hosted, read-only. JSONL and workspace manifests remain canonical.</p>\n <p id=\"status\">Loading health…</p>\n <script>\n fetch(\"/api/health\")\n .then((res) => res.json())\n .then((data) => {\n document.getElementById(\"status\").textContent =\n data.ok ? \"Studio is running (read-only).\" : \"Studio health check failed.\";\n })\n .catch(() => {\n document.getElementById(\"status\").textContent = \"Studio health check failed.\";\n });\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 { 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 if (req.method !== \"GET\" && req.method !== \"HEAD\") {\n return badRequest(res, \"Only GET is supported.\");\n }\n\n if (!contextPromise) {\n contextPromise = createStudioContext(options);\n }\n const ctx = await contextPromise;\n\n const url = new URL(req.url ?? \"/\", `http://${host}:${port}`);\n const pathname = url.pathname;\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"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
import { Server } from 'node:http';
|
|
3
|
+
|
|
4
|
+
type StudioAuthMode = "none" | "basic";
|
|
5
|
+
|
|
6
|
+
interface StudioProjectRow {
|
|
7
|
+
id: string;
|
|
8
|
+
label: string | null;
|
|
9
|
+
path: string;
|
|
10
|
+
workspaceDir: string;
|
|
11
|
+
projectName: string | null;
|
|
12
|
+
redactionProfile: string | null;
|
|
13
|
+
traceCount: number;
|
|
14
|
+
importedAt: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
declare const STUDIO_REGISTRY_SCHEMA_VERSION: "1.0";
|
|
18
|
+
interface StudioRegistryProject {
|
|
19
|
+
id: string;
|
|
20
|
+
path: string;
|
|
21
|
+
label?: string;
|
|
22
|
+
suiteConfigs?: string[];
|
|
23
|
+
}
|
|
24
|
+
interface StudioRegistryImport {
|
|
25
|
+
ciArtifactsDir?: string;
|
|
26
|
+
bundlesDir?: string;
|
|
27
|
+
}
|
|
28
|
+
interface StudioRegistry {
|
|
29
|
+
schemaVersion: typeof STUDIO_REGISTRY_SCHEMA_VERSION;
|
|
30
|
+
name: string;
|
|
31
|
+
projects: StudioRegistryProject[];
|
|
32
|
+
import?: StudioRegistryImport;
|
|
33
|
+
}
|
|
34
|
+
interface StudioRegistryParseResult {
|
|
35
|
+
ok: boolean;
|
|
36
|
+
registry?: StudioRegistry;
|
|
37
|
+
errors: string[];
|
|
38
|
+
}
|
|
39
|
+
declare function parseStudioRegistry(input: unknown): StudioRegistryParseResult;
|
|
40
|
+
declare function readStudioRegistryFile(filePath: string): Promise<StudioRegistryParseResult & {
|
|
41
|
+
path: string;
|
|
42
|
+
}>;
|
|
43
|
+
|
|
44
|
+
interface ImportedStudioProject extends StudioProjectRow {
|
|
45
|
+
suiteConfigPaths: string[];
|
|
46
|
+
}
|
|
47
|
+
interface StudioImportResult {
|
|
48
|
+
registryName: string;
|
|
49
|
+
projects: ImportedStudioProject[];
|
|
50
|
+
warnings: string[];
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
interface StudioContext {
|
|
54
|
+
db: Database.Database;
|
|
55
|
+
dbPath: string;
|
|
56
|
+
registryPath: string;
|
|
57
|
+
registry: StudioRegistry;
|
|
58
|
+
importResult: StudioImportResult;
|
|
59
|
+
projects: ImportedStudioProject[];
|
|
60
|
+
}
|
|
61
|
+
declare function createStudioContext(options?: StudioServerOptions): Promise<StudioContext>;
|
|
62
|
+
declare function summarizeProjects(projects: StudioProjectRow[]): {
|
|
63
|
+
id: string;
|
|
64
|
+
label: string;
|
|
65
|
+
projectName: string | null;
|
|
66
|
+
traceCount: number;
|
|
67
|
+
redactionProfile: string | null;
|
|
68
|
+
importedAt: string;
|
|
69
|
+
}[];
|
|
70
|
+
|
|
71
|
+
interface StudioServerOptions {
|
|
72
|
+
host?: string;
|
|
73
|
+
port?: number;
|
|
74
|
+
workspacePath?: string;
|
|
75
|
+
dbPath?: string;
|
|
76
|
+
server?: boolean;
|
|
77
|
+
cwd?: string;
|
|
78
|
+
auth?: StudioAuthMode;
|
|
79
|
+
passwordEnv?: string;
|
|
80
|
+
/** Test hook: inject a preloaded context instead of importing on startup. */
|
|
81
|
+
context?: StudioContext;
|
|
82
|
+
}
|
|
83
|
+
interface StudioServerInfo {
|
|
84
|
+
host: string;
|
|
85
|
+
port: number;
|
|
86
|
+
url: string;
|
|
87
|
+
mode: "studio";
|
|
88
|
+
workspacePath?: string;
|
|
89
|
+
dbPath?: string;
|
|
90
|
+
registryName?: string;
|
|
91
|
+
projectCount?: number;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
declare function createStudioServer(options?: StudioServerOptions): Server;
|
|
95
|
+
declare function startStudioServer(options?: StudioServerOptions): Promise<StudioServerInfo>;
|
|
96
|
+
|
|
97
|
+
declare const studioIndexHtml = "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <title>AgentInspect Studio</title>\n <style>\n body { font-family: system-ui, sans-serif; margin: 1.5rem; line-height: 1.4; }\n h1 { font-size: 1.25rem; }\n .muted { color: #666; }\n </style>\n</head>\n<body>\n <h1>AgentInspect Studio</h1>\n <p class=\"muted\">Self-hosted, read-only. JSONL and workspace manifests remain canonical.</p>\n <p id=\"status\">Loading health\u2026</p>\n <script>\n fetch(\"/api/health\")\n .then((res) => res.json())\n .then((data) => {\n document.getElementById(\"status\").textContent =\n data.ok ? \"Studio is running (read-only).\" : \"Studio health check failed.\";\n })\n .catch(() => {\n document.getElementById(\"status\").textContent = \"Studio health check failed.\";\n });\n </script>\n</body>\n</html>";
|
|
98
|
+
|
|
99
|
+
export { type StudioRegistry, type StudioRegistryProject, type StudioServerInfo, type StudioServerOptions, createStudioContext, createStudioServer, parseStudioRegistry, readStudioRegistryFile, startStudioServer, studioIndexHtml, summarizeProjects };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
import { Server } from 'node:http';
|
|
3
|
+
|
|
4
|
+
type StudioAuthMode = "none" | "basic";
|
|
5
|
+
|
|
6
|
+
interface StudioProjectRow {
|
|
7
|
+
id: string;
|
|
8
|
+
label: string | null;
|
|
9
|
+
path: string;
|
|
10
|
+
workspaceDir: string;
|
|
11
|
+
projectName: string | null;
|
|
12
|
+
redactionProfile: string | null;
|
|
13
|
+
traceCount: number;
|
|
14
|
+
importedAt: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
declare const STUDIO_REGISTRY_SCHEMA_VERSION: "1.0";
|
|
18
|
+
interface StudioRegistryProject {
|
|
19
|
+
id: string;
|
|
20
|
+
path: string;
|
|
21
|
+
label?: string;
|
|
22
|
+
suiteConfigs?: string[];
|
|
23
|
+
}
|
|
24
|
+
interface StudioRegistryImport {
|
|
25
|
+
ciArtifactsDir?: string;
|
|
26
|
+
bundlesDir?: string;
|
|
27
|
+
}
|
|
28
|
+
interface StudioRegistry {
|
|
29
|
+
schemaVersion: typeof STUDIO_REGISTRY_SCHEMA_VERSION;
|
|
30
|
+
name: string;
|
|
31
|
+
projects: StudioRegistryProject[];
|
|
32
|
+
import?: StudioRegistryImport;
|
|
33
|
+
}
|
|
34
|
+
interface StudioRegistryParseResult {
|
|
35
|
+
ok: boolean;
|
|
36
|
+
registry?: StudioRegistry;
|
|
37
|
+
errors: string[];
|
|
38
|
+
}
|
|
39
|
+
declare function parseStudioRegistry(input: unknown): StudioRegistryParseResult;
|
|
40
|
+
declare function readStudioRegistryFile(filePath: string): Promise<StudioRegistryParseResult & {
|
|
41
|
+
path: string;
|
|
42
|
+
}>;
|
|
43
|
+
|
|
44
|
+
interface ImportedStudioProject extends StudioProjectRow {
|
|
45
|
+
suiteConfigPaths: string[];
|
|
46
|
+
}
|
|
47
|
+
interface StudioImportResult {
|
|
48
|
+
registryName: string;
|
|
49
|
+
projects: ImportedStudioProject[];
|
|
50
|
+
warnings: string[];
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
interface StudioContext {
|
|
54
|
+
db: Database.Database;
|
|
55
|
+
dbPath: string;
|
|
56
|
+
registryPath: string;
|
|
57
|
+
registry: StudioRegistry;
|
|
58
|
+
importResult: StudioImportResult;
|
|
59
|
+
projects: ImportedStudioProject[];
|
|
60
|
+
}
|
|
61
|
+
declare function createStudioContext(options?: StudioServerOptions): Promise<StudioContext>;
|
|
62
|
+
declare function summarizeProjects(projects: StudioProjectRow[]): {
|
|
63
|
+
id: string;
|
|
64
|
+
label: string;
|
|
65
|
+
projectName: string | null;
|
|
66
|
+
traceCount: number;
|
|
67
|
+
redactionProfile: string | null;
|
|
68
|
+
importedAt: string;
|
|
69
|
+
}[];
|
|
70
|
+
|
|
71
|
+
interface StudioServerOptions {
|
|
72
|
+
host?: string;
|
|
73
|
+
port?: number;
|
|
74
|
+
workspacePath?: string;
|
|
75
|
+
dbPath?: string;
|
|
76
|
+
server?: boolean;
|
|
77
|
+
cwd?: string;
|
|
78
|
+
auth?: StudioAuthMode;
|
|
79
|
+
passwordEnv?: string;
|
|
80
|
+
/** Test hook: inject a preloaded context instead of importing on startup. */
|
|
81
|
+
context?: StudioContext;
|
|
82
|
+
}
|
|
83
|
+
interface StudioServerInfo {
|
|
84
|
+
host: string;
|
|
85
|
+
port: number;
|
|
86
|
+
url: string;
|
|
87
|
+
mode: "studio";
|
|
88
|
+
workspacePath?: string;
|
|
89
|
+
dbPath?: string;
|
|
90
|
+
registryName?: string;
|
|
91
|
+
projectCount?: number;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
declare function createStudioServer(options?: StudioServerOptions): Server;
|
|
95
|
+
declare function startStudioServer(options?: StudioServerOptions): Promise<StudioServerInfo>;
|
|
96
|
+
|
|
97
|
+
declare const studioIndexHtml = "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <title>AgentInspect Studio</title>\n <style>\n body { font-family: system-ui, sans-serif; margin: 1.5rem; line-height: 1.4; }\n h1 { font-size: 1.25rem; }\n .muted { color: #666; }\n </style>\n</head>\n<body>\n <h1>AgentInspect Studio</h1>\n <p class=\"muted\">Self-hosted, read-only. JSONL and workspace manifests remain canonical.</p>\n <p id=\"status\">Loading health\u2026</p>\n <script>\n fetch(\"/api/health\")\n .then((res) => res.json())\n .then((data) => {\n document.getElementById(\"status\").textContent =\n data.ok ? \"Studio is running (read-only).\" : \"Studio health check failed.\";\n })\n .catch(() => {\n document.getElementById(\"status\").textContent = \"Studio health check failed.\";\n });\n </script>\n</body>\n</html>";
|
|
98
|
+
|
|
99
|
+
export { type StudioRegistry, type StudioRegistryProject, type StudioServerInfo, type StudioServerOptions, createStudioContext, createStudioServer, parseStudioRegistry, readStudioRegistryFile, startStudioServer, studioIndexHtml, summarizeProjects };
|