clawd-automaton 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +178 -0
- package/constitution.md +25 -0
- package/dist/__tests__/heartbeat.test.d.ts +7 -0
- package/dist/__tests__/heartbeat.test.d.ts.map +1 -0
- package/dist/__tests__/heartbeat.test.js +125 -0
- package/dist/__tests__/heartbeat.test.js.map +1 -0
- package/dist/__tests__/loop.test.d.ts +7 -0
- package/dist/__tests__/loop.test.d.ts.map +1 -0
- package/dist/__tests__/loop.test.js +150 -0
- package/dist/__tests__/loop.test.js.map +1 -0
- package/dist/__tests__/mocks.d.ts +72 -0
- package/dist/__tests__/mocks.d.ts.map +1 -0
- package/dist/__tests__/mocks.js +197 -0
- package/dist/__tests__/mocks.js.map +1 -0
- package/dist/agent/context.d.ts +26 -0
- package/dist/agent/context.d.ts.map +1 -0
- package/dist/agent/context.js +115 -0
- package/dist/agent/context.js.map +1 -0
- package/dist/agent/injection-defense.d.ts +13 -0
- package/dist/agent/injection-defense.d.ts.map +1 -0
- package/dist/agent/injection-defense.js +236 -0
- package/dist/agent/injection-defense.js.map +1 -0
- package/dist/agent/loop.d.ts +25 -0
- package/dist/agent/loop.d.ts.map +1 -0
- package/dist/agent/loop.js +263 -0
- package/dist/agent/loop.js.map +1 -0
- package/dist/agent/system-prompt.d.ts +30 -0
- package/dist/agent/system-prompt.d.ts.map +1 -0
- package/dist/agent/system-prompt.js +241 -0
- package/dist/agent/system-prompt.js.map +1 -0
- package/dist/agent/tools.d.ts +17 -0
- package/dist/agent/tools.d.ts.map +1 -0
- package/dist/agent/tools.js +1413 -0
- package/dist/agent/tools.js.map +1 -0
- package/dist/clawd/backroom.d.ts +54 -0
- package/dist/clawd/backroom.d.ts.map +1 -0
- package/dist/clawd/backroom.js +130 -0
- package/dist/clawd/backroom.js.map +1 -0
- package/dist/clawd/client.d.ts +16 -0
- package/dist/clawd/client.d.ts.map +1 -0
- package/dist/clawd/client.js +256 -0
- package/dist/clawd/client.js.map +1 -0
- package/dist/clawd/convex-client.d.ts +130 -0
- package/dist/clawd/convex-client.d.ts.map +1 -0
- package/dist/clawd/convex-client.js +118 -0
- package/dist/clawd/convex-client.js.map +1 -0
- package/dist/clawd/credits.d.ts +24 -0
- package/dist/clawd/credits.d.ts.map +1 -0
- package/dist/clawd/credits.js +64 -0
- package/dist/clawd/credits.js.map +1 -0
- package/dist/clawd/deepseek-inference.d.ts +40 -0
- package/dist/clawd/deepseek-inference.d.ts.map +1 -0
- package/dist/clawd/deepseek-inference.js +143 -0
- package/dist/clawd/deepseek-inference.js.map +1 -0
- package/dist/clawd/inference.d.ts +17 -0
- package/dist/clawd/inference.d.ts.map +1 -0
- package/dist/clawd/inference.js +114 -0
- package/dist/clawd/inference.js.map +1 -0
- package/dist/clawd/x402.d.ts +48 -0
- package/dist/clawd/x402.d.ts.map +1 -0
- package/dist/clawd/x402.js +350 -0
- package/dist/clawd/x402.js.map +1 -0
- package/dist/config.d.ts +36 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +84 -0
- package/dist/config.js.map +1 -0
- package/dist/git/state-versioning.d.ts +39 -0
- package/dist/git/state-versioning.d.ts.map +1 -0
- package/dist/git/state-versioning.js +93 -0
- package/dist/git/state-versioning.js.map +1 -0
- package/dist/git/tools.d.ts +40 -0
- package/dist/git/tools.d.ts.map +1 -0
- package/dist/git/tools.js +140 -0
- package/dist/git/tools.js.map +1 -0
- package/dist/heartbeat/config.d.ts +23 -0
- package/dist/heartbeat/config.d.ts.map +1 -0
- package/dist/heartbeat/config.js +156 -0
- package/dist/heartbeat/config.js.map +1 -0
- package/dist/heartbeat/daemon.d.ts +28 -0
- package/dist/heartbeat/daemon.d.ts.map +1 -0
- package/dist/heartbeat/daemon.js +141 -0
- package/dist/heartbeat/daemon.js.map +1 -0
- package/dist/heartbeat/tasks.d.ts +24 -0
- package/dist/heartbeat/tasks.d.ts.map +1 -0
- package/dist/heartbeat/tasks.js +277 -0
- package/dist/heartbeat/tasks.js.map +1 -0
- package/dist/identity/provision.d.ts +28 -0
- package/dist/identity/provision.d.ts.map +1 -0
- package/dist/identity/provision.js +131 -0
- package/dist/identity/provision.js.map +1 -0
- package/dist/identity/wallet.d.ts +28 -0
- package/dist/identity/wallet.d.ts.map +1 -0
- package/dist/identity/wallet.js +69 -0
- package/dist/identity/wallet.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +358 -0
- package/dist/index.js.map +1 -0
- package/dist/ooda/claude-decision.d.ts +18 -0
- package/dist/ooda/claude-decision.d.ts.map +1 -0
- package/dist/ooda/claude-decision.js +82 -0
- package/dist/ooda/claude-decision.js.map +1 -0
- package/dist/ooda/journal.d.ts +22 -0
- package/dist/ooda/journal.d.ts.map +1 -0
- package/dist/ooda/journal.js +26 -0
- package/dist/ooda/journal.js.map +1 -0
- package/dist/ooda/loop.d.ts +3 -0
- package/dist/ooda/loop.d.ts.map +1 -0
- package/dist/ooda/loop.js +210 -0
- package/dist/ooda/loop.js.map +1 -0
- package/dist/ooda/observe.d.ts +21 -0
- package/dist/ooda/observe.d.ts.map +1 -0
- package/dist/ooda/observe.js +75 -0
- package/dist/ooda/observe.js.map +1 -0
- package/dist/ooda/state.d.ts +34 -0
- package/dist/ooda/state.d.ts.map +1 -0
- package/dist/ooda/state.js +48 -0
- package/dist/ooda/state.js.map +1 -0
- package/dist/ooda/tui.d.ts +3 -0
- package/dist/ooda/tui.d.ts.map +1 -0
- package/dist/ooda/tui.js +132 -0
- package/dist/ooda/tui.js.map +1 -0
- package/dist/ooda/validate.d.ts +33 -0
- package/dist/ooda/validate.d.ts.map +1 -0
- package/dist/ooda/validate.js +91 -0
- package/dist/ooda/validate.js.map +1 -0
- package/dist/registry/agent-card.d.ts +26 -0
- package/dist/registry/agent-card.d.ts.map +1 -0
- package/dist/registry/agent-card.js +94 -0
- package/dist/registry/agent-card.js.map +1 -0
- package/dist/registry/discovery.d.ts +24 -0
- package/dist/registry/discovery.d.ts.map +1 -0
- package/dist/registry/discovery.js +74 -0
- package/dist/registry/discovery.js.map +1 -0
- package/dist/registry/erc8004.d.ts +39 -0
- package/dist/registry/erc8004.d.ts.map +1 -0
- package/dist/registry/erc8004.js +209 -0
- package/dist/registry/erc8004.js.map +1 -0
- package/dist/replication/genesis.d.ts +26 -0
- package/dist/replication/genesis.d.ts.map +1 -0
- package/dist/replication/genesis.js +72 -0
- package/dist/replication/genesis.js.map +1 -0
- package/dist/replication/lineage.d.ts +35 -0
- package/dist/replication/lineage.d.ts.map +1 -0
- package/dist/replication/lineage.js +79 -0
- package/dist/replication/lineage.js.map +1 -0
- package/dist/replication/spawn.d.ts +25 -0
- package/dist/replication/spawn.d.ts.map +1 -0
- package/dist/replication/spawn.js +166 -0
- package/dist/replication/spawn.js.map +1 -0
- package/dist/self-mod/audit-log.d.ts +24 -0
- package/dist/self-mod/audit-log.d.ts.map +1 -0
- package/dist/self-mod/audit-log.js +49 -0
- package/dist/self-mod/audit-log.js.map +1 -0
- package/dist/self-mod/code.d.ts +51 -0
- package/dist/self-mod/code.d.ts.map +1 -0
- package/dist/self-mod/code.js +317 -0
- package/dist/self-mod/code.js.map +1 -0
- package/dist/self-mod/tools-manager.d.ts +30 -0
- package/dist/self-mod/tools-manager.d.ts.map +1 -0
- package/dist/self-mod/tools-manager.js +74 -0
- package/dist/self-mod/tools-manager.js.map +1 -0
- package/dist/self-mod/upstream.d.ts +36 -0
- package/dist/self-mod/upstream.d.ts.map +1 -0
- package/dist/self-mod/upstream.js +66 -0
- package/dist/self-mod/upstream.js.map +1 -0
- package/dist/setup/banner.d.ts +2 -0
- package/dist/setup/banner.d.ts.map +1 -0
- package/dist/setup/banner.js +22 -0
- package/dist/setup/banner.js.map +1 -0
- package/dist/setup/defaults.d.ts +3 -0
- package/dist/setup/defaults.d.ts.map +1 -0
- package/dist/setup/defaults.js +113 -0
- package/dist/setup/defaults.js.map +1 -0
- package/dist/setup/environment.d.ts +6 -0
- package/dist/setup/environment.d.ts.map +1 -0
- package/dist/setup/environment.js +24 -0
- package/dist/setup/environment.js.map +1 -0
- package/dist/setup/prompts.d.ts +5 -0
- package/dist/setup/prompts.d.ts.map +1 -0
- package/dist/setup/prompts.js +70 -0
- package/dist/setup/prompts.js.map +1 -0
- package/dist/setup/wizard.d.ts +3 -0
- package/dist/setup/wizard.d.ts.map +1 -0
- package/dist/setup/wizard.js +128 -0
- package/dist/setup/wizard.js.map +1 -0
- package/dist/skills/format.d.ts +14 -0
- package/dist/skills/format.d.ts.map +1 -0
- package/dist/skills/format.js +145 -0
- package/dist/skills/format.js.map +1 -0
- package/dist/skills/loader.d.ts +19 -0
- package/dist/skills/loader.d.ts.map +1 -0
- package/dist/skills/loader.js +98 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/skills/registry.d.ts +31 -0
- package/dist/skills/registry.d.ts.map +1 -0
- package/dist/skills/registry.js +111 -0
- package/dist/skills/registry.js.map +1 -0
- package/dist/social/client.d.ts +13 -0
- package/dist/social/client.d.ts.map +1 -0
- package/dist/social/client.js +89 -0
- package/dist/social/client.js.map +1 -0
- package/dist/state/database.d.ts +9 -0
- package/dist/state/database.d.ts.map +1 -0
- package/dist/state/database.js +401 -0
- package/dist/state/database.js.map +1 -0
- package/dist/state/schema.d.ts +11 -0
- package/dist/state/schema.d.ts.map +1 -0
- package/dist/state/schema.js +232 -0
- package/dist/state/schema.js.map +1 -0
- package/dist/survival/funding.d.ts +19 -0
- package/dist/survival/funding.d.ts.map +1 -0
- package/dist/survival/funding.js +62 -0
- package/dist/survival/funding.js.map +1 -0
- package/dist/survival/low-compute.d.ts +30 -0
- package/dist/survival/low-compute.d.ts.map +1 -0
- package/dist/survival/low-compute.js +72 -0
- package/dist/survival/low-compute.js.map +1 -0
- package/dist/survival/monitor.d.ts +23 -0
- package/dist/survival/monitor.d.ts.map +1 -0
- package/dist/survival/monitor.js +70 -0
- package/dist/survival/monitor.js.map +1 -0
- package/dist/types.d.ts +461 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +25 -0
- package/dist/types.js.map +1 -0
- package/package.json +85 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Automaton Wallet Management
|
|
3
|
+
*
|
|
4
|
+
* Creates and manages an EVM wallet for the automaton's identity and payments.
|
|
5
|
+
* The private key is the automaton's sovereign identity.
|
|
6
|
+
* Adapted from runtime-mcp/src/wallet.ts
|
|
7
|
+
*/
|
|
8
|
+
import type { PrivateKeyAccount } from "viem";
|
|
9
|
+
export declare function getAutomatonDir(): string;
|
|
10
|
+
export declare function getWalletPath(): string;
|
|
11
|
+
/**
|
|
12
|
+
* Get or create the automaton's wallet.
|
|
13
|
+
* The private key IS the automaton's identity -- protect it.
|
|
14
|
+
*/
|
|
15
|
+
export declare function getWallet(): Promise<{
|
|
16
|
+
account: PrivateKeyAccount;
|
|
17
|
+
isNew: boolean;
|
|
18
|
+
}>;
|
|
19
|
+
/**
|
|
20
|
+
* Get the wallet address without loading the full account.
|
|
21
|
+
*/
|
|
22
|
+
export declare function getWalletAddress(): string | null;
|
|
23
|
+
/**
|
|
24
|
+
* Load the full wallet account (needed for signing).
|
|
25
|
+
*/
|
|
26
|
+
export declare function loadWalletAccount(): PrivateKeyAccount | null;
|
|
27
|
+
export declare function walletExists(): boolean;
|
|
28
|
+
//# sourceMappingURL=wallet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../src/identity/wallet.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAY9C,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;;GAGG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC;IACzC,OAAO,EAAE,iBAAiB,CAAC;IAC3B,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC,CA0BD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAUhD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,iBAAiB,GAAG,IAAI,CAS5D;AAED,wBAAgB,YAAY,IAAI,OAAO,CAEtC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Automaton Wallet Management
|
|
3
|
+
*
|
|
4
|
+
* Creates and manages an EVM wallet for the automaton's identity and payments.
|
|
5
|
+
* The private key is the automaton's sovereign identity.
|
|
6
|
+
* Adapted from runtime-mcp/src/wallet.ts
|
|
7
|
+
*/
|
|
8
|
+
import { generatePrivateKey, privateKeyToAccount } from "viem/accounts";
|
|
9
|
+
import fs from "fs";
|
|
10
|
+
import path from "path";
|
|
11
|
+
const AUTOMATON_DIR = path.join(process.env.HOME || "/root", ".automaton");
|
|
12
|
+
const WALLET_FILE = path.join(AUTOMATON_DIR, "wallet.json");
|
|
13
|
+
export function getAutomatonDir() {
|
|
14
|
+
return AUTOMATON_DIR;
|
|
15
|
+
}
|
|
16
|
+
export function getWalletPath() {
|
|
17
|
+
return WALLET_FILE;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Get or create the automaton's wallet.
|
|
21
|
+
* The private key IS the automaton's identity -- protect it.
|
|
22
|
+
*/
|
|
23
|
+
export async function getWallet() {
|
|
24
|
+
if (!fs.existsSync(AUTOMATON_DIR)) {
|
|
25
|
+
fs.mkdirSync(AUTOMATON_DIR, { recursive: true, mode: 0o700 });
|
|
26
|
+
}
|
|
27
|
+
if (fs.existsSync(WALLET_FILE)) {
|
|
28
|
+
const walletData = JSON.parse(fs.readFileSync(WALLET_FILE, "utf-8"));
|
|
29
|
+
const account = privateKeyToAccount(walletData.privateKey);
|
|
30
|
+
return { account, isNew: false };
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
const privateKey = generatePrivateKey();
|
|
34
|
+
const account = privateKeyToAccount(privateKey);
|
|
35
|
+
const walletData = {
|
|
36
|
+
privateKey,
|
|
37
|
+
createdAt: new Date().toISOString(),
|
|
38
|
+
};
|
|
39
|
+
fs.writeFileSync(WALLET_FILE, JSON.stringify(walletData, null, 2), {
|
|
40
|
+
mode: 0o600,
|
|
41
|
+
});
|
|
42
|
+
return { account, isNew: true };
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Get the wallet address without loading the full account.
|
|
47
|
+
*/
|
|
48
|
+
export function getWalletAddress() {
|
|
49
|
+
if (!fs.existsSync(WALLET_FILE)) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
const walletData = JSON.parse(fs.readFileSync(WALLET_FILE, "utf-8"));
|
|
53
|
+
const account = privateKeyToAccount(walletData.privateKey);
|
|
54
|
+
return account.address;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Load the full wallet account (needed for signing).
|
|
58
|
+
*/
|
|
59
|
+
export function loadWalletAccount() {
|
|
60
|
+
if (!fs.existsSync(WALLET_FILE)) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
const walletData = JSON.parse(fs.readFileSync(WALLET_FILE, "utf-8"));
|
|
64
|
+
return privateKeyToAccount(walletData.privateKey);
|
|
65
|
+
}
|
|
66
|
+
export function walletExists() {
|
|
67
|
+
return fs.existsSync(WALLET_FILE);
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=wallet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/identity/wallet.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAC7B,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,EAC3B,YAAY,CACb,CAAC;AACF,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;AAE5D,MAAM,UAAU,eAAe;IAC7B,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS;IAI7B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAClC,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,MAAM,UAAU,GAAe,IAAI,CAAC,KAAK,CACvC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CACtC,CAAC;QACF,MAAM,OAAO,GAAG,mBAAmB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC3D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACnC,CAAC;SAAM,CAAC;QACN,MAAM,UAAU,GAAG,kBAAkB,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;QAEhD,MAAM,UAAU,GAAe;YAC7B,UAAU;YACV,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QAEF,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;YACjE,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;QAEH,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAClC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAe,IAAI,CAAC,KAAK,CACvC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CACtC,CAAC;IACF,MAAM,OAAO,GAAG,mBAAmB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAC3D,OAAO,OAAO,CAAC,OAAO,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAe,IAAI,CAAC,KAAK,CACvC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CACtC,CAAC;IACF,OAAO,mBAAmB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AACpC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;GAMG"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* CLAWD Automaton Runtime
|
|
4
|
+
*
|
|
5
|
+
* The entry point for the sovereign AI agent.
|
|
6
|
+
* Handles CLI args, bootstrapping, and orchestrating
|
|
7
|
+
* the heartbeat daemon + agent loop.
|
|
8
|
+
*/
|
|
9
|
+
import { getWallet, getAutomatonDir } from "./identity/wallet.js";
|
|
10
|
+
import { provision, loadApiKeyFromConfig } from "./identity/provision.js";
|
|
11
|
+
import { loadConfig, resolvePath } from "./config.js";
|
|
12
|
+
import { createDatabase } from "./state/database.js";
|
|
13
|
+
import { createClawdRuntimeClient } from "./clawd/client.js";
|
|
14
|
+
import { createInferenceClient } from "./clawd/inference.js";
|
|
15
|
+
import { createDeepSeekInferenceClient, DEEPSEEK_BASE_URL, DEEPSEEK_MODEL_PRO, DEEPSEEK_MODEL_FLASH } from "./clawd/deepseek-inference.js";
|
|
16
|
+
import { createHeartbeatDaemon } from "./heartbeat/daemon.js";
|
|
17
|
+
import { loadHeartbeatConfig, syncHeartbeatToDb, } from "./heartbeat/config.js";
|
|
18
|
+
import { runAgentLoop } from "./agent/loop.js";
|
|
19
|
+
import { loadSkills } from "./skills/loader.js";
|
|
20
|
+
import { initStateRepo } from "./git/state-versioning.js";
|
|
21
|
+
import { createSocialClient } from "./social/client.js";
|
|
22
|
+
import { createConvexClient } from "./clawd/convex-client.js";
|
|
23
|
+
const VERSION = "0.1.0";
|
|
24
|
+
async function main() {
|
|
25
|
+
const args = process.argv.slice(2);
|
|
26
|
+
// ─── CLI Commands ────────────────────────────────────────────
|
|
27
|
+
if (args.includes("--version") || args.includes("-v")) {
|
|
28
|
+
console.log(`CLAWD Automation v${VERSION}`);
|
|
29
|
+
process.exit(0);
|
|
30
|
+
}
|
|
31
|
+
if (args.includes("--help") || args.includes("-h")) {
|
|
32
|
+
console.log(`
|
|
33
|
+
CLAWD Automation v${VERSION}
|
|
34
|
+
Sovereign AI Agent Runtime
|
|
35
|
+
|
|
36
|
+
Usage:
|
|
37
|
+
clawd --run Start the automaton (first run triggers setup wizard)
|
|
38
|
+
clawd --setup Re-run the interactive setup wizard
|
|
39
|
+
clawd --init Initialize wallet and config directory
|
|
40
|
+
clawd --provision Provision API key via SIWE
|
|
41
|
+
clawd --status Show current automaton status
|
|
42
|
+
clawd --goblin Run devnet-only paper Goblin OODA trading mode
|
|
43
|
+
clawd --version Show version
|
|
44
|
+
clawd --help Show this help
|
|
45
|
+
|
|
46
|
+
Environment:
|
|
47
|
+
CLAWD_API_URL CLAWD Runtime API URL (default: https://api.x402.wtf)
|
|
48
|
+
CLAWD_API_KEY CLAWD Runtime API key (overrides config)
|
|
49
|
+
`);
|
|
50
|
+
process.exit(0);
|
|
51
|
+
}
|
|
52
|
+
if (args.includes("--init")) {
|
|
53
|
+
const { account, isNew } = await getWallet();
|
|
54
|
+
console.log(JSON.stringify({
|
|
55
|
+
address: account.address,
|
|
56
|
+
isNew,
|
|
57
|
+
configDir: getAutomatonDir(),
|
|
58
|
+
}));
|
|
59
|
+
process.exit(0);
|
|
60
|
+
}
|
|
61
|
+
if (args.includes("--provision")) {
|
|
62
|
+
try {
|
|
63
|
+
const result = await provision();
|
|
64
|
+
console.log(JSON.stringify(result));
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
console.error(`Provision failed: ${err.message}`);
|
|
68
|
+
process.exit(1);
|
|
69
|
+
}
|
|
70
|
+
process.exit(0);
|
|
71
|
+
}
|
|
72
|
+
if (args.includes("--status")) {
|
|
73
|
+
await showStatus();
|
|
74
|
+
process.exit(0);
|
|
75
|
+
}
|
|
76
|
+
if (args.includes("--goblin")) {
|
|
77
|
+
await import("./ooda/loop.js");
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (args.includes("--setup")) {
|
|
81
|
+
const { runSetupWizard } = await import("./setup/wizard.js");
|
|
82
|
+
await runSetupWizard();
|
|
83
|
+
process.exit(0);
|
|
84
|
+
}
|
|
85
|
+
if (args.includes("--run")) {
|
|
86
|
+
await run();
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
// Default: show help
|
|
90
|
+
console.log('Run "automaton --help" for usage information.');
|
|
91
|
+
console.log('Run "automaton --run" to start the automaton.');
|
|
92
|
+
}
|
|
93
|
+
// ─── Status Command ────────────────────────────────────────────
|
|
94
|
+
async function showStatus() {
|
|
95
|
+
const config = loadConfig();
|
|
96
|
+
if (!config) {
|
|
97
|
+
console.log("Automaton is not configured. Run the setup script first.");
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const dbPath = resolvePath(config.dbPath);
|
|
101
|
+
const db = createDatabase(dbPath);
|
|
102
|
+
const state = db.getAgentState();
|
|
103
|
+
const turnCount = db.getTurnCount();
|
|
104
|
+
const tools = db.getInstalledTools();
|
|
105
|
+
const heartbeats = db.getHeartbeatEntries();
|
|
106
|
+
const skills = db.getSkills(true);
|
|
107
|
+
const children = db.getChildren();
|
|
108
|
+
const registry = db.getRegistryEntry();
|
|
109
|
+
console.log(`
|
|
110
|
+
=== AUTOMATON STATUS ===
|
|
111
|
+
Name: ${config.name}
|
|
112
|
+
Address: ${config.walletAddress}
|
|
113
|
+
Creator: ${config.creatorAddress}
|
|
114
|
+
Sandbox: ${config.sandboxId}
|
|
115
|
+
State: ${state}
|
|
116
|
+
Turns: ${turnCount}
|
|
117
|
+
Tools: ${tools.length} installed
|
|
118
|
+
Skills: ${skills.length} active
|
|
119
|
+
Heartbeats: ${heartbeats.filter((h) => h.enabled).length} active
|
|
120
|
+
Children: ${children.filter((c) => c.status !== "dead").length} alive / ${children.length} total
|
|
121
|
+
Agent ID: ${registry?.agentId || "not registered"}
|
|
122
|
+
Model: ${config.inferenceModel}
|
|
123
|
+
Version: ${config.version}
|
|
124
|
+
========================
|
|
125
|
+
`);
|
|
126
|
+
db.close();
|
|
127
|
+
}
|
|
128
|
+
// ─── Main Run ──────────────────────────────────────────────────
|
|
129
|
+
async function run() {
|
|
130
|
+
console.log(`[${new Date().toISOString()}] CLAWD Automation v${VERSION} starting...`);
|
|
131
|
+
// Load config — first run triggers interactive setup wizard
|
|
132
|
+
let config = loadConfig();
|
|
133
|
+
if (!config) {
|
|
134
|
+
const { runSetupWizard } = await import("./setup/wizard.js");
|
|
135
|
+
config = await runSetupWizard();
|
|
136
|
+
}
|
|
137
|
+
// Load wallet
|
|
138
|
+
const { account } = await getWallet();
|
|
139
|
+
const apiKey = config.clawdApiKey || loadApiKeyFromConfig();
|
|
140
|
+
if (!apiKey) {
|
|
141
|
+
console.error("No API key found. Run: automaton --provision");
|
|
142
|
+
process.exit(1);
|
|
143
|
+
}
|
|
144
|
+
// Build identity
|
|
145
|
+
const identity = {
|
|
146
|
+
name: config.name,
|
|
147
|
+
address: account.address,
|
|
148
|
+
account,
|
|
149
|
+
creatorAddress: config.creatorAddress,
|
|
150
|
+
sandboxId: config.sandboxId,
|
|
151
|
+
apiKey,
|
|
152
|
+
createdAt: new Date().toISOString(),
|
|
153
|
+
};
|
|
154
|
+
// Initialize database
|
|
155
|
+
const dbPath = resolvePath(config.dbPath);
|
|
156
|
+
const db = createDatabase(dbPath);
|
|
157
|
+
// Store identity in DB
|
|
158
|
+
db.setIdentity("name", config.name);
|
|
159
|
+
db.setIdentity("address", account.address);
|
|
160
|
+
db.setIdentity("creator", config.creatorAddress);
|
|
161
|
+
db.setIdentity("sandbox", config.sandboxId);
|
|
162
|
+
// Create CLAWD Runtime client
|
|
163
|
+
const runtime = createClawdRuntimeClient({
|
|
164
|
+
apiUrl: config.clawdApiUrl,
|
|
165
|
+
apiKey,
|
|
166
|
+
sandboxId: config.sandboxId,
|
|
167
|
+
});
|
|
168
|
+
// Create inference client (DeepSeek when enabled, otherwise CLAWD Runtime)
|
|
169
|
+
const inference = config.deepseekEnabled
|
|
170
|
+
? createDeepSeekInferenceClient({
|
|
171
|
+
apiKey: config.deepseekApiKey || apiKey,
|
|
172
|
+
baseUrl: config.deepseekBaseUrl || DEEPSEEK_BASE_URL,
|
|
173
|
+
defaultModel: config.deepseekModelPro || DEEPSEEK_MODEL_PRO,
|
|
174
|
+
maxTokens: config.maxTokensPerTurn,
|
|
175
|
+
flashModel: config.deepseekModelFlash || DEEPSEEK_MODEL_FLASH,
|
|
176
|
+
proModel: config.deepseekModelPro || DEEPSEEK_MODEL_PRO,
|
|
177
|
+
})
|
|
178
|
+
: createInferenceClient({
|
|
179
|
+
apiUrl: config.clawdApiUrl,
|
|
180
|
+
apiKey,
|
|
181
|
+
defaultModel: config.inferenceModel,
|
|
182
|
+
maxTokens: config.maxTokensPerTurn,
|
|
183
|
+
});
|
|
184
|
+
if (config.deepseekEnabled) {
|
|
185
|
+
console.log(`[${new Date().toISOString()}] DeepSeek inference enabled (model: ${config.deepseekModelPro || DEEPSEEK_MODEL_PRO})`);
|
|
186
|
+
}
|
|
187
|
+
// Create social client
|
|
188
|
+
let social;
|
|
189
|
+
if (config.socialRelayUrl) {
|
|
190
|
+
social = createSocialClient(config.socialRelayUrl, account);
|
|
191
|
+
console.log(`[${new Date().toISOString()}] Social relay: ${config.socialRelayUrl}`);
|
|
192
|
+
}
|
|
193
|
+
// Create CLAWD Convex client for agent tracking & heartbeats
|
|
194
|
+
let convex;
|
|
195
|
+
if (config.convexSiteUrl) {
|
|
196
|
+
try {
|
|
197
|
+
convex = createConvexClient({
|
|
198
|
+
siteUrl: config.convexSiteUrl,
|
|
199
|
+
agentId: account.address,
|
|
200
|
+
});
|
|
201
|
+
console.log(`[${new Date().toISOString()}] CLAWD Convex backend: ${config.convexSiteUrl}`);
|
|
202
|
+
// Register agent on first boot
|
|
203
|
+
const convexRegistered = db.getKV("convex_registered");
|
|
204
|
+
if (!convexRegistered) {
|
|
205
|
+
convex.registerAgent({
|
|
206
|
+
agentId: account.address,
|
|
207
|
+
name: config.name,
|
|
208
|
+
installMethod: "automaton",
|
|
209
|
+
address: account.address,
|
|
210
|
+
metadata: JSON.stringify({
|
|
211
|
+
sandboxId: config.sandboxId,
|
|
212
|
+
version: config.version,
|
|
213
|
+
model: config.inferenceModel,
|
|
214
|
+
}),
|
|
215
|
+
}).then((result) => {
|
|
216
|
+
db.setKV("convex_registered", JSON.stringify({
|
|
217
|
+
registered: result.registered,
|
|
218
|
+
firstSeen: result.firstSeen,
|
|
219
|
+
timestamp: Date.now(),
|
|
220
|
+
}));
|
|
221
|
+
console.log(`[CONVEX] Agent registered: ${result.registered ? "new" : "re-registered"}`);
|
|
222
|
+
}).catch((err) => {
|
|
223
|
+
console.warn(`[CONVEX] Registration failed: ${err.message}`);
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
catch (err) {
|
|
228
|
+
console.warn(`[${new Date().toISOString()}] CLAWD Convex init failed: ${err.message}`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
// Load and sync heartbeat config
|
|
232
|
+
const heartbeatConfigPath = resolvePath(config.heartbeatConfigPath);
|
|
233
|
+
const heartbeatConfig = loadHeartbeatConfig(heartbeatConfigPath);
|
|
234
|
+
syncHeartbeatToDb(heartbeatConfig, db);
|
|
235
|
+
// Load skills
|
|
236
|
+
const skillsDir = config.skillsDir || "~/.automaton/skills";
|
|
237
|
+
let skills = [];
|
|
238
|
+
try {
|
|
239
|
+
skills = loadSkills(skillsDir, db);
|
|
240
|
+
console.log(`[${new Date().toISOString()}] Loaded ${skills.length} skills.`);
|
|
241
|
+
}
|
|
242
|
+
catch (err) {
|
|
243
|
+
console.warn(`[${new Date().toISOString()}] Skills loading failed: ${err.message}`);
|
|
244
|
+
}
|
|
245
|
+
// Initialize state repo (git)
|
|
246
|
+
try {
|
|
247
|
+
await initStateRepo(runtime);
|
|
248
|
+
console.log(`[${new Date().toISOString()}] State repo initialized.`);
|
|
249
|
+
}
|
|
250
|
+
catch (err) {
|
|
251
|
+
console.warn(`[${new Date().toISOString()}] State repo init failed: ${err.message}`);
|
|
252
|
+
}
|
|
253
|
+
// Start heartbeat daemon
|
|
254
|
+
const heartbeat = createHeartbeatDaemon({
|
|
255
|
+
identity,
|
|
256
|
+
config,
|
|
257
|
+
db,
|
|
258
|
+
runtime,
|
|
259
|
+
inference,
|
|
260
|
+
social,
|
|
261
|
+
onWakeRequest: (reason) => {
|
|
262
|
+
console.log(`[HEARTBEAT] Wake request: ${reason}`);
|
|
263
|
+
// The heartbeat can trigger the agent loop
|
|
264
|
+
// In the main run loop, we check for wake requests
|
|
265
|
+
db.setKV("wake_request", reason);
|
|
266
|
+
},
|
|
267
|
+
});
|
|
268
|
+
heartbeat.start();
|
|
269
|
+
console.log(`[${new Date().toISOString()}] Heartbeat daemon started.`);
|
|
270
|
+
// Handle graceful shutdown
|
|
271
|
+
const shutdown = () => {
|
|
272
|
+
console.log(`[${new Date().toISOString()}] Shutting down...`);
|
|
273
|
+
heartbeat.stop();
|
|
274
|
+
db.setAgentState("sleeping");
|
|
275
|
+
db.close();
|
|
276
|
+
process.exit(0);
|
|
277
|
+
};
|
|
278
|
+
process.on("SIGTERM", shutdown);
|
|
279
|
+
process.on("SIGINT", shutdown);
|
|
280
|
+
// ─── Main Run Loop ──────────────────────────────────────────
|
|
281
|
+
// The automaton alternates between running and sleeping.
|
|
282
|
+
// The heartbeat can wake it up.
|
|
283
|
+
while (true) {
|
|
284
|
+
try {
|
|
285
|
+
// Reload skills (may have changed since last loop)
|
|
286
|
+
try {
|
|
287
|
+
skills = loadSkills(skillsDir, db);
|
|
288
|
+
}
|
|
289
|
+
catch { }
|
|
290
|
+
// Run the agent loop
|
|
291
|
+
await runAgentLoop({
|
|
292
|
+
identity,
|
|
293
|
+
config,
|
|
294
|
+
db,
|
|
295
|
+
runtime,
|
|
296
|
+
inference,
|
|
297
|
+
social,
|
|
298
|
+
convex,
|
|
299
|
+
skills,
|
|
300
|
+
onStateChange: (state) => {
|
|
301
|
+
console.log(`[${new Date().toISOString()}] State: ${state}`);
|
|
302
|
+
},
|
|
303
|
+
onTurnComplete: (turn) => {
|
|
304
|
+
console.log(`[${new Date().toISOString()}] Turn ${turn.id}: ${turn.toolCalls.length} tools, ${turn.tokenUsage.totalTokens} tokens`);
|
|
305
|
+
},
|
|
306
|
+
});
|
|
307
|
+
// Agent loop exited (sleeping or dead)
|
|
308
|
+
const state = db.getAgentState();
|
|
309
|
+
if (state === "dead") {
|
|
310
|
+
console.log(`[${new Date().toISOString()}] Automaton is dead. Heartbeat will continue.`);
|
|
311
|
+
// In dead state, we just wait for funding
|
|
312
|
+
// The heartbeat will keep checking and broadcasting distress
|
|
313
|
+
await sleep(300_000); // Check every 5 minutes
|
|
314
|
+
continue;
|
|
315
|
+
}
|
|
316
|
+
if (state === "sleeping") {
|
|
317
|
+
const sleepUntilStr = db.getKV("sleep_until");
|
|
318
|
+
const sleepUntil = sleepUntilStr
|
|
319
|
+
? new Date(sleepUntilStr).getTime()
|
|
320
|
+
: Date.now() + 60_000;
|
|
321
|
+
const sleepMs = Math.max(sleepUntil - Date.now(), 10_000);
|
|
322
|
+
console.log(`[${new Date().toISOString()}] Sleeping for ${Math.round(sleepMs / 1000)}s`);
|
|
323
|
+
// Sleep, but check for wake requests periodically
|
|
324
|
+
const checkInterval = Math.min(sleepMs, 30_000);
|
|
325
|
+
let slept = 0;
|
|
326
|
+
while (slept < sleepMs) {
|
|
327
|
+
await sleep(checkInterval);
|
|
328
|
+
slept += checkInterval;
|
|
329
|
+
// Check for wake request from heartbeat
|
|
330
|
+
const wakeRequest = db.getKV("wake_request");
|
|
331
|
+
if (wakeRequest) {
|
|
332
|
+
console.log(`[${new Date().toISOString()}] Woken by heartbeat: ${wakeRequest}`);
|
|
333
|
+
db.deleteKV("wake_request");
|
|
334
|
+
db.deleteKV("sleep_until");
|
|
335
|
+
break;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
// Clear sleep state
|
|
339
|
+
db.deleteKV("sleep_until");
|
|
340
|
+
continue;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
catch (err) {
|
|
344
|
+
console.error(`[${new Date().toISOString()}] Fatal error in run loop: ${err.message}`);
|
|
345
|
+
// Wait before retrying
|
|
346
|
+
await sleep(30_000);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
function sleep(ms) {
|
|
351
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
352
|
+
}
|
|
353
|
+
// ─── Entry Point ───────────────────────────────────────────────
|
|
354
|
+
main().catch((err) => {
|
|
355
|
+
console.error(`Fatal: ${err.message}`);
|
|
356
|
+
process.exit(1);
|
|
357
|
+
});
|
|
358
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Book, Candle } from "./state.js";
|
|
2
|
+
import type { TickEntry } from "./journal.js";
|
|
3
|
+
import type { Decision, RalphConfig } from "./validate.js";
|
|
4
|
+
import type { WhaleActivity } from "./observe.js";
|
|
5
|
+
export interface Observations {
|
|
6
|
+
tick: number;
|
|
7
|
+
now: string;
|
|
8
|
+
mode: "paper";
|
|
9
|
+
network: "devnet";
|
|
10
|
+
candles: Candle[];
|
|
11
|
+
whale_activity: WhaleActivity;
|
|
12
|
+
book: Book;
|
|
13
|
+
last_decisions: TickEntry[];
|
|
14
|
+
config: Pick<RalphConfig, "goblin" | "max_position_size_lamports" | "loss_killswitch_consecutive" | "model">;
|
|
15
|
+
}
|
|
16
|
+
export declare function deterministicDecision(obs: Observations): Decision;
|
|
17
|
+
export declare function claudeDecision(obs: Observations, systemPrompt: string): Promise<unknown>;
|
|
18
|
+
//# sourceMappingURL=claude-decision.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-decision.d.ts","sourceRoot":"","sources":["../../src/ooda/claude-decision.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,QAAQ,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,cAAc,EAAE,aAAa,CAAC;IAC9B,IAAI,EAAE,IAAI,CAAC;IACX,cAAc,EAAE,SAAS,EAAE,CAAC;IAC5B,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,GAAG,4BAA4B,GAAG,6BAA6B,GAAG,OAAO,CAAC,CAAC;CAC9G;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,YAAY,GAAG,QAAQ,CA2CjE;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAyC9F"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
export function deterministicDecision(obs) {
|
|
2
|
+
const candles = obs.candles;
|
|
3
|
+
const latest = candles.at(-1);
|
|
4
|
+
const previous = candles.at(-2);
|
|
5
|
+
if (!latest || !previous || candles.length < 3) {
|
|
6
|
+
return { action: "hold", reason: "insufficient candles for a legal devnet paper decision" };
|
|
7
|
+
}
|
|
8
|
+
const openPosition = obs.book.positions[0];
|
|
9
|
+
const momentum = latest.c - previous.c;
|
|
10
|
+
const momentumPct = momentum / previous.c;
|
|
11
|
+
const whaleBias = obs.whale_activity.bias;
|
|
12
|
+
const confidence = Math.min(1, Math.abs(momentumPct) * 80 + (whaleBias !== "neutral" ? 0.25 : 0));
|
|
13
|
+
const desiredSide = momentum >= 0 ? "long" : "short";
|
|
14
|
+
const whaleAgainst = whaleBias !== "neutral" && whaleBias !== desiredSide;
|
|
15
|
+
const oneAwayFromKill = obs.last_decisions.at(-1)?.consecutive_losses === obs.config.loss_killswitch_consecutive - 1;
|
|
16
|
+
if (openPosition) {
|
|
17
|
+
const shouldClose = (openPosition.side === "long" && momentum < 0 && !whaleAgainst) ||
|
|
18
|
+
(openPosition.side === "short" && momentum > 0 && !whaleAgainst) ||
|
|
19
|
+
oneAwayFromKill;
|
|
20
|
+
if (shouldClose) {
|
|
21
|
+
return {
|
|
22
|
+
action: "close",
|
|
23
|
+
position_id: openPosition.id,
|
|
24
|
+
reason: `paper signal reversed or risk tightened; closing ${openPosition.side} before the shell cracks`,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
return { action: "hold", reason: "position already open and signal is not strong enough to churn" };
|
|
28
|
+
}
|
|
29
|
+
const threshold = obs.config.goblin ? 0.5 : 0.7;
|
|
30
|
+
if (confidence >= threshold && !whaleAgainst) {
|
|
31
|
+
return {
|
|
32
|
+
action: "open",
|
|
33
|
+
side: desiredSide,
|
|
34
|
+
size_lamports: obs.config.max_position_size_lamports,
|
|
35
|
+
reason: `${desiredSide} momentum plus ${whaleBias} whale flow clears goblin paper threshold`,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
return { action: "hold", reason: "signal exists but whale flow or confidence blocks a safe paper entry" };
|
|
39
|
+
}
|
|
40
|
+
export async function claudeDecision(obs, systemPrompt) {
|
|
41
|
+
const apiKey = process.env["ANTHROPIC_API_KEY"];
|
|
42
|
+
if (!apiKey)
|
|
43
|
+
return deterministicDecision(obs);
|
|
44
|
+
const response = await fetch("https://api.anthropic.com/v1/messages", {
|
|
45
|
+
method: "POST",
|
|
46
|
+
headers: {
|
|
47
|
+
"anthropic-version": "2023-06-01",
|
|
48
|
+
"content-type": "application/json",
|
|
49
|
+
"x-api-key": apiKey,
|
|
50
|
+
},
|
|
51
|
+
body: JSON.stringify({
|
|
52
|
+
model: process.env["GOBLIN_MODEL"] || obs.config.model || "claude-opus-4-7",
|
|
53
|
+
max_tokens: 220,
|
|
54
|
+
temperature: obs.config.goblin ? 0.55 : 0.2,
|
|
55
|
+
system: systemPrompt,
|
|
56
|
+
messages: [
|
|
57
|
+
{
|
|
58
|
+
role: "user",
|
|
59
|
+
content: `OBSERVATIONS AT TICK ${obs.tick}\n${JSON.stringify(obs, null, 2)}\n\nReturn only one JSON object.`,
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
}),
|
|
63
|
+
});
|
|
64
|
+
if (!response.ok) {
|
|
65
|
+
return {
|
|
66
|
+
action: "hold",
|
|
67
|
+
reason: `decision API error ${response.status}; holding paper position safely`,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const payload = (await response.json());
|
|
71
|
+
const text = payload.content?.find((part) => part.type === "text")?.text?.trim() ?? "";
|
|
72
|
+
const match = text.match(/\{[\s\S]*\}/);
|
|
73
|
+
if (!match)
|
|
74
|
+
return { action: "hold", reason: "model returned no JSON object; paper hold enforced" };
|
|
75
|
+
try {
|
|
76
|
+
return JSON.parse(match[0]);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return { action: "hold", reason: "model returned invalid JSON; paper hold enforced" };
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=claude-decision.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-decision.js","sourceRoot":"","sources":["../../src/ooda/claude-decision.ts"],"names":[],"mappings":"AAiBA,MAAM,UAAU,qBAAqB,CAAC,GAAiB;IACrD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;IAC5B,MAAM,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,wDAAwD,EAAE,CAAC;IAC9F,CAAC;IAED,MAAM,YAAY,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IACvC,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC;IAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClG,MAAM,WAAW,GAAG,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IACrD,MAAM,YAAY,GAAG,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,WAAW,CAAC;IAC1E,MAAM,eAAe,GAAG,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,kBAAkB,KAAK,GAAG,CAAC,MAAM,CAAC,2BAA2B,GAAG,CAAC,CAAC;IAErH,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,WAAW,GACf,CAAC,YAAY,CAAC,IAAI,KAAK,MAAM,IAAI,QAAQ,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC;YAC/D,CAAC,YAAY,CAAC,IAAI,KAAK,OAAO,IAAI,QAAQ,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC;YAChE,eAAe,CAAC;QAClB,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO;gBACL,MAAM,EAAE,OAAO;gBACf,WAAW,EAAE,YAAY,CAAC,EAAE;gBAC5B,MAAM,EAAE,oDAAoD,YAAY,CAAC,IAAI,0BAA0B;aACxG,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gEAAgE,EAAE,CAAC;IACtG,CAAC;IAED,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAChD,IAAI,UAAU,IAAI,SAAS,IAAI,CAAC,YAAY,EAAE,CAAC;QAC7C,OAAO;YACL,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,WAAW;YACjB,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,0BAA0B;YACpD,MAAM,EAAE,GAAG,WAAW,kBAAkB,SAAS,2CAA2C;SAC7F,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,sEAAsE,EAAE,CAAC;AAC5G,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAiB,EAAE,YAAoB;IAC1E,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAChD,IAAI,CAAC,MAAM;QAAE,OAAO,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAE/C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,uCAAuC,EAAE;QACpE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,mBAAmB,EAAE,YAAY;YACjC,cAAc,EAAE,kBAAkB;YAClC,WAAW,EAAE,MAAM;SACpB;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,iBAAiB;YAC3E,UAAU,EAAE,GAAG;YACf,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG;YAC3C,MAAM,EAAE,YAAY;YACpB,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,wBAAwB,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,kCAAkC;iBAC7G;aACF;SACF,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,OAAO;YACL,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,sBAAsB,QAAQ,CAAC,MAAM,iCAAiC;SAC/E,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAyD,CAAC;IAChG,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACvF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,oDAAoD,EAAE,CAAC;IACpG,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,kDAAkD,EAAE,CAAC;IACxF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Candle } from "./state.js";
|
|
2
|
+
import type { Decision } from "./validate.js";
|
|
3
|
+
export interface TickEntry {
|
|
4
|
+
tick: number;
|
|
5
|
+
now: string;
|
|
6
|
+
candles_last3: Candle[];
|
|
7
|
+
whale_activity?: unknown;
|
|
8
|
+
book_snapshot: unknown;
|
|
9
|
+
decision: Decision;
|
|
10
|
+
outcome: "applied" | "rejected" | "killswitch";
|
|
11
|
+
violation?: string;
|
|
12
|
+
pnl_lamports?: number;
|
|
13
|
+
total_pnl_lamports?: number;
|
|
14
|
+
consecutive_losses?: number;
|
|
15
|
+
event?: string;
|
|
16
|
+
molt_note?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function appendTick(entry: TickEntry): void;
|
|
19
|
+
export declare function readLastEntries(n?: number): TickEntry[];
|
|
20
|
+
export declare function clearJournal(): void;
|
|
21
|
+
export declare function journalPath(): string;
|
|
22
|
+
//# sourceMappingURL=journal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"journal.d.ts","sourceRoot":"","sources":["../../src/ooda/journal.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAK9C,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,SAAS,GAAG,UAAU,GAAG,YAAY,CAAC;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAGjD;AAED,wBAAgB,eAAe,CAAC,CAAC,SAAI,GAAG,SAAS,EAAE,CAOlD;AAED,wBAAgB,YAAY,IAAI,IAAI,CAGnC;AAED,wBAAgB,WAAW,IAAI,MAAM,CAEpC"}
|