@statforge/claudestat 1.5.0 → 1.6.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 +27 -4
- package/dashboard/dist/assets/{AnalyticsView-BApcOGsD.js → AnalyticsView-5bUM3UHp.js} +1 -1
- package/dashboard/dist/assets/{HistoryView-B331k5oL.js → HistoryView-C-AsEqos.js} +1 -1
- package/dashboard/dist/assets/{ProjectsView-DUleaXsP.js → ProjectsView-D9bZBdY2.js} +1 -1
- package/dashboard/dist/assets/{SystemView-BGe__vl1.js → SystemView-DIYDCCF3.js} +1 -1
- package/dashboard/dist/assets/{TopView-CXggyydU.js → TopView-DhdLpsiA.js} +1 -1
- package/dashboard/dist/assets/index-DgbWvj42.js +84 -0
- package/dashboard/dist/index.html +1 -1
- package/dist/daemon.js +3 -1
- package/dist/db.d.ts +1 -0
- package/dist/db.js +8 -0
- package/dist/enricher.js +20 -11
- package/dist/paths.js +1 -1
- package/dist/routes/events.d.ts +0 -2
- package/dist/routes/events.js +3 -20
- package/dist/routes/helpers.d.ts +2 -0
- package/dist/routes/helpers.js +21 -0
- package/dist/routes/misc.js +34 -0
- package/dist/routes/opencode-reader.d.ts +7 -0
- package/dist/routes/opencode-reader.js +129 -0
- package/dist/routes/projects.d.ts +0 -2
- package/dist/routes/projects.js +3 -17
- package/dist/routes/stream.js +1 -1
- package/dist/watch.js +0 -1
- package/dist/watchdog.d.ts +5 -0
- package/dist/watchdog.js +6 -1
- package/dist/watchers/adapter.d.ts +10 -0
- package/dist/watchers/adapter.js +4 -0
- package/dist/watchers/claude-code.js +9 -9
- package/dist/watchers/opencode.d.ts +6 -6
- package/dist/watchers/opencode.js +49 -9
- package/package.json +3 -2
- package/dashboard/dist/assets/index-CB01c5lb.js +0 -84
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* opencode.ts — WatcherAdapter para OpenCode
|
|
3
|
+
* opencode.ts — WatcherAdapter para OpenCode (poll-based, SQLite)
|
|
4
4
|
*
|
|
5
|
-
* OpenCode stores
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* OpenCode stores sessions in ~/.local/share/opencode/opencode.db (SQLite).
|
|
6
|
+
* The session table has cost, token counts, model, and timestamps directly.
|
|
7
|
+
* Uses PollableAdapter — no JSONL files, no chokidar.
|
|
8
8
|
*/
|
|
9
9
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
10
10
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
@@ -15,29 +15,69 @@ const path_1 = __importDefault(require("path"));
|
|
|
15
15
|
const os_1 = __importDefault(require("os"));
|
|
16
16
|
const fs_1 = __importDefault(require("fs"));
|
|
17
17
|
const adapter_1 = require("./adapter");
|
|
18
|
-
const
|
|
18
|
+
const OPENCODE_DB = path_1.default.join(os_1.default.homedir(), '.local', 'share', 'opencode', 'opencode.db');
|
|
19
|
+
function openDb() {
|
|
20
|
+
const { DatabaseSync } = require('node:sqlite');
|
|
21
|
+
return new DatabaseSync(OPENCODE_DB, { open: true });
|
|
22
|
+
}
|
|
23
|
+
function parseModel(raw) {
|
|
24
|
+
if (!raw)
|
|
25
|
+
return 'unknown';
|
|
26
|
+
try {
|
|
27
|
+
const obj = JSON.parse(raw);
|
|
28
|
+
return obj.id ?? 'unknown';
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return 'unknown';
|
|
32
|
+
}
|
|
33
|
+
}
|
|
19
34
|
exports.opencodeAdapter = {
|
|
20
35
|
name: 'opencode',
|
|
21
36
|
label: 'OpenCode',
|
|
22
37
|
get shortName() { return 'OC'; },
|
|
23
38
|
detect() {
|
|
24
39
|
try {
|
|
25
|
-
return fs_1.default.existsSync(
|
|
40
|
+
return fs_1.default.existsSync(OPENCODE_DB);
|
|
26
41
|
}
|
|
27
42
|
catch {
|
|
28
43
|
return false;
|
|
29
44
|
}
|
|
30
45
|
},
|
|
31
46
|
getWatchPaths() {
|
|
32
|
-
return [
|
|
47
|
+
return [];
|
|
33
48
|
},
|
|
34
49
|
parseEvent(_raw, _filePath) {
|
|
35
|
-
// TODO: implement when OpenCode trace format is known
|
|
36
50
|
return null;
|
|
37
51
|
},
|
|
38
52
|
async getSessionCost(_filePath) {
|
|
39
|
-
// TODO: implement when OpenCode trace format is known
|
|
40
53
|
return null;
|
|
41
54
|
},
|
|
55
|
+
async pollSessions(since) {
|
|
56
|
+
try {
|
|
57
|
+
const db = openDb();
|
|
58
|
+
const stmt = db.prepare(`SELECT id, model, cost, tokens_input, tokens_output, tokens_cache_read, tokens_cache_write, time_updated
|
|
59
|
+
FROM session
|
|
60
|
+
WHERE time_updated >= ?
|
|
61
|
+
AND time_archived IS NULL`);
|
|
62
|
+
const rows = stmt.all(since);
|
|
63
|
+
db.close();
|
|
64
|
+
return rows.map(row => ({
|
|
65
|
+
sessionId: row.id,
|
|
66
|
+
cost: {
|
|
67
|
+
input_tokens: row.tokens_input,
|
|
68
|
+
output_tokens: row.tokens_output,
|
|
69
|
+
cache_read: row.tokens_cache_read,
|
|
70
|
+
cache_creation: row.tokens_cache_write,
|
|
71
|
+
cost_usd: row.cost,
|
|
72
|
+
context_used: 0,
|
|
73
|
+
context_window: 200000,
|
|
74
|
+
lastModel: parseModel(row.model),
|
|
75
|
+
},
|
|
76
|
+
}));
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return [];
|
|
80
|
+
}
|
|
81
|
+
},
|
|
42
82
|
};
|
|
43
83
|
(0, adapter_1.registerAdapter)(exports.opencodeAdapter);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@statforge/claudestat",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -51,6 +51,8 @@
|
|
|
51
51
|
"hooks/",
|
|
52
52
|
"dashboard/dist/"
|
|
53
53
|
],
|
|
54
|
+
"main": "dist/index.js",
|
|
55
|
+
"types": "dist/index.d.ts",
|
|
54
56
|
"bin": {
|
|
55
57
|
"claudestat": "dist/index.js",
|
|
56
58
|
"claudestat-mcp": "dist/mcp-server.js"
|
|
@@ -61,7 +63,6 @@
|
|
|
61
63
|
"build:bun": "bun run scripts/build-binary.ts",
|
|
62
64
|
"build:bun:all": "bun run scripts/build-binary.ts --all",
|
|
63
65
|
"prepublishOnly": "npm run build",
|
|
64
|
-
"prepack": "npm run build",
|
|
65
66
|
"dev": "tsx src/index.ts",
|
|
66
67
|
"dev:full": "tsx src/index.ts start & sleep 1 && cd dashboard && npm run dev",
|
|
67
68
|
"start": "node dist/index.js",
|