@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.
Files changed (34) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +27 -4
  3. package/dashboard/dist/assets/{AnalyticsView-BApcOGsD.js → AnalyticsView-5bUM3UHp.js} +1 -1
  4. package/dashboard/dist/assets/{HistoryView-B331k5oL.js → HistoryView-C-AsEqos.js} +1 -1
  5. package/dashboard/dist/assets/{ProjectsView-DUleaXsP.js → ProjectsView-D9bZBdY2.js} +1 -1
  6. package/dashboard/dist/assets/{SystemView-BGe__vl1.js → SystemView-DIYDCCF3.js} +1 -1
  7. package/dashboard/dist/assets/{TopView-CXggyydU.js → TopView-DhdLpsiA.js} +1 -1
  8. package/dashboard/dist/assets/index-DgbWvj42.js +84 -0
  9. package/dashboard/dist/index.html +1 -1
  10. package/dist/daemon.js +3 -1
  11. package/dist/db.d.ts +1 -0
  12. package/dist/db.js +8 -0
  13. package/dist/enricher.js +20 -11
  14. package/dist/paths.js +1 -1
  15. package/dist/routes/events.d.ts +0 -2
  16. package/dist/routes/events.js +3 -20
  17. package/dist/routes/helpers.d.ts +2 -0
  18. package/dist/routes/helpers.js +21 -0
  19. package/dist/routes/misc.js +34 -0
  20. package/dist/routes/opencode-reader.d.ts +7 -0
  21. package/dist/routes/opencode-reader.js +129 -0
  22. package/dist/routes/projects.d.ts +0 -2
  23. package/dist/routes/projects.js +3 -17
  24. package/dist/routes/stream.js +1 -1
  25. package/dist/watch.js +0 -1
  26. package/dist/watchdog.d.ts +5 -0
  27. package/dist/watchdog.js +6 -1
  28. package/dist/watchers/adapter.d.ts +10 -0
  29. package/dist/watchers/adapter.js +4 -0
  30. package/dist/watchers/claude-code.js +9 -9
  31. package/dist/watchers/opencode.d.ts +6 -6
  32. package/dist/watchers/opencode.js +49 -9
  33. package/package.json +3 -2
  34. 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 traces in ~/.opencode/logs/ as JSONL files.
6
- * Format is similar to Claude Code but with different field names.
7
- * This is a scaffold fill in parseEvent/getSessionCost with sample traces.
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 PollableAdapterno 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 OPENCODE_DIR = path_1.default.join(os_1.default.homedir(), '.opencode', 'logs');
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(OPENCODE_DIR);
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 [`${OPENCODE_DIR}/**/*.jsonl`];
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.5.0",
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",