clawck 0.4.3 → 0.5.4

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 (79) hide show
  1. package/README.md +86 -11
  2. package/dist/cli/index.js +29 -44
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/core/atp.d.ts +1 -1
  5. package/dist/core/atp.d.ts.map +1 -1
  6. package/dist/core/atp.js +1 -1
  7. package/dist/core/atp.js.map +1 -1
  8. package/dist/core/clawck.d.ts.map +1 -1
  9. package/dist/core/clawck.js +40 -1
  10. package/dist/core/clawck.js.map +1 -1
  11. package/dist/core/config.d.ts +10 -0
  12. package/dist/core/config.d.ts.map +1 -0
  13. package/dist/core/config.js +58 -0
  14. package/dist/core/config.js.map +1 -0
  15. package/dist/core/database.d.ts +13 -0
  16. package/dist/core/database.d.ts.map +1 -1
  17. package/dist/core/database.js +150 -65
  18. package/dist/core/database.js.map +1 -1
  19. package/dist/core/errors.d.ts +19 -0
  20. package/dist/core/errors.d.ts.map +1 -0
  21. package/dist/core/errors.js +40 -0
  22. package/dist/core/errors.js.map +1 -0
  23. package/dist/core/logger.d.ts +14 -0
  24. package/dist/core/logger.d.ts.map +1 -0
  25. package/dist/core/logger.js +39 -0
  26. package/dist/core/logger.js.map +1 -0
  27. package/dist/core/pricing.d.ts +28 -0
  28. package/dist/core/pricing.d.ts.map +1 -0
  29. package/dist/core/pricing.js +48 -0
  30. package/dist/core/pricing.js.map +1 -0
  31. package/dist/core/runtime.d.ts +10 -0
  32. package/dist/core/runtime.d.ts.map +1 -1
  33. package/dist/core/runtime.js +34 -0
  34. package/dist/core/runtime.js.map +1 -1
  35. package/dist/core/sync.d.ts.map +1 -1
  36. package/dist/core/sync.js +3 -0
  37. package/dist/core/sync.js.map +1 -1
  38. package/dist/core/types.d.ts +14 -3
  39. package/dist/core/types.d.ts.map +1 -1
  40. package/dist/core/types.js +1 -1
  41. package/dist/core/types.js.map +1 -1
  42. package/dist/core/webhooks.d.ts.map +1 -1
  43. package/dist/core/webhooks.js +5 -2
  44. package/dist/core/webhooks.js.map +1 -1
  45. package/dist/dashboard/index.js +3 -3
  46. package/dist/hooks/adapters.d.ts.map +1 -1
  47. package/dist/hooks/adapters.js +27 -8
  48. package/dist/hooks/adapters.js.map +1 -1
  49. package/dist/hooks/handler.d.ts.map +1 -1
  50. package/dist/hooks/handler.js +17 -5
  51. package/dist/hooks/handler.js.map +1 -1
  52. package/dist/hooks/types.d.ts +1 -0
  53. package/dist/hooks/types.d.ts.map +1 -1
  54. package/dist/index.d.ts +5 -0
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +12 -1
  57. package/dist/index.js.map +1 -1
  58. package/dist/reports/html.d.ts +2 -2
  59. package/dist/reports/html.d.ts.map +1 -1
  60. package/dist/reports/html.js +238 -84
  61. package/dist/reports/html.js.map +1 -1
  62. package/dist/reports/pdf.d.ts.map +1 -1
  63. package/dist/reports/pdf.js +5 -4
  64. package/dist/reports/pdf.js.map +1 -1
  65. package/dist/server/api.d.ts.map +1 -1
  66. package/dist/server/api.js +57 -18
  67. package/dist/server/api.js.map +1 -1
  68. package/dist/server/mcp.d.ts.map +1 -1
  69. package/dist/server/mcp.js +3 -3
  70. package/dist/server/mcp.js.map +1 -1
  71. package/docs/api-reference.md +380 -0
  72. package/docs/deployment.md +140 -0
  73. package/docs/deprecation-policy.md +32 -0
  74. package/docs/migration-guide.md +78 -0
  75. package/docs/security.md +70 -0
  76. package/docs/skills/clawck-setup.md +19 -0
  77. package/docs/skills/clawck-usage.md +6 -0
  78. package/docs/versioning.md +49 -0
  79. package/package.json +7 -4
@@ -1 +1 @@
1
- {"version":3,"file":"clawck.d.ts","sourceRoot":"","sources":["../../src/core/clawck.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"clawck.d.ts","sourceRoot":"","sources":["../../src/core/clawck.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.Clawck = void 0;
8
8
  const uuid_1 = require("uuid");
9
9
  const types_1 = require("./types");
10
+ const pricing_1 = require("./pricing");
10
11
  const database_1 = require("./database");
11
12
  const webhooks_1 = require("./webhooks");
12
13
  const patterns_1 = require("./patterns");
@@ -84,6 +85,19 @@ class Clawck {
84
85
  cost_usd: input.cost_usd,
85
86
  tool_calls: input.tool_calls,
86
87
  };
88
+ // Cost estimation fallback: if no cost_usd provided but tokens exist, compute from pricing
89
+ if (updates.cost_usd == null || updates.cost_usd === 0) {
90
+ const existing = this._db.getById(input.id);
91
+ const tokIn = input.tokens_in ?? existing?.tokens_in ?? 0;
92
+ const tokOut = input.tokens_out ?? existing?.tokens_out ?? 0;
93
+ const model = existing?.model || 'unknown';
94
+ if (tokIn > 0 || tokOut > 0) {
95
+ const estimated = (0, pricing_1.estimateCost)(model, tokIn, tokOut, true);
96
+ if (estimated != null) {
97
+ updates.cost_usd = Math.round(estimated * 10000) / 10000;
98
+ }
99
+ }
100
+ }
87
101
  // Calculate wall clock and agent runtime
88
102
  const existing = this._db.getById(input.id);
89
103
  if (existing) {
@@ -98,6 +112,21 @@ class Clawck {
98
112
  else {
99
113
  // No token data available (e.g. hook-based tracking) — wall clock is the best proxy
100
114
  updates.agent_runtime_ms = updates.wall_clock_ms;
115
+ // Reverse-estimate tokens from wall clock time
116
+ if (updates.wall_clock_ms && updates.wall_clock_ms > 0) {
117
+ const runtimeConfig = this.getRuntimeConfig();
118
+ const speed = (0, runtime_1.findModelSpeed)(model, runtimeConfig);
119
+ // 0.5 factor: not all wall clock time is active generation
120
+ const estimatedOut = Math.round((updates.wall_clock_ms / 1000) * speed * 0.5);
121
+ if (estimatedOut > 0) {
122
+ updates.tokens_out = estimatedOut;
123
+ updates.tokens_in = Math.round(estimatedOut * 2); // rough input:output ratio
124
+ const estimated = (0, pricing_1.estimateCost)(model, updates.tokens_in, estimatedOut, true);
125
+ if (estimated != null) {
126
+ updates.cost_usd = Math.round(estimated * 10000) / 10000;
127
+ }
128
+ }
129
+ }
101
130
  }
102
131
  }
103
132
  const entry = this._db.update(input.id, updates);
@@ -120,6 +149,16 @@ class Clawck {
120
149
  const runtimeConfig = this.getRuntimeConfig();
121
150
  agentRuntimeMs = (0, runtime_1.estimateAgentRuntime)({ tokens_out: tokensOut, model, tool_calls: toolCalls }, runtimeConfig);
122
151
  }
152
+ let costUsd = input.cost_usd || 0;
153
+ if (costUsd === 0) {
154
+ const tokIn = input.tokens_in || 0;
155
+ if (tokIn > 0 || tokensOut > 0) {
156
+ const estimated = (0, pricing_1.estimateCost)(model, tokIn, tokensOut, true);
157
+ if (estimated != null) {
158
+ costUsd = Math.round(estimated * 10000) / 10000;
159
+ }
160
+ }
161
+ }
123
162
  const entry = {
124
163
  id: (0, uuid_1.v4)(),
125
164
  agent: input.agent || pat?.agent || this.config.default_agent || 'unknown-agent',
@@ -133,7 +172,7 @@ class Clawck {
133
172
  status: 'completed',
134
173
  tokens_in: input.tokens_in || 0,
135
174
  tokens_out: tokensOut,
136
- cost_usd: input.cost_usd || 0,
175
+ cost_usd: costUsd,
137
176
  tool_calls: toolCalls,
138
177
  summary: input.summary || '',
139
178
  tags: input.tags || pat?.tags || [],
@@ -1 +1 @@
1
- {"version":3,"file":"clawck.js","sourceRoot":"","sources":["../../src/core/clawck.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"clawck.js","sourceRoot":"","sources":["../../src/core/clawck.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * ⏱️🦀 Clawck — Config Validation
3
+ * Shared validation for CLI and server config loading.
4
+ */
5
+ export interface ConfigValidationResult {
6
+ valid: boolean;
7
+ errors: string[];
8
+ }
9
+ export declare function validateConfig(config: Record<string, any>): ConfigValidationResult;
10
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,sBAAsB,CAsDlF"}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ /**
3
+ * ⏱️🦀 Clawck — Config Validation
4
+ * Shared validation for CLI and server config loading.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.validateConfig = validateConfig;
8
+ function validateConfig(config) {
9
+ const errors = [];
10
+ if (config.port !== undefined) {
11
+ if (typeof config.port !== 'number' || config.port < 1 || config.port > 65535) {
12
+ errors.push(`"port" must be a number between 1 and 65535 (got ${JSON.stringify(config.port)})`);
13
+ }
14
+ }
15
+ if (config.human_equivalents !== undefined) {
16
+ if (typeof config.human_equivalents !== 'object' || config.human_equivalents === null) {
17
+ errors.push('"human_equivalents" must be an object');
18
+ }
19
+ else {
20
+ for (const [key, val] of Object.entries(config.human_equivalents)) {
21
+ const v = val;
22
+ if (typeof v.multiplier !== 'number' || typeof v.human_rate_usd !== 'number') {
23
+ errors.push(`"human_equivalents.${key}" must have numeric "multiplier" and "human_rate_usd"`);
24
+ }
25
+ }
26
+ }
27
+ }
28
+ if (config.remote_sources !== undefined && !Array.isArray(config.remote_sources)) {
29
+ errors.push('"remote_sources" must be an array');
30
+ }
31
+ if (config.webhooks !== undefined) {
32
+ if (!Array.isArray(config.webhooks)) {
33
+ errors.push('"webhooks" must be an array');
34
+ }
35
+ else {
36
+ for (const [i, wh] of config.webhooks.entries()) {
37
+ if (!wh.url || typeof wh.url !== 'string') {
38
+ errors.push(`"webhooks[${i}].url" must be a string`);
39
+ }
40
+ if (!Array.isArray(wh.events)) {
41
+ errors.push(`"webhooks[${i}].events" must be an array`);
42
+ }
43
+ }
44
+ }
45
+ }
46
+ if (config.sync_interval !== undefined) {
47
+ if (typeof config.sync_interval !== 'number' || config.sync_interval < 1) {
48
+ errors.push('"sync_interval" must be a positive number');
49
+ }
50
+ }
51
+ if (config.idle_alert_hours !== undefined) {
52
+ if (typeof config.idle_alert_hours !== 'number' || config.idle_alert_hours < 0) {
53
+ errors.push('"idle_alert_hours" must be a non-negative number');
54
+ }
55
+ }
56
+ return { valid: errors.length === 0, errors };
57
+ }
58
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
@@ -8,7 +8,20 @@ export declare class ClawckDB {
8
8
  private config;
9
9
  private dbPath;
10
10
  constructor(config: ClawckConfig);
11
+ /** Current schema version — bump when adding a new migration. */
12
+ static readonly SCHEMA_VERSION = 5;
13
+ private static readonly MIGRATIONS;
11
14
  private migrate;
15
+ private getCurrentVersion;
16
+ private tableExists;
17
+ private columnExists;
18
+ /**
19
+ * For databases created before the versioned migration system existed,
20
+ * probe the schema to determine which migrations have already been applied.
21
+ */
22
+ private detectLegacyVersion;
23
+ /** Expose the current schema version for diagnostics. */
24
+ getSchemaVersion(): number;
12
25
  ensureReady(): Promise<void>;
13
26
  insert(entry: ClawckEntry): ClawckEntry;
14
27
  update(id: string, updates: Partial<ClawckEntry>): ClawckEntry | null;
@@ -1 +1 @@
1
- {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/core/database.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/core/database.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAgB,YAAY,EAA6E,SAAS,EAAgB,YAAY,EAA2D,MAAM,SAAS,CAAC;AAC/P,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG9C,qBAAa,QAAQ;IACnB,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,YAAY;IAkBhC,iEAAiE;IACjE,MAAM,CAAC,QAAQ,CAAC,cAAc,KAAK;IAEnC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAqEhC;IAEF,OAAO,CAAC,OAAO;IAqCf,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,YAAY;IAKpB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAU3B,yDAAyD;IACzD,gBAAgB,IAAI,MAAM;IAIpB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAElC,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW;IAOvC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,GAAG,IAAI;IA4BrE,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAKvC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAK/B,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,EAAE;IAI3C,UAAU,IAAI,WAAW,EAAE;IAI3B,KAAK,CAAC,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;KAAO,GAAG,WAAW,EAAE;IAc/M,OAAO,CAAC,SAAS;IAKjB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,gBAAgB;IA6C7H,UAAU,IAAI,MAAM,EAAE;IACtB,WAAW,IAAI,MAAM,EAAE;IACvB,SAAS,IAAI,MAAM,EAAE;IAErB,OAAO,CAAC,WAAW;IAKnB,QAAQ;;;;;;;IAQR,OAAO,CAAC,UAAU;IAIlB,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW;IAOvC,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM;IAa1C,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAMlD,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAMpC,gBAAgB,IAAI,SAAS,EAAE;IAa/B,cAAc,CAAC,QAAQ,EAAE,gBAAgB,GAAG,gBAAgB;IAO5D,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,GAAG,IAAI;IAgBvF,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAKnC,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAKpD,YAAY,IAAI,gBAAgB,EAAE;IAKlC,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAK5D,OAAO,CAAC,aAAa;IAcrB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY;IAQhD,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAK9C,WAAW,CAAC,KAAK,GAAE,MAAW,EAAE,MAAM,GAAE,MAAU,GAAG,YAAY,EAAE;IAKnE,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAajD,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAKjC,OAAO,CAAC,WAAW;IAenB,KAAK,IAAI,IAAI;CACd"}
@@ -11,6 +11,7 @@ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
11
11
  const path_1 = __importDefault(require("path"));
12
12
  const fs_1 = __importDefault(require("fs"));
13
13
  const types_1 = require("./types");
14
+ const runtime_1 = require("./runtime");
14
15
  class ClawckDB {
15
16
  db;
16
17
  config;
@@ -24,71 +25,148 @@ class ClawckDB {
24
25
  this.db = new better_sqlite3_1.default(this.dbPath);
25
26
  this.migrate();
26
27
  }
28
+ // ─── Versioned Migration System ────────────────────────
29
+ //
30
+ // Each migration is a function that receives the db handle and runs DDL.
31
+ // Migrations are numbered starting at 1. The schema_version table tracks
32
+ // which migrations have been applied. On a fresh DB we detect the absence
33
+ // of any tables and run all migrations. On an existing pre-versioned DB
34
+ // (has entries table but no schema_version table) we detect already-applied
35
+ // columns and start from the right version.
36
+ /** Current schema version — bump when adding a new migration. */
37
+ static SCHEMA_VERSION = 5;
38
+ static MIGRATIONS = [
39
+ // ── Migration 1: initial schema (entries + sync_state + indexes) ──
40
+ (db) => {
41
+ db.exec(`CREATE TABLE IF NOT EXISTS entries (
42
+ id TEXT PRIMARY KEY, agent TEXT NOT NULL, model TEXT NOT NULL DEFAULT 'unknown',
43
+ client TEXT NOT NULL DEFAULT 'default', project TEXT NOT NULL DEFAULT 'default',
44
+ task TEXT NOT NULL, category TEXT NOT NULL DEFAULT 'other', start TEXT NOT NULL,
45
+ end_ TEXT, status TEXT NOT NULL DEFAULT 'running', tokens_in INTEGER NOT NULL DEFAULT 0,
46
+ tokens_out INTEGER NOT NULL DEFAULT 0, cost_usd REAL NOT NULL DEFAULT 0,
47
+ tool_calls INTEGER NOT NULL DEFAULT 0, summary TEXT NOT NULL DEFAULT '',
48
+ tags TEXT NOT NULL DEFAULT '[]', source TEXT NOT NULL DEFAULT 'manual',
49
+ spec_version TEXT NOT NULL DEFAULT '0.1.0',
50
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
51
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
52
+ )`);
53
+ db.exec(`CREATE INDEX IF NOT EXISTS idx_entries_agent ON entries(agent)`);
54
+ db.exec(`CREATE INDEX IF NOT EXISTS idx_entries_client ON entries(client)`);
55
+ db.exec(`CREATE INDEX IF NOT EXISTS idx_entries_project ON entries(project)`);
56
+ db.exec(`CREATE INDEX IF NOT EXISTS idx_entries_status ON entries(status)`);
57
+ db.exec(`CREATE INDEX IF NOT EXISTS idx_entries_start ON entries(start)`);
58
+ db.exec(`CREATE TABLE IF NOT EXISTS sync_state (
59
+ source_name TEXT PRIMARY KEY,
60
+ last_sync_at TEXT NOT NULL,
61
+ last_status TEXT NOT NULL DEFAULT 'success',
62
+ last_error TEXT,
63
+ entries_synced INTEGER NOT NULL DEFAULT 0
64
+ )`);
65
+ },
66
+ // ── Migration 2: add approved column ──
67
+ (db) => {
68
+ db.exec(`ALTER TABLE entries ADD COLUMN approved INTEGER NOT NULL DEFAULT 0`);
69
+ },
70
+ // ── Migration 3: add agent_runtime_ms and wall_clock_ms ──
71
+ (db) => {
72
+ db.exec(`ALTER TABLE entries ADD COLUMN agent_runtime_ms INTEGER`);
73
+ db.exec(`ALTER TABLE entries ADD COLUMN wall_clock_ms INTEGER`);
74
+ },
75
+ // ── Migration 4: personal baselines table ──
76
+ (db) => {
77
+ db.exec(`CREATE TABLE IF NOT EXISTS personal_baselines (
78
+ id TEXT PRIMARY KEY,
79
+ category TEXT NOT NULL,
80
+ task_type TEXT NOT NULL,
81
+ description TEXT NOT NULL DEFAULT '',
82
+ my_minutes REAL NOT NULL,
83
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
84
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
85
+ )`);
86
+ },
87
+ // ── Migration 5: reports table ──
88
+ (db) => {
89
+ db.exec(`CREATE TABLE IF NOT EXISTS reports (
90
+ id TEXT PRIMARY KEY,
91
+ name TEXT NOT NULL DEFAULT '',
92
+ period TEXT NOT NULL,
93
+ period_start TEXT NOT NULL,
94
+ period_end TEXT NOT NULL,
95
+ style TEXT NOT NULL DEFAULT 'full',
96
+ format TEXT NOT NULL DEFAULT 'terminal',
97
+ content BLOB,
98
+ metadata TEXT NOT NULL DEFAULT '{}',
99
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
100
+ )`);
101
+ db.exec(`CREATE INDEX IF NOT EXISTS idx_reports_created ON reports(created_at)`);
102
+ },
103
+ ];
27
104
  migrate() {
28
105
  this.db.pragma('journal_mode = WAL');
29
106
  this.db.pragma('synchronous = NORMAL');
30
- this.db.exec(`CREATE TABLE IF NOT EXISTS entries (
31
- id TEXT PRIMARY KEY, agent TEXT NOT NULL, model TEXT NOT NULL DEFAULT 'unknown',
32
- client TEXT NOT NULL DEFAULT 'default', project TEXT NOT NULL DEFAULT 'default',
33
- task TEXT NOT NULL, category TEXT NOT NULL DEFAULT 'other', start TEXT NOT NULL,
34
- end_ TEXT, status TEXT NOT NULL DEFAULT 'running', tokens_in INTEGER NOT NULL DEFAULT 0,
35
- tokens_out INTEGER NOT NULL DEFAULT 0, cost_usd REAL NOT NULL DEFAULT 0,
36
- tool_calls INTEGER NOT NULL DEFAULT 0, summary TEXT NOT NULL DEFAULT '',
37
- tags TEXT NOT NULL DEFAULT '[]', source TEXT NOT NULL DEFAULT 'manual',
38
- spec_version TEXT NOT NULL DEFAULT '0.1.0',
39
- created_at TEXT NOT NULL DEFAULT (datetime('now')),
40
- updated_at TEXT NOT NULL DEFAULT (datetime('now'))
107
+ // Bootstrap the schema_version table
108
+ this.db.exec(`CREATE TABLE IF NOT EXISTS schema_version (
109
+ version INTEGER NOT NULL
41
110
  )`);
42
- this.db.exec(`CREATE INDEX IF NOT EXISTS idx_entries_agent ON entries(agent)`);
43
- this.db.exec(`CREATE INDEX IF NOT EXISTS idx_entries_client ON entries(client)`);
44
- this.db.exec(`CREATE INDEX IF NOT EXISTS idx_entries_project ON entries(project)`);
45
- this.db.exec(`CREATE INDEX IF NOT EXISTS idx_entries_status ON entries(status)`);
46
- this.db.exec(`CREATE INDEX IF NOT EXISTS idx_entries_start ON entries(start)`);
47
- this.db.exec(`CREATE TABLE IF NOT EXISTS sync_state (
48
- source_name TEXT PRIMARY KEY,
49
- last_sync_at TEXT NOT NULL,
50
- last_status TEXT NOT NULL DEFAULT 'success',
51
- last_error TEXT,
52
- entries_synced INTEGER NOT NULL DEFAULT 0
53
- )`);
54
- // Migration: add approved column
55
- try {
56
- this.db.exec(`ALTER TABLE entries ADD COLUMN approved INTEGER NOT NULL DEFAULT 0`);
57
- }
58
- catch { }
59
- // Migration: add agent_runtime_ms and wall_clock_ms columns
60
- try {
61
- this.db.exec(`ALTER TABLE entries ADD COLUMN agent_runtime_ms INTEGER`);
62
- }
63
- catch { }
64
- try {
65
- this.db.exec(`ALTER TABLE entries ADD COLUMN wall_clock_ms INTEGER`);
66
- }
67
- catch { }
68
- // Migration: personal baselines table
69
- this.db.exec(`CREATE TABLE IF NOT EXISTS personal_baselines (
70
- id TEXT PRIMARY KEY,
71
- category TEXT NOT NULL,
72
- task_type TEXT NOT NULL,
73
- description TEXT NOT NULL DEFAULT '',
74
- my_minutes REAL NOT NULL,
75
- created_at TEXT NOT NULL DEFAULT (datetime('now')),
76
- updated_at TEXT NOT NULL DEFAULT (datetime('now'))
77
- )`);
78
- // Migration: reports table
79
- this.db.exec(`CREATE TABLE IF NOT EXISTS reports (
80
- id TEXT PRIMARY KEY,
81
- name TEXT NOT NULL DEFAULT '',
82
- period TEXT NOT NULL,
83
- period_start TEXT NOT NULL,
84
- period_end TEXT NOT NULL,
85
- style TEXT NOT NULL DEFAULT 'full',
86
- format TEXT NOT NULL DEFAULT 'terminal',
87
- content BLOB,
88
- metadata TEXT NOT NULL DEFAULT '{}',
89
- created_at TEXT NOT NULL DEFAULT (datetime('now'))
90
- )`);
91
- this.db.exec(`CREATE INDEX IF NOT EXISTS idx_reports_created ON reports(created_at)`);
111
+ let currentVersion = this.getCurrentVersion();
112
+ // Detect pre-versioned databases: entries table exists but no schema_version row.
113
+ // Probe which columns/tables already exist to infer the correct starting version.
114
+ if (currentVersion === 0 && this.tableExists('entries')) {
115
+ currentVersion = this.detectLegacyVersion();
116
+ this.db.prepare('INSERT INTO schema_version (version) VALUES (?)').run(currentVersion);
117
+ }
118
+ else if (currentVersion === 0) {
119
+ // Fresh database seed version tracker at 0
120
+ this.db.prepare('INSERT INTO schema_version (version) VALUES (0)').run();
121
+ }
122
+ // Run pending migrations inside a transaction
123
+ if (currentVersion < ClawckDB.SCHEMA_VERSION) {
124
+ const runMigrations = this.db.transaction(() => {
125
+ for (let v = currentVersion + 1; v <= ClawckDB.SCHEMA_VERSION; v++) {
126
+ const migration = ClawckDB.MIGRATIONS[v - 1];
127
+ if (!migration) {
128
+ throw new Error(`Missing migration for version ${v}`);
129
+ }
130
+ migration(this.db);
131
+ }
132
+ this.db.prepare('UPDATE schema_version SET version = ?').run(ClawckDB.SCHEMA_VERSION);
133
+ });
134
+ runMigrations();
135
+ }
136
+ }
137
+ getCurrentVersion() {
138
+ // If schema_version table was just created, it will be empty
139
+ const row = this.db.prepare('SELECT version FROM schema_version LIMIT 1').get();
140
+ return row?.version ?? 0;
141
+ }
142
+ tableExists(name) {
143
+ const row = this.db.prepare("SELECT 1 FROM sqlite_master WHERE type='table' AND name=?").get(name);
144
+ return !!row;
145
+ }
146
+ columnExists(table, column) {
147
+ const cols = this.db.pragma(`table_info(${table})`);
148
+ return cols.some(c => c.name === column);
149
+ }
150
+ /**
151
+ * For databases created before the versioned migration system existed,
152
+ * probe the schema to determine which migrations have already been applied.
153
+ */
154
+ detectLegacyVersion() {
155
+ // Walk backwards from the latest migration to find the highest already-applied one
156
+ if (this.tableExists('reports'))
157
+ return 5;
158
+ if (this.tableExists('personal_baselines'))
159
+ return 4;
160
+ if (this.columnExists('entries', 'agent_runtime_ms'))
161
+ return 3;
162
+ if (this.columnExists('entries', 'approved'))
163
+ return 2;
164
+ // entries table exists but none of the later columns/tables → version 1
165
+ return 1;
166
+ }
167
+ /** Expose the current schema version for diagnostics. */
168
+ getSchemaVersion() {
169
+ return this.getCurrentVersion();
92
170
  }
93
171
  async ensureReady() { }
94
172
  insert(entry) {
@@ -233,18 +311,24 @@ class ClawckDB {
233
311
  const equivs = this.config.human_equivalents || types_1.DEFAULT_HUMAN_EQUIVALENTS;
234
312
  const rows = entries.map(e => {
235
313
  const wallClockMs = e.wall_clock_ms ?? (e.end ? (new Date(e.end).getTime() - new Date(e.start).getTime()) : (Date.now() - new Date(e.start).getTime()));
236
- const durationMin = wallClockMs / 60000;
237
- const agentRuntimeMin = e.agent_runtime_ms != null ? e.agent_runtime_ms / 60000 : undefined;
314
+ const agentRuntimeMs = e.agent_runtime_ms ?? null;
315
+ // Primary duration: agent_runtime_ms when available, fall back to wall_clock_ms, then computed
316
+ const primaryMs = agentRuntimeMs ?? wallClockMs;
317
+ const durationMin = primaryMs / 60000;
318
+ const agentTotalRuntimeMin = agentRuntimeMs != null ? agentRuntimeMs / 60000 : undefined;
238
319
  const equiv = equivs[e.category] || equivs.other;
239
320
  const agentHours = durationMin / 60;
240
321
  const humanEquivHours = agentHours * equiv.multiplier;
241
- return { date: e.start.split('T')[0], agent: e.agent, client: e.client, project: e.project, task: e.task, category: e.category, duration_minutes: Math.round(durationMin * 100) / 100, tokens_total: e.tokens_in + e.tokens_out, cost_usd: e.cost_usd, human_equiv_hours: Math.round(humanEquivHours * 100) / 100, human_equiv_cost_saved: Math.round(humanEquivHours * equiv.human_rate_usd * 100) / 100, status: e.status, approved: e.approved ?? false, agent_runtime_minutes: agentRuntimeMin != null ? Math.round(agentRuntimeMin * 100) / 100 : undefined, wall_clock_minutes: Math.round(durationMin * 100) / 100 };
322
+ const timeSavedHours = Math.round((humanEquivHours - agentHours) * 100) / 100;
323
+ return { date: e.start.split('T')[0], start_time: e.start, end_time: e.end, agent: e.agent, client: e.client, project: e.project, task: e.task, category: e.category, duration_minutes: Math.round(durationMin * 100) / 100, tokens_in: e.tokens_in, tokens_out: e.tokens_out, tokens_total: e.tokens_in + e.tokens_out, cost_usd: e.cost_usd, human_equiv_hours: Math.round(humanEquivHours * 100) / 100, human_equiv_cost_saved: Math.round(humanEquivHours * equiv.human_rate_usd * 100) / 100, time_saved_hours: timeSavedHours, status: e.status, approved: e.approved ?? false, agent_total_runtime_minutes: agentTotalRuntimeMin != null ? Math.round(agentTotalRuntimeMin * 100) / 100 : undefined, wall_clock_minutes: Math.round(wallClockMs / 60000 * 100) / 100 };
242
324
  });
243
325
  const totalAgentHours = rows.reduce((s, r) => s + r.duration_minutes / 60, 0);
244
326
  const totalHumanEquiv = rows.reduce((s, r) => s + r.human_equiv_hours, 0);
245
327
  const totalCost = rows.reduce((s, r) => s + r.cost_usd, 0);
246
328
  const totalSavings = rows.reduce((s, r) => s + r.human_equiv_cost_saved, 0);
247
329
  const totalTokens = rows.reduce((s, r) => s + r.tokens_total, 0);
330
+ const totalTokensIn = entries.reduce((s, e) => s + e.tokens_in, 0);
331
+ const totalTokensOut = entries.reduce((s, e) => s + e.tokens_out, 0);
248
332
  const clientMap = new Map();
249
333
  for (const r of rows) {
250
334
  const c = clientMap.get(r.client) || { client: r.client, agent_hours: 0, human_equiv_hours: 0, cost_usd: 0, savings_usd: 0, entries: 0 };
@@ -290,7 +374,8 @@ class ClawckDB {
290
374
  catMap.set(r.category, c);
291
375
  }
292
376
  const round2 = (n) => Math.round(n * 100) / 100;
293
- return { period_start: from, period_end: to, total_entries: entries.length, total_agent_hours: round2(totalAgentHours), total_human_equiv_hours: round2(totalHumanEquiv), total_cost_usd: round2(totalCost), total_savings_usd: round2(totalSavings), total_tokens: totalTokens,
377
+ const mergedMs = (0, runtime_1.computeMergedRuntimeMs)(entries.map(e => ({ start: e.start, end: e.end })));
378
+ return { period_start: from, period_end: to, total_entries: entries.length, total_agent_hours: round2(totalAgentHours), total_human_equiv_hours: round2(totalHumanEquiv), total_cost_usd: round2(totalCost), total_savings_usd: round2(totalSavings), total_tokens: totalTokens, total_tokens_in: totalTokensIn, total_tokens_out: totalTokensOut, total_time_saved_hours: round2(totalHumanEquiv - mergedMs / 3600000), total_agent_merged_runtime_hours: round2(mergedMs / 3600000),
294
379
  by_client: [...clientMap.values()].map(c => ({ ...c, agent_hours: round2(c.agent_hours), human_equiv_hours: round2(c.human_equiv_hours), cost_usd: round2(c.cost_usd), savings_usd: round2(c.savings_usd) })),
295
380
  by_agent: [...agentMap.values()].map(a => ({ ...a, agent_hours: round2(a.agent_hours), human_equiv_hours: round2(a.human_equiv_hours), cost_usd: round2(a.cost_usd), success_rate: a.entries > 0 ? Math.round((a.completed / a.entries) * 100) : 0 })),
296
381
  by_project: [...projMap.values()].map(p => ({ ...p, agent_hours: round2(p.agent_hours), human_equiv_hours: round2(p.human_equiv_hours), cost_usd: round2(p.cost_usd) })),