@percepta/kaizen 0.9.1 → 0.10.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.
Files changed (74) hide show
  1. package/dist/dashboard/pages/api/langfuse-action.js.map +1 -1
  2. package/dist/dashboard/pages/api/langfuse-dataset-item.js.map +1 -1
  3. package/dist/dashboard/pages/api/langfuse-dataset-mutation.js.map +1 -1
  4. package/dist/dashboard/pages/api/langfuse-dataset.js.map +1 -1
  5. package/dist/dashboard/pages/api/langfuse-datasets.js.map +1 -1
  6. package/dist/dashboard/pages/api/langfuse-trace-memberships.js.map +1 -1
  7. package/dist/dashboard/pages/api/langfuse-trace.js.map +1 -1
  8. package/dist/dashboard/pages/api/langfuse-traces.js.map +1 -1
  9. package/dist/dashboard/pages/api/linear-ideas.js.map +1 -1
  10. package/dist/dashboard/pages/api/run-events.js.map +1 -1
  11. package/dist/dashboard/pages/api/run-failures.js.map +1 -1
  12. package/dist/dashboard/pages/api/run-traces.js.map +1 -1
  13. package/dist/dashboard/pages/api/runs.js.map +1 -1
  14. package/dist/dashboard/pages/api/systems.js +1 -1
  15. package/dist/dashboard/pages/api/systems.js.map +1 -1
  16. package/dist/dashboard/pages/api/trace-renderer-version.js +10 -3
  17. package/dist/dashboard/pages/api/trace-renderer-version.js.map +1 -1
  18. package/dist/dashboard/pages/api/trace-renderer.js +12 -26
  19. package/dist/dashboard/pages/api/trace-renderer.js.map +1 -1
  20. package/dist/dashboard/src/lib/bundle-custom-renderer.js +167 -0
  21. package/dist/dashboard/src/lib/bundle-custom-renderer.js.map +1 -0
  22. package/dist/dashboard/src/lib/custom-renderer-files.js.map +1 -1
  23. package/dist/dashboard/src/lib/custom-renderer-metadata.js.map +1 -1
  24. package/dist/dashboard/src/lib/custom-view-paths.js.map +1 -1
  25. package/dist/dashboard/src/lib/dataset-item-labeling.js.map +1 -1
  26. package/dist/dashboard/src/lib/env.js.map +1 -1
  27. package/dist/dashboard/src/lib/langfuse-cache.js.map +1 -1
  28. package/dist/dashboard/src/lib/langfuse-creds.js.map +1 -1
  29. package/dist/dashboard/src/lib/langfuse-demo.js.map +1 -1
  30. package/dist/dashboard/src/lib/langfuse-errors.js.map +1 -1
  31. package/dist/dashboard/src/lib/langfuse-helpers.js.map +1 -1
  32. package/dist/dashboard/src/lib/run-api.js.map +1 -1
  33. package/dist/dashboard/src/lib/run-store.js.map +1 -1
  34. package/dist/dashboard/src/lib/types.js.map +1 -1
  35. package/dist/dashboard/src/lib/workspace-env.js.map +1 -1
  36. package/dist/dashboard/src/lib/workspace.js.map +1 -1
  37. package/dist/index.js.map +1 -1
  38. package/dist/langfuse.d.ts.map +1 -1
  39. package/dist/langfuse.js.map +1 -1
  40. package/dist/package.js +2 -2
  41. package/dist/shared/env-file.js.map +1 -1
  42. package/dist/shared/linear-ideas.js.map +1 -1
  43. package/dist/shared/linear-issue.js.map +1 -1
  44. package/dist/shared/view-types.d.ts.map +1 -1
  45. package/dist/shared/workspace-paths.js.map +1 -1
  46. package/dist/src/commands/create-view.js.map +1 -1
  47. package/dist/src/commands/guide.js.map +1 -1
  48. package/dist/src/commands/ideas.js.map +1 -1
  49. package/dist/src/commands/init-system.js.map +1 -1
  50. package/dist/src/commands/init.js.map +1 -1
  51. package/dist/src/commands/log.js.map +1 -1
  52. package/dist/src/commands/rebuild.js.map +1 -1
  53. package/dist/src/commands/run.js.map +1 -1
  54. package/dist/src/commands/studio.js.map +1 -1
  55. package/dist/src/lib/bootstrap.js.map +1 -1
  56. package/dist/src/lib/cli.js.map +1 -1
  57. package/dist/src/lib/events.js +2 -0
  58. package/dist/src/lib/events.js.map +1 -1
  59. package/dist/src/lib/fs-utils.js.map +1 -1
  60. package/dist/src/lib/leaderboard.js.map +1 -1
  61. package/dist/src/lib/parse-args.js.map +1 -1
  62. package/dist/src/lib/paths.js.map +1 -1
  63. package/dist/src/lib/promotion.js.map +1 -1
  64. package/dist/src/lib/prompt.js.map +1 -1
  65. package/dist/src/lib/run-dir.js.map +1 -1
  66. package/dist/src/lib/runner.js.map +1 -1
  67. package/dist/src/lib/system.js.map +1 -1
  68. package/dist/studio/client/assets/index-ElL5OoiH.js +9 -0
  69. package/dist/studio/client/index.html +1 -1
  70. package/dist/studio/server.d.ts.map +1 -1
  71. package/dist/studio/server.js.map +1 -1
  72. package/dist/types.d.ts.map +1 -1
  73. package/package.json +3 -3
  74. package/dist/studio/client/assets/index-D5r9lQ7l.js +0 -9
@@ -7,7 +7,7 @@
7
7
  <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32.png" />
8
8
  <link rel="icon" type="image/png" sizes="64x64" href="/favicon-64.png" />
9
9
  <link rel="apple-touch-icon" href="/apple-touch-icon.png" />
10
- <script type="module" crossorigin src="/assets/index-D5r9lQ7l.js"></script>
10
+ <script type="module" crossorigin src="/assets/index-ElL5OoiH.js"></script>
11
11
  <link rel="stylesheet" crossorigin href="/assets/index-Dc4zGLjQ.css">
12
12
  </head>
13
13
  <body>
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","names":[],"sources":["../../dashboard/src/studio/server/server.ts"],"mappings":";UAuCiB,mBAAA;EACf,IAAA;EACA,QAAA;EACA,aAAA;EACA,QAAA;AAAA;AAAA,iBAsBoB,iBAAA,CACpB,OAAA,GAAS,mBAAA,GACR,OAAA;AAAA,iBAwOa,kBAAA,CAAmB,QAAA;AAAA,iBAKnB,WAAA,CAAY,QAAA"}
1
+ {"version":3,"file":"server.d.ts","names":[],"sources":["../../dashboard/src/studio/server/server.ts"],"mappings":";UAuCiB,mBAAA;EACf,IAAA;EACA,QAAA;EACA,aAAA;EACA,QAAA;AAAA;AAAA,iBAsBoB,iBAAA,CACpB,OAAA,GAAS,mBAAA,GACR,OAAO;AAAA,iBAwOM,kBAAA,CAAmB,QAAgB;AAAA,iBAKnC,WAAA,CAAY,QAAgB"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","names":["langfuseAction","langfuseDataset","langfuseDatasetItem","langfuseDatasetMutation","langfuseDatasets","langfuseTrace","langfuseTraceMemberships","langfuseTraces","linearIdeas","runEvents","runFailures","runTraces","runs","systems","traceRenderer","traceRendererVersion"],"sources":["../../dashboard/src/studio/server/server.ts"],"sourcesContent":["import { createReadStream, existsSync, statSync } from \"node:fs\";\nimport {\n createServer,\n type IncomingMessage,\n type ServerResponse,\n} from \"node:http\";\nimport {\n dirname,\n extname,\n isAbsolute,\n join,\n relative,\n resolve,\n} from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { resolveKaizenStateDir } from \"../../../../shared/workspace-paths.js\";\nimport langfuseAction from \"../../../pages/api/langfuse-action\";\nimport langfuseDataset from \"../../../pages/api/langfuse-dataset\";\nimport langfuseDatasetItem from \"../../../pages/api/langfuse-dataset-item\";\nimport langfuseDatasetMutation from \"../../../pages/api/langfuse-dataset-mutation\";\nimport langfuseDatasets from \"../../../pages/api/langfuse-datasets\";\nimport langfuseTrace from \"../../../pages/api/langfuse-trace\";\nimport langfuseTraceMemberships from \"../../../pages/api/langfuse-trace-memberships\";\nimport langfuseTraces from \"../../../pages/api/langfuse-traces\";\nimport linearIdeas from \"../../../pages/api/linear-ideas\";\nimport runEvents from \"../../../pages/api/run-events\";\nimport runFailures from \"../../../pages/api/run-failures\";\nimport runTraces from \"../../../pages/api/run-traces\";\nimport runs from \"../../../pages/api/runs\";\nimport systems from \"../../../pages/api/systems\";\nimport traceRenderer from \"../../../pages/api/trace-renderer\";\nimport traceRendererVersion from \"../../../pages/api/trace-renderer-version\";\nimport type { StudioRequest, StudioResponse } from \"./compat\";\n\ntype ApiHandler = (\n req: StudioRequest,\n res: StudioResponse,\n) => void | Promise<void>;\n\nexport interface StudioServerOptions {\n port?: number | string;\n hostname?: string;\n workspaceRoot?: string;\n stateDir?: string;\n}\n\nconst API_ROUTES: Record<string, ApiHandler> = {\n \"/api/langfuse-action\": langfuseAction,\n \"/api/langfuse-dataset\": langfuseDataset,\n \"/api/langfuse-dataset-item\": langfuseDatasetItem,\n \"/api/langfuse-dataset-mutation\": langfuseDatasetMutation,\n \"/api/langfuse-datasets\": langfuseDatasets,\n \"/api/langfuse-trace\": langfuseTrace,\n \"/api/langfuse-trace-memberships\": langfuseTraceMemberships,\n \"/api/langfuse-traces\": langfuseTraces,\n \"/api/linear-ideas\": linearIdeas,\n \"/api/run-events\": runEvents,\n \"/api/run-failures\": runFailures,\n \"/api/run-traces\": runTraces,\n \"/api/runs\": runs,\n \"/api/systems\": systems,\n \"/api/trace-renderer\": traceRenderer,\n \"/api/trace-renderer-version\": traceRendererVersion,\n};\n\nexport async function startStudioServer(\n options: StudioServerOptions = {},\n): Promise<number> {\n const base = resolve(process.cwd());\n const workspace = resolve(\n base,\n options.workspaceRoot ?? process.env.KAIZEN_WORKSPACE ?? \".\",\n );\n const workspaceRelativePath = relative(base, workspace);\n if (\n workspaceRelativePath.startsWith(\"..\") ||\n isAbsolute(workspaceRelativePath)\n ) {\n throw new Error(\"Invalid workspace root path\");\n }\n\n const stateDir =\n options.stateDir ??\n process.env.KAIZEN_STATE_DIR ??\n resolveKaizenStateDir(workspace);\n const port = Number(options.port ?? process.env.PORT ?? 6789);\n const hostname = options.hostname ?? \"127.0.0.1\";\n\n process.env.KAIZEN_WORKSPACE = workspace;\n process.env.KAIZEN_STATE_DIR = stateDir;\n\n const server = createServer((req, res) => {\n void handleRequest(req, res).catch((err) => {\n sendServerError(res, err);\n });\n });\n\n let shuttingDown = false;\n const shutdown = () => {\n if (shuttingDown) return;\n shuttingDown = true;\n server.close();\n server.closeAllConnections();\n };\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n return await new Promise<number>((resolveExit) => {\n server.listen(port, hostname, () => {\n process.stdout.write(`kaizen studio: ${workspace}\\n`);\n process.stdout.write(`state: ${stateDir}\\n`);\n process.stdout.write(`url: http://localhost:${port}\\n`);\n });\n server.on(\"close\", () => resolveExit(0));\n server.on(\"error\", (err) => {\n process.stderr.write(`kaizen studio server error: ${err.message}\\n`);\n resolveExit(1);\n });\n });\n}\n\nasync function handleRequest(\n req: IncomingMessage,\n res: ServerResponse,\n): Promise<void> {\n if (hasPathTraversal(rawPathname(req.url ?? \"/\"))) {\n res.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n res.end(\"Not found\");\n return;\n }\n\n const url = new URL(req.url ?? \"/\", \"http://kaizen.local\");\n const handler = API_ROUTES[url.pathname];\n if (handler !== undefined) {\n await handleApi(handler, req, res, url);\n return;\n }\n\n if (url.pathname.startsWith(\"/api/\")) {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"API route not found\" }));\n return;\n }\n\n if (req.method !== \"GET\" && req.method !== \"HEAD\") {\n res.writeHead(405, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Method not allowed\" }));\n return;\n }\n\n if (isSystemIndexRoute(url.pathname) && !hasStaticFile(url.pathname)) {\n res.writeHead(302, {\n Location: `${url.pathname.replace(/\\/+$/, \"\")}/experiments`,\n });\n res.end();\n return;\n }\n\n serveStatic(req, res, url.pathname);\n}\n\nasync function handleApi(\n handler: ApiHandler,\n req: IncomingMessage,\n res: ServerResponse,\n url: URL,\n): Promise<void> {\n const apiReq = req as StudioRequest;\n apiReq.query = queryObject(url.searchParams);\n const apiRes = decorateResponse(res);\n try {\n if (req.method !== \"GET\" && req.method !== \"HEAD\") {\n apiReq.body = await readJsonBody(req);\n }\n await handler(apiReq, apiRes);\n } catch (err) {\n sendServerError(res, err);\n }\n}\n\nfunction decorateResponse(res: ServerResponse): StudioResponse {\n const apiRes = res as StudioResponse;\n apiRes.status = (code: number) => {\n res.statusCode = code;\n return apiRes;\n };\n apiRes.json = (value: unknown) => {\n if (!res.headersSent) {\n res.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\n }\n res.end(JSON.stringify(value));\n };\n apiRes.send = (value: unknown) => {\n if (\n typeof value === \"string\" ||\n Buffer.isBuffer(value) ||\n value instanceof Uint8Array\n ) {\n res.end(value);\n return;\n }\n apiRes.json(value);\n };\n return apiRes;\n}\n\nfunction serveStatic(\n req: IncomingMessage,\n res: ServerResponse,\n pathname: string,\n): void {\n const root = trustedClientRoot();\n const decodedPath = safeDecodePath(pathname);\n const requestedPath =\n decodedPath === \"/\" ? \"index.html\" : decodedPath.replace(/^\\/+/, \"\");\n const target = resolve(root, requestedPath);\n const targetRelativePath = relative(root, target);\n if (targetRelativePath.startsWith(\"..\") || isAbsolute(targetRelativePath)) {\n res.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n res.end(\"Not found\");\n return;\n }\n\n const indexPath = resolve(root, \"index.html\");\n const indexRelativePath = relative(root, indexPath);\n const filePath =\n existsSync(target) && statSync(target).isFile()\n ? target\n : isAssetPath(`/${requestedPath}`)\n ? null\n : indexRelativePath.startsWith(\"..\") || isAbsolute(indexRelativePath)\n ? null\n : indexPath;\n\n if (!filePath || !existsSync(filePath)) {\n res.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n res.end(\"Not found\");\n return;\n }\n\n const validatedPath = resolve(filePath);\n const fileRelativePath = relative(root, validatedPath);\n if (fileRelativePath.startsWith(\"..\") || isAbsolute(fileRelativePath)) {\n res.writeHead(403, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n res.end(\"Forbidden\");\n return;\n }\n\n const mimeType = mimeTypeFor(validatedPath);\n res.writeHead(200, {\n \"Content-Type\": mimeType,\n \"Cache-Control\":\n validatedPath.endsWith(\"index.html\") || mimeType.startsWith(\"text/html\")\n ? \"no-store\"\n : \"public, max-age=31536000, immutable\",\n });\n if (req.method === \"HEAD\") {\n res.end();\n return;\n }\n const stream = createReadStream(validatedPath);\n stream.on(\"error\", (err) => {\n sendServerError(res, err);\n });\n stream.pipe(res);\n}\n\nfunction queryObject(\n params: URLSearchParams,\n): Record<string, string | string[]> {\n const out: Record<string, string | string[]> = {};\n for (const [key, value] of params) {\n const existing = out[key];\n if (existing === undefined) {\n out[key] = value;\n } else if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n out[key] = [existing, value];\n }\n }\n return out;\n}\n\nasync function readJsonBody(req: IncomingMessage): Promise<unknown> {\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n if (chunks.length === 0) return undefined;\n const text = Buffer.concat(chunks).toString(\"utf-8\");\n if (!text.trim()) return undefined;\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\nexport function isSystemIndexRoute(pathname: string): boolean {\n const parts = pathname.split(\"/\").filter(Boolean);\n return parts.length === 1 && parts[0] !== \"api\";\n}\n\nexport function isAssetPath(pathname: string): boolean {\n return (\n pathname.startsWith(\"/assets/\") || pathname.startsWith(\"/source-icons/\")\n );\n}\n\nfunction hasStaticFile(pathname: string): boolean {\n const root = trustedClientRoot();\n const decodedPath = safeDecodePath(pathname);\n const requestedPath =\n decodedPath === \"/\" ? \"index.html\" : decodedPath.replace(/^\\/+/, \"\");\n const target = resolve(root, requestedPath);\n return (\n isInside(root, target) && existsSync(target) && statSync(target).isFile()\n );\n}\n\nfunction sendServerError(res: ServerResponse, err: unknown): void {\n if (!res.headersSent) {\n res.writeHead(500, { \"Content-Type\": \"application/json; charset=utf-8\" });\n res.end(\n JSON.stringify({\n error: err instanceof Error ? err.message : String(err),\n }),\n );\n return;\n }\n res.destroy(err instanceof Error ? err : undefined);\n}\n\nfunction trustedClientRoot(): string {\n return resolve(findPackageRoot(), \"dist\", \"studio\", \"client\");\n}\n\nfunction rawPathname(requestUrl: string): string {\n return requestUrl.split(/[?#]/, 1)[0] || \"/\";\n}\n\nfunction hasPathTraversal(pathname: string): boolean {\n let decodedPath = pathname;\n for (let i = 0; i < 3; i += 1) {\n const next = safeDecodePath(decodedPath);\n if (next === decodedPath) break;\n decodedPath = next;\n }\n return decodedPath.split(/[\\\\/]+/).includes(\"..\");\n}\n\nfunction safeDecodePath(pathname: string): string {\n try {\n return decodeURIComponent(pathname);\n } catch {\n return pathname;\n }\n}\n\nfunction isInside(root: string, target: string): boolean {\n const relativePath = relative(root, target);\n return (\n relativePath === \"\" ||\n (!relativePath.startsWith(\"..\") && !isAbsolute(relativePath))\n );\n}\n\nfunction findPackageRoot(): string {\n let dir = dirname(fileURLToPath(import.meta.url));\n while (dir !== dirname(dir)) {\n if (existsSync(join(dir, \"package.json\"))) return dir;\n dir = dirname(dir);\n }\n return process.cwd();\n}\n\nfunction mimeTypeFor(filePath: string): string {\n switch (extname(filePath).toLowerCase()) {\n case \".html\":\n return \"text/html; charset=utf-8\";\n case \".js\":\n return \"text/javascript; charset=utf-8\";\n case \".css\":\n return \"text/css; charset=utf-8\";\n case \".json\":\n return \"application/json; charset=utf-8\";\n case \".png\":\n return \"image/png\";\n case \".svg\":\n return \"image/svg+xml\";\n case \".ico\":\n return \"image/x-icon\";\n default:\n return \"application/octet-stream\";\n }\n}\n\nif (process.argv[1] === fileURLToPath(import.meta.url)) {\n void startStudioServer().then((code) => process.exit(code));\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"server.js","names":["langfuseAction","langfuseDataset","langfuseDatasetItem","langfuseDatasetMutation","langfuseDatasets","langfuseTrace","langfuseTraceMemberships","langfuseTraces","linearIdeas","runEvents","runFailures","runTraces","runs","systems","traceRenderer","traceRendererVersion"],"sources":["../../dashboard/src/studio/server/server.ts"],"sourcesContent":["import { createReadStream, existsSync, statSync } from \"node:fs\";\nimport {\n createServer,\n type IncomingMessage,\n type ServerResponse,\n} from \"node:http\";\nimport {\n dirname,\n extname,\n isAbsolute,\n join,\n relative,\n resolve,\n} from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { resolveKaizenStateDir } from \"../../../../shared/workspace-paths.js\";\nimport langfuseAction from \"../../../pages/api/langfuse-action\";\nimport langfuseDataset from \"../../../pages/api/langfuse-dataset\";\nimport langfuseDatasetItem from \"../../../pages/api/langfuse-dataset-item\";\nimport langfuseDatasetMutation from \"../../../pages/api/langfuse-dataset-mutation\";\nimport langfuseDatasets from \"../../../pages/api/langfuse-datasets\";\nimport langfuseTrace from \"../../../pages/api/langfuse-trace\";\nimport langfuseTraceMemberships from \"../../../pages/api/langfuse-trace-memberships\";\nimport langfuseTraces from \"../../../pages/api/langfuse-traces\";\nimport linearIdeas from \"../../../pages/api/linear-ideas\";\nimport runEvents from \"../../../pages/api/run-events\";\nimport runFailures from \"../../../pages/api/run-failures\";\nimport runTraces from \"../../../pages/api/run-traces\";\nimport runs from \"../../../pages/api/runs\";\nimport systems from \"../../../pages/api/systems\";\nimport traceRenderer from \"../../../pages/api/trace-renderer\";\nimport traceRendererVersion from \"../../../pages/api/trace-renderer-version\";\nimport type { StudioRequest, StudioResponse } from \"./compat\";\n\ntype ApiHandler = (\n req: StudioRequest,\n res: StudioResponse,\n) => void | Promise<void>;\n\nexport interface StudioServerOptions {\n port?: number | string;\n hostname?: string;\n workspaceRoot?: string;\n stateDir?: string;\n}\n\nconst API_ROUTES: Record<string, ApiHandler> = {\n \"/api/langfuse-action\": langfuseAction,\n \"/api/langfuse-dataset\": langfuseDataset,\n \"/api/langfuse-dataset-item\": langfuseDatasetItem,\n \"/api/langfuse-dataset-mutation\": langfuseDatasetMutation,\n \"/api/langfuse-datasets\": langfuseDatasets,\n \"/api/langfuse-trace\": langfuseTrace,\n \"/api/langfuse-trace-memberships\": langfuseTraceMemberships,\n \"/api/langfuse-traces\": langfuseTraces,\n \"/api/linear-ideas\": linearIdeas,\n \"/api/run-events\": runEvents,\n \"/api/run-failures\": runFailures,\n \"/api/run-traces\": runTraces,\n \"/api/runs\": runs,\n \"/api/systems\": systems,\n \"/api/trace-renderer\": traceRenderer,\n \"/api/trace-renderer-version\": traceRendererVersion,\n};\n\nexport async function startStudioServer(\n options: StudioServerOptions = {},\n): Promise<number> {\n const base = resolve(process.cwd());\n const workspace = resolve(\n base,\n options.workspaceRoot ?? process.env.KAIZEN_WORKSPACE ?? \".\",\n );\n const workspaceRelativePath = relative(base, workspace);\n if (\n workspaceRelativePath.startsWith(\"..\") ||\n isAbsolute(workspaceRelativePath)\n ) {\n throw new Error(\"Invalid workspace root path\");\n }\n\n const stateDir =\n options.stateDir ??\n process.env.KAIZEN_STATE_DIR ??\n resolveKaizenStateDir(workspace);\n const port = Number(options.port ?? process.env.PORT ?? 6789);\n const hostname = options.hostname ?? \"127.0.0.1\";\n\n process.env.KAIZEN_WORKSPACE = workspace;\n process.env.KAIZEN_STATE_DIR = stateDir;\n\n const server = createServer((req, res) => {\n void handleRequest(req, res).catch((err) => {\n sendServerError(res, err);\n });\n });\n\n let shuttingDown = false;\n const shutdown = () => {\n if (shuttingDown) return;\n shuttingDown = true;\n server.close();\n server.closeAllConnections();\n };\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n return await new Promise<number>((resolveExit) => {\n server.listen(port, hostname, () => {\n process.stdout.write(`kaizen studio: ${workspace}\\n`);\n process.stdout.write(`state: ${stateDir}\\n`);\n process.stdout.write(`url: http://localhost:${port}\\n`);\n });\n server.on(\"close\", () => resolveExit(0));\n server.on(\"error\", (err) => {\n process.stderr.write(`kaizen studio server error: ${err.message}\\n`);\n resolveExit(1);\n });\n });\n}\n\nasync function handleRequest(\n req: IncomingMessage,\n res: ServerResponse,\n): Promise<void> {\n if (hasPathTraversal(rawPathname(req.url ?? \"/\"))) {\n res.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n res.end(\"Not found\");\n return;\n }\n\n const url = new URL(req.url ?? \"/\", \"http://kaizen.local\");\n const handler = API_ROUTES[url.pathname];\n if (handler !== undefined) {\n await handleApi(handler, req, res, url);\n return;\n }\n\n if (url.pathname.startsWith(\"/api/\")) {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"API route not found\" }));\n return;\n }\n\n if (req.method !== \"GET\" && req.method !== \"HEAD\") {\n res.writeHead(405, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Method not allowed\" }));\n return;\n }\n\n if (isSystemIndexRoute(url.pathname) && !hasStaticFile(url.pathname)) {\n res.writeHead(302, {\n Location: `${url.pathname.replace(/\\/+$/, \"\")}/experiments`,\n });\n res.end();\n return;\n }\n\n serveStatic(req, res, url.pathname);\n}\n\nasync function handleApi(\n handler: ApiHandler,\n req: IncomingMessage,\n res: ServerResponse,\n url: URL,\n): Promise<void> {\n const apiReq = req as StudioRequest;\n apiReq.query = queryObject(url.searchParams);\n const apiRes = decorateResponse(res);\n try {\n if (req.method !== \"GET\" && req.method !== \"HEAD\") {\n apiReq.body = await readJsonBody(req);\n }\n await handler(apiReq, apiRes);\n } catch (err) {\n sendServerError(res, err);\n }\n}\n\nfunction decorateResponse(res: ServerResponse): StudioResponse {\n const apiRes = res as StudioResponse;\n apiRes.status = (code: number) => {\n res.statusCode = code;\n return apiRes;\n };\n apiRes.json = (value: unknown) => {\n if (!res.headersSent) {\n res.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\n }\n res.end(JSON.stringify(value));\n };\n apiRes.send = (value: unknown) => {\n if (\n typeof value === \"string\" ||\n Buffer.isBuffer(value) ||\n value instanceof Uint8Array\n ) {\n res.end(value);\n return;\n }\n apiRes.json(value);\n };\n return apiRes;\n}\n\nfunction serveStatic(\n req: IncomingMessage,\n res: ServerResponse,\n pathname: string,\n): void {\n const root = trustedClientRoot();\n const decodedPath = safeDecodePath(pathname);\n const requestedPath =\n decodedPath === \"/\" ? \"index.html\" : decodedPath.replace(/^\\/+/, \"\");\n const target = resolve(root, requestedPath);\n const targetRelativePath = relative(root, target);\n if (targetRelativePath.startsWith(\"..\") || isAbsolute(targetRelativePath)) {\n res.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n res.end(\"Not found\");\n return;\n }\n\n const indexPath = resolve(root, \"index.html\");\n const indexRelativePath = relative(root, indexPath);\n const filePath =\n existsSync(target) && statSync(target).isFile()\n ? target\n : isAssetPath(`/${requestedPath}`)\n ? null\n : indexRelativePath.startsWith(\"..\") || isAbsolute(indexRelativePath)\n ? null\n : indexPath;\n\n if (!filePath || !existsSync(filePath)) {\n res.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n res.end(\"Not found\");\n return;\n }\n\n const validatedPath = resolve(filePath);\n const fileRelativePath = relative(root, validatedPath);\n if (fileRelativePath.startsWith(\"..\") || isAbsolute(fileRelativePath)) {\n res.writeHead(403, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n res.end(\"Forbidden\");\n return;\n }\n\n const mimeType = mimeTypeFor(validatedPath);\n res.writeHead(200, {\n \"Content-Type\": mimeType,\n \"Cache-Control\":\n validatedPath.endsWith(\"index.html\") || mimeType.startsWith(\"text/html\")\n ? \"no-store\"\n : \"public, max-age=31536000, immutable\",\n });\n if (req.method === \"HEAD\") {\n res.end();\n return;\n }\n const stream = createReadStream(validatedPath);\n stream.on(\"error\", (err) => {\n sendServerError(res, err);\n });\n stream.pipe(res);\n}\n\nfunction queryObject(\n params: URLSearchParams,\n): Record<string, string | string[]> {\n const out: Record<string, string | string[]> = {};\n for (const [key, value] of params) {\n const existing = out[key];\n if (existing === undefined) {\n out[key] = value;\n } else if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n out[key] = [existing, value];\n }\n }\n return out;\n}\n\nasync function readJsonBody(req: IncomingMessage): Promise<unknown> {\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n if (chunks.length === 0) return undefined;\n const text = Buffer.concat(chunks).toString(\"utf-8\");\n if (!text.trim()) return undefined;\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\nexport function isSystemIndexRoute(pathname: string): boolean {\n const parts = pathname.split(\"/\").filter(Boolean);\n return parts.length === 1 && parts[0] !== \"api\";\n}\n\nexport function isAssetPath(pathname: string): boolean {\n return (\n pathname.startsWith(\"/assets/\") || pathname.startsWith(\"/source-icons/\")\n );\n}\n\nfunction hasStaticFile(pathname: string): boolean {\n const root = trustedClientRoot();\n const decodedPath = safeDecodePath(pathname);\n const requestedPath =\n decodedPath === \"/\" ? \"index.html\" : decodedPath.replace(/^\\/+/, \"\");\n const target = resolve(root, requestedPath);\n return (\n isInside(root, target) && existsSync(target) && statSync(target).isFile()\n );\n}\n\nfunction sendServerError(res: ServerResponse, err: unknown): void {\n if (!res.headersSent) {\n res.writeHead(500, { \"Content-Type\": \"application/json; charset=utf-8\" });\n res.end(\n JSON.stringify({\n error: err instanceof Error ? err.message : String(err),\n }),\n );\n return;\n }\n res.destroy(err instanceof Error ? err : undefined);\n}\n\nfunction trustedClientRoot(): string {\n return resolve(findPackageRoot(), \"dist\", \"studio\", \"client\");\n}\n\nfunction rawPathname(requestUrl: string): string {\n return requestUrl.split(/[?#]/, 1)[0] || \"/\";\n}\n\nfunction hasPathTraversal(pathname: string): boolean {\n let decodedPath = pathname;\n for (let i = 0; i < 3; i += 1) {\n const next = safeDecodePath(decodedPath);\n if (next === decodedPath) break;\n decodedPath = next;\n }\n return decodedPath.split(/[\\\\/]+/).includes(\"..\");\n}\n\nfunction safeDecodePath(pathname: string): string {\n try {\n return decodeURIComponent(pathname);\n } catch {\n return pathname;\n }\n}\n\nfunction isInside(root: string, target: string): boolean {\n const relativePath = relative(root, target);\n return (\n relativePath === \"\" ||\n (!relativePath.startsWith(\"..\") && !isAbsolute(relativePath))\n );\n}\n\nfunction findPackageRoot(): string {\n let dir = dirname(fileURLToPath(import.meta.url));\n while (dir !== dirname(dir)) {\n if (existsSync(join(dir, \"package.json\"))) return dir;\n dir = dirname(dir);\n }\n return process.cwd();\n}\n\nfunction mimeTypeFor(filePath: string): string {\n switch (extname(filePath).toLowerCase()) {\n case \".html\":\n return \"text/html; charset=utf-8\";\n case \".js\":\n return \"text/javascript; charset=utf-8\";\n case \".css\":\n return \"text/css; charset=utf-8\";\n case \".json\":\n return \"application/json; charset=utf-8\";\n case \".png\":\n return \"image/png\";\n case \".svg\":\n return \"image/svg+xml\";\n case \".ico\":\n return \"image/x-icon\";\n default:\n return \"application/octet-stream\";\n }\n}\n\nif (process.argv[1] === fileURLToPath(import.meta.url)) {\n void startStudioServer().then((code) => process.exit(code));\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"mappings":";;;UAAiB,YAAA;EACf,QAAA;IACE,IAAA;EAAA;AAAA"}
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"mappings":";;;UAAiB,YAAA;EACf,QAAA;IACE,IAAI;EAAA;AAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@percepta/kaizen",
3
- "version": "0.9.1",
3
+ "version": "0.10.0",
4
4
  "description": "Automated AI researcher that improves AI systems",
5
5
  "keywords": [
6
6
  "ai",
@@ -42,6 +42,7 @@
42
42
  "yaml": "^2.8.4"
43
43
  },
44
44
  "devDependencies": {
45
+ "@percepta/build": "^1.2.1",
45
46
  "@types/d3-hierarchy": "^3.1.7",
46
47
  "@types/node": "^25.6.2",
47
48
  "@types/react": "^19.2.14",
@@ -55,8 +56,7 @@
55
56
  "rimraf": "^6.1.3",
56
57
  "typescript": "^6.0.3",
57
58
  "vite": "^8.0.11",
58
- "vitest": "^4.1.5",
59
- "@percepta/build": "1.1.0"
59
+ "vitest": "^4.1.5"
60
60
  },
61
61
  "peerDependencies": {
62
62
  "@types/react": "^19.0.0"