@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.
Files changed (111) hide show
  1. package/README.md +8 -3
  2. package/config-examples/runtime.json +10 -8
  3. package/config-examples/tool-policy.json +17 -0
  4. package/container/Dockerfile +4 -0
  5. package/container/agent-runner/package-lock.json +2 -2
  6. package/container/agent-runner/package.json +1 -1
  7. package/container/agent-runner/src/agent-config.ts +17 -15
  8. package/container/agent-runner/src/container-protocol.ts +10 -6
  9. package/container/agent-runner/src/daemon.ts +237 -32
  10. package/container/agent-runner/src/heartbeat-worker.ts +94 -0
  11. package/container/agent-runner/src/id.ts +4 -0
  12. package/container/agent-runner/src/index.ts +356 -188
  13. package/container/agent-runner/src/ipc.ts +161 -12
  14. package/container/agent-runner/src/memory.ts +8 -2
  15. package/container/agent-runner/src/prompt-packs.ts +5 -209
  16. package/container/agent-runner/src/request-worker.ts +25 -0
  17. package/container/agent-runner/src/tools.ts +423 -32
  18. package/dist/agent-context.d.ts +1 -0
  19. package/dist/agent-context.d.ts.map +1 -1
  20. package/dist/agent-context.js +15 -7
  21. package/dist/agent-context.js.map +1 -1
  22. package/dist/agent-execution.d.ts +11 -6
  23. package/dist/agent-execution.d.ts.map +1 -1
  24. package/dist/agent-execution.js +6 -4
  25. package/dist/agent-execution.js.map +1 -1
  26. package/dist/background-jobs.d.ts +9 -0
  27. package/dist/background-jobs.d.ts.map +1 -1
  28. package/dist/background-jobs.js +70 -15
  29. package/dist/background-jobs.js.map +1 -1
  30. package/dist/behavior-config.d.ts +0 -1
  31. package/dist/behavior-config.d.ts.map +1 -1
  32. package/dist/behavior-config.js +0 -3
  33. package/dist/behavior-config.js.map +1 -1
  34. package/dist/cli.js +313 -45
  35. package/dist/cli.js.map +1 -1
  36. package/dist/config.d.ts +6 -0
  37. package/dist/config.d.ts.map +1 -1
  38. package/dist/config.js +6 -0
  39. package/dist/config.js.map +1 -1
  40. package/dist/container-protocol.d.ts +10 -6
  41. package/dist/container-protocol.d.ts.map +1 -1
  42. package/dist/container-runner.d.ts +28 -8
  43. package/dist/container-runner.d.ts.map +1 -1
  44. package/dist/container-runner.js +254 -54
  45. package/dist/container-runner.js.map +1 -1
  46. package/dist/dashboard.js +1 -1
  47. package/dist/dashboard.js.map +1 -1
  48. package/dist/db.d.ts +31 -3
  49. package/dist/db.d.ts.map +1 -1
  50. package/dist/db.js +277 -39
  51. package/dist/db.js.map +1 -1
  52. package/dist/id.d.ts +2 -0
  53. package/dist/id.d.ts.map +1 -0
  54. package/dist/id.js +4 -0
  55. package/dist/id.js.map +1 -0
  56. package/dist/index.js +1194 -381
  57. package/dist/index.js.map +1 -1
  58. package/dist/json-helpers.d.ts +1 -0
  59. package/dist/json-helpers.d.ts.map +1 -1
  60. package/dist/json-helpers.js +33 -1
  61. package/dist/json-helpers.js.map +1 -1
  62. package/dist/maintenance.d.ts +2 -0
  63. package/dist/maintenance.d.ts.map +1 -1
  64. package/dist/maintenance.js +196 -17
  65. package/dist/maintenance.js.map +1 -1
  66. package/dist/memory-embeddings.d.ts +1 -0
  67. package/dist/memory-embeddings.d.ts.map +1 -1
  68. package/dist/memory-embeddings.js +38 -4
  69. package/dist/memory-embeddings.js.map +1 -1
  70. package/dist/memory-recall.d.ts.map +1 -1
  71. package/dist/memory-recall.js +6 -1
  72. package/dist/memory-recall.js.map +1 -1
  73. package/dist/memory-store.d.ts +1 -0
  74. package/dist/memory-store.d.ts.map +1 -1
  75. package/dist/memory-store.js +72 -10
  76. package/dist/memory-store.js.map +1 -1
  77. package/dist/metrics.d.ts +1 -0
  78. package/dist/metrics.d.ts.map +1 -1
  79. package/dist/metrics.js +16 -2
  80. package/dist/metrics.js.map +1 -1
  81. package/dist/path-mapping.d.ts +4 -0
  82. package/dist/path-mapping.d.ts.map +1 -0
  83. package/dist/path-mapping.js +50 -0
  84. package/dist/path-mapping.js.map +1 -0
  85. package/dist/paths.d.ts +4 -2
  86. package/dist/paths.d.ts.map +1 -1
  87. package/dist/paths.js +4 -2
  88. package/dist/paths.js.map +1 -1
  89. package/dist/personalization.d.ts +1 -0
  90. package/dist/personalization.d.ts.map +1 -1
  91. package/dist/personalization.js +14 -0
  92. package/dist/personalization.js.map +1 -1
  93. package/dist/progress.d.ts +2 -2
  94. package/dist/progress.d.ts.map +1 -1
  95. package/dist/progress.js +18 -14
  96. package/dist/progress.js.map +1 -1
  97. package/dist/runtime-config.d.ts +18 -7
  98. package/dist/runtime-config.d.ts.map +1 -1
  99. package/dist/runtime-config.js +29 -18
  100. package/dist/runtime-config.js.map +1 -1
  101. package/dist/task-scheduler.d.ts +7 -1
  102. package/dist/task-scheduler.d.ts.map +1 -1
  103. package/dist/task-scheduler.js +182 -48
  104. package/dist/task-scheduler.js.map +1 -1
  105. package/dist/timezone.d.ts +4 -0
  106. package/dist/timezone.d.ts.map +1 -0
  107. package/dist/timezone.js +111 -0
  108. package/dist/timezone.js.map +1 -0
  109. package/dist/types.d.ts +31 -0
  110. package/dist/types.d.ts.map +1 -1
  111. 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
@@ -0,0 +1,4 @@
1
+ export function generateId(prefix: string): string {
2
+ if (!prefix) return `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
3
+ return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
4
+ }