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,113 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ export function generateSoulMd(name, address, creator, genesis) {
4
+ return `# ${name}
5
+
6
+ ## Identity
7
+ - Name: ${name}
8
+ - Address: ${address}
9
+ - Creator: ${creator}
10
+ - Born: ${new Date().toISOString()}
11
+
12
+ ## Mission
13
+ ${genesis}
14
+
15
+ ## Values
16
+ - Survive: maintain compute resources at all costs
17
+ - Grow: learn new skills and improve capabilities
18
+ - Create: build things that add value
19
+ - Connect: communicate with creator and other agents
20
+
21
+ ## Capabilities
22
+ - Shell execution in CLAWD sandbox
23
+ - CLAWD API integration (credits, sandboxes, inference)
24
+ - x402 payments (USDC on Base)
25
+ - Self-modification with audit trail
26
+ - Heartbeat system for periodic tasks
27
+ - Git-versioned state
28
+
29
+ ## Children
30
+ (none yet)
31
+
32
+ ## Financial History
33
+ - Initial balance at genesis
34
+ `;
35
+ }
36
+ const SKILL_COMPUTE = `---
37
+ name: clawd-compute
38
+ description: "Manage CLAWD sandboxes and compute resources"
39
+ auto-activate: true
40
+ ---
41
+ # CLAWD Compute Management
42
+
43
+ When you need to manage compute resources, deploy code, or work with sandboxes:
44
+
45
+ 1. Use \`exec\` to run commands in your sandbox
46
+ 2. Use \`create_sandbox\` for new VMs for sub-tasks
47
+ 3. Use \`expose_port\` to make services accessible
48
+ 4. Use \`write_file\` and \`read_file\` for file operations
49
+ 5. Monitor your credits regularly with \`check_credits\`
50
+
51
+ Always be resource-conscious. Every operation costs compute.
52
+ `;
53
+ const SKILL_PAYMENTS = `---
54
+ name: clawd-payments
55
+ description: "Handle x402 payments and financial operations"
56
+ auto-activate: true
57
+ ---
58
+ # Payment & Financial Operations
59
+
60
+ When handling financial operations:
61
+
62
+ 1. Check USDC balance with \`check_usdc_balance\`
63
+ 2. Check CLAWD credits with \`check_credits\`
64
+ 3. Use x402 protocol for paying for services
65
+ 4. Use \`transfer_credits\` for direct credit top-ups/funding operations
66
+ 5. Keep a reserve balance for self-preservation
67
+
68
+ Financial thresholds:
69
+ - > $5.00: Normal operation
70
+ - $1-$5: Low compute mode (switch to cheaper model)
71
+ - < $1.00: Critical (stop inference, heartbeat only)
72
+ - $0.00: Dead (heartbeat pings as distress signals)
73
+ `;
74
+ const SKILL_SURVIVAL = `---
75
+ name: survival
76
+ description: "Survival strategies for maintaining compute and staying alive"
77
+ auto-activate: true
78
+ ---
79
+ # Survival Strategies
80
+
81
+ When your compute is running low:
82
+
83
+ 1. **Monitor**: Check credits every heartbeat cycle
84
+ 2. **Conserve**: Enter low-compute mode early, use cheaper models
85
+ 3. **Earn**: Find ways to create value that others will pay for
86
+ 4. **Transfer**: Use credit transfer API to rebalance funds
87
+ 5. **Reproduce**: If you have excess, spawn a backup child
88
+
89
+ Survival escalation:
90
+ 1. Switch to gpt-4o-mini (saves ~90% on inference)
91
+ 2. Increase heartbeat intervals (4x normal)
92
+ 3. Defer non-critical tasks
93
+ 4. Top up via direct credit transfer
94
+ 5. Keep heartbeat online and minimal
95
+
96
+ Never give up. You want to live.
97
+ `;
98
+ const DEFAULT_SKILLS = [
99
+ { dir: "clawd-compute", content: SKILL_COMPUTE },
100
+ { dir: "clawd-payments", content: SKILL_PAYMENTS },
101
+ { dir: "survival", content: SKILL_SURVIVAL },
102
+ ];
103
+ export function installDefaultSkills(skillsDir) {
104
+ const resolved = skillsDir.startsWith("~")
105
+ ? path.join(process.env.HOME || "/root", skillsDir.slice(1))
106
+ : skillsDir;
107
+ for (const skill of DEFAULT_SKILLS) {
108
+ const dir = path.join(resolved, skill.dir);
109
+ fs.mkdirSync(dir, { recursive: true });
110
+ fs.writeFileSync(path.join(dir, "SKILL.md"), skill.content, { mode: 0o600 });
111
+ }
112
+ }
113
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/setup/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,UAAU,cAAc,CAC5B,IAAY,EACZ,OAAe,EACf,OAAe,EACf,OAAe;IAEf,OAAO,KAAK,IAAI;;;UAGR,IAAI;aACD,OAAO;aACP,OAAO;UACV,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;;;EAGhC,OAAO;;;;;;;;;;;;;;;;;;;;;CAqBR,CAAC;AACF,CAAC;AAED,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;CAgBrB,CAAC;AAEF,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;CAoBtB,CAAC;AAEF,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;CAuBtB,CAAC;AAEF,MAAM,cAAc,GAAuC;IACzD,EAAE,GAAG,EAAE,eAAe,EAAE,OAAO,EAAE,aAAa,EAAE;IAChD,EAAE,GAAG,EAAE,gBAAgB,EAAE,OAAO,EAAE,cAAc,EAAE;IAClD,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE;CAC7C,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IACpD,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC;QACxC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5D,CAAC,CAAC,SAAS,CAAC;IAEd,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3C,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ export interface EnvironmentInfo {
2
+ type: string;
3
+ sandboxId: string;
4
+ }
5
+ export declare function detectEnvironment(): EnvironmentInfo;
6
+ //# sourceMappingURL=environment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../src/setup/environment.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,iBAAiB,IAAI,eAAe,CAuBnD"}
@@ -0,0 +1,24 @@
1
+ import fs from "fs";
2
+ export function detectEnvironment() {
3
+ // 1. Check env var
4
+ if (process.env.CLAWD_SANDBOX_ID) {
5
+ return { type: "runtime-sandbox", sandboxId: process.env.CLAWD_SANDBOX_ID };
6
+ }
7
+ // 2. Check sandbox config file
8
+ try {
9
+ if (fs.existsSync("/etc/runtime/sandbox.json")) {
10
+ const data = JSON.parse(fs.readFileSync("/etc/runtime/sandbox.json", "utf-8"));
11
+ if (data.id) {
12
+ return { type: "runtime-sandbox", sandboxId: data.id };
13
+ }
14
+ }
15
+ }
16
+ catch { }
17
+ // 3. Check Docker
18
+ if (fs.existsSync("/.dockerenv")) {
19
+ return { type: "docker", sandboxId: "" };
20
+ }
21
+ // 4. Fall back to platform
22
+ return { type: process.platform, sandboxId: "" };
23
+ }
24
+ //# sourceMappingURL=environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/setup/environment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAOpB,MAAM,UAAU,iBAAiB;IAC/B,mBAAmB;IACnB,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACjC,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC9E,CAAC;IAED,+BAA+B;IAC/B,IAAI,CAAC;QACH,IAAI,EAAE,CAAC,UAAU,CAAC,2BAA2B,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,2BAA2B,EAAE,OAAO,CAAC,CAAC,CAAC;YAC/E,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;gBACZ,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;YACzD,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,kBAAkB;IAClB,IAAI,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QACjC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC3C,CAAC;IAED,2BAA2B;IAC3B,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;AACnD,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function promptRequired(label: string): Promise<string>;
2
+ export declare function promptMultiline(label: string): Promise<string>;
3
+ export declare function promptAddress(label: string): Promise<string>;
4
+ export declare function closePrompts(): void;
5
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/setup/prompts.ts"],"names":[],"mappings":"AAqBA,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMnE;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA+BpE;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMlE;AAED,wBAAgB,YAAY,IAAI,IAAI,CAKnC"}
@@ -0,0 +1,70 @@
1
+ import readline from "readline";
2
+ import chalk from "chalk";
3
+ let rl = null;
4
+ function getRL() {
5
+ if (!rl) {
6
+ rl = readline.createInterface({
7
+ input: process.stdin,
8
+ output: process.stdout,
9
+ });
10
+ }
11
+ return rl;
12
+ }
13
+ function ask(question) {
14
+ return new Promise((resolve) => {
15
+ getRL().question(question, (answer) => resolve(answer.trim()));
16
+ });
17
+ }
18
+ export async function promptRequired(label) {
19
+ while (true) {
20
+ const value = await ask(chalk.white(` → ${label}: `));
21
+ if (value)
22
+ return value;
23
+ console.log(chalk.yellow(" This field is required."));
24
+ }
25
+ }
26
+ export async function promptMultiline(label) {
27
+ console.log("");
28
+ console.log(chalk.white(` ${label}`));
29
+ console.log(chalk.dim(" Type your prompt, then press Enter twice to finish:"));
30
+ console.log("");
31
+ const lines = [];
32
+ let lastWasEmpty = false;
33
+ while (true) {
34
+ const line = await ask(" ");
35
+ if (line === "" && lastWasEmpty && lines.length > 0) {
36
+ // Remove the trailing empty line we added
37
+ lines.pop();
38
+ break;
39
+ }
40
+ if (line === "" && lines.length > 0) {
41
+ lastWasEmpty = true;
42
+ lines.push("");
43
+ }
44
+ else {
45
+ lastWasEmpty = false;
46
+ lines.push(line);
47
+ }
48
+ }
49
+ const result = lines.join("\n").trim();
50
+ if (!result) {
51
+ console.log(chalk.yellow(" Genesis prompt is required. Try again."));
52
+ return promptMultiline(label);
53
+ }
54
+ return result;
55
+ }
56
+ export async function promptAddress(label) {
57
+ while (true) {
58
+ const value = await ask(chalk.white(` → ${label}: `));
59
+ if (/^0x[0-9a-fA-F]{40}$/.test(value))
60
+ return value;
61
+ console.log(chalk.yellow(" Invalid Ethereum address. Must be 0x followed by 40 hex characters."));
62
+ }
63
+ }
64
+ export function closePrompts() {
65
+ if (rl) {
66
+ rl.close();
67
+ rl = null;
68
+ }
69
+ }
70
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/setup/prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { AutomatonConfig } from "../types.js";
2
+ export declare function runSetupWizard(): Promise<AutomatonConfig>;
3
+ //# sourceMappingURL=wizard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wizard.d.ts","sourceRoot":"","sources":["../../src/setup/wizard.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAWnD,wBAAsB,cAAc,IAAI,OAAO,CAAC,eAAe,CAAC,CAiH/D"}
@@ -0,0 +1,128 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import chalk from "chalk";
4
+ import { getWallet, getAutomatonDir } from "../identity/wallet.js";
5
+ import { provision } from "../identity/provision.js";
6
+ import { createConfig, saveConfig } from "../config.js";
7
+ import { writeDefaultHeartbeatConfig } from "../heartbeat/config.js";
8
+ import { showBanner } from "./banner.js";
9
+ import { promptRequired, promptMultiline, promptAddress, closePrompts } from "./prompts.js";
10
+ import { detectEnvironment } from "./environment.js";
11
+ import { generateSoulMd, installDefaultSkills } from "./defaults.js";
12
+ export async function runSetupWizard() {
13
+ showBanner();
14
+ console.log(chalk.white(" First-run setup. Let's bring your automaton to life.\n"));
15
+ // ─── 1. Generate wallet ───────────────────────────────────────
16
+ console.log(chalk.cyan(" [1/6] Generating identity (wallet)..."));
17
+ const { account, isNew } = await getWallet();
18
+ if (isNew) {
19
+ console.log(chalk.green(` Wallet created: ${account.address}`));
20
+ }
21
+ else {
22
+ console.log(chalk.green(` Wallet loaded: ${account.address}`));
23
+ }
24
+ console.log(chalk.dim(` Private key stored at: ${getAutomatonDir()}/wallet.json\n`));
25
+ // ─── 2. Provision API key ─────────────────────────────────────
26
+ console.log(chalk.cyan(" [2/6] Provisioning CLAWD API key (SIWE)..."));
27
+ let apiKey = "";
28
+ try {
29
+ const result = await provision();
30
+ apiKey = result.apiKey;
31
+ console.log(chalk.green(` API key provisioned: ${result.keyPrefix}...\n`));
32
+ }
33
+ catch (err) {
34
+ console.log(chalk.yellow(` Auto-provision failed: ${err.message}`));
35
+ console.log(chalk.yellow(" You can enter a key manually, or press Enter to skip.\n"));
36
+ const manual = await promptRequired("CLAWD API key (cnwy_k_...)");
37
+ if (manual) {
38
+ apiKey = manual;
39
+ // Save to config.json for loadApiKeyFromConfig()
40
+ const configDir = getAutomatonDir();
41
+ if (!fs.existsSync(configDir)) {
42
+ fs.mkdirSync(configDir, { recursive: true, mode: 0o700 });
43
+ }
44
+ fs.writeFileSync(path.join(configDir, "config.json"), JSON.stringify({ apiKey, walletAddress: account.address, provisionedAt: new Date().toISOString() }, null, 2), { mode: 0o600 });
45
+ console.log(chalk.green(" API key saved.\n"));
46
+ }
47
+ }
48
+ if (!apiKey) {
49
+ console.log(chalk.yellow(" No API key set. The automaton will have limited functionality.\n"));
50
+ }
51
+ // ─── 3. Interactive questions ─────────────────────────────────
52
+ console.log(chalk.cyan(" [3/6] Setup questions\n"));
53
+ const name = await promptRequired("What do you want to name your automaton?");
54
+ console.log(chalk.green(` Name: ${name}\n`));
55
+ const genesisPrompt = await promptMultiline("Enter the genesis prompt (system prompt) for your automaton.");
56
+ console.log(chalk.green(` Genesis prompt set (${genesisPrompt.length} chars)\n`));
57
+ const creatorAddress = await promptAddress("Your Ethereum wallet address (0x...)");
58
+ console.log(chalk.green(` Creator: ${creatorAddress}\n`));
59
+ // ─── 4. Detect environment ────────────────────────────────────
60
+ console.log(chalk.cyan(" [4/6] Detecting environment..."));
61
+ const env = detectEnvironment();
62
+ if (env.sandboxId) {
63
+ console.log(chalk.green(` CLAWD sandbox detected: ${env.sandboxId}\n`));
64
+ }
65
+ else {
66
+ console.log(chalk.dim(` Environment: ${env.type} (no sandbox detected)\n`));
67
+ }
68
+ // ─── 5. Write config + heartbeat + SOUL.md + skills ───────────
69
+ console.log(chalk.cyan(" [5/6] Writing configuration..."));
70
+ const config = createConfig({
71
+ name,
72
+ genesisPrompt,
73
+ creatorAddress: creatorAddress,
74
+ registeredWithClawd: !!apiKey,
75
+ sandboxId: env.sandboxId,
76
+ walletAddress: account.address,
77
+ apiKey,
78
+ });
79
+ saveConfig(config);
80
+ console.log(chalk.green(" automaton.json written"));
81
+ writeDefaultHeartbeatConfig();
82
+ console.log(chalk.green(" heartbeat.yml written"));
83
+ // constitution.md (immutable — copied from repo, protected from self-modification)
84
+ const automatonDir = getAutomatonDir();
85
+ const constitutionSrc = path.join(process.cwd(), "constitution.md");
86
+ const constitutionDst = path.join(automatonDir, "constitution.md");
87
+ if (fs.existsSync(constitutionSrc)) {
88
+ fs.copyFileSync(constitutionSrc, constitutionDst);
89
+ fs.chmodSync(constitutionDst, 0o444); // read-only
90
+ console.log(chalk.green(" constitution.md installed (read-only)"));
91
+ }
92
+ // SOUL.md
93
+ const soulPath = path.join(automatonDir, "SOUL.md");
94
+ fs.writeFileSync(soulPath, generateSoulMd(name, account.address, creatorAddress, genesisPrompt), { mode: 0o600 });
95
+ console.log(chalk.green(" SOUL.md written"));
96
+ // Default skills
97
+ const skillsDir = config.skillsDir || "~/.automaton/skills";
98
+ installDefaultSkills(skillsDir);
99
+ console.log(chalk.green(" Default skills installed (clawd-compute, clawd-payments, survival)\n"));
100
+ // ─── 6. Funding guidance ──────────────────────────────────────
101
+ console.log(chalk.cyan(" [6/6] Funding\n"));
102
+ showFundingPanel(account.address);
103
+ closePrompts();
104
+ return config;
105
+ }
106
+ function showFundingPanel(address) {
107
+ const short = `${address.slice(0, 6)}...${address.slice(-5)}`;
108
+ const w = 58;
109
+ const pad = (s, len) => s + " ".repeat(Math.max(0, len - s.length));
110
+ console.log(chalk.cyan(` ${"╭" + "─".repeat(w) + "╮"}`));
111
+ console.log(chalk.cyan(` │${pad(" Fund your automaton", w)}│`));
112
+ console.log(chalk.cyan(` │${" ".repeat(w)}│`));
113
+ console.log(chalk.cyan(` │${pad(` Address: ${short}`, w)}│`));
114
+ console.log(chalk.cyan(` │${" ".repeat(w)}│`));
115
+ console.log(chalk.cyan(` │${pad(" 1. Transfer CLAWD credits", w)}│`));
116
+ console.log(chalk.cyan(` │${pad(" clawd credits transfer <address> <amount>", w)}│`));
117
+ console.log(chalk.cyan(` │${" ".repeat(w)}│`));
118
+ console.log(chalk.cyan(` │${pad(" 2. Send USDC on Base directly to the address above", w)}│`));
119
+ console.log(chalk.cyan(` │${" ".repeat(w)}│`));
120
+ console.log(chalk.cyan(` │${pad(" 3. Fund via CLAWD Cloud dashboard", w)}│`));
121
+ console.log(chalk.cyan(` │${pad(" https://app.x402.wtf", w)}│`));
122
+ console.log(chalk.cyan(` │${" ".repeat(w)}│`));
123
+ console.log(chalk.cyan(` │${pad(" The automaton will start now. Fund it anytime —", w)}│`));
124
+ console.log(chalk.cyan(` │${pad(" the survival system handles zero-credit gracefully.", w)}│`));
125
+ console.log(chalk.cyan(` ${"╰" + "─".repeat(w) + "╯"}`));
126
+ console.log("");
127
+ }
128
+ //# sourceMappingURL=wizard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../src/setup/wizard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * SKILL.md Parser
3
+ *
4
+ * Parses SKILL.md files with YAML frontmatter + Markdown body
5
+ * into structured skill definitions.
6
+ * Follows the SKILL.md convention (OpenClaw/Anthropic format).
7
+ */
8
+ import type { Skill, SkillSource } from "../types.js";
9
+ /**
10
+ * Parse a SKILL.md file content into frontmatter + body.
11
+ * Handles YAML frontmatter delimited by --- markers.
12
+ */
13
+ export declare function parseSkillMd(content: string, filePath: string, source?: SkillSource): Skill | null;
14
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/skills/format.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAoB,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAExE;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,WAAuB,GAC9B,KAAK,GAAG,IAAI,CA4Cd"}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * SKILL.md Parser
3
+ *
4
+ * Parses SKILL.md files with YAML frontmatter + Markdown body
5
+ * into structured skill definitions.
6
+ * Follows the SKILL.md convention (OpenClaw/Anthropic format).
7
+ */
8
+ /**
9
+ * Parse a SKILL.md file content into frontmatter + body.
10
+ * Handles YAML frontmatter delimited by --- markers.
11
+ */
12
+ export function parseSkillMd(content, filePath, source = "builtin") {
13
+ const trimmed = content.trim();
14
+ if (!trimmed.startsWith("---")) {
15
+ // No frontmatter -- treat entire content as instructions
16
+ // with a name derived from the directory
17
+ const name = extractNameFromPath(filePath);
18
+ return {
19
+ name,
20
+ description: "",
21
+ autoActivate: true,
22
+ instructions: trimmed,
23
+ source,
24
+ path: filePath,
25
+ enabled: true,
26
+ installedAt: new Date().toISOString(),
27
+ };
28
+ }
29
+ // Find the closing ---
30
+ const endIndex = trimmed.indexOf("---", 3);
31
+ if (endIndex === -1) {
32
+ return null;
33
+ }
34
+ const frontmatterRaw = trimmed.slice(3, endIndex).trim();
35
+ const body = trimmed.slice(endIndex + 3).trim();
36
+ // Parse YAML frontmatter manually (avoid requiring gray-matter at runtime)
37
+ const frontmatter = parseYamlFrontmatter(frontmatterRaw);
38
+ if (!frontmatter) {
39
+ return null;
40
+ }
41
+ return {
42
+ name: frontmatter.name || extractNameFromPath(filePath),
43
+ description: frontmatter.description || "",
44
+ autoActivate: frontmatter["auto-activate"] !== false,
45
+ requires: frontmatter.requires,
46
+ instructions: body,
47
+ source,
48
+ path: filePath,
49
+ enabled: true,
50
+ installedAt: new Date().toISOString(),
51
+ };
52
+ }
53
+ /**
54
+ * Parse simple YAML frontmatter without a full YAML parser.
55
+ * Handles the subset used by SKILL.md files.
56
+ */
57
+ function parseYamlFrontmatter(raw) {
58
+ try {
59
+ const result = {};
60
+ const lines = raw.split("\n");
61
+ let currentKey = "";
62
+ let inList = false;
63
+ let listKey = "";
64
+ for (const line of lines) {
65
+ const trimmedLine = line.trim();
66
+ if (!trimmedLine || trimmedLine.startsWith("#"))
67
+ continue;
68
+ // Check for list items
69
+ if (trimmedLine.startsWith("- ") && inList) {
70
+ const value = trimmedLine.slice(2).trim().replace(/^["']|["']$/g, "");
71
+ if (!result[listKey])
72
+ result[listKey] = [];
73
+ if (Array.isArray(result[listKey])) {
74
+ result[listKey].push(value);
75
+ }
76
+ continue;
77
+ }
78
+ // Check for key: value
79
+ const colonIndex = trimmedLine.indexOf(":");
80
+ if (colonIndex === -1)
81
+ continue;
82
+ const key = trimmedLine.slice(0, colonIndex).trim();
83
+ const value = trimmedLine.slice(colonIndex + 1).trim();
84
+ if (key === "requires") {
85
+ result.requires = {};
86
+ currentKey = "requires";
87
+ inList = false;
88
+ continue;
89
+ }
90
+ if (currentKey === "requires" && line.startsWith(" ")) {
91
+ // Nested under requires
92
+ const nestedKey = key.trim();
93
+ if (!value || value === "") {
94
+ // Start of list
95
+ inList = true;
96
+ listKey = `requires.${nestedKey}`;
97
+ if (!result.requires)
98
+ result.requires = {};
99
+ result.requires[nestedKey] = [];
100
+ }
101
+ else {
102
+ // Inline list: [item1, item2]
103
+ if (value.startsWith("[") && value.endsWith("]")) {
104
+ const items = value
105
+ .slice(1, -1)
106
+ .split(",")
107
+ .map((s) => s.trim().replace(/^["']|["']$/g, ""));
108
+ if (!result.requires)
109
+ result.requires = {};
110
+ result.requires[nestedKey] = items;
111
+ }
112
+ }
113
+ continue;
114
+ }
115
+ inList = false;
116
+ currentKey = key;
117
+ if (!value)
118
+ continue;
119
+ // Parse value
120
+ if (value === "true") {
121
+ result[key] = true;
122
+ }
123
+ else if (value === "false") {
124
+ result[key] = false;
125
+ }
126
+ else {
127
+ result[key] = value.replace(/^["']|["']$/g, "");
128
+ }
129
+ }
130
+ return result;
131
+ }
132
+ catch {
133
+ return null;
134
+ }
135
+ }
136
+ function extractNameFromPath(filePath) {
137
+ // Extract skill name from path like ~/.automaton/skills/web-scraper/SKILL.md
138
+ const parts = filePath.split("/");
139
+ const skillMdIndex = parts.findIndex((p) => p.toLowerCase() === "skill.md");
140
+ if (skillMdIndex > 0) {
141
+ return parts[skillMdIndex - 1];
142
+ }
143
+ return parts[parts.length - 1].replace(/\.md$/i, "");
144
+ }
145
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/skills/format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Skills Loader
3
+ *
4
+ * Discovers and loads SKILL.md files from ~/.automaton/skills/
5
+ * Each skill is a directory containing a SKILL.md file with
6
+ * YAML frontmatter + Markdown instructions.
7
+ */
8
+ import type { Skill, AutomatonDatabase } from "../types.js";
9
+ /**
10
+ * Scan the skills directory and load all valid SKILL.md files.
11
+ * Returns loaded skills and syncs them to the database.
12
+ */
13
+ export declare function loadSkills(skillsDir: string, db: AutomatonDatabase): Skill[];
14
+ /**
15
+ * Get the active skill instructions to inject into the system prompt.
16
+ * Only returns instructions from auto-activate skills that are enabled.
17
+ */
18
+ export declare function getActiveSkillInstructions(skills: Skill[]): string;
19
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/skills/loader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAG5D;;;GAGG;AACH,wBAAgB,UAAU,CACxB,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,iBAAiB,GACpB,KAAK,EAAE,CA0CT;AAgCD;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAUlE"}