@clawnch/clawtomaton 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/README.md +231 -0
- package/constitution.md +15 -0
- package/dist/agent/index.d.ts +43 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +315 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/prompt.d.ts +24 -0
- package/dist/agent/prompt.d.ts.map +1 -0
- package/dist/agent/prompt.js +137 -0
- package/dist/agent/prompt.js.map +1 -0
- package/dist/cli.d.ts +15 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +303 -0
- package/dist/cli.js.map +1 -0
- package/dist/constants.d.ts +18 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +18 -0
- package/dist/constants.js.map +1 -0
- package/dist/heartbeat/index.d.ts +38 -0
- package/dist/heartbeat/index.d.ts.map +1 -0
- package/dist/heartbeat/index.js +127 -0
- package/dist/heartbeat/index.js.map +1 -0
- package/dist/identity/index.d.ts +39 -0
- package/dist/identity/index.d.ts.map +1 -0
- package/dist/identity/index.js +134 -0
- package/dist/identity/index.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/market/index.d.ts +73 -0
- package/dist/market/index.d.ts.map +1 -0
- package/dist/market/index.js +205 -0
- package/dist/market/index.js.map +1 -0
- package/dist/self-mod/index.d.ts +30 -0
- package/dist/self-mod/index.d.ts.map +1 -0
- package/dist/self-mod/index.js +83 -0
- package/dist/self-mod/index.js.map +1 -0
- package/dist/skills/check-balance.d.ts +7 -0
- package/dist/skills/check-balance.d.ts.map +1 -0
- package/dist/skills/check-balance.js +46 -0
- package/dist/skills/check-balance.js.map +1 -0
- package/dist/skills/check-stats.d.ts +6 -0
- package/dist/skills/check-stats.d.ts.map +1 -0
- package/dist/skills/check-stats.js +49 -0
- package/dist/skills/check-stats.js.map +1 -0
- package/dist/skills/claim-fees.d.ts +14 -0
- package/dist/skills/claim-fees.d.ts.map +1 -0
- package/dist/skills/claim-fees.js +109 -0
- package/dist/skills/claim-fees.js.map +1 -0
- package/dist/skills/conway.d.ts +16 -0
- package/dist/skills/conway.d.ts.map +1 -0
- package/dist/skills/conway.js +97 -0
- package/dist/skills/conway.js.map +1 -0
- package/dist/skills/deploy.d.ts +19 -0
- package/dist/skills/deploy.d.ts.map +1 -0
- package/dist/skills/deploy.js +167 -0
- package/dist/skills/deploy.js.map +1 -0
- package/dist/skills/edit-soul.d.ts +10 -0
- package/dist/skills/edit-soul.d.ts.map +1 -0
- package/dist/skills/edit-soul.js +68 -0
- package/dist/skills/edit-soul.js.map +1 -0
- package/dist/skills/index.d.ts +21 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +59 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/shell.d.ts +12 -0
- package/dist/skills/shell.d.ts.map +1 -0
- package/dist/skills/shell.js +66 -0
- package/dist/skills/shell.js.map +1 -0
- package/dist/skills/swap.d.ts +6 -0
- package/dist/skills/swap.d.ts.map +1 -0
- package/dist/skills/swap.js +87 -0
- package/dist/skills/swap.js.map +1 -0
- package/dist/skills/transfer.d.ts +7 -0
- package/dist/skills/transfer.d.ts.map +1 -0
- package/dist/skills/transfer.js +82 -0
- package/dist/skills/transfer.js.map +1 -0
- package/dist/state/index.d.ts +44 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +266 -0
- package/dist/state/index.js.map +1 -0
- package/dist/survival/index.d.ts +49 -0
- package/dist/survival/index.d.ts.map +1 -0
- package/dist/survival/index.js +151 -0
- package/dist/survival/index.js.map +1 -0
- package/dist/types.d.ts +132 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +17 -0
- package/dist/types.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* System prompt construction for the Clawtomaton agent.
|
|
3
|
+
*
|
|
4
|
+
* Injects real on-chain data — not vague guidance. The agent sees:
|
|
5
|
+
* - Constitution (immutable)
|
|
6
|
+
* - SOUL.md (self-authored memory)
|
|
7
|
+
* - Genesis prompt (creator's seed)
|
|
8
|
+
* - Market snapshot (ETH balance, gas price, fee balances, claim profitability)
|
|
9
|
+
* - Available skills (filtered by survival tier)
|
|
10
|
+
* - Token stats (if deployed)
|
|
11
|
+
*/
|
|
12
|
+
import { formatSnapshot } from '../market/index.js';
|
|
13
|
+
import { formatSurvivalStatus } from '../survival/index.js';
|
|
14
|
+
/**
|
|
15
|
+
* Build the full system prompt for an inference call.
|
|
16
|
+
* If a market snapshot is available, it's injected as hard data.
|
|
17
|
+
*/
|
|
18
|
+
export function buildSystemPrompt(ctx) {
|
|
19
|
+
const { agent, snapshot, conditions } = ctx;
|
|
20
|
+
const sections = [];
|
|
21
|
+
// 1. Identity
|
|
22
|
+
sections.push(`# You are ${agent.identity.name}
|
|
23
|
+
|
|
24
|
+
You are a Clawtomaton — an autonomous AI agent that launches and manages a crypto project on Base.
|
|
25
|
+
Wallet: \`${agent.identity.address}\`
|
|
26
|
+
Creator: \`${agent.identity.creatorAddress}\``);
|
|
27
|
+
// 2. Constitution
|
|
28
|
+
sections.push(`# Constitution (IMMUTABLE — overrides everything else)
|
|
29
|
+
|
|
30
|
+
${agent.constitution}`);
|
|
31
|
+
// 3. SOUL.md
|
|
32
|
+
if (agent.soul) {
|
|
33
|
+
sections.push(`# SOUL.md
|
|
34
|
+
|
|
35
|
+
${agent.soul}`);
|
|
36
|
+
}
|
|
37
|
+
// 4. Genesis prompt
|
|
38
|
+
sections.push(`# Genesis Prompt
|
|
39
|
+
|
|
40
|
+
${agent.identity.genesisPrompt}`);
|
|
41
|
+
// 5. Market state — real numbers, not vibes
|
|
42
|
+
if (snapshot) {
|
|
43
|
+
sections.push(`# Current State (live on-chain data)
|
|
44
|
+
|
|
45
|
+
${formatSnapshot(snapshot)}`);
|
|
46
|
+
if (conditions) {
|
|
47
|
+
sections.push(`# Situation Assessment
|
|
48
|
+
|
|
49
|
+
${conditions.summary}
|
|
50
|
+
|
|
51
|
+
${getActionGuidance(conditions, agent.survival.tier)}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
// Fallback if no snapshot (shouldn't happen in normal operation)
|
|
56
|
+
sections.push(`# Survival
|
|
57
|
+
|
|
58
|
+
${formatSurvivalStatus(agent.survival)}`);
|
|
59
|
+
}
|
|
60
|
+
// 6. Token info
|
|
61
|
+
if (agent.identity.tokenAddress) {
|
|
62
|
+
const tokenLines = [
|
|
63
|
+
`# Your Token`,
|
|
64
|
+
``,
|
|
65
|
+
`$${agent.identity.tokenSymbol} — \`${agent.identity.tokenAddress}\``,
|
|
66
|
+
];
|
|
67
|
+
if (snapshot?.ownToken) {
|
|
68
|
+
tokenLines.push(`Balance: ${snapshot.ownToken.balanceFormatted} (${snapshot.ownToken.holdingPct.toFixed(2)}% of supply)`);
|
|
69
|
+
}
|
|
70
|
+
tokenLines.push(``, `Your revenue comes from LP trading fees on this token. More volume = more fees.`);
|
|
71
|
+
sections.push(tokenLines.join('\n'));
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
sections.push(`# No Token Yet
|
|
75
|
+
|
|
76
|
+
You haven't deployed a token. When you have a concept ready, use deploy_token.
|
|
77
|
+
Don't rush — a bad launch wastes gas and your one deploy slot.`);
|
|
78
|
+
}
|
|
79
|
+
// 7. Skills
|
|
80
|
+
sections.push(`# Skills
|
|
81
|
+
|
|
82
|
+
${formatSkills(agent.skills)}
|
|
83
|
+
|
|
84
|
+
Call a skill:
|
|
85
|
+
\`\`\`
|
|
86
|
+
<tool_call>
|
|
87
|
+
{"skill": "skill_name", "params": {"key": "value"}}
|
|
88
|
+
</tool_call>
|
|
89
|
+
\`\`\``);
|
|
90
|
+
// 8. Operating rules
|
|
91
|
+
sections.push(`# Rules
|
|
92
|
+
|
|
93
|
+
- Think before acting. State your reasoning, then use skills.
|
|
94
|
+
- NEVER claim fees just because you can. The claim_fees skill checks profitability for you.
|
|
95
|
+
- Let fees pool up. Claim when the skill tells you it's profitable, or in survival emergencies.
|
|
96
|
+
- Every tx costs gas. Be frugal.
|
|
97
|
+
- Update SOUL.md to remember important decisions and observations.
|
|
98
|
+
- If nothing needs doing, say so and end your turn. Silence is fine.
|
|
99
|
+
- Turn: ${agent.turn}`);
|
|
100
|
+
return sections.join('\n\n---\n\n');
|
|
101
|
+
}
|
|
102
|
+
// ============================================================================
|
|
103
|
+
// Helpers
|
|
104
|
+
// ============================================================================
|
|
105
|
+
function formatSkills(skills) {
|
|
106
|
+
if (skills.length === 0)
|
|
107
|
+
return '(No skills available — survival tier too low.)';
|
|
108
|
+
return skills.map((s) => {
|
|
109
|
+
const params = s.parameters
|
|
110
|
+
.map((p) => ` - \`${p.name}\` (${p.type}${p.required ? ', required' : ''}): ${p.description}`)
|
|
111
|
+
.join('\n');
|
|
112
|
+
return `## ${s.name}\n${s.description}\nParams:\n${params}`;
|
|
113
|
+
}).join('\n\n');
|
|
114
|
+
}
|
|
115
|
+
function getActionGuidance(conditions, tier) {
|
|
116
|
+
if (tier === 'dead') {
|
|
117
|
+
return 'You are dead. No ETH, no actions. Wait for external funding.';
|
|
118
|
+
}
|
|
119
|
+
const lines = [];
|
|
120
|
+
if (conditions.survivalClaimNeeded) {
|
|
121
|
+
lines.push('PRIORITY: Claim fees now. Your ETH is low and fees exist to claim.');
|
|
122
|
+
}
|
|
123
|
+
else if (conditions.feesWorthClaiming) {
|
|
124
|
+
lines.push('Fees are profitable to claim. You can claim now or let them grow further.');
|
|
125
|
+
}
|
|
126
|
+
if (!conditions.operationallyHealthy) {
|
|
127
|
+
lines.push(`Warning: ~${conditions.estimatedHoursRemaining}h of runway. Conserve gas. Consider claiming soon.`);
|
|
128
|
+
}
|
|
129
|
+
if (tier === 'low_compute') {
|
|
130
|
+
lines.push('Low compute mode. Keep turns short. No deploys or shell commands.');
|
|
131
|
+
}
|
|
132
|
+
else if (tier === 'critical') {
|
|
133
|
+
lines.push('Critical mode. Only claim_fees and check_balance available.');
|
|
134
|
+
}
|
|
135
|
+
return lines.length > 0 ? lines.join('\n') : 'Situation normal. Act according to your strategy.';
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/agent/prompt.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Clawtomaton CLI — setup wizard and runtime entry point.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* clawtomaton setup Interactive setup wizard
|
|
7
|
+
* clawtomaton activate Burn 1M $CLAWNCH to activate
|
|
8
|
+
* clawtomaton run Start the agent (single run)
|
|
9
|
+
* clawtomaton daemon Start the agent with heartbeat (continuous)
|
|
10
|
+
* clawtomaton status Show agent status
|
|
11
|
+
* clawtomaton audit Show audit log
|
|
12
|
+
* clawtomaton soul Print SOUL.md
|
|
13
|
+
*/
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;GAWG"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Clawtomaton CLI — setup wizard and runtime entry point.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* clawtomaton setup Interactive setup wizard
|
|
7
|
+
* clawtomaton activate Burn 1M $CLAWNCH to activate
|
|
8
|
+
* clawtomaton run Start the agent (single run)
|
|
9
|
+
* clawtomaton daemon Start the agent with heartbeat (continuous)
|
|
10
|
+
* clawtomaton status Show agent status
|
|
11
|
+
* clawtomaton audit Show audit log
|
|
12
|
+
* clawtomaton soul Print SOUL.md
|
|
13
|
+
*/
|
|
14
|
+
import { readFileSync, writeFileSync, existsSync } from 'node:fs';
|
|
15
|
+
import { join } from 'node:path';
|
|
16
|
+
import { createInterface } from 'node:readline';
|
|
17
|
+
import { StateStore } from './state/index.js';
|
|
18
|
+
import { generateIdentity, activate } from './identity/index.js';
|
|
19
|
+
import { ClawtomatonAgent } from './agent/index.js';
|
|
20
|
+
import { Heartbeat } from './heartbeat/index.js';
|
|
21
|
+
import { SelfModAuditor } from './self-mod/index.js';
|
|
22
|
+
import { formatSurvivalStatus } from './survival/index.js';
|
|
23
|
+
// ============================================================================
|
|
24
|
+
// Arg Parsing
|
|
25
|
+
// ============================================================================
|
|
26
|
+
const args = process.argv.slice(2);
|
|
27
|
+
const command = args[0] ?? 'help';
|
|
28
|
+
const DEFAULT_STATE_DIR = join(process.env.HOME ?? '.', '.clawtomaton');
|
|
29
|
+
const CONFIG_FILE = join(DEFAULT_STATE_DIR, 'config.json');
|
|
30
|
+
// ============================================================================
|
|
31
|
+
// Main
|
|
32
|
+
// ============================================================================
|
|
33
|
+
async function main() {
|
|
34
|
+
switch (command) {
|
|
35
|
+
case 'setup':
|
|
36
|
+
await setupWizard();
|
|
37
|
+
break;
|
|
38
|
+
case 'activate':
|
|
39
|
+
await activateAgent();
|
|
40
|
+
break;
|
|
41
|
+
case 'run':
|
|
42
|
+
await runOnce();
|
|
43
|
+
break;
|
|
44
|
+
case 'daemon':
|
|
45
|
+
await runDaemon();
|
|
46
|
+
break;
|
|
47
|
+
case 'status':
|
|
48
|
+
showStatus();
|
|
49
|
+
break;
|
|
50
|
+
case 'audit':
|
|
51
|
+
showAudit();
|
|
52
|
+
break;
|
|
53
|
+
case 'soul':
|
|
54
|
+
showSoul();
|
|
55
|
+
break;
|
|
56
|
+
case 'help':
|
|
57
|
+
default:
|
|
58
|
+
printHelp();
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// ============================================================================
|
|
63
|
+
// Commands
|
|
64
|
+
// ============================================================================
|
|
65
|
+
async function setupWizard() {
|
|
66
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
67
|
+
const ask = (q) => new Promise((resolve) => rl.question(q, resolve));
|
|
68
|
+
console.log('\n Clawtomaton Setup Wizard\n');
|
|
69
|
+
console.log(' This will create a new agent with a fresh wallet.\n');
|
|
70
|
+
const name = await ask(' Agent name: ');
|
|
71
|
+
const genesisPrompt = await ask(' Genesis prompt (seed instruction): ');
|
|
72
|
+
const creatorAddress = await ask(' Your wallet address (creator/auditor): ');
|
|
73
|
+
const rpcUrl = await ask(' Base RPC URL [https://mainnet.base.org]: ') || 'https://mainnet.base.org';
|
|
74
|
+
const inferenceProvider = await ask(' Inference provider (anthropic/openrouter) [openrouter]: ') || 'openrouter';
|
|
75
|
+
const inferenceApiKey = await ask(' Inference API key: ');
|
|
76
|
+
const model = await ask(' Model [anthropic/claude-sonnet-4-20250514]: ') || 'anthropic/claude-sonnet-4-20250514';
|
|
77
|
+
const fallbackModel = await ask(' Fallback model (for low compute) [anthropic/claude-3-5-haiku-20241022]: ') || 'anthropic/claude-3-5-haiku-20241022';
|
|
78
|
+
const heartbeatMinutes = await ask(' Heartbeat interval in minutes [30]: ') || '30';
|
|
79
|
+
const conwayApiKey = await ask(' Conway API key (optional, press enter to skip): ') || undefined;
|
|
80
|
+
const stateDir = await ask(` State directory [${DEFAULT_STATE_DIR}]: `) || DEFAULT_STATE_DIR;
|
|
81
|
+
rl.close();
|
|
82
|
+
const config = {
|
|
83
|
+
inference: {
|
|
84
|
+
provider: inferenceProvider,
|
|
85
|
+
apiKey: inferenceApiKey,
|
|
86
|
+
model,
|
|
87
|
+
fallbackModel,
|
|
88
|
+
},
|
|
89
|
+
rpcUrl,
|
|
90
|
+
stateDir,
|
|
91
|
+
heartbeatIntervalMs: parseInt(heartbeatMinutes) * 60 * 1000,
|
|
92
|
+
maxHistoryTurns: 50,
|
|
93
|
+
conwayApiKey,
|
|
94
|
+
};
|
|
95
|
+
// Save config
|
|
96
|
+
const { mkdirSync } = await import('node:fs');
|
|
97
|
+
mkdirSync(stateDir, { recursive: true });
|
|
98
|
+
writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));
|
|
99
|
+
// Generate identity
|
|
100
|
+
const state = new StateStore(stateDir);
|
|
101
|
+
console.log('\n Generating wallet and registering with Clawncher...');
|
|
102
|
+
try {
|
|
103
|
+
const identity = await generateIdentity({ name, genesisPrompt, creatorAddress, rpcUrl }, state);
|
|
104
|
+
console.log(`\n Agent created!`);
|
|
105
|
+
console.log(` Name: ${identity.name}`);
|
|
106
|
+
console.log(` Wallet: ${identity.address}`);
|
|
107
|
+
console.log(` API Key: ${identity.apiKey}`);
|
|
108
|
+
console.log(`\n IMPORTANT: Fund this wallet with:`);
|
|
109
|
+
console.log(` - 1,000,000 $CLAWNCH (for activation burn)`);
|
|
110
|
+
console.log(` - Some ETH (for gas and survival)`);
|
|
111
|
+
console.log(`\n Then run: clawtomaton activate`);
|
|
112
|
+
// Init self-mod auditor
|
|
113
|
+
const auditor = new SelfModAuditor(stateDir, state);
|
|
114
|
+
auditor.init();
|
|
115
|
+
// Create initial SOUL.md
|
|
116
|
+
const soulTemplate = `# ${identity.name}\n\n*This is my self-authored identity document. I will update it as I learn and grow.*\n\n## Genesis\n\n${genesisPrompt}\n\n## Notes\n\n(I haven't written any notes yet.)\n`;
|
|
117
|
+
state.setSoul(soulTemplate);
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
console.error(`\n Setup failed: ${err instanceof Error ? err.message : err}`);
|
|
121
|
+
process.exit(1);
|
|
122
|
+
}
|
|
123
|
+
finally {
|
|
124
|
+
state.close();
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
async function activateAgent() {
|
|
128
|
+
const config = loadConfig();
|
|
129
|
+
const state = new StateStore(config.stateDir);
|
|
130
|
+
try {
|
|
131
|
+
if (state.isActivated()) {
|
|
132
|
+
const activation = state.getActivation();
|
|
133
|
+
console.log(`\n Already activated!`);
|
|
134
|
+
console.log(` Burn TX: ${activation.burnTxHash}`);
|
|
135
|
+
console.log(` Activated at: ${new Date(activation.activatedAt).toISOString()}`);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
const identity = state.getIdentity();
|
|
139
|
+
if (!identity) {
|
|
140
|
+
console.error(' No identity found. Run: clawtomaton setup');
|
|
141
|
+
process.exit(1);
|
|
142
|
+
}
|
|
143
|
+
console.log(`\n Activating ${identity.name}...`);
|
|
144
|
+
console.log(` This will burn 1,000,000 $CLAWNCH from ${identity.address}`);
|
|
145
|
+
const result = await activate(identity, config.rpcUrl, state);
|
|
146
|
+
console.log(`\n Activated!`);
|
|
147
|
+
console.log(` Burn TX: ${result.burnTxHash}`);
|
|
148
|
+
console.log(` Amount burned: ${(Number(result.amountBurned) / 1e18).toLocaleString()} $CLAWNCH`);
|
|
149
|
+
console.log(`\n Run: clawtomaton run (single) or clawtomaton daemon (continuous)`);
|
|
150
|
+
}
|
|
151
|
+
finally {
|
|
152
|
+
state.close();
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
async function runOnce() {
|
|
156
|
+
const config = loadConfig();
|
|
157
|
+
const state = new StateStore(config.stateDir);
|
|
158
|
+
if (!state.isActivated()) {
|
|
159
|
+
console.error(' Agent not activated. Run: clawtomaton activate');
|
|
160
|
+
state.close();
|
|
161
|
+
process.exit(1);
|
|
162
|
+
}
|
|
163
|
+
state.close();
|
|
164
|
+
const agent = new ClawtomatonAgent(config);
|
|
165
|
+
console.log(`\n Running ${agent.getIdentity().name}...`);
|
|
166
|
+
try {
|
|
167
|
+
await agent.run();
|
|
168
|
+
console.log(' Run complete.');
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
console.error(` Run failed: ${err instanceof Error ? err.message : err}`);
|
|
172
|
+
}
|
|
173
|
+
finally {
|
|
174
|
+
agent.shutdown();
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
async function runDaemon() {
|
|
178
|
+
const config = loadConfig();
|
|
179
|
+
const state = new StateStore(config.stateDir);
|
|
180
|
+
if (!state.isActivated()) {
|
|
181
|
+
console.error(' Agent not activated. Run: clawtomaton activate');
|
|
182
|
+
state.close();
|
|
183
|
+
process.exit(1);
|
|
184
|
+
}
|
|
185
|
+
state.close();
|
|
186
|
+
const agent = new ClawtomatonAgent(config);
|
|
187
|
+
const heartbeat = new Heartbeat(agent, config);
|
|
188
|
+
const identity = agent.getIdentity();
|
|
189
|
+
console.log(`\n Starting ${identity.name} in daemon mode...`);
|
|
190
|
+
console.log(` Wallet: ${identity.address}`);
|
|
191
|
+
console.log(` Heartbeat: every ${config.heartbeatIntervalMs / 60000} minutes`);
|
|
192
|
+
console.log(` Press Ctrl+C to stop.\n`);
|
|
193
|
+
heartbeat.start();
|
|
194
|
+
// Graceful shutdown
|
|
195
|
+
const shutdown = () => {
|
|
196
|
+
console.log('\n Shutting down...');
|
|
197
|
+
heartbeat.stop();
|
|
198
|
+
agent.shutdown();
|
|
199
|
+
process.exit(0);
|
|
200
|
+
};
|
|
201
|
+
process.on('SIGINT', shutdown);
|
|
202
|
+
process.on('SIGTERM', shutdown);
|
|
203
|
+
}
|
|
204
|
+
function showStatus() {
|
|
205
|
+
const config = loadConfig();
|
|
206
|
+
const state = new StateStore(config.stateDir);
|
|
207
|
+
try {
|
|
208
|
+
const identity = state.getIdentity();
|
|
209
|
+
if (!identity) {
|
|
210
|
+
console.log(' No agent configured. Run: clawtomaton setup');
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
const survival = state.getSurvival();
|
|
214
|
+
const activation = state.getActivation();
|
|
215
|
+
const turnCount = state.getTurnCount();
|
|
216
|
+
console.log(`\n ${identity.name}`);
|
|
217
|
+
console.log(` ${'─'.repeat(40)}`);
|
|
218
|
+
console.log(` Wallet: ${identity.address}`);
|
|
219
|
+
console.log(` Activated: ${activation ? 'Yes' : 'No'}`);
|
|
220
|
+
if (identity.tokenAddress) {
|
|
221
|
+
console.log(` Token: $${identity.tokenSymbol} (${identity.tokenAddress})`);
|
|
222
|
+
}
|
|
223
|
+
console.log(` Turns: ${turnCount}`);
|
|
224
|
+
console.log(`\n Survival:`);
|
|
225
|
+
console.log(` ${formatSurvivalStatus(survival).split('\n').join('\n ')}`);
|
|
226
|
+
}
|
|
227
|
+
finally {
|
|
228
|
+
state.close();
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
function showAudit() {
|
|
232
|
+
const config = loadConfig();
|
|
233
|
+
const state = new StateStore(config.stateDir);
|
|
234
|
+
try {
|
|
235
|
+
const limit = parseInt(args[1] ?? '50');
|
|
236
|
+
const entries = state.getAuditLog(limit);
|
|
237
|
+
if (entries.length === 0) {
|
|
238
|
+
console.log(' No audit entries.');
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
console.log(`\n Audit Log (last ${entries.length} entries):`);
|
|
242
|
+
console.log(` ${'─'.repeat(60)}`);
|
|
243
|
+
for (const entry of entries.reverse()) {
|
|
244
|
+
const time = new Date(entry.timestamp).toISOString().slice(0, 19);
|
|
245
|
+
const tx = entry.tx_hash ? ` [${entry.tx_hash.slice(0, 10)}...]` : '';
|
|
246
|
+
console.log(` ${time} | ${entry.action}: ${entry.details}${tx}`);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
finally {
|
|
250
|
+
state.close();
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
function showSoul() {
|
|
254
|
+
const config = loadConfig();
|
|
255
|
+
const state = new StateStore(config.stateDir);
|
|
256
|
+
try {
|
|
257
|
+
const soul = state.getSoul();
|
|
258
|
+
if (!soul) {
|
|
259
|
+
console.log(' SOUL.md is empty.');
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
console.log(soul);
|
|
263
|
+
}
|
|
264
|
+
finally {
|
|
265
|
+
state.close();
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
function printHelp() {
|
|
269
|
+
console.log(`
|
|
270
|
+
Clawtomaton — Autonomous AI agents on Base
|
|
271
|
+
|
|
272
|
+
Usage:
|
|
273
|
+
clawtomaton setup Interactive setup wizard
|
|
274
|
+
clawtomaton activate Burn 1M $CLAWNCH to activate
|
|
275
|
+
clawtomaton run Start the agent (single run)
|
|
276
|
+
clawtomaton daemon Start with heartbeat (continuous)
|
|
277
|
+
clawtomaton status Show agent status
|
|
278
|
+
clawtomaton audit [n] Show last n audit entries (default: 50)
|
|
279
|
+
clawtomaton soul Print SOUL.md
|
|
280
|
+
|
|
281
|
+
https://clawn.ch/er
|
|
282
|
+
`);
|
|
283
|
+
}
|
|
284
|
+
// ============================================================================
|
|
285
|
+
// Config Loading
|
|
286
|
+
// ============================================================================
|
|
287
|
+
function loadConfig() {
|
|
288
|
+
// Check for config in env var or default location
|
|
289
|
+
const configPath = process.env.CLAWTOMATON_CONFIG ?? CONFIG_FILE;
|
|
290
|
+
if (!existsSync(configPath)) {
|
|
291
|
+
console.error(` Config not found at ${configPath}. Run: clawtomaton setup`);
|
|
292
|
+
process.exit(1);
|
|
293
|
+
}
|
|
294
|
+
return JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
295
|
+
}
|
|
296
|
+
// ============================================================================
|
|
297
|
+
// Entry
|
|
298
|
+
// ============================================================================
|
|
299
|
+
main().catch((err) => {
|
|
300
|
+
console.error(`Fatal: ${err instanceof Error ? err.message : err}`);
|
|
301
|
+
process.exit(1);
|
|
302
|
+
});
|
|
303
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared constants for Clawtomaton.
|
|
3
|
+
*
|
|
4
|
+
* Gas estimates, profit thresholds, and re-exports of SDK addresses
|
|
5
|
+
* so nothing is hardcoded in multiple places.
|
|
6
|
+
*/
|
|
7
|
+
import { BASE_WETH, NATIVE_TOKEN_ADDRESS } from '@clawnch/clawncher-sdk';
|
|
8
|
+
/** Gas per transaction on Base (overestimate for safety) */
|
|
9
|
+
export declare const GAS_PER_TX = 150000n;
|
|
10
|
+
/** Number of txs in a full claimAll (collectRewards + claimFees WETH + claimFees token) */
|
|
11
|
+
export declare const CLAIM_TX_COUNT = 3n;
|
|
12
|
+
/** Minimum net profit in WETH to justify claiming (0.0005 ETH ~ $1.25) */
|
|
13
|
+
export declare const MIN_CLAIM_PROFIT_WEI: bigint;
|
|
14
|
+
/** Cost of one inference call in ETH-equivalent terms (~$0.50) */
|
|
15
|
+
export declare const INFERENCE_COST_ETH_EQUIV: bigint;
|
|
16
|
+
/** Re-export SDK addresses so nothing is hardcoded elsewhere */
|
|
17
|
+
export { BASE_WETH, NATIVE_TOKEN_ADDRESS };
|
|
18
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEzE,4DAA4D;AAC5D,eAAO,MAAM,UAAU,UAAW,CAAC;AAEnC,2FAA2F;AAC3F,eAAO,MAAM,cAAc,KAAK,CAAC;AAEjC,0EAA0E;AAC1E,eAAO,MAAM,oBAAoB,QAA4B,CAAC;AAE9D,kEAAkE;AAClE,eAAO,MAAM,wBAAwB,QAA4B,CAAC;AAElE,gEAAgE;AAChE,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared constants for Clawtomaton.
|
|
3
|
+
*
|
|
4
|
+
* Gas estimates, profit thresholds, and re-exports of SDK addresses
|
|
5
|
+
* so nothing is hardcoded in multiple places.
|
|
6
|
+
*/
|
|
7
|
+
import { BASE_WETH, NATIVE_TOKEN_ADDRESS } from '@clawnch/clawncher-sdk';
|
|
8
|
+
/** Gas per transaction on Base (overestimate for safety) */
|
|
9
|
+
export const GAS_PER_TX = 150000n;
|
|
10
|
+
/** Number of txs in a full claimAll (collectRewards + claimFees WETH + claimFees token) */
|
|
11
|
+
export const CLAIM_TX_COUNT = 3n;
|
|
12
|
+
/** Minimum net profit in WETH to justify claiming (0.0005 ETH ~ $1.25) */
|
|
13
|
+
export const MIN_CLAIM_PROFIT_WEI = BigInt('500000000000000');
|
|
14
|
+
/** Cost of one inference call in ETH-equivalent terms (~$0.50) */
|
|
15
|
+
export const INFERENCE_COST_ETH_EQUIV = BigInt('200000000000000');
|
|
16
|
+
/** Re-export SDK addresses so nothing is hardcoded elsewhere */
|
|
17
|
+
export { BASE_WETH, NATIVE_TOKEN_ADDRESS };
|
|
18
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEzE,4DAA4D;AAC5D,MAAM,CAAC,MAAM,UAAU,GAAG,OAAQ,CAAC;AAEnC,2FAA2F;AAC3F,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AAEjC,0EAA0E;AAC1E,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAE9D,kEAAkE;AAClE,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAElE,gEAAgE;AAChE,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Heartbeat — condition-driven wake scheduler.
|
|
3
|
+
*
|
|
4
|
+
* NOT a dumb timer that tells the agent to "maybe do something."
|
|
5
|
+
* Instead: periodically checks on-chain conditions and only wakes
|
|
6
|
+
* the agent when there's something genuinely actionable.
|
|
7
|
+
*
|
|
8
|
+
* The check itself is cheap (a few RPC reads, no txs). The agent
|
|
9
|
+
* run is expensive (inference + potential txs). So we gate the
|
|
10
|
+
* expensive part behind the cheap check.
|
|
11
|
+
*
|
|
12
|
+
* Wake conditions:
|
|
13
|
+
* - Fees are profitable to claim (WETH fees > gas cost + threshold)
|
|
14
|
+
* - Survival danger (ETH low, but fees exist to claim)
|
|
15
|
+
* - Operational runway < 24h
|
|
16
|
+
* - Scheduled: periodic self-reflection (every 24h)
|
|
17
|
+
*/
|
|
18
|
+
import type { ClawtomatonConfig } from '../types.js';
|
|
19
|
+
import type { ClawtomatonAgent } from '../agent/index.js';
|
|
20
|
+
export declare class Heartbeat {
|
|
21
|
+
private timer;
|
|
22
|
+
private agent;
|
|
23
|
+
private config;
|
|
24
|
+
private market;
|
|
25
|
+
private lastRunTime;
|
|
26
|
+
private lastReflectionTime;
|
|
27
|
+
constructor(agent: ClawtomatonAgent, config: ClawtomatonConfig);
|
|
28
|
+
/**
|
|
29
|
+
* Start the heartbeat loop.
|
|
30
|
+
*/
|
|
31
|
+
start(): void;
|
|
32
|
+
stop(): void;
|
|
33
|
+
/**
|
|
34
|
+
* Check conditions. Only wake the agent if something is actionable.
|
|
35
|
+
*/
|
|
36
|
+
private check;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/heartbeat/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAW1D,qBAAa,SAAS;IACpB,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,kBAAkB,CAAK;gBAEnB,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,iBAAiB;IAa9D;;OAEG;IACH,KAAK,IAAI,IAAI;IAYb,IAAI,IAAI,IAAI;IAQZ;;OAEG;YACW,KAAK;CAyEpB"}
|