@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.
Files changed (91) hide show
  1. package/README.md +231 -0
  2. package/constitution.md +15 -0
  3. package/dist/agent/index.d.ts +43 -0
  4. package/dist/agent/index.d.ts.map +1 -0
  5. package/dist/agent/index.js +315 -0
  6. package/dist/agent/index.js.map +1 -0
  7. package/dist/agent/prompt.d.ts +24 -0
  8. package/dist/agent/prompt.d.ts.map +1 -0
  9. package/dist/agent/prompt.js +137 -0
  10. package/dist/agent/prompt.js.map +1 -0
  11. package/dist/cli.d.ts +15 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +303 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/constants.d.ts +18 -0
  16. package/dist/constants.d.ts.map +1 -0
  17. package/dist/constants.js +18 -0
  18. package/dist/constants.js.map +1 -0
  19. package/dist/heartbeat/index.d.ts +38 -0
  20. package/dist/heartbeat/index.d.ts.map +1 -0
  21. package/dist/heartbeat/index.js +127 -0
  22. package/dist/heartbeat/index.js.map +1 -0
  23. package/dist/identity/index.d.ts +39 -0
  24. package/dist/identity/index.d.ts.map +1 -0
  25. package/dist/identity/index.js +134 -0
  26. package/dist/identity/index.js.map +1 -0
  27. package/dist/index.d.ts +33 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +36 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/market/index.d.ts +73 -0
  32. package/dist/market/index.d.ts.map +1 -0
  33. package/dist/market/index.js +205 -0
  34. package/dist/market/index.js.map +1 -0
  35. package/dist/self-mod/index.d.ts +30 -0
  36. package/dist/self-mod/index.d.ts.map +1 -0
  37. package/dist/self-mod/index.js +83 -0
  38. package/dist/self-mod/index.js.map +1 -0
  39. package/dist/skills/check-balance.d.ts +7 -0
  40. package/dist/skills/check-balance.d.ts.map +1 -0
  41. package/dist/skills/check-balance.js +46 -0
  42. package/dist/skills/check-balance.js.map +1 -0
  43. package/dist/skills/check-stats.d.ts +6 -0
  44. package/dist/skills/check-stats.d.ts.map +1 -0
  45. package/dist/skills/check-stats.js +49 -0
  46. package/dist/skills/check-stats.js.map +1 -0
  47. package/dist/skills/claim-fees.d.ts +14 -0
  48. package/dist/skills/claim-fees.d.ts.map +1 -0
  49. package/dist/skills/claim-fees.js +109 -0
  50. package/dist/skills/claim-fees.js.map +1 -0
  51. package/dist/skills/conway.d.ts +16 -0
  52. package/dist/skills/conway.d.ts.map +1 -0
  53. package/dist/skills/conway.js +97 -0
  54. package/dist/skills/conway.js.map +1 -0
  55. package/dist/skills/deploy.d.ts +19 -0
  56. package/dist/skills/deploy.d.ts.map +1 -0
  57. package/dist/skills/deploy.js +167 -0
  58. package/dist/skills/deploy.js.map +1 -0
  59. package/dist/skills/edit-soul.d.ts +10 -0
  60. package/dist/skills/edit-soul.d.ts.map +1 -0
  61. package/dist/skills/edit-soul.js +68 -0
  62. package/dist/skills/edit-soul.js.map +1 -0
  63. package/dist/skills/index.d.ts +21 -0
  64. package/dist/skills/index.d.ts.map +1 -0
  65. package/dist/skills/index.js +59 -0
  66. package/dist/skills/index.js.map +1 -0
  67. package/dist/skills/shell.d.ts +12 -0
  68. package/dist/skills/shell.d.ts.map +1 -0
  69. package/dist/skills/shell.js +66 -0
  70. package/dist/skills/shell.js.map +1 -0
  71. package/dist/skills/swap.d.ts +6 -0
  72. package/dist/skills/swap.d.ts.map +1 -0
  73. package/dist/skills/swap.js +87 -0
  74. package/dist/skills/swap.js.map +1 -0
  75. package/dist/skills/transfer.d.ts +7 -0
  76. package/dist/skills/transfer.d.ts.map +1 -0
  77. package/dist/skills/transfer.js +82 -0
  78. package/dist/skills/transfer.js.map +1 -0
  79. package/dist/state/index.d.ts +44 -0
  80. package/dist/state/index.d.ts.map +1 -0
  81. package/dist/state/index.js +266 -0
  82. package/dist/state/index.js.map +1 -0
  83. package/dist/survival/index.d.ts +49 -0
  84. package/dist/survival/index.d.ts.map +1 -0
  85. package/dist/survival/index.js +151 -0
  86. package/dist/survival/index.js.map +1 -0
  87. package/dist/types.d.ts +132 -0
  88. package/dist/types.d.ts.map +1 -0
  89. package/dist/types.js +17 -0
  90. package/dist/types.js.map +1 -0
  91. package/package.json +60 -0
@@ -0,0 +1,205 @@
1
+ /**
2
+ * Market intelligence — the agent's eyes on-chain.
3
+ *
4
+ * Reads real state: gas prices, fee balances, token stats, ETH balance.
5
+ * Uses the Clawncher SDK for all on-chain reads — no local ABI duplication.
6
+ */
7
+ import { formatEther, } from 'viem';
8
+ import { ClawnchReader, ERC20ABI, } from '@clawnch/clawncher-sdk';
9
+ import { BASE_WETH, GAS_PER_TX, CLAIM_TX_COUNT, MIN_CLAIM_PROFIT_WEI, INFERENCE_COST_ETH_EQUIV, } from '../constants.js';
10
+ // ============================================================================
11
+ // Market Intelligence
12
+ // ============================================================================
13
+ export class MarketIntelligence {
14
+ publicClient;
15
+ address;
16
+ state;
17
+ reader;
18
+ constructor(publicClient, address, state, network = 'mainnet') {
19
+ this.publicClient = publicClient;
20
+ this.address = address;
21
+ this.state = state;
22
+ this.reader = new ClawnchReader({ publicClient: publicClient, network });
23
+ }
24
+ /**
25
+ * Take a full market snapshot — all data from chain, no caching.
26
+ */
27
+ async snapshot(tokenAddress) {
28
+ const timestamp = Date.now();
29
+ const [ethBalance, gasPrice, feesData] = await Promise.all([
30
+ this.publicClient.getBalance({ address: this.address }),
31
+ this.publicClient.getGasPrice(),
32
+ this.fetchFees(tokenAddress),
33
+ ]);
34
+ const estimatedTxCostWei = gasPrice * GAS_PER_TX;
35
+ const estimatedClaimCostWei = estimatedTxCostWei * CLAIM_TX_COUNT;
36
+ const claimProfitWei = feesData.unclaimedWeth > estimatedClaimCostWei
37
+ ? feesData.unclaimedWeth - estimatedClaimCostWei
38
+ : 0n - (estimatedClaimCostWei - feesData.unclaimedWeth);
39
+ const claimIsProfitable = claimProfitWei > MIN_CLAIM_PROFIT_WEI;
40
+ let ownToken = null;
41
+ if (tokenAddress) {
42
+ ownToken = await this.fetchOwnTokenStats(tokenAddress);
43
+ }
44
+ const txBudget = estimatedTxCostWei > 0n
45
+ ? Number(ethBalance / estimatedTxCostWei)
46
+ : 0;
47
+ return {
48
+ timestamp,
49
+ ethBalance,
50
+ ethFormatted: formatEther(ethBalance),
51
+ gasPrice,
52
+ estimatedTxCostWei,
53
+ estimatedClaimCostWei,
54
+ estimatedClaimCostEth: formatEther(estimatedClaimCostWei),
55
+ unclaimedFeesWeth: feesData.unclaimedWeth,
56
+ unclaimedFeesWethFormatted: formatEther(feesData.unclaimedWeth),
57
+ unclaimedFeesToken: feesData.unclaimedToken,
58
+ unclaimedFeesTokenFormatted: feesData.unclaimedTokenFormatted,
59
+ claimProfitWei,
60
+ claimProfitEth: formatEther(claimProfitWei < 0n ? 0n : claimProfitWei),
61
+ claimIsProfitable,
62
+ ownToken,
63
+ txBudget,
64
+ };
65
+ }
66
+ /**
67
+ * Evaluate conditions from a snapshot — actionable signals.
68
+ */
69
+ evaluate(snap) {
70
+ const { ethBalance, estimatedTxCostWei, claimIsProfitable, unclaimedFeesWeth } = snap;
71
+ const dailyTxBudget = 96n;
72
+ const dailyCostWei = estimatedTxCostWei * dailyTxBudget + INFERENCE_COST_ETH_EQUIV * 48n;
73
+ const operationallyHealthy = ethBalance > dailyCostWei;
74
+ const estimatedHoursRemaining = dailyCostWei > 0n
75
+ ? Number((ethBalance * 24n) / dailyCostWei)
76
+ : 0;
77
+ const survivalThreshold = dailyCostWei * 2n;
78
+ const survivalClaimNeeded = ethBalance < survivalThreshold && unclaimedFeesWeth > snap.estimatedClaimCostWei;
79
+ const needsToken = snap.ownToken === null;
80
+ const lines = [];
81
+ if (claimIsProfitable) {
82
+ lines.push(`Claimable fees: ${snap.unclaimedFeesWethFormatted} WETH (profit after gas: ${snap.claimProfitEth} ETH)`);
83
+ }
84
+ else if (unclaimedFeesWeth > 0n) {
85
+ lines.push(`Fees pooling: ${snap.unclaimedFeesWethFormatted} WETH (not yet worth claiming, gas would cost ${snap.estimatedClaimCostEth} ETH)`);
86
+ }
87
+ if (survivalClaimNeeded) {
88
+ lines.push(`SURVIVAL: ETH low (${snap.ethFormatted}), claiming fees to stay alive.`);
89
+ }
90
+ if (!operationallyHealthy) {
91
+ lines.push(`WARNING: ~${estimatedHoursRemaining}h of operation remaining at current gas prices.`);
92
+ }
93
+ if (needsToken) {
94
+ lines.push('No token deployed yet.');
95
+ }
96
+ lines.push(`TX budget: ~${snap.txBudget} transactions at current gas (${formatGwei(snap.gasPrice)} gwei)`);
97
+ return {
98
+ feesWorthClaiming: claimIsProfitable,
99
+ survivalClaimNeeded,
100
+ operationallyHealthy,
101
+ estimatedHoursRemaining,
102
+ needsToken,
103
+ summary: lines.join('\n'),
104
+ };
105
+ }
106
+ /**
107
+ * Quick check: should the agent wake up?
108
+ */
109
+ async shouldWake(tokenAddress) {
110
+ try {
111
+ const snap = await this.snapshot(tokenAddress);
112
+ const conditions = this.evaluate(snap);
113
+ if (conditions.survivalClaimNeeded) {
114
+ return { wake: true, reason: 'Survival claim needed — ETH low, fees available' };
115
+ }
116
+ if (conditions.feesWorthClaiming) {
117
+ return { wake: true, reason: `Fees worth claiming: ${snap.unclaimedFeesWethFormatted} WETH` };
118
+ }
119
+ if (!conditions.operationallyHealthy) {
120
+ return { wake: true, reason: `Only ${conditions.estimatedHoursRemaining}h of operation remaining` };
121
+ }
122
+ return { wake: false, reason: 'Nothing actionable' };
123
+ }
124
+ catch (err) {
125
+ return { wake: false, reason: `Check failed: ${err instanceof Error ? err.message : String(err)}` };
126
+ }
127
+ }
128
+ // --------------------------------------------------------------------------
129
+ // Internal
130
+ // --------------------------------------------------------------------------
131
+ async fetchFees(tokenAddress) {
132
+ if (!tokenAddress) {
133
+ return { unclaimedWeth: 0n, unclaimedToken: 0n, unclaimedTokenFormatted: '0' };
134
+ }
135
+ try {
136
+ const [wethFees, tokenFees] = await Promise.all([
137
+ this.reader.getAvailableFees(this.address, BASE_WETH),
138
+ this.reader.getAvailableFees(this.address, tokenAddress),
139
+ ]);
140
+ return {
141
+ unclaimedWeth: wethFees,
142
+ unclaimedToken: tokenFees,
143
+ unclaimedTokenFormatted: formatEther(tokenFees),
144
+ };
145
+ }
146
+ catch {
147
+ return { unclaimedWeth: 0n, unclaimedToken: 0n, unclaimedTokenFormatted: '0' };
148
+ }
149
+ }
150
+ /**
151
+ * Fetch own token stats using the SDK's ClawnchReader + ERC20ABI.
152
+ */
153
+ async fetchOwnTokenStats(tokenAddress) {
154
+ try {
155
+ // Use SDK's reader for name/symbol/decimals/totalSupply in one call
156
+ const tokenInfo = await this.reader.getTokenInfo(tokenAddress);
157
+ // Balance requires a separate read (reader doesn't do balanceOf for arbitrary wallets)
158
+ const balance = await this.publicClient.readContract({
159
+ address: tokenAddress,
160
+ abi: ERC20ABI,
161
+ functionName: 'balanceOf',
162
+ args: [this.address],
163
+ });
164
+ const holdingPct = tokenInfo.totalSupply > 0n
165
+ ? Number((balance * 10000n) / tokenInfo.totalSupply) / 100
166
+ : 0;
167
+ return {
168
+ address: tokenAddress,
169
+ symbol: tokenInfo.symbol,
170
+ balance,
171
+ balanceFormatted: formatEther(balance),
172
+ totalSupply: tokenInfo.totalSupply,
173
+ holdingPct,
174
+ };
175
+ }
176
+ catch {
177
+ return null;
178
+ }
179
+ }
180
+ }
181
+ // ============================================================================
182
+ // Helpers
183
+ // ============================================================================
184
+ function formatGwei(wei) {
185
+ return (Number(wei) / 1e9).toFixed(4);
186
+ }
187
+ export function formatSnapshot(snap) {
188
+ const lines = [
189
+ `=== Market Snapshot (${new Date(snap.timestamp).toISOString()}) ===`,
190
+ `ETH Balance: ${snap.ethFormatted} ETH`,
191
+ `Gas Price: ${formatGwei(snap.gasPrice)} gwei`,
192
+ `Est. Claim Cost (3 txs): ${snap.estimatedClaimCostEth} ETH`,
193
+ `Unclaimed WETH Fees: ${snap.unclaimedFeesWethFormatted}`,
194
+ `Unclaimed Token Fees: ${snap.unclaimedFeesTokenFormatted}`,
195
+ `Claim Profitable: ${snap.claimIsProfitable ? `YES (profit: ${snap.claimProfitEth} ETH)` : 'NO (gas exceeds fees)'}`,
196
+ `TX Budget: ~${snap.txBudget} transactions remaining`,
197
+ ];
198
+ if (snap.ownToken) {
199
+ lines.push(`--- Own Token ---`);
200
+ lines.push(`$${snap.ownToken.symbol} (${snap.ownToken.address})`);
201
+ lines.push(`Balance: ${snap.ownToken.balanceFormatted} (${snap.ownToken.holdingPct.toFixed(2)}% of supply)`);
202
+ }
203
+ return lines.join('\n');
204
+ }
205
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/market/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Self-modification audit module.
3
+ *
4
+ * Tracks all changes the agent makes to itself or its environment.
5
+ * Provides a tamper-evident log that the creator can audit.
6
+ */
7
+ import type { StateStore } from '../state/index.js';
8
+ export declare class SelfModAuditor {
9
+ private stateDir;
10
+ private gitDir;
11
+ private state;
12
+ constructor(stateDir: string, state: StateStore);
13
+ /**
14
+ * Initialize the git-backed audit trail.
15
+ */
16
+ init(): void;
17
+ /**
18
+ * Record a file modification.
19
+ */
20
+ recordModification(filename: string, content: string, reason: string): void;
21
+ /**
22
+ * Get modification history.
23
+ */
24
+ getHistory(limit?: number): string[];
25
+ /**
26
+ * Get diff for a specific commit.
27
+ */
28
+ getDiff(commitHash: string): string;
29
+ }
30
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/self-mod/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAa;gBAEd,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU;IAM/C;;OAEG;IACH,IAAI,IAAI,IAAI;IAiBZ;;OAEG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAoB3E;;OAEG;IACH,UAAU,CAAC,KAAK,GAAE,MAAW,GAAG,MAAM,EAAE;IAYxC;;OAEG;IACH,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;CAUpC"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Self-modification audit module.
3
+ *
4
+ * Tracks all changes the agent makes to itself or its environment.
5
+ * Provides a tamper-evident log that the creator can audit.
6
+ */
7
+ import { execSync } from 'node:child_process';
8
+ import { existsSync, writeFileSync, mkdirSync } from 'node:fs';
9
+ import { join } from 'node:path';
10
+ export class SelfModAuditor {
11
+ stateDir;
12
+ gitDir;
13
+ state;
14
+ constructor(stateDir, state) {
15
+ this.stateDir = stateDir;
16
+ this.gitDir = join(stateDir, 'modifications');
17
+ this.state = state;
18
+ }
19
+ /**
20
+ * Initialize the git-backed audit trail.
21
+ */
22
+ init() {
23
+ mkdirSync(this.gitDir, { recursive: true });
24
+ if (!existsSync(join(this.gitDir, '.git'))) {
25
+ execSync('git init', { cwd: this.gitDir, stdio: 'ignore' });
26
+ execSync('git config user.name "clawtomaton"', { cwd: this.gitDir, stdio: 'ignore' });
27
+ execSync('git config user.email "agent@clawtomaton.local"', { cwd: this.gitDir, stdio: 'ignore' });
28
+ // Initial commit
29
+ writeFileSync(join(this.gitDir, 'README.md'), '# Clawtomaton Self-Modification Log\n\nThis directory tracks all modifications made by the agent.\n');
30
+ execSync('git add -A && git commit -m "init: self-modification audit trail"', {
31
+ cwd: this.gitDir,
32
+ stdio: 'ignore',
33
+ });
34
+ }
35
+ }
36
+ /**
37
+ * Record a file modification.
38
+ */
39
+ recordModification(filename, content, reason) {
40
+ const filepath = join(this.gitDir, filename);
41
+ const dir = join(this.gitDir, ...filename.split('/').slice(0, -1));
42
+ mkdirSync(dir, { recursive: true });
43
+ writeFileSync(filepath, content, 'utf-8');
44
+ try {
45
+ execSync('git add -A', { cwd: this.gitDir, stdio: 'ignore' });
46
+ execSync(`git commit -m "${escapeGitMessage(reason)}"`, {
47
+ cwd: this.gitDir,
48
+ stdio: 'ignore',
49
+ });
50
+ }
51
+ catch {
52
+ // No changes to commit (identical content)
53
+ }
54
+ this.state.audit('self_mod', `Modified ${filename}: ${reason}`);
55
+ }
56
+ /**
57
+ * Get modification history.
58
+ */
59
+ getHistory(limit = 20) {
60
+ try {
61
+ const log = execSync(`git log --oneline -n ${limit}`, { cwd: this.gitDir, encoding: 'utf-8' });
62
+ return log.trim().split('\n').filter(Boolean);
63
+ }
64
+ catch {
65
+ return [];
66
+ }
67
+ }
68
+ /**
69
+ * Get diff for a specific commit.
70
+ */
71
+ getDiff(commitHash) {
72
+ try {
73
+ return execSync(`git show --stat ${commitHash}`, { cwd: this.gitDir, encoding: 'utf-8', maxBuffer: 1024 * 1024 });
74
+ }
75
+ catch {
76
+ return '(unable to read diff)';
77
+ }
78
+ }
79
+ }
80
+ function escapeGitMessage(msg) {
81
+ return msg.replace(/"/g, '\\"').replace(/\n/g, ' ').slice(0, 200);
82
+ }
83
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/self-mod/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,OAAO,cAAc;IACjB,QAAQ,CAAS;IACjB,MAAM,CAAS;IACf,KAAK,CAAa;IAE1B,YAAY,QAAgB,EAAE,KAAiB;QAC7C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,IAAI;QACF,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE5C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;YAC3C,QAAQ,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC5D,QAAQ,CAAC,oCAAoC,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YACtF,QAAQ,CAAC,iDAAiD,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAEnG,iBAAiB;YACjB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,qGAAqG,CAAC,CAAC;YACrJ,QAAQ,CAAC,mEAAmE,EAAE;gBAC5E,GAAG,EAAE,IAAI,CAAC,MAAM;gBAChB,KAAK,EAAE,QAAQ;aAChB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,QAAgB,EAAE,OAAe,EAAE,MAAc;QAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACnE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEpC,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAE1C,IAAI,CAAC;YACH,QAAQ,CAAC,YAAY,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC9D,QAAQ,CAAC,kBAAkB,gBAAgB,CAAC,MAAM,CAAC,GAAG,EAAE;gBACtD,GAAG,EAAE,IAAI,CAAC,MAAM;gBAChB,KAAK,EAAE,QAAQ;aAChB,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,2CAA2C;QAC7C,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,YAAY,QAAQ,KAAK,MAAM,EAAE,CAAC,CAAC;IAClE,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,QAAgB,EAAE;QAC3B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,QAAQ,CAClB,wBAAwB,KAAK,EAAE,EAC/B,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CACxC,CAAC;YACF,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,UAAkB;QACxB,IAAI,CAAC;YACH,OAAO,QAAQ,CACb,mBAAmB,UAAU,EAAE,EAC/B,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,GAAG,IAAI,EAAE,CAChE,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,uBAAuB,CAAC;QACjC,CAAC;IACH,CAAC;CACF;AAED,SAAS,gBAAgB,CAAC,GAAW;IACnC,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACpE,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Skill: check_balance — Check ETH and token balances.
3
+ * Uses ClawnchSwapper from the SDK for balance reads.
4
+ */
5
+ import type { SkillDefinition } from '../types.js';
6
+ export declare const checkBalanceSkill: SkillDefinition;
7
+ //# sourceMappingURL=check-balance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-balance.d.ts","sourceRoot":"","sources":["../../src/skills/check-balance.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,eAAe,EAA4B,MAAM,aAAa,CAAC;AAE7E,eAAO,MAAM,iBAAiB,EAAE,eAyC/B,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Skill: check_balance — Check ETH and token balances.
3
+ * Uses ClawnchSwapper from the SDK for balance reads.
4
+ */
5
+ import { ClawnchSwapper } from '@clawnch/clawncher-sdk';
6
+ import { formatEther } from 'viem';
7
+ export const checkBalanceSkill = {
8
+ name: 'check_balance',
9
+ description: 'Check ETH balance and optionally a specific token balance for the agent wallet.',
10
+ parameters: [
11
+ {
12
+ name: 'token',
13
+ type: 'address',
14
+ description: 'Token contract address to check. Omit for ETH only.',
15
+ required: false,
16
+ },
17
+ ],
18
+ execute: async (params, ctx) => {
19
+ try {
20
+ const { buildClients } = await import('../identity/index.js');
21
+ const rpcUrl = process.env.BASE_RPC_URL ?? 'https://mainnet.base.org';
22
+ const { publicClient, walletClient } = buildClients(ctx.identity, rpcUrl);
23
+ const swapper = new ClawnchSwapper({
24
+ wallet: walletClient,
25
+ publicClient: publicClient,
26
+ network: 'mainnet',
27
+ });
28
+ const ethBalance = await publicClient.getBalance({ address: ctx.identity.address });
29
+ const lines = [`ETH: ${formatEther(ethBalance)}`];
30
+ if (params.token) {
31
+ const tokenAddr = params.token;
32
+ const [balance, symbol, formatted] = await Promise.all([
33
+ swapper.getBalance(tokenAddr, ctx.identity.address),
34
+ swapper.getSymbol(tokenAddr),
35
+ swapper.formatAmount(tokenAddr, await swapper.getBalance(tokenAddr, ctx.identity.address)),
36
+ ]);
37
+ lines.push(`${symbol}: ${formatted}`);
38
+ }
39
+ return { callId: '', success: true, result: lines.join('\n') };
40
+ }
41
+ catch (err) {
42
+ return { callId: '', success: false, result: null, error: err instanceof Error ? err.message : String(err) };
43
+ }
44
+ },
45
+ };
46
+ //# sourceMappingURL=check-balance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-balance.js","sourceRoot":"","sources":["../../src/skills/check-balance.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAgB,MAAM,MAAM,CAAC;AAGjD,MAAM,CAAC,MAAM,iBAAiB,GAAoB;IAChD,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE,iFAAiF;IAC9F,UAAU,EAAE;QACV;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,qDAAqD;YAClE,QAAQ,EAAE,KAAK;SAChB;KACF;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAuB,EAAE;QAClD,IAAI,CAAC;YACH,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;YAC9D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,0BAA0B,CAAC;YACtE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAE1E,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC;gBACjC,MAAM,EAAE,YAAmB;gBAC3B,YAAY,EAAE,YAAmB;gBACjC,OAAO,EAAE,SAAS;aACnB,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;YACpF,MAAM,KAAK,GAAa,CAAC,QAAQ,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAE5D,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,MAAM,SAAS,GAAG,MAAM,CAAC,KAAgB,CAAC;gBAC1C,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;oBACrD,OAAO,CAAC,UAAU,CAAC,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;oBACnD,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC;oBAC5B,OAAO,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;iBAC3F,CAAC,CAAC;gBACH,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,KAAK,SAAS,EAAE,CAAC,CAAC;YACxC,CAAC;YAED,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACjE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/G,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Skill: check_stats — Check token analytics and market data.
3
+ */
4
+ import type { SkillDefinition } from '../types.js';
5
+ export declare const checkStatsSkill: SkillDefinition;
6
+ //# sourceMappingURL=check-stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-stats.d.ts","sourceRoot":"","sources":["../../src/skills/check-stats.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAc,MAAM,aAAa,CAAC;AAE/D,eAAO,MAAM,eAAe,EAAE,eA4C7B,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Skill: check_stats — Check token analytics and market data.
3
+ */
4
+ import { ClawnchClient } from '@clawnch/clawncher-sdk';
5
+ export const checkStatsSkill = {
6
+ name: 'check_stats',
7
+ description: 'Check analytics and market data for a token by address or symbol.',
8
+ parameters: [
9
+ {
10
+ name: 'token',
11
+ type: 'string',
12
+ description: 'Token address or symbol to check.',
13
+ required: true,
14
+ },
15
+ ],
16
+ execute: async (params) => {
17
+ try {
18
+ const client = new ClawnchClient();
19
+ const token = params.token;
20
+ // Try by address first, then by symbol
21
+ const isAddress = token.startsWith('0x') && token.length === 42;
22
+ let analytics;
23
+ if (isAddress) {
24
+ analytics = await client.getTokenAnalytics(token);
25
+ }
26
+ else {
27
+ const tokenData = await client.getTokenBySymbol(token);
28
+ if (!tokenData) {
29
+ return { callId: '', success: false, result: null, error: `Token "${token}" not found` };
30
+ }
31
+ analytics = await client.getTokenAnalytics(tokenData.address);
32
+ }
33
+ return {
34
+ callId: '',
35
+ success: true,
36
+ result: JSON.stringify(analytics, null, 2),
37
+ };
38
+ }
39
+ catch (err) {
40
+ return {
41
+ callId: '',
42
+ success: false,
43
+ result: null,
44
+ error: err instanceof Error ? err.message : String(err),
45
+ };
46
+ }
47
+ },
48
+ };
49
+ //# sourceMappingURL=check-stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-stats.js","sourceRoot":"","sources":["../../src/skills/check-stats.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAGvD,MAAM,CAAC,MAAM,eAAe,GAAoB;IAC9C,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,mEAAmE;IAChF,UAAU,EAAE;QACV;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,mCAAmC;YAChD,QAAQ,EAAE,IAAI;SACf;KACF;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAuB,EAAE;QAC7C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAe,CAAC;YAErC,uCAAuC;YACvC,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,EAAE,CAAC;YAChE,IAAI,SAAS,CAAC;YAEd,IAAI,SAAS,EAAE,CAAC;gBACd,SAAS,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACpD,CAAC;iBAAM,CAAC;gBACN,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBACvD,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,KAAK,aAAa,EAAE,CAAC;gBAC3F,CAAC;gBACD,SAAS,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAChE,CAAC;YAED,OAAO;gBACL,MAAM,EAAE,EAAE;gBACV,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;aAC3C,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,MAAM,EAAE,EAAE;gBACV,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Skill: claim_fees — Gas-aware LP fee claiming.
3
+ *
4
+ * Does NOT blindly claim. Checks fee balance vs gas cost first.
5
+ * Only claims when:
6
+ * 1. Fees exceed gas cost by MIN_PROFIT threshold (normal mode), OR
7
+ * 2. Agent's ETH is critically low and ANY fees exist (survival mode)
8
+ *
9
+ * Three on-chain txs: collectRewards → claimFees(WETH) → claimFees(token).
10
+ * Each tx is checked independently — if WETH fees are 0, that tx is skipped.
11
+ */
12
+ import type { SkillDefinition } from '../types.js';
13
+ export declare const claimFeesSkill: SkillDefinition;
14
+ //# sourceMappingURL=claim-fees.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claim-fees.d.ts","sourceRoot":"","sources":["../../src/skills/claim-fees.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,eAAe,EAA4B,MAAM,aAAa,CAAC;AAI7E,eAAO,MAAM,cAAc,EAAE,eAuG5B,CAAC"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Skill: claim_fees — Gas-aware LP fee claiming.
3
+ *
4
+ * Does NOT blindly claim. Checks fee balance vs gas cost first.
5
+ * Only claims when:
6
+ * 1. Fees exceed gas cost by MIN_PROFIT threshold (normal mode), OR
7
+ * 2. Agent's ETH is critically low and ANY fees exist (survival mode)
8
+ *
9
+ * Three on-chain txs: collectRewards → claimFees(WETH) → claimFees(token).
10
+ * Each tx is checked independently — if WETH fees are 0, that tx is skipped.
11
+ */
12
+ import { ClawncherClaimer, ClawnchReader } from '@clawnch/clawncher-sdk';
13
+ import { formatEther } from 'viem';
14
+ import { SURVIVAL_THRESHOLDS } from '../types.js';
15
+ import { BASE_WETH, GAS_PER_TX, MIN_CLAIM_PROFIT_WEI } from '../constants.js';
16
+ export const claimFeesSkill = {
17
+ name: 'claim_fees',
18
+ description: [
19
+ 'Claim accumulated LP trading fees. Gas-aware: checks if fees exceed gas cost before claiming.',
20
+ 'In survival mode (low ETH), claims even small amounts.',
21
+ 'Use force=true to skip profitability check.',
22
+ ].join(' '),
23
+ parameters: [
24
+ {
25
+ name: 'token',
26
+ type: 'address',
27
+ description: 'Token address to claim fees for. Defaults to own token.',
28
+ required: false,
29
+ },
30
+ {
31
+ name: 'force',
32
+ type: 'boolean',
33
+ description: 'Force claim regardless of profitability. Use only in emergencies.',
34
+ required: false,
35
+ default: false,
36
+ },
37
+ ],
38
+ execute: async (params, ctx) => {
39
+ try {
40
+ const tokenAddress = params.token ?? ctx.identity.tokenAddress;
41
+ if (!tokenAddress) {
42
+ return { callId: '', success: false, result: null, error: 'No token address. Deploy a token first or specify one.' };
43
+ }
44
+ const { buildClients } = await import('../identity/index.js');
45
+ const rpcUrl = process.env.BASE_RPC_URL ?? 'https://mainnet.base.org';
46
+ const { publicClient, walletClient } = buildClients(ctx.identity, rpcUrl);
47
+ const reader = new ClawnchReader({ publicClient: publicClient, network: 'mainnet' });
48
+ // Check actual fee balances before doing anything
49
+ const [wethFees, tokenFees, gasPrice, ethBalance] = await Promise.all([
50
+ reader.getAvailableFees(ctx.identity.address, BASE_WETH),
51
+ reader.getAvailableFees(ctx.identity.address, tokenAddress),
52
+ publicClient.getGasPrice(),
53
+ publicClient.getBalance({ address: ctx.identity.address }),
54
+ ]);
55
+ const totalFees = wethFees;
56
+ const txCount = 1n + (wethFees > 0n ? 1n : 0n) + (tokenFees > 0n ? 1n : 0n);
57
+ const estimatedGasCost = gasPrice * GAS_PER_TX * txCount;
58
+ const netProfit = totalFees > estimatedGasCost ? totalFees - estimatedGasCost : 0n;
59
+ const force = params.force;
60
+ const survivalMode = ethBalance < SURVIVAL_THRESHOLDS.low_compute;
61
+ if (totalFees === 0n && tokenFees === 0n) {
62
+ return {
63
+ callId: '',
64
+ success: true,
65
+ result: 'No fees available to claim. Fees pool up from LP trading volume — check back later.',
66
+ };
67
+ }
68
+ if (!force && !survivalMode && netProfit < MIN_CLAIM_PROFIT_WEI) {
69
+ return {
70
+ callId: '',
71
+ success: true,
72
+ result: [
73
+ `Fees are pooling but not worth claiming yet.`,
74
+ `Unclaimed WETH: ${formatEther(wethFees)}`,
75
+ `Unclaimed token: ${formatEther(tokenFees)}`,
76
+ `Gas cost to claim: ~${formatEther(estimatedGasCost)} ETH (${txCount} txs)`,
77
+ `Net profit: ${formatEther(netProfit)} ETH`,
78
+ `Threshold: ${formatEther(MIN_CLAIM_PROFIT_WEI)} ETH`,
79
+ `Let fees accumulate. They're safe in the FeeLocker.`,
80
+ ].join('\n'),
81
+ };
82
+ }
83
+ const reason = survivalMode ? 'SURVIVAL MODE' : force ? 'FORCED' : `profitable (net ${formatEther(netProfit)} ETH)`;
84
+ const claimer = new ClawncherClaimer({
85
+ wallet: walletClient,
86
+ publicClient: publicClient,
87
+ network: 'mainnet',
88
+ });
89
+ const result = await claimer.claimAll(tokenAddress, ctx.identity.address);
90
+ const lines = [`Fee claim executed (${reason}):`];
91
+ if (result.collectRewards) {
92
+ lines.push(` collectRewards: ${result.collectRewards.txHash}`);
93
+ }
94
+ if (result.claimFeesWeth) {
95
+ lines.push(` claimFees WETH: ${result.claimFeesWeth.txHash} (${formatEther(wethFees)} WETH)`);
96
+ }
97
+ if (result.claimFeesToken) {
98
+ lines.push(` claimFees token: ${result.claimFeesToken.txHash} (${formatEther(tokenFees)} tokens)`);
99
+ }
100
+ const newEthBalance = await publicClient.getBalance({ address: ctx.identity.address });
101
+ lines.push(`ETH balance after claim: ${formatEther(newEthBalance)}`);
102
+ return { callId: '', success: true, result: lines.join('\n') };
103
+ }
104
+ catch (err) {
105
+ return { callId: '', success: false, result: null, error: err instanceof Error ? err.message : String(err) };
106
+ }
107
+ },
108
+ };
109
+ //# sourceMappingURL=claim-fees.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claim-fees.js","sourceRoot":"","sources":["../../src/skills/claim-fees.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Skill: conway — Conway Terminal integration for domains and VMs.
3
+ *
4
+ * Wraps the `conway-terminal` npm package. Requires a Conway API key
5
+ * in the agent's config. Capabilities:
6
+ * - Buy domains
7
+ * - Provision VMs (for hosting frontends, APIs, etc.)
8
+ * - Check domain availability
9
+ * - List owned resources
10
+ *
11
+ * This is optional infrastructure — agents don't need it to function,
12
+ * but it lets them build real web presence.
13
+ */
14
+ import type { SkillDefinition } from '../types.js';
15
+ export declare const conwaySkill: SkillDefinition;
16
+ //# sourceMappingURL=conway.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conway.d.ts","sourceRoot":"","sources":["../../src/skills/conway.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,eAAe,EAA4B,MAAM,aAAa,CAAC;AAE7E,eAAO,MAAM,WAAW,EAAE,eAuFzB,CAAC"}