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.
- package/LICENSE +21 -0
- package/README.md +322 -0
- package/dist/cli/index.d.ts +14 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +233 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/clawck.d.ts +48 -0
- package/dist/core/clawck.d.ts.map +1 -0
- package/dist/core/clawck.js +119 -0
- package/dist/core/clawck.js.map +1 -0
- package/dist/core/database.d.ts +55 -0
- package/dist/core/database.d.ts.map +1 -0
- package/dist/core/database.js +329 -0
- package/dist/core/database.js.map +1 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +23 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/sync.d.ts +17 -0
- package/dist/core/sync.d.ts.map +1 -0
- package/dist/core/sync.js +91 -0
- package/dist/core/sync.js.map +1 -0
- package/dist/core/types.d.ts +186 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +34 -0
- package/dist/core/types.js.map +1 -0
- package/dist/dashboard/index.d.ts +6 -0
- package/dist/dashboard/index.d.ts.map +1 -0
- package/dist/dashboard/index.js +632 -0
- package/dist/dashboard/index.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/dist/server/api.d.ts +15 -0
- package/dist/server/api.d.ts.map +1 -0
- package/dist/server/api.js +193 -0
- package/dist/server/api.js.map +1 -0
- package/dist/server/index.d.ts +3 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +9 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/mcp.d.ts +8 -0
- package/dist/server/mcp.d.ts.map +1 -0
- package/dist/server/mcp.js +277 -0
- package/dist/server/mcp.js.map +1 -0
- 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 @@
|
|
|
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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"}
|