clawck 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.
Files changed (47) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +322 -0
  3. package/dist/cli/index.d.ts +14 -0
  4. package/dist/cli/index.d.ts.map +1 -0
  5. package/dist/cli/index.js +233 -0
  6. package/dist/cli/index.js.map +1 -0
  7. package/dist/core/clawck.d.ts +48 -0
  8. package/dist/core/clawck.d.ts.map +1 -0
  9. package/dist/core/clawck.js +119 -0
  10. package/dist/core/clawck.js.map +1 -0
  11. package/dist/core/database.d.ts +55 -0
  12. package/dist/core/database.d.ts.map +1 -0
  13. package/dist/core/database.js +329 -0
  14. package/dist/core/database.js.map +1 -0
  15. package/dist/core/index.d.ts +4 -0
  16. package/dist/core/index.d.ts.map +1 -0
  17. package/dist/core/index.js +23 -0
  18. package/dist/core/index.js.map +1 -0
  19. package/dist/core/sync.d.ts +17 -0
  20. package/dist/core/sync.d.ts.map +1 -0
  21. package/dist/core/sync.js +91 -0
  22. package/dist/core/sync.js.map +1 -0
  23. package/dist/core/types.d.ts +186 -0
  24. package/dist/core/types.d.ts.map +1 -0
  25. package/dist/core/types.js +34 -0
  26. package/dist/core/types.js.map +1 -0
  27. package/dist/dashboard/index.d.ts +6 -0
  28. package/dist/dashboard/index.d.ts.map +1 -0
  29. package/dist/dashboard/index.js +632 -0
  30. package/dist/dashboard/index.js.map +1 -0
  31. package/dist/index.d.ts +30 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +53 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/server/api.d.ts +15 -0
  36. package/dist/server/api.d.ts.map +1 -0
  37. package/dist/server/api.js +193 -0
  38. package/dist/server/api.js.map +1 -0
  39. package/dist/server/index.d.ts +3 -0
  40. package/dist/server/index.d.ts.map +1 -0
  41. package/dist/server/index.js +9 -0
  42. package/dist/server/index.js.map +1 -0
  43. package/dist/server/mcp.d.ts +8 -0
  44. package/dist/server/mcp.d.ts.map +1 -0
  45. package/dist/server/mcp.js +277 -0
  46. package/dist/server/mcp.js.map +1 -0
  47. package/package.json +66 -0
package/dist/index.js ADDED
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ /**
3
+ * ā±ļøšŸ¦€ Clawck
4
+ * Time tracking for AI agents. Toggl for the agentic era.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * import { Clawck } from 'clawck';
9
+ *
10
+ * const clawck = new Clawck({ default_client: 'acme-corp' });
11
+ *
12
+ * // Start tracking
13
+ * const entry = clawck.start({ task: 'Research grants', project: 'grant-research', category: 'research' });
14
+ *
15
+ * // ... agent does work ...
16
+ *
17
+ * // Stop tracking
18
+ * clawck.stop({ id: entry.id, status: 'completed', summary: 'Found 12 matching grants' });
19
+ *
20
+ * // Get timesheet
21
+ * const report = clawck.timesheet('2026-03-01', '2026-03-07');
22
+ * console.log(`Saved ${report.total_savings_usd} in human-equivalent work`);
23
+ * ```
24
+ */
25
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
26
+ if (k2 === undefined) k2 = k;
27
+ var desc = Object.getOwnPropertyDescriptor(m, k);
28
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
29
+ desc = { enumerable: true, get: function() { return m[k]; } };
30
+ }
31
+ Object.defineProperty(o, k2, desc);
32
+ }) : (function(o, m, k, k2) {
33
+ if (k2 === undefined) k2 = k;
34
+ o[k2] = m[k];
35
+ }));
36
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
37
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
38
+ };
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.startMCPServer = exports.startServer = exports.createServer = exports.SyncManager = exports.ClawckDB = exports.Clawck = void 0;
41
+ var clawck_1 = require("./core/clawck");
42
+ Object.defineProperty(exports, "Clawck", { enumerable: true, get: function () { return clawck_1.Clawck; } });
43
+ var database_1 = require("./core/database");
44
+ Object.defineProperty(exports, "ClawckDB", { enumerable: true, get: function () { return database_1.ClawckDB; } });
45
+ var sync_1 = require("./core/sync");
46
+ Object.defineProperty(exports, "SyncManager", { enumerable: true, get: function () { return sync_1.SyncManager; } });
47
+ var api_1 = require("./server/api");
48
+ Object.defineProperty(exports, "createServer", { enumerable: true, get: function () { return api_1.createServer; } });
49
+ Object.defineProperty(exports, "startServer", { enumerable: true, get: function () { return api_1.startServer; } });
50
+ var mcp_1 = require("./server/mcp");
51
+ Object.defineProperty(exports, "startMCPServer", { enumerable: true, get: function () { return mcp_1.startMCPServer; } });
52
+ __exportStar(require("./core/types"), exports);
53
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;;;;;;;;;;;;;;;;;AAEH,wCAAuC;AAA9B,gGAAA,MAAM,OAAA;AACf,4CAA2C;AAAlC,oGAAA,QAAQ,OAAA;AACjB,oCAA0C;AAAjC,mGAAA,WAAW,OAAA;AACpB,oCAAyD;AAAhD,mGAAA,YAAY,OAAA;AAAE,kGAAA,WAAW,OAAA;AAClC,oCAA8C;AAArC,qGAAA,cAAc,OAAA;AACvB,+CAA6B"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * ā±ļøšŸ¦€ Clawck — REST API Server
3
+ * Express-based server for the REST API and dashboard.
4
+ */
5
+ import express from 'express';
6
+ import { Clawck } from '../core/clawck';
7
+ import { ClawckConfig } from '../core/types';
8
+ import { SyncManager } from '../core/sync';
9
+ export declare function createServer(config?: Partial<ClawckConfig>): Promise<{
10
+ app: express.Express;
11
+ clawck: Clawck;
12
+ syncManager?: SyncManager;
13
+ }>;
14
+ export declare function startServer(config?: Partial<ClawckConfig>): Promise<void>;
15
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/server/api.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,OAAO,MAAM,SAAS,CAAC;AAG9B,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,YAAY,EAA6C,MAAM,eAAe,CAAC;AACxF,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG3C,wBAAsB,YAAY,CAAC,MAAM,GAAE,OAAO,CAAC,YAAY,CAAM,GAAG,OAAO,CAAC;IAAE,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,WAAW,CAAA;CAAE,CAAC,CAwLnJ;AAED,wBAAsB,WAAW,CAAC,MAAM,GAAE,OAAO,CAAC,YAAY,CAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYnF"}
@@ -0,0 +1,193 @@
1
+ "use strict";
2
+ /**
3
+ * ā±ļøšŸ¦€ Clawck — REST API Server
4
+ * Express-based server for the REST API and dashboard.
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.createServer = createServer;
11
+ exports.startServer = startServer;
12
+ const express_1 = __importDefault(require("express"));
13
+ const cors_1 = __importDefault(require("cors"));
14
+ const clawck_1 = require("../core/clawck");
15
+ const types_1 = require("../core/types");
16
+ const sync_1 = require("../core/sync");
17
+ const index_1 = require("../dashboard/index");
18
+ async function createServer(config = {}) {
19
+ const fullConfig = { ...types_1.DEFAULT_CONFIG, ...config };
20
+ const clawck = await new clawck_1.Clawck(fullConfig).ready();
21
+ const app = (0, express_1.default)();
22
+ app.use((0, cors_1.default)());
23
+ app.use(express_1.default.json());
24
+ // ─── Dashboard ──────────────────────────────────────────
25
+ app.get('/', (_req, res) => {
26
+ res.setHeader('Content-Type', 'text/html');
27
+ res.send((0, index_1.getDashboardHTML)(fullConfig.port));
28
+ });
29
+ // ─── Health ─────────────────────────────────────────────
30
+ app.get('/api/health', (_req, res) => {
31
+ res.json({ status: 'ok', version: '0.1.0', spec: '0.1.0' });
32
+ });
33
+ app.get('/api/stats', (_req, res) => {
34
+ res.json(clawck.stats());
35
+ });
36
+ // ─── Start Task ─────────────────────────────────────────
37
+ app.post('/api/start', (req, res) => {
38
+ try {
39
+ const entry = clawck.start(req.body);
40
+ res.status(201).json(entry);
41
+ }
42
+ catch (err) {
43
+ res.status(400).json({ error: err.message });
44
+ }
45
+ });
46
+ // ─── Stop Task ──────────────────────────────────────────
47
+ app.post('/api/stop', (req, res) => {
48
+ try {
49
+ const entry = clawck.stop(req.body);
50
+ if (!entry)
51
+ return res.status(404).json({ error: 'Entry not found' });
52
+ res.json(entry);
53
+ }
54
+ catch (err) {
55
+ res.status(400).json({ error: err.message });
56
+ }
57
+ });
58
+ // ─── Log Completed Task ────────────────────────────────
59
+ app.post('/api/log', (req, res) => {
60
+ try {
61
+ const entry = clawck.log(req.body);
62
+ res.status(201).json(entry);
63
+ }
64
+ catch (err) {
65
+ res.status(400).json({ error: err.message });
66
+ }
67
+ });
68
+ // ─── Update Entry ──────────────────────────────────────
69
+ app.patch('/api/entries/:id', (req, res) => {
70
+ try {
71
+ const entry = clawck.update(req.params.id, req.body);
72
+ if (!entry)
73
+ return res.status(404).json({ error: 'Entry not found' });
74
+ res.json(entry);
75
+ }
76
+ catch (err) {
77
+ res.status(400).json({ error: err.message });
78
+ }
79
+ });
80
+ // ─── Get Entry ─────────────────────────────────────────
81
+ app.get('/api/entries/:id', (req, res) => {
82
+ const entry = clawck.get(req.params.id);
83
+ if (!entry)
84
+ return res.status(404).json({ error: 'Entry not found' });
85
+ res.json(entry);
86
+ });
87
+ // ─── Query Entries ─────────────────────────────────────
88
+ app.get('/api/entries', (req, res) => {
89
+ const entries = clawck.query({
90
+ client: req.query.client,
91
+ project: req.query.project,
92
+ agent: req.query.agent,
93
+ category: req.query.category,
94
+ status: req.query.status,
95
+ from: req.query.from,
96
+ to: req.query.to,
97
+ limit: req.query.limit ? parseInt(req.query.limit) : undefined,
98
+ });
99
+ res.json(entries);
100
+ });
101
+ // ─── Running Entries ───────────────────────────────────
102
+ app.get('/api/running', (_req, res) => {
103
+ res.json(clawck.running());
104
+ });
105
+ // ─── Timesheet ─────────────────────────────────────────
106
+ app.get('/api/timesheet', (req, res) => {
107
+ const now = new Date();
108
+ const weekAgo = new Date(now.getTime() - 7 * 24 * 3600000);
109
+ const from = req.query.from || weekAgo.toISOString();
110
+ const to = req.query.to || now.toISOString();
111
+ const timesheet = clawck.timesheet(from, to, {
112
+ client: req.query.client,
113
+ project: req.query.project,
114
+ agent: req.query.agent,
115
+ });
116
+ res.json(timesheet);
117
+ });
118
+ // ─── Filter Options ────────────────────────────────────
119
+ app.get('/api/clients', (_req, res) => res.json(clawck.clients()));
120
+ app.get('/api/projects', (_req, res) => res.json(clawck.projects()));
121
+ app.get('/api/agents', (_req, res) => res.json(clawck.agents()));
122
+ // ─── Ingest (for remote sync / merging) ────────────────
123
+ app.post('/api/ingest', (req, res) => {
124
+ try {
125
+ const entries = Array.isArray(req.body) ? req.body : [req.body];
126
+ let ingested = 0;
127
+ for (const raw of entries) {
128
+ try {
129
+ const entry = {
130
+ id: raw.id,
131
+ agent: raw.agent || 'unknown-agent',
132
+ model: raw.model || 'unknown',
133
+ client: raw.client || 'default',
134
+ project: raw.project || 'default',
135
+ task: raw.task,
136
+ category: raw.category || 'other',
137
+ start: raw.start,
138
+ end: raw.end || null,
139
+ status: raw.status || 'completed',
140
+ tokens_in: raw.tokens_in || 0,
141
+ tokens_out: raw.tokens_out || 0,
142
+ cost_usd: raw.cost_usd || 0,
143
+ tool_calls: raw.tool_calls || 0,
144
+ summary: raw.summary || '',
145
+ tags: raw.tags || [],
146
+ source: raw.source || 'remote',
147
+ spec_version: raw.spec_version || types_1.SPEC_VERSION,
148
+ };
149
+ clawck.upsert(entry);
150
+ ingested++;
151
+ }
152
+ catch (e) {
153
+ // Skip bad entries
154
+ }
155
+ }
156
+ res.json({ ingested, total: entries.length });
157
+ }
158
+ catch (err) {
159
+ res.status(400).json({ error: err.message });
160
+ }
161
+ });
162
+ // ─── Sync Status ──────────────────────────────────────
163
+ let syncManager = null;
164
+ if (fullConfig.remote_sources && fullConfig.remote_sources.length > 0) {
165
+ syncManager = new sync_1.SyncManager(fullConfig, clawck.database);
166
+ syncManager.start();
167
+ }
168
+ app.get('/api/sync/status', (_req, res) => {
169
+ if (!syncManager)
170
+ return res.json({ enabled: false, states: [] });
171
+ res.json({ enabled: true, states: syncManager.getStates() });
172
+ });
173
+ app.post('/api/sync/trigger', async (_req, res) => {
174
+ if (!syncManager)
175
+ return res.status(400).json({ error: 'Sync not configured — no remote_sources defined' });
176
+ const states = await syncManager.syncAll();
177
+ res.json({ states });
178
+ });
179
+ return { app, clawck, syncManager: syncManager ?? undefined };
180
+ }
181
+ async function startServer(config = {}) {
182
+ const fullConfig = { ...types_1.DEFAULT_CONFIG, ...config };
183
+ const { app } = await createServer(config);
184
+ const port = fullConfig.port;
185
+ app.listen(port, () => {
186
+ console.log(`\n ā±ļøšŸ¦€ Clawck is running!`);
187
+ console.log(` ā”œā”€ Dashboard: http://localhost:${port}`);
188
+ console.log(` ā”œā”€ API: http://localhost:${port}/api`);
189
+ console.log(` ā”œā”€ Data dir: ${fullConfig.data_dir}`);
190
+ console.log(` └─ Spec: v${fullConfig.port ? '0.1.0' : '0.1.0'}\n`);
191
+ });
192
+ }
193
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/server/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { createServer, startServer } from './api';
2
+ export { startMCPServer } from './mcp';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.startMCPServer = exports.startServer = exports.createServer = void 0;
4
+ var api_1 = require("./api");
5
+ Object.defineProperty(exports, "createServer", { enumerable: true, get: function () { return api_1.createServer; } });
6
+ Object.defineProperty(exports, "startServer", { enumerable: true, get: function () { return api_1.startServer; } });
7
+ var mcp_1 = require("./mcp");
8
+ Object.defineProperty(exports, "startMCPServer", { enumerable: true, get: function () { return mcp_1.startMCPServer; } });
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":";;;AAAA,6BAAkD;AAAzC,mGAAA,YAAY,OAAA;AAAE,kGAAA,WAAW,OAAA;AAClC,6BAAuC;AAA9B,qGAAA,cAAc,OAAA"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * ā±ļøšŸ¦€ Clawck — MCP Server (stdio)
3
+ * Implements the Model Context Protocol for agent tool integration.
4
+ * Claude Code, Cline, Cursor, etc. can use this to clock in/out.
5
+ */
6
+ import { ClawckConfig } from '../core/types';
7
+ export declare function startMCPServer(config?: Partial<ClawckConfig>): Promise<void>;
8
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/server/mcp.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,YAAY,EAAmC,MAAM,eAAe,CAAC;AAoF9E,wBAAsB,cAAc,CAAC,MAAM,GAAE,OAAO,CAAC,YAAY,CAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsKtF"}
@@ -0,0 +1,277 @@
1
+ "use strict";
2
+ /**
3
+ * ā±ļøšŸ¦€ Clawck — MCP Server (stdio)
4
+ * Implements the Model Context Protocol for agent tool integration.
5
+ * Claude Code, Cline, Cursor, etc. can use this to clock in/out.
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.startMCPServer = startMCPServer;
42
+ const clawck_1 = require("../core/clawck");
43
+ const types_1 = require("../core/types");
44
+ const readline = __importStar(require("readline"));
45
+ const TOOLS = [
46
+ {
47
+ name: 'clawck_start_task',
48
+ description: 'Start tracking time for a new task. Call this when beginning work on a task, project, or client deliverable. Returns the entry ID needed to stop the timer later.',
49
+ inputSchema: {
50
+ type: 'object',
51
+ properties: {
52
+ task: { type: 'string', description: 'What work is being done (e.g., "Research grant opportunities for NEA funding")' },
53
+ project: { type: 'string', description: 'Project name (e.g., "grant-research", "website-rebuild")' },
54
+ client: { type: 'string', description: 'Client name (e.g., "acme-corp")' },
55
+ category: { type: 'string', enum: types_1.TASK_CATEGORIES, description: 'Type of work for human-equivalent time estimates' },
56
+ agent: { type: 'string', description: 'Agent name/identifier' },
57
+ model: { type: 'string', description: 'Model being used (e.g., "claude-sonnet-4-20250514")' },
58
+ tags: { type: 'array', items: { type: 'string' }, description: 'Optional tags for filtering' },
59
+ },
60
+ required: ['task'],
61
+ },
62
+ },
63
+ {
64
+ name: 'clawck_stop_task',
65
+ description: 'Stop tracking time for a task. Call this when finished with a task. Provide the entry ID from clawck_start_task.',
66
+ inputSchema: {
67
+ type: 'object',
68
+ properties: {
69
+ id: { type: 'string', description: 'Entry ID from clawck_start_task' },
70
+ status: { type: 'string', enum: ['completed', 'failed'], description: 'Outcome of the task' },
71
+ summary: { type: 'string', description: 'Brief summary of what was accomplished' },
72
+ tokens_in: { type: 'number', description: 'Input tokens consumed' },
73
+ tokens_out: { type: 'number', description: 'Output tokens generated' },
74
+ cost_usd: { type: 'number', description: 'Estimated cost in USD' },
75
+ tool_calls: { type: 'number', description: 'Number of tool calls made' },
76
+ },
77
+ required: ['id'],
78
+ },
79
+ },
80
+ {
81
+ name: 'clawck_log_task',
82
+ description: 'Log a completed task retroactively (when you forgot to start the timer). Provide the duration and details.',
83
+ inputSchema: {
84
+ type: 'object',
85
+ properties: {
86
+ task: { type: 'string', description: 'What work was done' },
87
+ duration_minutes: { type: 'number', description: 'How long the task took in minutes' },
88
+ project: { type: 'string', description: 'Project name' },
89
+ client: { type: 'string', description: 'Client name' },
90
+ category: { type: 'string', enum: types_1.TASK_CATEGORIES, description: 'Type of work' },
91
+ agent: { type: 'string', description: 'Agent name' },
92
+ model: { type: 'string', description: 'Model used' },
93
+ summary: { type: 'string', description: 'Summary of work done' },
94
+ tokens_in: { type: 'number', description: 'Input tokens consumed' },
95
+ tokens_out: { type: 'number', description: 'Output tokens generated' },
96
+ cost_usd: { type: 'number', description: 'Estimated cost in USD' },
97
+ tags: { type: 'array', items: { type: 'string' }, description: 'Tags' },
98
+ },
99
+ required: ['task', 'duration_minutes'],
100
+ },
101
+ },
102
+ {
103
+ name: 'clawck_status',
104
+ description: 'Get currently running tasks and overall Clawck stats.',
105
+ inputSchema: {
106
+ type: 'object',
107
+ properties: {},
108
+ },
109
+ },
110
+ {
111
+ name: 'clawck_timesheet',
112
+ description: 'Get a timesheet summary for a date range. Shows agent hours, human equivalent hours, costs, and savings.',
113
+ inputSchema: {
114
+ type: 'object',
115
+ properties: {
116
+ from: { type: 'string', description: 'Start date (ISO 8601, defaults to 7 days ago)' },
117
+ to: { type: 'string', description: 'End date (ISO 8601, defaults to now)' },
118
+ client: { type: 'string', description: 'Filter by client' },
119
+ project: { type: 'string', description: 'Filter by project' },
120
+ agent: { type: 'string', description: 'Filter by agent' },
121
+ },
122
+ },
123
+ },
124
+ ];
125
+ async function startMCPServer(config = {}) {
126
+ const fullConfig = { ...types_1.DEFAULT_CONFIG, ...config };
127
+ const clawck = await new clawck_1.Clawck(fullConfig).ready();
128
+ const rl = readline.createInterface({ input: process.stdin, terminal: false });
129
+ let buffer = '';
130
+ function send(msg) {
131
+ const json = JSON.stringify(msg);
132
+ process.stdout.write(`Content-Length: ${Buffer.byteLength(json)}\r\n\r\n${json}`);
133
+ }
134
+ function handleMessage(msg) {
135
+ const { id, method, params } = msg;
136
+ switch (method) {
137
+ case 'initialize':
138
+ send({
139
+ jsonrpc: '2.0', id,
140
+ result: {
141
+ protocolVersion: '2024-11-05',
142
+ capabilities: { tools: {} },
143
+ serverInfo: { name: 'clawck', version: '0.1.0' },
144
+ },
145
+ });
146
+ break;
147
+ case 'notifications/initialized':
148
+ // Client acknowledged — no response needed
149
+ break;
150
+ case 'tools/list':
151
+ send({ jsonrpc: '2.0', id, result: { tools: TOOLS } });
152
+ break;
153
+ case 'tools/call': {
154
+ const { name, arguments: args } = params;
155
+ let result;
156
+ try {
157
+ switch (name) {
158
+ case 'clawck_start_task': {
159
+ const entry = clawck.start(args);
160
+ result = `ā±ļø Timer started!\n\nEntry ID: ${entry.id}\nTask: ${entry.task}\nProject: ${entry.project}\nClient: ${entry.client}\nStarted: ${entry.start}\n\nšŸ’” Call clawck_stop_task with id="${entry.id}" when done.`;
161
+ break;
162
+ }
163
+ case 'clawck_stop_task': {
164
+ const entry = clawck.stop(args);
165
+ if (!entry) {
166
+ result = `āŒ Entry not found: ${args.id}`;
167
+ }
168
+ else {
169
+ const dur = entry.end
170
+ ? ((new Date(entry.end).getTime() - new Date(entry.start).getTime()) / 60000).toFixed(1)
171
+ : '?';
172
+ result = `ā±ļø Timer stopped!\n\nTask: ${entry.task}\nDuration: ${dur} minutes\nStatus: ${entry.status}\nTokens: ${entry.tokens_in + entry.tokens_out}\nCost: $${entry.cost_usd.toFixed(4)}`;
173
+ }
174
+ break;
175
+ }
176
+ case 'clawck_log_task': {
177
+ const entry = clawck.log(args);
178
+ result = `šŸ“ Task logged!\n\nEntry ID: ${entry.id}\nTask: ${entry.task}\nDuration: ${args.duration_minutes} minutes\nProject: ${entry.project}\nClient: ${entry.client}`;
179
+ break;
180
+ }
181
+ case 'clawck_status': {
182
+ const running = clawck.running();
183
+ const stats = clawck.stats();
184
+ const runningList = running.length > 0
185
+ ? running.map(e => ` • ${e.task} (${e.project}/${e.client}) — started ${e.start}`).join('\n')
186
+ : ' No tasks running';
187
+ result = `šŸ¦€ Clawck Status\n\nšŸ“Š Total entries: ${stats.total_entries}\nšŸƒ Running: ${stats.running}\nšŸ‘„ Clients: ${stats.clients}\nšŸ“ Projects: ${stats.projects}\nšŸ¤– Agents: ${stats.agents}\n\nā±ļø Running tasks:\n${runningList}`;
188
+ break;
189
+ }
190
+ case 'clawck_timesheet': {
191
+ const now = new Date();
192
+ const weekAgo = new Date(now.getTime() - 7 * 24 * 3600000);
193
+ const ts = clawck.timesheet(args.from || weekAgo.toISOString(), args.to || now.toISOString(), { client: args.client, project: args.project, agent: args.agent });
194
+ result = `šŸ“‹ Timesheet (${ts.period_start.split('T')[0]} → ${ts.period_end.split('T')[0]})\n\n` +
195
+ `ā±ļø Agent hours: ${ts.total_agent_hours.toFixed(1)} hrs\n` +
196
+ `šŸ‘¤ Human equiv: ${ts.total_human_equiv_hours.toFixed(1)} hrs\n` +
197
+ `šŸ’° Agent cost: $${ts.total_cost_usd.toFixed(2)}\n` +
198
+ `šŸ’š Est. savings: $${ts.total_savings_usd.toFixed(2)}\n` +
199
+ `šŸ”¢ Total entries: ${ts.total_entries}\n` +
200
+ `šŸŖ™ Total tokens: ${ts.total_tokens.toLocaleString()}\n\n` +
201
+ `šŸ“ By Project:\n${ts.by_project.map(p => ` • ${p.project} (${p.client}): ${p.agent_hours.toFixed(1)}h agent → ${p.human_equiv_hours.toFixed(1)}h human equiv`).join('\n') || ' None'}\n\n` +
202
+ `šŸ¤– By Agent:\n${ts.by_agent.map(a => ` • ${a.agent} (${a.model}): ${a.agent_hours.toFixed(1)}h, ${a.success_rate}% success`).join('\n') || ' None'}`;
203
+ break;
204
+ }
205
+ default:
206
+ result = `Unknown tool: ${name}`;
207
+ }
208
+ send({
209
+ jsonrpc: '2.0', id,
210
+ result: { content: [{ type: 'text', text: result }] },
211
+ });
212
+ }
213
+ catch (err) {
214
+ send({
215
+ jsonrpc: '2.0', id,
216
+ result: { content: [{ type: 'text', text: `Error: ${err.message}` }], isError: true },
217
+ });
218
+ }
219
+ break;
220
+ }
221
+ default:
222
+ if (id) {
223
+ send({ jsonrpc: '2.0', id, error: { code: -32601, message: `Unknown method: ${method}` } });
224
+ }
225
+ }
226
+ }
227
+ // Parse Content-Length delimited JSON-RPC messages from stdin
228
+ rl.on('line', (line) => {
229
+ buffer += line + '\n';
230
+ // Try to parse complete messages
231
+ while (buffer.includes('\r\n\r\n') || buffer.includes('\n\n')) {
232
+ const headerEnd = buffer.indexOf('\r\n\r\n');
233
+ const altEnd = buffer.indexOf('\n\n');
234
+ const end = headerEnd !== -1 ? headerEnd : altEnd;
235
+ const sep = headerEnd !== -1 ? '\r\n\r\n' : '\n\n';
236
+ if (end === -1)
237
+ break;
238
+ const header = buffer.substring(0, end);
239
+ const contentLengthMatch = header.match(/Content-Length:\s*(\d+)/i);
240
+ if (contentLengthMatch) {
241
+ const length = parseInt(contentLengthMatch[1]);
242
+ const bodyStart = end + sep.length;
243
+ const remaining = buffer.substring(bodyStart);
244
+ if (remaining.length >= length) {
245
+ const body = remaining.substring(0, length);
246
+ buffer = remaining.substring(length);
247
+ try {
248
+ const msg = JSON.parse(body);
249
+ handleMessage(msg);
250
+ }
251
+ catch (e) {
252
+ // Malformed JSON — skip
253
+ }
254
+ }
255
+ else {
256
+ break; // Wait for more data
257
+ }
258
+ }
259
+ else {
260
+ // No content-length header — try parsing as plain JSON line
261
+ const lines = buffer.split('\n').filter(l => l.trim());
262
+ buffer = '';
263
+ for (const l of lines) {
264
+ try {
265
+ const msg = JSON.parse(l.trim());
266
+ handleMessage(msg);
267
+ }
268
+ catch (e) {
269
+ // Not JSON — skip
270
+ }
271
+ }
272
+ }
273
+ }
274
+ });
275
+ process.stderr.write('ā±ļøšŸ¦€ Clawck MCP server running on stdio\n');
276
+ }
277
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/server/mcp.ts"],"names":[],"mappings":"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"}