@cliftonc/finius 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 +147 -0
- package/dist/branding.js +28 -0
- package/dist/cli/backfill.js +122 -0
- package/dist/cli/claude-settings.js +54 -0
- package/dist/cli/codex-config.js +60 -0
- package/dist/cli/codex.js +97 -0
- package/dist/cli/config.js +41 -0
- package/dist/cli/doctor.js +159 -0
- package/dist/cli/hook.js +70 -0
- package/dist/cli/identity.js +163 -0
- package/dist/cli/import.js +61 -0
- package/dist/cli/index.js +70 -0
- package/dist/cli/install.js +23 -0
- package/dist/cli/password.js +14 -0
- package/dist/cli/serve.js +63 -0
- package/dist/cli/setup.js +314 -0
- package/dist/cli/ui.js +15 -0
- package/dist/client/assets/TranscriptView-CBf7-4Bo.css +1 -0
- package/dist/client/assets/TranscriptView-CLCPX5bI.js +194 -0
- package/dist/client/assets/TranscriptView-D056GDHO.js +194 -0
- package/dist/client/assets/TranscriptView-MIgsAwMN.js +194 -0
- package/dist/client/assets/index-6OIY_8fO.css +1 -0
- package/dist/client/assets/index-9aN8py7_.js +1 -0
- package/dist/client/assets/index-B-sjMmTS.js +1636 -0
- package/dist/client/assets/index-B4HbP3X6.js +1 -0
- package/dist/client/assets/index-B9wgN1BV.js +1636 -0
- package/dist/client/assets/index-BHlFz1Th.js +1652 -0
- package/dist/client/assets/index-BJyvYca7.js +1636 -0
- package/dist/client/assets/index-BKBTeJLz.js +1 -0
- package/dist/client/assets/index-BN6CbirS.js +1444 -0
- package/dist/client/assets/index-BW4_7xR6.js +1460 -0
- package/dist/client/assets/index-BaLElA30.js +1 -0
- package/dist/client/assets/index-BaQ02V5d.css +1 -0
- package/dist/client/assets/index-Bh0dgUU-.js +1636 -0
- package/dist/client/assets/index-Bie86XRc.js +1 -0
- package/dist/client/assets/index-Bijt5al-.css +1 -0
- package/dist/client/assets/index-BikJP2HS.js +1636 -0
- package/dist/client/assets/index-BkwrvP-J.js +1 -0
- package/dist/client/assets/index-BwVuUJSv.js +1 -0
- package/dist/client/assets/index-BweXI4-D.css +1 -0
- package/dist/client/assets/index-BwqdHcDE.js +1 -0
- package/dist/client/assets/index-C-Z0w-tQ.js +1652 -0
- package/dist/client/assets/index-C2RmKzem.js +1636 -0
- package/dist/client/assets/index-CHz-iKIQ.js +1 -0
- package/dist/client/assets/index-CIGl5oW_.js +1646 -0
- package/dist/client/assets/index-CVYmd4Bm.js +1465 -0
- package/dist/client/assets/index-Ca9UVGK1.js +1 -0
- package/dist/client/assets/index-CeWDkmJN.js +1 -0
- package/dist/client/assets/index-CpsNq0zm.css +1 -0
- package/dist/client/assets/index-CrUS6abD.css +1 -0
- package/dist/client/assets/index-Ctq8vj2Z.js +1 -0
- package/dist/client/assets/index-D1ktp0pp.js +1 -0
- package/dist/client/assets/index-D3BoYpFi.css +1 -0
- package/dist/client/assets/index-D59GxlrT.js +1636 -0
- package/dist/client/assets/index-D5Wkww8x.css +1 -0
- package/dist/client/assets/index-DC94jMGe.js +1 -0
- package/dist/client/assets/index-DFcIBkv1.js +1652 -0
- package/dist/client/assets/index-DmKj5Jqc.css +1 -0
- package/dist/client/assets/index-Dx52i05H.js +1465 -0
- package/dist/client/assets/index-L3GnPzmU.css +1 -0
- package/dist/client/assets/index-OZADsKet.js +1652 -0
- package/dist/client/assets/index-Qt124kj1.js +1652 -0
- package/dist/client/assets/index-nHzwQ3EM.js +1 -0
- package/dist/client/assets/index-s9Mg6LTO.js +1 -0
- package/dist/client/assets/index-ye8oxz8P.js +1 -0
- package/dist/client/assets/index-yqJS7tUY.css +1 -0
- package/dist/client/favicon.svg +35 -0
- package/dist/client/finius-dashboard.png +0 -0
- package/dist/client/index.html +38 -0
- package/dist/server/app.js +285 -0
- package/dist/server/claude.js +124 -0
- package/dist/server/codex.js +94 -0
- package/dist/server/events.js +12 -0
- package/dist/server/index.js +119 -0
- package/dist/server/otel.js +231 -0
- package/dist/server/pricing-backfill.js +41 -0
- package/dist/server/pricing.js +138 -0
- package/dist/server/queue.js +35 -0
- package/dist/server/storage/blob.js +17 -0
- package/dist/server/storage/query-helpers.js +104 -0
- package/dist/server/storage/sqlite.js +1167 -0
- package/dist/server/transcripts.js +46 -0
- package/dist/server/types.js +1 -0
- package/dist/shared/api-types.js +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { parseClaudeTranscript } from "./claude.js";
|
|
2
|
+
import { parseCodexTranscript } from "./codex.js";
|
|
3
|
+
// Pluggable dispatch: given a (possibly detected) format, route to the matching pure parser. Add a
|
|
4
|
+
// new coding agent by writing its parser module and extending TranscriptFormat + these two switches.
|
|
5
|
+
export function parseTranscript(format, source, sessionHint, lines) {
|
|
6
|
+
switch (format) {
|
|
7
|
+
case "codex":
|
|
8
|
+
return parseCodexTranscript(source, sessionHint, lines);
|
|
9
|
+
case "claude":
|
|
10
|
+
default:
|
|
11
|
+
return parseClaudeTranscript(source, sessionHint, lines);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
// Best-effort sniff of which agent wrote a transcript, used when the caller doesn't pass an explicit
|
|
15
|
+
// format. Codex "rollout" lines are uniquely shaped: `{ type, payload }` with a small set of envelope
|
|
16
|
+
// types. Anything else falls back to Claude (the original transcript format).
|
|
17
|
+
export function detectTranscriptFormat(lines) {
|
|
18
|
+
const CODEX_TYPES = new Set(["session_meta", "event_msg", "response_item", "turn_context"]);
|
|
19
|
+
for (const line of lines) {
|
|
20
|
+
const trimmed = line.trim();
|
|
21
|
+
if (!trimmed)
|
|
22
|
+
continue;
|
|
23
|
+
let event;
|
|
24
|
+
try {
|
|
25
|
+
event = JSON.parse(trimmed);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
if (!event || typeof event !== "object")
|
|
31
|
+
continue;
|
|
32
|
+
const obj = event;
|
|
33
|
+
if (typeof obj.type === "string" && obj.payload && typeof obj.payload === "object" && CODEX_TYPES.has(obj.type)) {
|
|
34
|
+
return "codex";
|
|
35
|
+
}
|
|
36
|
+
if (obj.message || obj.requestId || obj.sessionId || obj.session_id)
|
|
37
|
+
return "claude";
|
|
38
|
+
}
|
|
39
|
+
return "claude";
|
|
40
|
+
}
|
|
41
|
+
// Codex writes ONE append-only rollout file per session that grows as the session runs; the upload
|
|
42
|
+
// hook fires per-turn, so re-importing the (now longer) file must REPLACE the session's prior points,
|
|
43
|
+
// not add to them. Claude uploads are point-in-time snapshots and stay append-only.
|
|
44
|
+
export function shouldReplaceBySession(format) {
|
|
45
|
+
return format === "codex";
|
|
46
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/package.json
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@cliftonc/finius",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Local-first Claude Code usage & cost tracker — OTLP + transcript ingest with a live dashboard.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"finius": "dist/cli/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"README.md",
|
|
13
|
+
"LICENSE"
|
|
14
|
+
],
|
|
15
|
+
"engines": {
|
|
16
|
+
"node": ">=22.5"
|
|
17
|
+
},
|
|
18
|
+
"keywords": [
|
|
19
|
+
"claude-code",
|
|
20
|
+
"telemetry",
|
|
21
|
+
"opentelemetry",
|
|
22
|
+
"otlp",
|
|
23
|
+
"usage-tracking",
|
|
24
|
+
"cost-tracking"
|
|
25
|
+
],
|
|
26
|
+
"scripts": {
|
|
27
|
+
"dev": "concurrently -k \"npm:dev:server\" \"npm:dev:client\"",
|
|
28
|
+
"dev:server": "tsx watch src/server/index.ts",
|
|
29
|
+
"dev:client": "vite",
|
|
30
|
+
"build": "tsc -p tsconfig.build.json && vite build",
|
|
31
|
+
"start": "node dist/server/index.js",
|
|
32
|
+
"cli": "tsx src/cli/index.ts",
|
|
33
|
+
"prepublishOnly": "npm run build",
|
|
34
|
+
"test": "vitest run",
|
|
35
|
+
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
36
|
+
},
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"@clack/prompts": "^1.5.0",
|
|
39
|
+
"@heroui/react": "^2.8.5",
|
|
40
|
+
"@hono/node-server": "^1.19.6",
|
|
41
|
+
"@tanstack/react-query": "^5.90.12",
|
|
42
|
+
"ansi-to-html": "^0.7.2",
|
|
43
|
+
"chartgpu": "^0.3.2",
|
|
44
|
+
"clsx": "^2.1.1",
|
|
45
|
+
"dompurify": "^3.4.7",
|
|
46
|
+
"framer-motion": "^12.23.25",
|
|
47
|
+
"hono": "^4.10.7",
|
|
48
|
+
"lucide-react": "^0.468.0",
|
|
49
|
+
"marked": "^18.0.4",
|
|
50
|
+
"picocolors": "^1.1.1",
|
|
51
|
+
"prismjs": "^1.30.0",
|
|
52
|
+
"react": "^18.3.1",
|
|
53
|
+
"react-dom": "^18.3.1",
|
|
54
|
+
"unique-names-generator": "^4.7.1"
|
|
55
|
+
},
|
|
56
|
+
"devDependencies": {
|
|
57
|
+
"@types/dompurify": "^3.0.5",
|
|
58
|
+
"@types/node": "^24.10.1",
|
|
59
|
+
"@types/prismjs": "^1.26.6",
|
|
60
|
+
"@types/react": "^18.3.27",
|
|
61
|
+
"@types/react-dom": "^18.3.7",
|
|
62
|
+
"@vitejs/plugin-react": "^5.1.1",
|
|
63
|
+
"autoprefixer": "^10.4.20",
|
|
64
|
+
"concurrently": "^9.2.1",
|
|
65
|
+
"postcss": "^8.4.49",
|
|
66
|
+
"tailwindcss": "^3.4.17",
|
|
67
|
+
"tsx": "^4.20.6",
|
|
68
|
+
"typescript": "^5.9.3",
|
|
69
|
+
"vite": "^6.4.1",
|
|
70
|
+
"vitest": "^3.2.4"
|
|
71
|
+
}
|
|
72
|
+
}
|