@dotsetlabs/dotclaw 1.5.2 → 1.7.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/README.md +8 -3
- package/config-examples/runtime.json +10 -8
- package/config-examples/tool-policy.json +17 -0
- package/container/Dockerfile +4 -0
- package/container/agent-runner/package-lock.json +2 -2
- package/container/agent-runner/package.json +1 -1
- package/container/agent-runner/src/agent-config.ts +17 -15
- package/container/agent-runner/src/container-protocol.ts +10 -6
- package/container/agent-runner/src/daemon.ts +237 -32
- package/container/agent-runner/src/heartbeat-worker.ts +94 -0
- package/container/agent-runner/src/id.ts +4 -0
- package/container/agent-runner/src/index.ts +356 -188
- package/container/agent-runner/src/ipc.ts +161 -12
- package/container/agent-runner/src/memory.ts +8 -2
- package/container/agent-runner/src/prompt-packs.ts +5 -209
- package/container/agent-runner/src/request-worker.ts +25 -0
- package/container/agent-runner/src/tools.ts +423 -32
- package/dist/agent-context.d.ts +1 -0
- package/dist/agent-context.d.ts.map +1 -1
- package/dist/agent-context.js +15 -7
- package/dist/agent-context.js.map +1 -1
- package/dist/agent-execution.d.ts +11 -6
- package/dist/agent-execution.d.ts.map +1 -1
- package/dist/agent-execution.js +6 -4
- package/dist/agent-execution.js.map +1 -1
- package/dist/background-jobs.d.ts +9 -0
- package/dist/background-jobs.d.ts.map +1 -1
- package/dist/background-jobs.js +70 -15
- package/dist/background-jobs.js.map +1 -1
- package/dist/behavior-config.d.ts +0 -1
- package/dist/behavior-config.d.ts.map +1 -1
- package/dist/behavior-config.js +0 -3
- package/dist/behavior-config.js.map +1 -1
- package/dist/cli.js +313 -45
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +6 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +6 -0
- package/dist/config.js.map +1 -1
- package/dist/container-protocol.d.ts +10 -6
- package/dist/container-protocol.d.ts.map +1 -1
- package/dist/container-runner.d.ts +28 -8
- package/dist/container-runner.d.ts.map +1 -1
- package/dist/container-runner.js +254 -54
- package/dist/container-runner.js.map +1 -1
- package/dist/dashboard.js +1 -1
- package/dist/dashboard.js.map +1 -1
- package/dist/db.d.ts +31 -3
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +277 -39
- package/dist/db.js.map +1 -1
- package/dist/id.d.ts +2 -0
- package/dist/id.d.ts.map +1 -0
- package/dist/id.js +4 -0
- package/dist/id.js.map +1 -0
- package/dist/index.js +1194 -381
- package/dist/index.js.map +1 -1
- package/dist/json-helpers.d.ts +1 -0
- package/dist/json-helpers.d.ts.map +1 -1
- package/dist/json-helpers.js +33 -1
- package/dist/json-helpers.js.map +1 -1
- package/dist/maintenance.d.ts +2 -0
- package/dist/maintenance.d.ts.map +1 -1
- package/dist/maintenance.js +196 -17
- package/dist/maintenance.js.map +1 -1
- package/dist/memory-embeddings.d.ts +1 -0
- package/dist/memory-embeddings.d.ts.map +1 -1
- package/dist/memory-embeddings.js +38 -4
- package/dist/memory-embeddings.js.map +1 -1
- package/dist/memory-recall.d.ts.map +1 -1
- package/dist/memory-recall.js +6 -1
- package/dist/memory-recall.js.map +1 -1
- package/dist/memory-store.d.ts +1 -0
- package/dist/memory-store.d.ts.map +1 -1
- package/dist/memory-store.js +72 -10
- package/dist/memory-store.js.map +1 -1
- package/dist/metrics.d.ts +1 -0
- package/dist/metrics.d.ts.map +1 -1
- package/dist/metrics.js +16 -2
- package/dist/metrics.js.map +1 -1
- package/dist/path-mapping.d.ts +4 -0
- package/dist/path-mapping.d.ts.map +1 -0
- package/dist/path-mapping.js +50 -0
- package/dist/path-mapping.js.map +1 -0
- package/dist/paths.d.ts +4 -2
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +4 -2
- package/dist/paths.js.map +1 -1
- package/dist/personalization.d.ts +1 -0
- package/dist/personalization.d.ts.map +1 -1
- package/dist/personalization.js +14 -0
- package/dist/personalization.js.map +1 -1
- package/dist/progress.d.ts +2 -2
- package/dist/progress.d.ts.map +1 -1
- package/dist/progress.js +18 -14
- package/dist/progress.js.map +1 -1
- package/dist/runtime-config.d.ts +18 -7
- package/dist/runtime-config.d.ts.map +1 -1
- package/dist/runtime-config.js +29 -18
- package/dist/runtime-config.js.map +1 -1
- package/dist/task-scheduler.d.ts +7 -1
- package/dist/task-scheduler.d.ts.map +1 -1
- package/dist/task-scheduler.js +182 -48
- package/dist/task-scheduler.js.map +1 -1
- package/dist/timezone.d.ts +4 -0
- package/dist/timezone.d.ts.map +1 -0
- package/dist/timezone.js +111 -0
- package/dist/timezone.js.map +1 -0
- package/dist/types.d.ts +31 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +6 -1
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Heartbeat Worker Thread
|
|
3
|
+
*
|
|
4
|
+
* Runs in a separate V8 isolate so heartbeat writes are never blocked
|
|
5
|
+
* by long-running agent tasks on the main thread. Writes two files:
|
|
6
|
+
*
|
|
7
|
+
* - /workspace/ipc/heartbeat — epoch ms (backward compatible)
|
|
8
|
+
* - /workspace/ipc/daemon_status.json — structured status with state info
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { parentPort, workerData } from 'worker_threads';
|
|
12
|
+
import fs from 'fs';
|
|
13
|
+
|
|
14
|
+
interface WorkerConfig {
|
|
15
|
+
heartbeatPath: string;
|
|
16
|
+
statusPath: string;
|
|
17
|
+
intervalMs: number;
|
|
18
|
+
pid: number;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
type WorkerMessage =
|
|
22
|
+
| { type: 'processing'; requestId: string }
|
|
23
|
+
| { type: 'idle' }
|
|
24
|
+
| { type: 'shutdown' };
|
|
25
|
+
|
|
26
|
+
interface DaemonStatus {
|
|
27
|
+
state: 'idle' | 'processing';
|
|
28
|
+
ts: number;
|
|
29
|
+
request_id: string | null;
|
|
30
|
+
started_at: number | null;
|
|
31
|
+
pid: number;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const config = workerData as WorkerConfig;
|
|
35
|
+
let state: 'idle' | 'processing' = 'idle';
|
|
36
|
+
let requestId: string | null = null;
|
|
37
|
+
let startedAt: number | null = null;
|
|
38
|
+
function writeHeartbeat(): void {
|
|
39
|
+
const now = Date.now();
|
|
40
|
+
try {
|
|
41
|
+
const tmpHeartbeat = config.heartbeatPath + '.tmp';
|
|
42
|
+
fs.writeFileSync(tmpHeartbeat, now.toString());
|
|
43
|
+
fs.renameSync(tmpHeartbeat, config.heartbeatPath);
|
|
44
|
+
} catch {
|
|
45
|
+
// Ignore heartbeat write errors
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const status: DaemonStatus = {
|
|
49
|
+
state,
|
|
50
|
+
ts: now,
|
|
51
|
+
request_id: requestId,
|
|
52
|
+
started_at: startedAt,
|
|
53
|
+
pid: config.pid,
|
|
54
|
+
};
|
|
55
|
+
try {
|
|
56
|
+
const tmpStatus = config.statusPath + '.tmp';
|
|
57
|
+
fs.writeFileSync(tmpStatus, JSON.stringify(status));
|
|
58
|
+
fs.renameSync(tmpStatus, config.statusPath);
|
|
59
|
+
} catch {
|
|
60
|
+
// Ignore status write errors
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Write immediately on start
|
|
65
|
+
writeHeartbeat();
|
|
66
|
+
|
|
67
|
+
const timer = setInterval(writeHeartbeat, config.intervalMs);
|
|
68
|
+
|
|
69
|
+
parentPort?.on('message', (msg: WorkerMessage) => {
|
|
70
|
+
switch (msg.type) {
|
|
71
|
+
case 'processing':
|
|
72
|
+
state = 'processing';
|
|
73
|
+
requestId = msg.requestId;
|
|
74
|
+
startedAt = Date.now();
|
|
75
|
+
writeHeartbeat(); // Immediate update
|
|
76
|
+
break;
|
|
77
|
+
case 'idle':
|
|
78
|
+
state = 'idle';
|
|
79
|
+
requestId = null;
|
|
80
|
+
startedAt = null;
|
|
81
|
+
writeHeartbeat(); // Immediate update
|
|
82
|
+
break;
|
|
83
|
+
case 'shutdown':
|
|
84
|
+
clearInterval(timer);
|
|
85
|
+
state = 'idle';
|
|
86
|
+
requestId = null;
|
|
87
|
+
startedAt = null;
|
|
88
|
+
writeHeartbeat(); // Final heartbeat
|
|
89
|
+
process.exit(0);
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
// Worker stays alive via the setInterval timer
|