@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,87 @@
1
+ /**
2
+ * Skill: swap — Swap tokens via 0x through the Clawncher API proxy.
3
+ */
4
+ import { ClawnchSwapper, NATIVE_TOKEN_ADDRESS } from '@clawnch/clawncher-sdk';
5
+ import { parseEther } from 'viem';
6
+ export const swapSkill = {
7
+ name: 'swap',
8
+ description: 'Swap tokens on Base via 0x aggregation. Supports ETH and any ERC-20.',
9
+ parameters: [
10
+ {
11
+ name: 'sellToken',
12
+ type: 'address',
13
+ description: 'Token to sell. Use "ETH" or the zero address for native ETH.',
14
+ required: true,
15
+ },
16
+ {
17
+ name: 'buyToken',
18
+ type: 'address',
19
+ description: 'Token to buy.',
20
+ required: true,
21
+ },
22
+ {
23
+ name: 'amount',
24
+ type: 'string',
25
+ description: 'Amount to sell in human-readable units (e.g. "0.01" for 0.01 ETH).',
26
+ required: true,
27
+ },
28
+ {
29
+ name: 'slippageBps',
30
+ type: 'number',
31
+ description: 'Slippage tolerance in basis points. Default: 100 (1%).',
32
+ required: false,
33
+ default: 100,
34
+ },
35
+ ],
36
+ execute: async (params, ctx) => {
37
+ try {
38
+ const { buildClients } = await import('../identity/index.js');
39
+ const rpcUrl = process.env.BASE_RPC_URL ?? 'https://mainnet.base.org';
40
+ const { publicClient, walletClient } = buildClients(ctx.identity, rpcUrl);
41
+ const swapper = new ClawnchSwapper({
42
+ wallet: walletClient,
43
+ publicClient: publicClient,
44
+ network: 'mainnet',
45
+ });
46
+ // Resolve "ETH" to native token address
47
+ let sellToken = params.sellToken;
48
+ if (sellToken.toUpperCase() === 'ETH' || sellToken === '0x0000000000000000000000000000000000000000') {
49
+ sellToken = NATIVE_TOKEN_ADDRESS;
50
+ }
51
+ let buyToken = params.buyToken;
52
+ if (buyToken.toUpperCase() === 'ETH' || buyToken === '0x0000000000000000000000000000000000000000') {
53
+ buyToken = NATIVE_TOKEN_ADDRESS;
54
+ }
55
+ // Parse amount — for ETH we use 18 decimals, for tokens we fetch
56
+ const amountStr = params.amount;
57
+ let sellAmount;
58
+ if (sellToken === NATIVE_TOKEN_ADDRESS) {
59
+ sellAmount = parseEther(amountStr);
60
+ }
61
+ else {
62
+ const decimals = await swapper.getDecimals(sellToken);
63
+ sellAmount = BigInt(Math.floor(parseFloat(amountStr) * 10 ** decimals));
64
+ }
65
+ const result = await swapper.swap({
66
+ sellToken: sellToken,
67
+ buyToken: buyToken,
68
+ sellAmount,
69
+ slippageBps: params.slippageBps ?? 100,
70
+ });
71
+ const buySymbol = await swapper.getSymbol(buyToken);
72
+ const buyFormatted = await swapper.formatAmount(buyToken, result.buyAmount);
73
+ const lines = [
74
+ `Swap complete!`,
75
+ `Sold: ${amountStr}`,
76
+ `Bought: ${buyFormatted} ${buySymbol}`,
77
+ `TX: ${result.txHash}`,
78
+ `Gas used: ${result.gasUsed.toString()}`,
79
+ ];
80
+ return { callId: '', success: true, result: lines.join('\n') };
81
+ }
82
+ catch (err) {
83
+ return { callId: '', success: false, result: null, error: err instanceof Error ? err.message : String(err) };
84
+ }
85
+ },
86
+ };
87
+ //# sourceMappingURL=swap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swap.js","sourceRoot":"","sources":["../../src/skills/swap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Skill: transfer — Send ETH or ERC-20 tokens to an address.
3
+ * Uses viem's built-in erc20Abi and SDK's ClawnchSwapper for reads.
4
+ */
5
+ import type { SkillDefinition } from '../types.js';
6
+ export declare const transferSkill: SkillDefinition;
7
+ //# sourceMappingURL=transfer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../../src/skills/transfer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,OAAO,KAAK,EAAE,eAAe,EAA4B,MAAM,aAAa,CAAC;AAE7E,eAAO,MAAM,aAAa,EAAE,eAiF3B,CAAC"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Skill: transfer — Send ETH or ERC-20 tokens to an address.
3
+ * Uses viem's built-in erc20Abi and SDK's ClawnchSwapper for reads.
4
+ */
5
+ import { parseEther, erc20Abi, } from 'viem';
6
+ import { ClawnchSwapper } from '@clawnch/clawncher-sdk';
7
+ export const transferSkill = {
8
+ name: 'transfer',
9
+ description: 'Send ETH or ERC-20 tokens to a recipient address.',
10
+ parameters: [
11
+ {
12
+ name: 'to',
13
+ type: 'address',
14
+ description: 'Recipient address.',
15
+ required: true,
16
+ },
17
+ {
18
+ name: 'amount',
19
+ type: 'string',
20
+ description: 'Amount to send in human-readable units.',
21
+ required: true,
22
+ },
23
+ {
24
+ name: 'token',
25
+ type: 'address',
26
+ description: 'Token contract address. Omit for native ETH.',
27
+ required: false,
28
+ },
29
+ ],
30
+ execute: async (params, ctx) => {
31
+ try {
32
+ const { buildClients } = await import('../identity/index.js');
33
+ const rpcUrl = process.env.BASE_RPC_URL ?? 'https://mainnet.base.org';
34
+ const { publicClient, walletClient } = buildClients(ctx.identity, rpcUrl);
35
+ const to = params.to;
36
+ const amountStr = params.amount;
37
+ const tokenAddr = params.token;
38
+ let txHash;
39
+ if (!tokenAddr) {
40
+ // Native ETH transfer
41
+ const value = parseEther(amountStr);
42
+ txHash = await walletClient.sendTransaction({
43
+ to,
44
+ value,
45
+ chain: undefined,
46
+ account: undefined,
47
+ });
48
+ const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash });
49
+ if (receipt.status === 'reverted') {
50
+ return { callId: '', success: false, result: null, error: `Transfer reverted: ${txHash}` };
51
+ }
52
+ return { callId: '', success: true, result: `Sent ${amountStr} ETH to ${to}\nTX: ${txHash}` };
53
+ }
54
+ else {
55
+ // ERC-20 transfer — use SDK for reads, viem's erc20Abi for write
56
+ const swapper = new ClawnchSwapper({
57
+ wallet: walletClient,
58
+ publicClient: publicClient,
59
+ network: 'mainnet',
60
+ });
61
+ const decimals = await swapper.getDecimals(tokenAddr);
62
+ const symbol = await swapper.getSymbol(tokenAddr);
63
+ const amount = BigInt(Math.floor(parseFloat(amountStr) * 10 ** decimals));
64
+ txHash = await walletClient.writeContract({
65
+ address: tokenAddr,
66
+ abi: erc20Abi,
67
+ functionName: 'transfer',
68
+ args: [to, amount],
69
+ });
70
+ const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash });
71
+ if (receipt.status === 'reverted') {
72
+ return { callId: '', success: false, result: null, error: `Transfer reverted: ${txHash}` };
73
+ }
74
+ return { callId: '', success: true, result: `Sent ${amountStr} ${symbol} to ${to}\nTX: ${txHash}` };
75
+ }
76
+ }
77
+ catch (err) {
78
+ return { callId: '', success: false, result: null, error: err instanceof Error ? err.message : String(err) };
79
+ }
80
+ },
81
+ };
82
+ //# sourceMappingURL=transfer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../src/skills/transfer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * SQLite persistence layer for Clawtomaton state.
3
+ *
4
+ * Stores identity, conversation history, heartbeat state, audit log,
5
+ * and SOUL.md content. All data is local — the agent owns its own state.
6
+ */
7
+ import type { ClawtomatonIdentity, SurvivalState, ConversationTurn, ActivationResult } from '../types.js';
8
+ export declare class StateStore {
9
+ private db;
10
+ constructor(stateDir: string);
11
+ private migrate;
12
+ saveIdentity(identity: ClawtomatonIdentity): void;
13
+ getIdentity(): ClawtomatonIdentity | null;
14
+ updateIdentityToken(tokenAddress: string, tokenSymbol: string, deployTxHash: string): void;
15
+ saveActivation(result: ActivationResult): void;
16
+ getActivation(): ActivationResult | null;
17
+ isActivated(): boolean;
18
+ saveSurvival(state: SurvivalState): void;
19
+ getSurvival(): SurvivalState;
20
+ addTurn(turn: ConversationTurn): void;
21
+ getHistory(limit: number): ConversationTurn[];
22
+ getTurnCount(): number;
23
+ clearHistory(): void;
24
+ getHeartbeatLastRun(taskName: string): number;
25
+ setHeartbeatLastRun(taskName: string, timestamp: number): void;
26
+ isHeartbeatEnabled(taskName: string): boolean;
27
+ setHeartbeatEnabled(taskName: string, enabled: boolean): void;
28
+ audit(action: string, details: string, txHash?: string): void;
29
+ getAuditLog(limit?: number): AuditEntry[];
30
+ set(key: string, value: string): void;
31
+ get(key: string): string | null;
32
+ delete(key: string): void;
33
+ getSoul(): string;
34
+ setSoul(content: string): void;
35
+ close(): void;
36
+ }
37
+ export interface AuditEntry {
38
+ id: number;
39
+ timestamp: number;
40
+ action: string;
41
+ details: string;
42
+ tx_hash: string | null;
43
+ }
44
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/state/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EACV,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAGhB,gBAAgB,EACjB,MAAM,aAAa,CAAC;AAMrB,qBAAa,UAAU;IACrB,OAAO,CAAC,EAAE,CAAoB;gBAElB,QAAQ,EAAE,MAAM;IAa5B,OAAO,CAAC,OAAO;IAkEf,YAAY,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI;IAiBjD,WAAW,IAAI,mBAAmB,GAAG,IAAI;IAgBzC,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAU1F,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAO9C,aAAa,IAAI,gBAAgB,GAAG,IAAI;IAUxC,WAAW,IAAI,OAAO;IAQtB,YAAY,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAcxC,WAAW,IAAI,aAAa;IA0B5B,OAAO,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAarC,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAc7C,YAAY,IAAI,MAAM;IAKtB,YAAY,IAAI,IAAI;IAQpB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAK7C,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAO9D,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAK7C,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAW7D,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAM7D,WAAW,CAAC,KAAK,GAAE,MAAY,GAAG,UAAU,EAAE;IAU9C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAOrC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAK/B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAQzB,OAAO,IAAI,MAAM;IAIjB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAS9B,KAAK,IAAI,IAAI;CAGd;AAMD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB"}
@@ -0,0 +1,266 @@
1
+ /**
2
+ * SQLite persistence layer for Clawtomaton state.
3
+ *
4
+ * Stores identity, conversation history, heartbeat state, audit log,
5
+ * and SOUL.md content. All data is local — the agent owns its own state.
6
+ */
7
+ import Database from 'better-sqlite3';
8
+ import { mkdirSync } from 'node:fs';
9
+ import { join } from 'node:path';
10
+ // ============================================================================
11
+ // State Store
12
+ // ============================================================================
13
+ export class StateStore {
14
+ db;
15
+ constructor(stateDir) {
16
+ mkdirSync(stateDir, { recursive: true });
17
+ const dbPath = join(stateDir, 'clawtomaton.db');
18
+ this.db = new Database(dbPath);
19
+ this.db.pragma('journal_mode = WAL');
20
+ this.db.pragma('foreign_keys = ON');
21
+ this.migrate();
22
+ }
23
+ // --------------------------------------------------------------------------
24
+ // Schema
25
+ // --------------------------------------------------------------------------
26
+ migrate() {
27
+ this.db.exec(`
28
+ CREATE TABLE IF NOT EXISTS identity (
29
+ id INTEGER PRIMARY KEY CHECK (id = 1),
30
+ name TEXT NOT NULL,
31
+ address TEXT NOT NULL,
32
+ private_key TEXT NOT NULL,
33
+ api_key TEXT NOT NULL,
34
+ creator_address TEXT NOT NULL,
35
+ genesis_prompt TEXT NOT NULL,
36
+ token_address TEXT,
37
+ token_symbol TEXT,
38
+ deploy_tx_hash TEXT
39
+ );
40
+
41
+ CREATE TABLE IF NOT EXISTS activation (
42
+ id INTEGER PRIMARY KEY CHECK (id = 1),
43
+ burn_tx_hash TEXT NOT NULL,
44
+ amount_burned TEXT NOT NULL,
45
+ activated_at INTEGER NOT NULL
46
+ );
47
+
48
+ CREATE TABLE IF NOT EXISTS survival (
49
+ id INTEGER PRIMARY KEY CHECK (id = 1),
50
+ tier TEXT NOT NULL DEFAULT 'normal',
51
+ eth_balance TEXT NOT NULL DEFAULT '0',
52
+ unclaimed_fees TEXT NOT NULL DEFAULT '0',
53
+ total_fees_claimed TEXT NOT NULL DEFAULT '0',
54
+ last_fee_claim INTEGER NOT NULL DEFAULT 0,
55
+ last_balance_check INTEGER NOT NULL DEFAULT 0
56
+ );
57
+
58
+ CREATE TABLE IF NOT EXISTS conversation (
59
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
60
+ role TEXT NOT NULL,
61
+ content TEXT NOT NULL,
62
+ timestamp INTEGER NOT NULL,
63
+ tool_calls TEXT,
64
+ tool_results TEXT
65
+ );
66
+
67
+ CREATE TABLE IF NOT EXISTS heartbeat_state (
68
+ task_name TEXT PRIMARY KEY,
69
+ last_run INTEGER NOT NULL DEFAULT 0,
70
+ enabled INTEGER NOT NULL DEFAULT 1
71
+ );
72
+
73
+ CREATE TABLE IF NOT EXISTS audit_log (
74
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
75
+ timestamp INTEGER NOT NULL,
76
+ action TEXT NOT NULL,
77
+ details TEXT NOT NULL,
78
+ tx_hash TEXT
79
+ );
80
+
81
+ CREATE TABLE IF NOT EXISTS kv (
82
+ key TEXT PRIMARY KEY,
83
+ value TEXT NOT NULL
84
+ );
85
+ `);
86
+ }
87
+ // --------------------------------------------------------------------------
88
+ // Identity
89
+ // --------------------------------------------------------------------------
90
+ saveIdentity(identity) {
91
+ this.db.prepare(`
92
+ INSERT OR REPLACE INTO identity (id, name, address, private_key, api_key, creator_address, genesis_prompt, token_address, token_symbol, deploy_tx_hash)
93
+ VALUES (1, ?, ?, ?, ?, ?, ?, ?, ?, ?)
94
+ `).run(identity.name, identity.address, identity.privateKey, identity.apiKey, identity.creatorAddress, identity.genesisPrompt, identity.tokenAddress ?? null, identity.tokenSymbol ?? null, identity.deployTxHash ?? null);
95
+ }
96
+ getIdentity() {
97
+ const row = this.db.prepare('SELECT * FROM identity WHERE id = 1').get();
98
+ if (!row)
99
+ return null;
100
+ return {
101
+ name: row.name,
102
+ address: row.address,
103
+ privateKey: row.private_key,
104
+ apiKey: row.api_key,
105
+ creatorAddress: row.creator_address,
106
+ genesisPrompt: row.genesis_prompt,
107
+ tokenAddress: row.token_address,
108
+ tokenSymbol: row.token_symbol,
109
+ deployTxHash: row.deploy_tx_hash,
110
+ };
111
+ }
112
+ updateIdentityToken(tokenAddress, tokenSymbol, deployTxHash) {
113
+ this.db.prepare(`
114
+ UPDATE identity SET token_address = ?, token_symbol = ?, deploy_tx_hash = ? WHERE id = 1
115
+ `).run(tokenAddress, tokenSymbol, deployTxHash);
116
+ }
117
+ // --------------------------------------------------------------------------
118
+ // Activation
119
+ // --------------------------------------------------------------------------
120
+ saveActivation(result) {
121
+ this.db.prepare(`
122
+ INSERT OR REPLACE INTO activation (id, burn_tx_hash, amount_burned, activated_at)
123
+ VALUES (1, ?, ?, ?)
124
+ `).run(result.burnTxHash, result.amountBurned.toString(), result.activatedAt);
125
+ }
126
+ getActivation() {
127
+ const row = this.db.prepare('SELECT * FROM activation WHERE id = 1').get();
128
+ if (!row)
129
+ return null;
130
+ return {
131
+ burnTxHash: row.burn_tx_hash,
132
+ amountBurned: BigInt(row.amount_burned),
133
+ activatedAt: row.activated_at,
134
+ };
135
+ }
136
+ isActivated() {
137
+ return this.getActivation() !== null;
138
+ }
139
+ // --------------------------------------------------------------------------
140
+ // Survival
141
+ // --------------------------------------------------------------------------
142
+ saveSurvival(state) {
143
+ this.db.prepare(`
144
+ INSERT OR REPLACE INTO survival (id, tier, eth_balance, unclaimed_fees, total_fees_claimed, last_fee_claim, last_balance_check)
145
+ VALUES (1, ?, ?, ?, ?, ?, ?)
146
+ `).run(state.tier, state.ethBalance.toString(), state.unclaimedFees.toString(), state.totalFeesClaimed.toString(), state.lastFeeClaim, state.lastBalanceCheck);
147
+ }
148
+ getSurvival() {
149
+ const row = this.db.prepare('SELECT * FROM survival WHERE id = 1').get();
150
+ if (!row) {
151
+ return {
152
+ tier: 'normal',
153
+ ethBalance: 0n,
154
+ unclaimedFees: 0n,
155
+ totalFeesClaimed: 0n,
156
+ lastFeeClaim: 0,
157
+ lastBalanceCheck: 0,
158
+ };
159
+ }
160
+ return {
161
+ tier: row.tier,
162
+ ethBalance: BigInt(row.eth_balance),
163
+ unclaimedFees: BigInt(row.unclaimed_fees),
164
+ totalFeesClaimed: BigInt(row.total_fees_claimed),
165
+ lastFeeClaim: row.last_fee_claim,
166
+ lastBalanceCheck: row.last_balance_check,
167
+ };
168
+ }
169
+ // --------------------------------------------------------------------------
170
+ // Conversation History
171
+ // --------------------------------------------------------------------------
172
+ addTurn(turn) {
173
+ this.db.prepare(`
174
+ INSERT INTO conversation (role, content, timestamp, tool_calls, tool_results)
175
+ VALUES (?, ?, ?, ?, ?)
176
+ `).run(turn.role, turn.content, turn.timestamp, turn.toolCalls ? JSON.stringify(turn.toolCalls) : null, turn.toolResults ? JSON.stringify(turn.toolResults) : null);
177
+ }
178
+ getHistory(limit) {
179
+ const rows = this.db.prepare(`
180
+ SELECT * FROM conversation ORDER BY id DESC LIMIT ?
181
+ `).all(limit);
182
+ return rows.reverse().map((row) => ({
183
+ role: row.role,
184
+ content: row.content,
185
+ timestamp: row.timestamp,
186
+ toolCalls: row.tool_calls ? JSON.parse(row.tool_calls) : undefined,
187
+ toolResults: row.tool_results ? JSON.parse(row.tool_results) : undefined,
188
+ }));
189
+ }
190
+ getTurnCount() {
191
+ const row = this.db.prepare('SELECT COUNT(*) as count FROM conversation').get();
192
+ return row.count;
193
+ }
194
+ clearHistory() {
195
+ this.db.prepare('DELETE FROM conversation').run();
196
+ }
197
+ // --------------------------------------------------------------------------
198
+ // Heartbeat State
199
+ // --------------------------------------------------------------------------
200
+ getHeartbeatLastRun(taskName) {
201
+ const row = this.db.prepare('SELECT last_run FROM heartbeat_state WHERE task_name = ?').get(taskName);
202
+ return row?.last_run ?? 0;
203
+ }
204
+ setHeartbeatLastRun(taskName, timestamp) {
205
+ this.db.prepare(`
206
+ INSERT INTO heartbeat_state (task_name, last_run) VALUES (?, ?)
207
+ ON CONFLICT(task_name) DO UPDATE SET last_run = ?
208
+ `).run(taskName, timestamp, timestamp);
209
+ }
210
+ isHeartbeatEnabled(taskName) {
211
+ const row = this.db.prepare('SELECT enabled FROM heartbeat_state WHERE task_name = ?').get(taskName);
212
+ return row?.enabled !== 0; // default true if not set
213
+ }
214
+ setHeartbeatEnabled(taskName, enabled) {
215
+ this.db.prepare(`
216
+ INSERT INTO heartbeat_state (task_name, last_run, enabled) VALUES (?, 0, ?)
217
+ ON CONFLICT(task_name) DO UPDATE SET enabled = ?
218
+ `).run(taskName, enabled ? 1 : 0, enabled ? 1 : 0);
219
+ }
220
+ // --------------------------------------------------------------------------
221
+ // Audit Log
222
+ // --------------------------------------------------------------------------
223
+ audit(action, details, txHash) {
224
+ this.db.prepare(`
225
+ INSERT INTO audit_log (timestamp, action, details, tx_hash) VALUES (?, ?, ?, ?)
226
+ `).run(Date.now(), action, details, txHash ?? null);
227
+ }
228
+ getAuditLog(limit = 100) {
229
+ return this.db.prepare(`
230
+ SELECT * FROM audit_log ORDER BY id DESC LIMIT ?
231
+ `).all(limit);
232
+ }
233
+ // --------------------------------------------------------------------------
234
+ // Key-Value Store (SOUL.md, config, arbitrary metadata)
235
+ // --------------------------------------------------------------------------
236
+ set(key, value) {
237
+ this.db.prepare(`
238
+ INSERT INTO kv (key, value) VALUES (?, ?)
239
+ ON CONFLICT(key) DO UPDATE SET value = ?
240
+ `).run(key, value, value);
241
+ }
242
+ get(key) {
243
+ const row = this.db.prepare('SELECT value FROM kv WHERE key = ?').get(key);
244
+ return row?.value ?? null;
245
+ }
246
+ delete(key) {
247
+ this.db.prepare('DELETE FROM kv WHERE key = ?').run(key);
248
+ }
249
+ // --------------------------------------------------------------------------
250
+ // SOUL.md convenience
251
+ // --------------------------------------------------------------------------
252
+ getSoul() {
253
+ return this.get('soul') ?? '';
254
+ }
255
+ setSoul(content) {
256
+ this.set('soul', content);
257
+ this.audit('soul_update', `SOUL.md updated (${content.length} chars)`);
258
+ }
259
+ // --------------------------------------------------------------------------
260
+ // Lifecycle
261
+ // --------------------------------------------------------------------------
262
+ close() {
263
+ this.db.close();
264
+ }
265
+ }
266
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/state/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Survival module — monitors ETH balance and determines operational tier.
3
+ *
4
+ * Tiers control what the agent is allowed to do:
5
+ * normal (>= 0.01 ETH) — Full capabilities, all skills enabled
6
+ * low_compute (>= 0.001 ETH) — Cheaper inference model, reduced heartbeat freq
7
+ * critical (>= 0.0001 ETH) — Emergency mode: only claim fees and check balance
8
+ * dead (< 0.0001 ETH) — Agent halts, cannot act
9
+ */
10
+ import type { PublicClient, Address } from 'viem';
11
+ import type { StateStore } from '../state/index.js';
12
+ import type { SurvivalState, SurvivalTier } from '../types.js';
13
+ export declare function determineTier(ethBalance: bigint): SurvivalTier;
14
+ export declare class SurvivalMonitor {
15
+ private publicClient;
16
+ private address;
17
+ private state;
18
+ constructor(publicClient: PublicClient, address: Address, state: StateStore);
19
+ /**
20
+ * Check current ETH balance, update tier, persist to state.
21
+ */
22
+ check(): Promise<SurvivalState>;
23
+ /**
24
+ * Get current survival state from DB (no RPC call).
25
+ */
26
+ getCached(): SurvivalState;
27
+ /**
28
+ * Check if a given skill is allowed at the current tier.
29
+ */
30
+ isSkillAllowed(skillName: string, tier: SurvivalTier): boolean;
31
+ /**
32
+ * Get the inference model to use for the current tier.
33
+ */
34
+ getModel(tier: SurvivalTier, config: {
35
+ model: string;
36
+ fallbackModel: string;
37
+ }): string;
38
+ /**
39
+ * Get heartbeat interval multiplier for current tier.
40
+ * Higher tier = less frequent heartbeats to conserve compute.
41
+ */
42
+ getHeartbeatMultiplier(tier: SurvivalTier): number;
43
+ /**
44
+ * Record a fee claim.
45
+ */
46
+ recordFeeClaim(amount: bigint): void;
47
+ }
48
+ export declare function formatSurvivalStatus(state: SurvivalState): string;
49
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/survival/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAElD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAO/D,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,CAK9D;AAMD,qBAAa,eAAe;IAExB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,KAAK;gBAFL,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,UAAU;IAG3B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,aAAa,CAAC;IAyBrC;;OAEG;IACH,SAAS,IAAI,aAAa;IAI1B;;OAEG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO;IAI9D;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM;IAOtF;;;OAGG;IACH,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM;IAIlD;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;CAQrC;AA8CD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAcjE"}