tracelight 0.1.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 +102 -0
- package/dist/apiTypes.d.ts +139 -0
- package/dist/apiTypes.d.ts.map +1 -0
- package/dist/apiTypes.js +11 -0
- package/dist/apiTypes.js.map +1 -0
- package/dist/cli.d.ts +13 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +73 -0
- package/dist/cli.js.map +1 -0
- package/dist/model.d.ts +133 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +20 -0
- package/dist/model.js.map +1 -0
- package/dist/parser/index.d.ts +27 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +434 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/rawTypes.d.ts +149 -0
- package/dist/parser/rawTypes.d.ts.map +1 -0
- package/dist/parser/rawTypes.js +11 -0
- package/dist/parser/rawTypes.js.map +1 -0
- package/dist/pricing.d.ts +35 -0
- package/dist/pricing.d.ts.map +1 -0
- package/dist/pricing.js +73 -0
- package/dist/pricing.js.map +1 -0
- package/dist/projectLoader.d.ts +31 -0
- package/dist/projectLoader.d.ts.map +1 -0
- package/dist/projectLoader.js +335 -0
- package/dist/projectLoader.js.map +1 -0
- package/dist/scripts/summarize.d.ts +7 -0
- package/dist/scripts/summarize.d.ts.map +1 -0
- package/dist/scripts/summarize.js +153 -0
- package/dist/scripts/summarize.js.map +1 -0
- package/dist/server/index.d.ts +18 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +100 -0
- package/dist/server/index.js.map +1 -0
- package/package.json +70 -0
- package/ui/dist/assets/index-Bnr6kWU4.js +62 -0
- package/ui/dist/assets/index-HoOM9YCS.css +1 -0
- package/ui/dist/index.html +13 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA2BH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC;IAClE,KAAK,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B,CAAC,CA6ED"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fastify HTTP server for tracelight.
|
|
3
|
+
*
|
|
4
|
+
* Serves:
|
|
5
|
+
* - GET /api/projects — list of all projects with session summaries
|
|
6
|
+
* - GET /api/sessions/:id — full session detail by sessionId
|
|
7
|
+
* - Static files from the Vite build output (ui/dist/)
|
|
8
|
+
*
|
|
9
|
+
* The server imports only from model.ts and apiTypes.ts — never from parser/.
|
|
10
|
+
*/
|
|
11
|
+
import Fastify from "fastify";
|
|
12
|
+
import fastifyStatic from "@fastify/static";
|
|
13
|
+
import { join } from "path";
|
|
14
|
+
import { existsSync } from "fs";
|
|
15
|
+
import { fileURLToPath } from "url";
|
|
16
|
+
import { loadAllProjects, loadSession, toSessionDetail } from "../projectLoader.js";
|
|
17
|
+
// Resolve the path to the built UI — works whether running from src or dist
|
|
18
|
+
const __dirname = fileURLToPath(new URL(".", import.meta.url));
|
|
19
|
+
// When compiled, this file is at dist/server/index.js; ui/dist is at ../../ui/dist
|
|
20
|
+
// When running via tsx src/server/index.ts: ui/dist is at ../ui/dist
|
|
21
|
+
const UI_DIST_CANDIDATES = [
|
|
22
|
+
join(__dirname, "../../ui/dist"),
|
|
23
|
+
join(__dirname, "../ui/dist"),
|
|
24
|
+
join(process.cwd(), "ui/dist"),
|
|
25
|
+
];
|
|
26
|
+
function findUiDist() {
|
|
27
|
+
for (const candidate of UI_DIST_CANDIDATES) {
|
|
28
|
+
if (existsSync(candidate))
|
|
29
|
+
return candidate;
|
|
30
|
+
}
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
export async function createServer(options) {
|
|
34
|
+
const fastify = Fastify({ logger: false });
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
// API routes
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
fastify.get("/api/projects", async (_request, reply) => {
|
|
39
|
+
const projects = loadAllProjects();
|
|
40
|
+
reply.type("application/json");
|
|
41
|
+
return projects;
|
|
42
|
+
});
|
|
43
|
+
fastify.get("/api/sessions/:id", async (request, reply) => {
|
|
44
|
+
const sessionId = request.params.id;
|
|
45
|
+
// Find the session across all projects
|
|
46
|
+
const projects = loadAllProjects();
|
|
47
|
+
for (const project of projects) {
|
|
48
|
+
for (const sessionItem of project.sessions) {
|
|
49
|
+
if (sessionItem.sessionId === sessionId) {
|
|
50
|
+
// Re-parse the full session for detail
|
|
51
|
+
const summary = loadSession(sessionItem.filePath);
|
|
52
|
+
if (summary === null) {
|
|
53
|
+
reply.code(500).send({ error: "Failed to load session" });
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const detail = toSessionDetail(summary, sessionItem.filePath);
|
|
57
|
+
return detail;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
reply.code(404).send({ error: "Session not found", sessionId });
|
|
62
|
+
});
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
// Static UI serving
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
const uiDist = findUiDist();
|
|
67
|
+
if (uiDist) {
|
|
68
|
+
await fastify.register(fastifyStatic, {
|
|
69
|
+
root: uiDist,
|
|
70
|
+
prefix: "/",
|
|
71
|
+
// Serve index.html for all unmatched routes (SPA fallback)
|
|
72
|
+
index: "index.html",
|
|
73
|
+
});
|
|
74
|
+
// SPA fallback: any non-API route serves index.html
|
|
75
|
+
fastify.setNotFoundHandler((_request, reply) => {
|
|
76
|
+
reply.sendFile("index.html");
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
// No UI build: return a helpful message from root
|
|
81
|
+
fastify.get("/", async (_request, reply) => {
|
|
82
|
+
reply.type("text/html");
|
|
83
|
+
return `<!DOCTYPE html><html><body>
|
|
84
|
+
<h2>tracelight API server</h2>
|
|
85
|
+
<p>UI not built yet. Run <code>npm run build:ui</code> first.</p>
|
|
86
|
+
<p>API endpoints: <a href="/api/projects">/api/projects</a></p>
|
|
87
|
+
</body></html>`;
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
start: async () => {
|
|
92
|
+
await fastify.listen({ port: options.port, host: "127.0.0.1" });
|
|
93
|
+
return `http://127.0.0.1:${options.port}`;
|
|
94
|
+
},
|
|
95
|
+
stop: async () => {
|
|
96
|
+
await fastify.close();
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "tracelight",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Local-first web viewer for Claude Code session transcripts — run npx tracelight in any directory",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"claude",
|
|
7
|
+
"claude-code",
|
|
8
|
+
"transcript",
|
|
9
|
+
"viewer",
|
|
10
|
+
"agent",
|
|
11
|
+
"observability",
|
|
12
|
+
"cli"
|
|
13
|
+
],
|
|
14
|
+
"author": "Aneesh Venuturumilli",
|
|
15
|
+
"license": "MIT",
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "git+https://github.com/aneeshv12/tracelight.git"
|
|
19
|
+
},
|
|
20
|
+
"homepage": "https://github.com/aneeshv12/tracelight#readme",
|
|
21
|
+
"bugs": {
|
|
22
|
+
"url": "https://github.com/aneeshv12/tracelight/issues"
|
|
23
|
+
},
|
|
24
|
+
"engines": {
|
|
25
|
+
"node": ">=18"
|
|
26
|
+
},
|
|
27
|
+
"type": "module",
|
|
28
|
+
"files": [
|
|
29
|
+
"dist",
|
|
30
|
+
"ui/dist",
|
|
31
|
+
"!dist/**/__tests__"
|
|
32
|
+
],
|
|
33
|
+
"scripts": {
|
|
34
|
+
"typecheck": "tsc --noEmit && tsc --noEmit -p ui/tsconfig.json",
|
|
35
|
+
"test": "vitest run",
|
|
36
|
+
"build": "tsc --outDir dist && npm run build:ui",
|
|
37
|
+
"build:server": "tsc --outDir dist",
|
|
38
|
+
"build:ui": "vite build",
|
|
39
|
+
"dev:ui": "vite",
|
|
40
|
+
"start": "node dist/cli.js",
|
|
41
|
+
"summarize": "tsx src/scripts/summarize.ts",
|
|
42
|
+
"prepublishOnly": "npm run build"
|
|
43
|
+
},
|
|
44
|
+
"bin": {
|
|
45
|
+
"tracelight": "./dist/cli.js"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"@types/diff": "^7.0.2",
|
|
49
|
+
"@types/node": "^20.0.0",
|
|
50
|
+
"@types/react": "^19.2.17",
|
|
51
|
+
"@types/react-dom": "^19.2.3",
|
|
52
|
+
"@vitejs/plugin-react": "^4.7.0",
|
|
53
|
+
"autoprefixer": "^10.5.0",
|
|
54
|
+
"postcss": "^8.5.15",
|
|
55
|
+
"tailwindcss": "^3.4.19",
|
|
56
|
+
"ts-node": "^10.9.2",
|
|
57
|
+
"tsx": "^4.22.4",
|
|
58
|
+
"typescript": "^5.5.0",
|
|
59
|
+
"vite": "^5.4.21",
|
|
60
|
+
"vitest": "^2.0.0"
|
|
61
|
+
},
|
|
62
|
+
"dependencies": {
|
|
63
|
+
"@fastify/static": "^9.1.3",
|
|
64
|
+
"diff": "^9.0.0",
|
|
65
|
+
"fastify": "^5.8.5",
|
|
66
|
+
"open": "^11.0.0",
|
|
67
|
+
"react": "^19.2.7",
|
|
68
|
+
"react-dom": "^19.2.7"
|
|
69
|
+
}
|
|
70
|
+
}
|