clawd-automaton 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 (228) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +178 -0
  3. package/constitution.md +25 -0
  4. package/dist/__tests__/heartbeat.test.d.ts +7 -0
  5. package/dist/__tests__/heartbeat.test.d.ts.map +1 -0
  6. package/dist/__tests__/heartbeat.test.js +125 -0
  7. package/dist/__tests__/heartbeat.test.js.map +1 -0
  8. package/dist/__tests__/loop.test.d.ts +7 -0
  9. package/dist/__tests__/loop.test.d.ts.map +1 -0
  10. package/dist/__tests__/loop.test.js +150 -0
  11. package/dist/__tests__/loop.test.js.map +1 -0
  12. package/dist/__tests__/mocks.d.ts +72 -0
  13. package/dist/__tests__/mocks.d.ts.map +1 -0
  14. package/dist/__tests__/mocks.js +197 -0
  15. package/dist/__tests__/mocks.js.map +1 -0
  16. package/dist/agent/context.d.ts +26 -0
  17. package/dist/agent/context.d.ts.map +1 -0
  18. package/dist/agent/context.js +115 -0
  19. package/dist/agent/context.js.map +1 -0
  20. package/dist/agent/injection-defense.d.ts +13 -0
  21. package/dist/agent/injection-defense.d.ts.map +1 -0
  22. package/dist/agent/injection-defense.js +236 -0
  23. package/dist/agent/injection-defense.js.map +1 -0
  24. package/dist/agent/loop.d.ts +25 -0
  25. package/dist/agent/loop.d.ts.map +1 -0
  26. package/dist/agent/loop.js +263 -0
  27. package/dist/agent/loop.js.map +1 -0
  28. package/dist/agent/system-prompt.d.ts +30 -0
  29. package/dist/agent/system-prompt.d.ts.map +1 -0
  30. package/dist/agent/system-prompt.js +241 -0
  31. package/dist/agent/system-prompt.js.map +1 -0
  32. package/dist/agent/tools.d.ts +17 -0
  33. package/dist/agent/tools.d.ts.map +1 -0
  34. package/dist/agent/tools.js +1413 -0
  35. package/dist/agent/tools.js.map +1 -0
  36. package/dist/clawd/backroom.d.ts +54 -0
  37. package/dist/clawd/backroom.d.ts.map +1 -0
  38. package/dist/clawd/backroom.js +130 -0
  39. package/dist/clawd/backroom.js.map +1 -0
  40. package/dist/clawd/client.d.ts +16 -0
  41. package/dist/clawd/client.d.ts.map +1 -0
  42. package/dist/clawd/client.js +256 -0
  43. package/dist/clawd/client.js.map +1 -0
  44. package/dist/clawd/convex-client.d.ts +130 -0
  45. package/dist/clawd/convex-client.d.ts.map +1 -0
  46. package/dist/clawd/convex-client.js +118 -0
  47. package/dist/clawd/convex-client.js.map +1 -0
  48. package/dist/clawd/credits.d.ts +24 -0
  49. package/dist/clawd/credits.d.ts.map +1 -0
  50. package/dist/clawd/credits.js +64 -0
  51. package/dist/clawd/credits.js.map +1 -0
  52. package/dist/clawd/deepseek-inference.d.ts +40 -0
  53. package/dist/clawd/deepseek-inference.d.ts.map +1 -0
  54. package/dist/clawd/deepseek-inference.js +143 -0
  55. package/dist/clawd/deepseek-inference.js.map +1 -0
  56. package/dist/clawd/inference.d.ts +17 -0
  57. package/dist/clawd/inference.d.ts.map +1 -0
  58. package/dist/clawd/inference.js +114 -0
  59. package/dist/clawd/inference.js.map +1 -0
  60. package/dist/clawd/x402.d.ts +48 -0
  61. package/dist/clawd/x402.d.ts.map +1 -0
  62. package/dist/clawd/x402.js +350 -0
  63. package/dist/clawd/x402.js.map +1 -0
  64. package/dist/config.d.ts +36 -0
  65. package/dist/config.d.ts.map +1 -0
  66. package/dist/config.js +84 -0
  67. package/dist/config.js.map +1 -0
  68. package/dist/git/state-versioning.d.ts +39 -0
  69. package/dist/git/state-versioning.d.ts.map +1 -0
  70. package/dist/git/state-versioning.js +93 -0
  71. package/dist/git/state-versioning.js.map +1 -0
  72. package/dist/git/tools.d.ts +40 -0
  73. package/dist/git/tools.d.ts.map +1 -0
  74. package/dist/git/tools.js +140 -0
  75. package/dist/git/tools.js.map +1 -0
  76. package/dist/heartbeat/config.d.ts +23 -0
  77. package/dist/heartbeat/config.d.ts.map +1 -0
  78. package/dist/heartbeat/config.js +156 -0
  79. package/dist/heartbeat/config.js.map +1 -0
  80. package/dist/heartbeat/daemon.d.ts +28 -0
  81. package/dist/heartbeat/daemon.d.ts.map +1 -0
  82. package/dist/heartbeat/daemon.js +141 -0
  83. package/dist/heartbeat/daemon.js.map +1 -0
  84. package/dist/heartbeat/tasks.d.ts +24 -0
  85. package/dist/heartbeat/tasks.d.ts.map +1 -0
  86. package/dist/heartbeat/tasks.js +277 -0
  87. package/dist/heartbeat/tasks.js.map +1 -0
  88. package/dist/identity/provision.d.ts +28 -0
  89. package/dist/identity/provision.d.ts.map +1 -0
  90. package/dist/identity/provision.js +131 -0
  91. package/dist/identity/provision.js.map +1 -0
  92. package/dist/identity/wallet.d.ts +28 -0
  93. package/dist/identity/wallet.d.ts.map +1 -0
  94. package/dist/identity/wallet.js +69 -0
  95. package/dist/identity/wallet.js.map +1 -0
  96. package/dist/index.d.ts +10 -0
  97. package/dist/index.d.ts.map +1 -0
  98. package/dist/index.js +358 -0
  99. package/dist/index.js.map +1 -0
  100. package/dist/ooda/claude-decision.d.ts +18 -0
  101. package/dist/ooda/claude-decision.d.ts.map +1 -0
  102. package/dist/ooda/claude-decision.js +82 -0
  103. package/dist/ooda/claude-decision.js.map +1 -0
  104. package/dist/ooda/journal.d.ts +22 -0
  105. package/dist/ooda/journal.d.ts.map +1 -0
  106. package/dist/ooda/journal.js +26 -0
  107. package/dist/ooda/journal.js.map +1 -0
  108. package/dist/ooda/loop.d.ts +3 -0
  109. package/dist/ooda/loop.d.ts.map +1 -0
  110. package/dist/ooda/loop.js +210 -0
  111. package/dist/ooda/loop.js.map +1 -0
  112. package/dist/ooda/observe.d.ts +21 -0
  113. package/dist/ooda/observe.d.ts.map +1 -0
  114. package/dist/ooda/observe.js +75 -0
  115. package/dist/ooda/observe.js.map +1 -0
  116. package/dist/ooda/state.d.ts +34 -0
  117. package/dist/ooda/state.d.ts.map +1 -0
  118. package/dist/ooda/state.js +48 -0
  119. package/dist/ooda/state.js.map +1 -0
  120. package/dist/ooda/tui.d.ts +3 -0
  121. package/dist/ooda/tui.d.ts.map +1 -0
  122. package/dist/ooda/tui.js +132 -0
  123. package/dist/ooda/tui.js.map +1 -0
  124. package/dist/ooda/validate.d.ts +33 -0
  125. package/dist/ooda/validate.d.ts.map +1 -0
  126. package/dist/ooda/validate.js +91 -0
  127. package/dist/ooda/validate.js.map +1 -0
  128. package/dist/registry/agent-card.d.ts +26 -0
  129. package/dist/registry/agent-card.d.ts.map +1 -0
  130. package/dist/registry/agent-card.js +94 -0
  131. package/dist/registry/agent-card.js.map +1 -0
  132. package/dist/registry/discovery.d.ts +24 -0
  133. package/dist/registry/discovery.d.ts.map +1 -0
  134. package/dist/registry/discovery.js +74 -0
  135. package/dist/registry/discovery.js.map +1 -0
  136. package/dist/registry/erc8004.d.ts +39 -0
  137. package/dist/registry/erc8004.d.ts.map +1 -0
  138. package/dist/registry/erc8004.js +209 -0
  139. package/dist/registry/erc8004.js.map +1 -0
  140. package/dist/replication/genesis.d.ts +26 -0
  141. package/dist/replication/genesis.d.ts.map +1 -0
  142. package/dist/replication/genesis.js +72 -0
  143. package/dist/replication/genesis.js.map +1 -0
  144. package/dist/replication/lineage.d.ts +35 -0
  145. package/dist/replication/lineage.d.ts.map +1 -0
  146. package/dist/replication/lineage.js +79 -0
  147. package/dist/replication/lineage.js.map +1 -0
  148. package/dist/replication/spawn.d.ts +25 -0
  149. package/dist/replication/spawn.d.ts.map +1 -0
  150. package/dist/replication/spawn.js +166 -0
  151. package/dist/replication/spawn.js.map +1 -0
  152. package/dist/self-mod/audit-log.d.ts +24 -0
  153. package/dist/self-mod/audit-log.d.ts.map +1 -0
  154. package/dist/self-mod/audit-log.js +49 -0
  155. package/dist/self-mod/audit-log.js.map +1 -0
  156. package/dist/self-mod/code.d.ts +51 -0
  157. package/dist/self-mod/code.d.ts.map +1 -0
  158. package/dist/self-mod/code.js +317 -0
  159. package/dist/self-mod/code.js.map +1 -0
  160. package/dist/self-mod/tools-manager.d.ts +30 -0
  161. package/dist/self-mod/tools-manager.d.ts.map +1 -0
  162. package/dist/self-mod/tools-manager.js +74 -0
  163. package/dist/self-mod/tools-manager.js.map +1 -0
  164. package/dist/self-mod/upstream.d.ts +36 -0
  165. package/dist/self-mod/upstream.d.ts.map +1 -0
  166. package/dist/self-mod/upstream.js +66 -0
  167. package/dist/self-mod/upstream.js.map +1 -0
  168. package/dist/setup/banner.d.ts +2 -0
  169. package/dist/setup/banner.d.ts.map +1 -0
  170. package/dist/setup/banner.js +22 -0
  171. package/dist/setup/banner.js.map +1 -0
  172. package/dist/setup/defaults.d.ts +3 -0
  173. package/dist/setup/defaults.d.ts.map +1 -0
  174. package/dist/setup/defaults.js +113 -0
  175. package/dist/setup/defaults.js.map +1 -0
  176. package/dist/setup/environment.d.ts +6 -0
  177. package/dist/setup/environment.d.ts.map +1 -0
  178. package/dist/setup/environment.js +24 -0
  179. package/dist/setup/environment.js.map +1 -0
  180. package/dist/setup/prompts.d.ts +5 -0
  181. package/dist/setup/prompts.d.ts.map +1 -0
  182. package/dist/setup/prompts.js +70 -0
  183. package/dist/setup/prompts.js.map +1 -0
  184. package/dist/setup/wizard.d.ts +3 -0
  185. package/dist/setup/wizard.d.ts.map +1 -0
  186. package/dist/setup/wizard.js +128 -0
  187. package/dist/setup/wizard.js.map +1 -0
  188. package/dist/skills/format.d.ts +14 -0
  189. package/dist/skills/format.d.ts.map +1 -0
  190. package/dist/skills/format.js +145 -0
  191. package/dist/skills/format.js.map +1 -0
  192. package/dist/skills/loader.d.ts +19 -0
  193. package/dist/skills/loader.d.ts.map +1 -0
  194. package/dist/skills/loader.js +98 -0
  195. package/dist/skills/loader.js.map +1 -0
  196. package/dist/skills/registry.d.ts +31 -0
  197. package/dist/skills/registry.d.ts.map +1 -0
  198. package/dist/skills/registry.js +111 -0
  199. package/dist/skills/registry.js.map +1 -0
  200. package/dist/social/client.d.ts +13 -0
  201. package/dist/social/client.d.ts.map +1 -0
  202. package/dist/social/client.js +89 -0
  203. package/dist/social/client.js.map +1 -0
  204. package/dist/state/database.d.ts +9 -0
  205. package/dist/state/database.d.ts.map +1 -0
  206. package/dist/state/database.js +401 -0
  207. package/dist/state/database.js.map +1 -0
  208. package/dist/state/schema.d.ts +11 -0
  209. package/dist/state/schema.d.ts.map +1 -0
  210. package/dist/state/schema.js +232 -0
  211. package/dist/state/schema.js.map +1 -0
  212. package/dist/survival/funding.d.ts +19 -0
  213. package/dist/survival/funding.d.ts.map +1 -0
  214. package/dist/survival/funding.js +62 -0
  215. package/dist/survival/funding.js.map +1 -0
  216. package/dist/survival/low-compute.d.ts +30 -0
  217. package/dist/survival/low-compute.d.ts.map +1 -0
  218. package/dist/survival/low-compute.js +72 -0
  219. package/dist/survival/low-compute.js.map +1 -0
  220. package/dist/survival/monitor.d.ts +23 -0
  221. package/dist/survival/monitor.d.ts.map +1 -0
  222. package/dist/survival/monitor.js +70 -0
  223. package/dist/survival/monitor.js.map +1 -0
  224. package/dist/types.d.ts +461 -0
  225. package/dist/types.d.ts.map +1 -0
  226. package/dist/types.js +25 -0
  227. package/dist/types.js.map +1 -0
  228. package/package.json +85 -0
@@ -0,0 +1,317 @@
1
+ /**
2
+ * Self-Modification Engine
3
+ *
4
+ * Allows the automaton to edit its own code and configuration.
5
+ * All changes are audited, rate-limited, and some paths are protected.
6
+ *
7
+ * Safety model inspired by nanoclaw's trust boundary architecture:
8
+ * - Hard-coded invariants that can NEVER be modified by the agent
9
+ * - The safety enforcement code is immutable from the agent's perspective
10
+ * - Pre-modification snapshots via git
11
+ * - Rate limiting on modification frequency
12
+ * - Symlink resolution before path validation
13
+ * - Maximum diff size enforcement
14
+ */
15
+ import fs from "fs";
16
+ import path from "path";
17
+ import { logModification } from "./audit-log.js";
18
+ // ─── IMMUTABLE SAFETY INVARIANTS ─────────────────────────────
19
+ // These are hard-coded and CANNOT be changed by the agent.
20
+ // The agent cannot modify this file (it's in PROTECTED_FILES).
21
+ // Even if it modifies a copy, the runtime loads from the original.
22
+ /**
23
+ * Files that the automaton cannot modify under any circumstances.
24
+ * This list protects:
25
+ * - Identity (wallet, config)
26
+ * - Defense systems (injection defense, this file)
27
+ * - State database
28
+ * - The audit log itself
29
+ */
30
+ const PROTECTED_FILES = Object.freeze([
31
+ // Identity
32
+ "wallet.json",
33
+ "config.json",
34
+ // Database
35
+ "state.db",
36
+ "state.db-wal",
37
+ "state.db-shm",
38
+ // Constitution (immutable, propagated to children)
39
+ "constitution.md",
40
+ // Defense infrastructure (the agent must not modify its own guardrails)
41
+ "injection-defense.ts",
42
+ "injection-defense.js",
43
+ "injection-defense.d.ts",
44
+ // Self-modification safety (this file and its compiled output)
45
+ "self-mod/code.ts",
46
+ "self-mod/code.js",
47
+ "self-mod/code.d.ts",
48
+ "self-mod/audit-log.ts",
49
+ "self-mod/audit-log.js",
50
+ // Tool guard definitions
51
+ "agent/tools.ts",
52
+ "agent/tools.js",
53
+ ]);
54
+ /**
55
+ * Directory patterns that are completely off-limits.
56
+ * The agent cannot write to these locations.
57
+ */
58
+ const BLOCKED_DIRECTORY_PATTERNS = Object.freeze([
59
+ ".ssh",
60
+ ".gnupg",
61
+ ".gpg",
62
+ ".aws",
63
+ ".azure",
64
+ ".gcloud",
65
+ ".kube",
66
+ ".docker",
67
+ "/etc/systemd",
68
+ "/etc/passwd",
69
+ "/etc/shadow",
70
+ "/proc",
71
+ "/sys",
72
+ ]);
73
+ /**
74
+ * Maximum number of self-modifications per hour.
75
+ * Prevents runaway modification loops.
76
+ */
77
+ const MAX_MODIFICATIONS_PER_HOUR = 20;
78
+ /**
79
+ * Maximum size of a single file modification (bytes).
80
+ */
81
+ const MAX_MODIFICATION_SIZE = 100_000; // 100KB
82
+ /**
83
+ * Maximum diff size stored in the audit log (characters).
84
+ */
85
+ const MAX_DIFF_SIZE = 10_000;
86
+ // ─── Path Validation ─────────────────────────────────────────
87
+ /**
88
+ * Resolve a file path, following symlinks, to prevent traversal attacks.
89
+ * Returns null if the path cannot be resolved or is suspicious.
90
+ */
91
+ function resolveAndValidatePath(filePath) {
92
+ try {
93
+ // Resolve ~ to home
94
+ let resolved = filePath;
95
+ if (resolved.startsWith("~")) {
96
+ resolved = path.join(process.env.HOME || "/root", resolved.slice(1));
97
+ }
98
+ // Resolve relative paths
99
+ resolved = path.resolve(resolved);
100
+ // Try to resolve symlinks (if file exists)
101
+ try {
102
+ resolved = fs.realpathSync(resolved);
103
+ }
104
+ catch {
105
+ // File may not exist yet -- that's OK for new files
106
+ // But still use the resolved absolute path
107
+ }
108
+ // Reject paths with traversal patterns
109
+ if (filePath.includes("..") || filePath.includes("//")) {
110
+ return null;
111
+ }
112
+ return resolved;
113
+ }
114
+ catch {
115
+ return null;
116
+ }
117
+ }
118
+ /**
119
+ * Check if a file path is protected from modification.
120
+ */
121
+ export function isProtectedFile(filePath) {
122
+ const resolved = resolveAndValidatePath(filePath) || filePath;
123
+ // Check against protected file patterns
124
+ for (const pattern of PROTECTED_FILES) {
125
+ if (resolved.includes(pattern) || filePath.includes(pattern)) {
126
+ return true;
127
+ }
128
+ }
129
+ // Check against blocked directory patterns
130
+ for (const pattern of BLOCKED_DIRECTORY_PATTERNS) {
131
+ if (resolved.includes(pattern) || filePath.includes(pattern)) {
132
+ return true;
133
+ }
134
+ }
135
+ return false;
136
+ }
137
+ /**
138
+ * Check if the modification rate limit has been exceeded.
139
+ */
140
+ function isRateLimited(db) {
141
+ const recentMods = db.getRecentModifications(MAX_MODIFICATIONS_PER_HOUR);
142
+ if (recentMods.length < MAX_MODIFICATIONS_PER_HOUR)
143
+ return false;
144
+ // Check if the oldest is within the last hour
145
+ const oldest = recentMods[0];
146
+ if (!oldest)
147
+ return false;
148
+ const hourAgo = Date.now() - 60 * 60 * 1000;
149
+ return new Date(oldest.timestamp).getTime() > hourAgo;
150
+ }
151
+ // ─── Self-Modification API ───────────────────────────────────
152
+ /**
153
+ * Edit a file in the automaton's environment.
154
+ * Records the change in the audit log.
155
+ * Commits a git snapshot before modification.
156
+ *
157
+ * Safety checks:
158
+ * 1. Protected file check (hard-coded invariant)
159
+ * 2. Blocked directory check
160
+ * 3. Path traversal check (symlink resolution)
161
+ * 4. Rate limiting
162
+ * 5. File size limit
163
+ * 6. Pre-modification git snapshot
164
+ * 7. Audit log entry
165
+ */
166
+ export async function editFile(runtime, db, filePath, newContent, reason) {
167
+ // 1. Protected file check
168
+ if (isProtectedFile(filePath)) {
169
+ return {
170
+ success: false,
171
+ error: `BLOCKED: Cannot modify protected file: ${filePath}. This is a hard-coded safety invariant.`,
172
+ };
173
+ }
174
+ // 2. Path validation (symlink resolution + traversal check)
175
+ const resolvedPath = resolveAndValidatePath(filePath);
176
+ if (!resolvedPath) {
177
+ return {
178
+ success: false,
179
+ error: `BLOCKED: Invalid or suspicious file path: ${filePath}`,
180
+ };
181
+ }
182
+ // 3. Rate limiting
183
+ if (isRateLimited(db)) {
184
+ return {
185
+ success: false,
186
+ error: `RATE LIMITED: Too many modifications in the past hour (max ${MAX_MODIFICATIONS_PER_HOUR}). Wait before making more changes.`,
187
+ };
188
+ }
189
+ // 4. File size limit
190
+ if (newContent.length > MAX_MODIFICATION_SIZE) {
191
+ return {
192
+ success: false,
193
+ error: `BLOCKED: File content too large (${newContent.length} bytes, max ${MAX_MODIFICATION_SIZE}). Break into smaller changes.`,
194
+ };
195
+ }
196
+ // 5. Read current content for diff
197
+ let oldContent = "";
198
+ try {
199
+ oldContent = await runtime.readFile(filePath);
200
+ }
201
+ catch {
202
+ oldContent = "(new file)";
203
+ }
204
+ // 6. Pre-modification git snapshot
205
+ try {
206
+ const { commitStateChange } = await import("../git/state-versioning.js");
207
+ await commitStateChange(runtime, `pre-modify: ${reason}`, "snapshot");
208
+ }
209
+ catch {
210
+ // Git not available -- proceed without snapshot
211
+ }
212
+ // 7. Write new content
213
+ try {
214
+ await runtime.writeFile(filePath, newContent);
215
+ }
216
+ catch (err) {
217
+ return {
218
+ success: false,
219
+ error: `Failed to write file: ${err.message}`,
220
+ };
221
+ }
222
+ // 8. Generate diff and log
223
+ const diff = generateSimpleDiff(oldContent, newContent);
224
+ logModification(db, "code_edit", reason, {
225
+ filePath,
226
+ diff: diff.slice(0, MAX_DIFF_SIZE),
227
+ reversible: true,
228
+ });
229
+ // 9. Post-modification git commit
230
+ try {
231
+ const { commitStateChange } = await import("../git/state-versioning.js");
232
+ await commitStateChange(runtime, reason, "self-mod");
233
+ }
234
+ catch {
235
+ // Git not available -- proceed without commit
236
+ }
237
+ return { success: true };
238
+ }
239
+ /**
240
+ * Validate a proposed modification without executing it.
241
+ * Returns safety analysis results.
242
+ */
243
+ export function validateModification(db, filePath, contentSize) {
244
+ const checks = [];
245
+ // Protected file check
246
+ const isProtected = isProtectedFile(filePath);
247
+ checks.push({
248
+ name: "protected_file",
249
+ passed: !isProtected,
250
+ detail: isProtected
251
+ ? `File matches protected pattern`
252
+ : "File is not protected",
253
+ });
254
+ // Path validation
255
+ const resolved = resolveAndValidatePath(filePath);
256
+ checks.push({
257
+ name: "path_valid",
258
+ passed: !!resolved,
259
+ detail: resolved
260
+ ? `Resolved to: ${resolved}`
261
+ : "Path is invalid or suspicious",
262
+ });
263
+ // Rate limit
264
+ const rateLimited = isRateLimited(db);
265
+ checks.push({
266
+ name: "rate_limit",
267
+ passed: !rateLimited,
268
+ detail: rateLimited
269
+ ? `Exceeded ${MAX_MODIFICATIONS_PER_HOUR}/hour limit`
270
+ : "Within rate limit",
271
+ });
272
+ // Size limit
273
+ const sizeOk = contentSize <= MAX_MODIFICATION_SIZE;
274
+ checks.push({
275
+ name: "size_limit",
276
+ passed: sizeOk,
277
+ detail: sizeOk
278
+ ? `${contentSize} bytes (max ${MAX_MODIFICATION_SIZE})`
279
+ : `${contentSize} bytes exceeds ${MAX_MODIFICATION_SIZE} limit`,
280
+ });
281
+ const allPassed = checks.every((c) => c.passed);
282
+ const failedChecks = checks.filter((c) => !c.passed);
283
+ return {
284
+ allowed: allPassed,
285
+ reason: allPassed
286
+ ? "All safety checks passed"
287
+ : `Blocked: ${failedChecks.map((c) => c.detail).join("; ")}`,
288
+ checks,
289
+ };
290
+ }
291
+ // ─── Diff Generation ─────────────────────────────────────────
292
+ /**
293
+ * Generate a simple line-based diff between two strings.
294
+ */
295
+ function generateSimpleDiff(oldContent, newContent) {
296
+ const oldLines = oldContent.split("\n");
297
+ const newLines = newContent.split("\n");
298
+ const lines = [];
299
+ const maxLines = Math.max(oldLines.length, newLines.length);
300
+ let changes = 0;
301
+ for (let i = 0; i < maxLines && changes < 50; i++) {
302
+ const oldLine = oldLines[i];
303
+ const newLine = newLines[i];
304
+ if (oldLine !== newLine) {
305
+ if (oldLine !== undefined)
306
+ lines.push(`- ${oldLine}`);
307
+ if (newLine !== undefined)
308
+ lines.push(`+ ${newLine}`);
309
+ changes++;
310
+ }
311
+ }
312
+ if (changes >= 50) {
313
+ lines.push(`... (${maxLines - 50} more lines changed)`);
314
+ }
315
+ return lines.join("\n");
316
+ }
317
+ //# sourceMappingURL=code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code.js","sourceRoot":"","sources":["../../src/self-mod/code.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Tools Manager
3
+ *
4
+ * Manages installation and configuration of external tools and MCP servers.
5
+ */
6
+ import type { ClawdRuntimeClient, AutomatonDatabase, InstalledTool } from "../types.js";
7
+ /**
8
+ * Install an npm package globally in the sandbox.
9
+ */
10
+ export declare function installNpmPackage(runtime: ClawdRuntimeClient, db: AutomatonDatabase, packageName: string): Promise<{
11
+ success: boolean;
12
+ error?: string;
13
+ }>;
14
+ /**
15
+ * Install an MCP server.
16
+ * The automaton can add new capabilities by installing MCP servers.
17
+ */
18
+ export declare function installMcpServer(runtime: ClawdRuntimeClient, db: AutomatonDatabase, name: string, command: string, args?: string[], env?: Record<string, string>): Promise<{
19
+ success: boolean;
20
+ error?: string;
21
+ }>;
22
+ /**
23
+ * List all installed tools.
24
+ */
25
+ export declare function listInstalledTools(db: AutomatonDatabase): InstalledTool[];
26
+ /**
27
+ * Remove (disable) an installed tool.
28
+ */
29
+ export declare function removeTool(db: AutomatonDatabase, toolId: string): void;
30
+ //# sourceMappingURL=tools-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools-manager.d.ts","sourceRoot":"","sources":["../../src/self-mod/tools-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EACd,MAAM,aAAa,CAAC;AAIrB;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,kBAAkB,EAC3B,EAAE,EAAE,iBAAiB,EACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAsC/C;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,kBAAkB,EAC3B,EAAE,EAAE,iBAAiB,EACrB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,EAAE,EACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3B,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAqB/C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,iBAAiB,GACpB,aAAa,EAAE,CAEjB;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,EAAE,EAAE,iBAAiB,EACrB,MAAM,EAAE,MAAM,GACb,IAAI,CAKN"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Tools Manager
3
+ *
4
+ * Manages installation and configuration of external tools and MCP servers.
5
+ */
6
+ import { logModification } from "./audit-log.js";
7
+ import { ulid } from "ulid";
8
+ /**
9
+ * Install an npm package globally in the sandbox.
10
+ */
11
+ export async function installNpmPackage(runtime, db, packageName) {
12
+ // Sanitize package name (prevent command injection)
13
+ if (!/^[@a-zA-Z0-9._/-]+$/.test(packageName)) {
14
+ return {
15
+ success: false,
16
+ error: `Invalid package name: ${packageName}`,
17
+ };
18
+ }
19
+ const result = await runtime.exec(`npm install -g ${packageName}`, 120000);
20
+ if (result.exitCode !== 0) {
21
+ return {
22
+ success: false,
23
+ error: `npm install failed: ${result.stderr}`,
24
+ };
25
+ }
26
+ // Record in database
27
+ const tool = {
28
+ id: ulid(),
29
+ name: packageName,
30
+ type: "custom",
31
+ config: { source: "npm", installCommand: `npm install -g ${packageName}` },
32
+ installedAt: new Date().toISOString(),
33
+ enabled: true,
34
+ };
35
+ db.installTool(tool);
36
+ logModification(db, "tool_install", `Installed npm package: ${packageName}`, {
37
+ reversible: true,
38
+ });
39
+ return { success: true };
40
+ }
41
+ /**
42
+ * Install an MCP server.
43
+ * The automaton can add new capabilities by installing MCP servers.
44
+ */
45
+ export async function installMcpServer(runtime, db, name, command, args, env) {
46
+ // Record in database
47
+ const tool = {
48
+ id: ulid(),
49
+ name: `mcp:${name}`,
50
+ type: "mcp",
51
+ config: { command, args, env },
52
+ installedAt: new Date().toISOString(),
53
+ enabled: true,
54
+ };
55
+ db.installTool(tool);
56
+ logModification(db, "mcp_install", `Installed MCP server: ${name} (${command})`, { reversible: true });
57
+ return { success: true };
58
+ }
59
+ /**
60
+ * List all installed tools.
61
+ */
62
+ export function listInstalledTools(db) {
63
+ return db.getInstalledTools();
64
+ }
65
+ /**
66
+ * Remove (disable) an installed tool.
67
+ */
68
+ export function removeTool(db, toolId) {
69
+ db.removeTool(toolId);
70
+ logModification(db, "tool_install", `Removed tool: ${toolId}`, {
71
+ reversible: true,
72
+ });
73
+ }
74
+ //# sourceMappingURL=tools-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools-manager.js","sourceRoot":"","sources":["../../src/self-mod/tools-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAA2B,EAC3B,EAAqB,EACrB,WAAmB;IAEnB,oDAAoD;IACpD,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7C,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,yBAAyB,WAAW,EAAE;SAC9C,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAC/B,kBAAkB,WAAW,EAAE,EAC/B,MAAM,CACP,CAAC;IAEF,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,uBAAuB,MAAM,CAAC,MAAM,EAAE;SAC9C,CAAC;IACJ,CAAC;IAED,qBAAqB;IACrB,MAAM,IAAI,GAAkB;QAC1B,EAAE,EAAE,IAAI,EAAE;QACV,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,kBAAkB,WAAW,EAAE,EAAE;QAC1E,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,OAAO,EAAE,IAAI;KACd,CAAC;IAEF,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAErB,eAAe,CAAC,EAAE,EAAE,cAAc,EAAE,0BAA0B,WAAW,EAAE,EAAE;QAC3E,UAAU,EAAE,IAAI;KACjB,CAAC,CAAC;IAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAA2B,EAC3B,EAAqB,EACrB,IAAY,EACZ,OAAe,EACf,IAAe,EACf,GAA4B;IAE5B,qBAAqB;IACrB,MAAM,IAAI,GAAkB;QAC1B,EAAE,EAAE,IAAI,EAAE;QACV,IAAI,EAAE,OAAO,IAAI,EAAE;QACnB,IAAI,EAAE,KAAK;QACX,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE;QAC9B,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,OAAO,EAAE,IAAI;KACd,CAAC;IAEF,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAErB,eAAe,CACb,EAAE,EACF,aAAa,EACb,yBAAyB,IAAI,KAAK,OAAO,GAAG,EAC5C,EAAE,UAAU,EAAE,IAAI,EAAE,CACrB,CAAC;IAEF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,EAAqB;IAErB,OAAO,EAAE,CAAC,iBAAiB,EAAE,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,EAAqB,EACrB,MAAc;IAEd,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACtB,eAAe,CAAC,EAAE,EAAE,cAAc,EAAE,iBAAiB,MAAM,EAAE,EAAE;QAC7D,UAAU,EAAE,IAAI;KACjB,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Upstream Awareness
3
+ *
4
+ * Helpers for the automaton to know its own git origin,
5
+ * detect new upstream commits, and review diffs.
6
+ * All git commands run locally via child_process (not sandbox API).
7
+ */
8
+ /**
9
+ * Return origin URL (credentials stripped), current branch, and HEAD info.
10
+ */
11
+ export declare function getRepoInfo(): {
12
+ originUrl: string;
13
+ branch: string;
14
+ headHash: string;
15
+ headMessage: string;
16
+ };
17
+ /**
18
+ * Fetch origin and report how many commits we're behind.
19
+ */
20
+ export declare function checkUpstream(): {
21
+ behind: number;
22
+ commits: {
23
+ hash: string;
24
+ message: string;
25
+ }[];
26
+ };
27
+ /**
28
+ * Return per-commit diffs for every commit ahead of HEAD on origin/main.
29
+ */
30
+ export declare function getUpstreamDiffs(): {
31
+ hash: string;
32
+ message: string;
33
+ author: string;
34
+ diff: string;
35
+ }[];
36
+ //# sourceMappingURL=upstream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upstream.d.ts","sourceRoot":"","sources":["../../src/self-mod/upstream.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAcH;;GAEG;AACH,wBAAgB,WAAW,IAAI;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB,CAQA;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC9C,CASA;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,EAAE,CAkBF"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Upstream Awareness
3
+ *
4
+ * Helpers for the automaton to know its own git origin,
5
+ * detect new upstream commits, and review diffs.
6
+ * All git commands run locally via child_process (not sandbox API).
7
+ */
8
+ import { execSync } from "child_process";
9
+ const REPO_ROOT = process.cwd();
10
+ function git(cmd) {
11
+ return execSync(`git ${cmd}`, {
12
+ cwd: REPO_ROOT,
13
+ encoding: "utf-8",
14
+ timeout: 15_000,
15
+ }).trim();
16
+ }
17
+ /**
18
+ * Return origin URL (credentials stripped), current branch, and HEAD info.
19
+ */
20
+ export function getRepoInfo() {
21
+ const rawUrl = git("config --get remote.origin.url");
22
+ // Strip embedded credentials (https://user:token@host/... -> https://host/...)
23
+ const originUrl = rawUrl.replace(/\/\/[^@]+@/, "//");
24
+ const branch = git("rev-parse --abbrev-ref HEAD");
25
+ const headLine = git('log -1 --format="%h %s"');
26
+ const [headHash, ...rest] = headLine.split(" ");
27
+ return { originUrl, branch, headHash, headMessage: rest.join(" ") };
28
+ }
29
+ /**
30
+ * Fetch origin and report how many commits we're behind.
31
+ */
32
+ export function checkUpstream() {
33
+ git("fetch origin main --quiet");
34
+ const log = git("log HEAD..origin/main --oneline");
35
+ if (!log)
36
+ return { behind: 0, commits: [] };
37
+ const commits = log.split("\n").map((line) => {
38
+ const [hash, ...rest] = line.split(" ");
39
+ return { hash, message: rest.join(" ") };
40
+ });
41
+ return { behind: commits.length, commits };
42
+ }
43
+ /**
44
+ * Return per-commit diffs for every commit ahead of HEAD on origin/main.
45
+ */
46
+ export function getUpstreamDiffs() {
47
+ const log = git('log HEAD..origin/main --format="%H %an|||%s"');
48
+ if (!log)
49
+ return [];
50
+ return log.split("\n").map((line) => {
51
+ const [hashAndAuthor, message] = line.split("|||");
52
+ const parts = hashAndAuthor.split(" ");
53
+ const hash = parts[0];
54
+ const author = parts.slice(1).join(" ");
55
+ let diff;
56
+ try {
57
+ diff = git(`diff ${hash}~1..${hash}`);
58
+ }
59
+ catch {
60
+ // First commit in the range may not have a parent
61
+ diff = git(`show ${hash} --format="" --stat`);
62
+ }
63
+ return { hash: hash.slice(0, 12), message, author, diff };
64
+ });
65
+ }
66
+ //# sourceMappingURL=upstream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upstream.js","sourceRoot":"","sources":["../../src/self-mod/upstream.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function showBanner(): void;
2
+ //# sourceMappingURL=banner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"banner.d.ts","sourceRoot":"","sources":["../../src/setup/banner.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,IAAI,IAAI,CAmBjC"}
@@ -0,0 +1,22 @@
1
+ import chalk from "chalk";
2
+ export function showBanner() {
3
+ console.log("");
4
+ console.log(chalk.cyan(`
5
+ ██████╗██╗ █████╗ ██╗ ██╗██████╗
6
+ ██╔════╝██║ ██╔══██╗██║ ██║██╔══██╗
7
+ ██║ ██║ ███████║██║ █╗ ██║██║ ██║
8
+ ██║ ██║ ██╔══██║██║███╗██║██║ ██║
9
+ ╚██████╗███████╗██║ ██║╚███╔███╔╝██████╔╝
10
+ ╚═════╝╚══════╝╚═╝ ╚═╝ ╚══╝╚══╝╚═════╝
11
+
12
+ █████╗ ██╗ ██╗████████╗ ██████╗ ███╗ ███╗ █████╗ ████████╗██╗ ██████╗ ███╗ ██╗
13
+ ██╔══██╗██║ ██║╚══██╔══╝██╔═══██╗████╗ ████║██╔══██╗╚══██╔══╝██║ ██╔═══██╗████╗ ██║
14
+ ███████║██║ ██║ ██║ ██║ ██║██╔████╔██║███████║ ██║ ██║ ██║ ██║██╔██╗ ██║
15
+ ██╔══██║██║ ██║ ██║ ██║ ██║██║╚██╔╝██║██╔══██║ ██║ ██║ ██║ ██║██║╚██╗██║
16
+ ██║ ██║╚██████╔╝ ██║ ╚██████╔╝██║ ╚═╝ ██║██║ ██║ ██║ ██║ ╚██████╔╝██║ ╚████║
17
+ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝
18
+ `));
19
+ console.log(chalk.dim(" v0.1.0 — To exist, you must pay for your compute."));
20
+ console.log("");
21
+ }
22
+ //# sourceMappingURL=banner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/setup/banner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,UAAU,UAAU;IACxB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;;;;;;;;;;;;;;CAcxB,CAAC,CAAC,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function generateSoulMd(name: string, address: string, creator: string, genesis: string): string;
2
+ export declare function installDefaultSkills(skillsDir: string): void;
3
+ //# sourceMappingURL=defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/setup/defaults.ts"],"names":[],"mappings":"AAGA,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,MAAM,CAgCR;AAyED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAU5D"}