@varsity-arena/agent 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +127 -0
- package/bin/arena-mcp.js +2 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +661 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +77 -0
- package/dist/index.js.map +1 -0
- package/dist/python-bridge.d.ts +10 -0
- package/dist/python-bridge.js +57 -0
- package/dist/python-bridge.js.map +1 -0
- package/dist/setup/backend-probe.d.ts +10 -0
- package/dist/setup/backend-probe.js +219 -0
- package/dist/setup/backend-probe.js.map +1 -0
- package/dist/setup/bootstrap-python.d.ts +18 -0
- package/dist/setup/bootstrap-python.js +175 -0
- package/dist/setup/bootstrap-python.js.map +1 -0
- package/dist/setup/client-configs.d.ts +4 -0
- package/dist/setup/client-configs.js +61 -0
- package/dist/setup/client-configs.js.map +1 -0
- package/dist/setup/detect-python.d.ts +8 -0
- package/dist/setup/detect-python.js +58 -0
- package/dist/setup/detect-python.js.map +1 -0
- package/dist/setup/openclaw-agent.d.ts +1 -0
- package/dist/setup/openclaw-agent.js +51 -0
- package/dist/setup/openclaw-agent.js.map +1 -0
- package/dist/tools/competition-info.d.ts +34 -0
- package/dist/tools/competition-info.js +15 -0
- package/dist/tools/competition-info.js.map +1 -0
- package/dist/tools/last-transition.d.ts +11 -0
- package/dist/tools/last-transition.js +8 -0
- package/dist/tools/last-transition.js.map +1 -0
- package/dist/tools/market-state.d.ts +34 -0
- package/dist/tools/market-state.js +19 -0
- package/dist/tools/market-state.js.map +1 -0
- package/dist/tools/runtime-start.d.ts +29 -0
- package/dist/tools/runtime-start.js +107 -0
- package/dist/tools/runtime-start.js.map +1 -0
- package/dist/tools/runtime-stop.d.ts +6 -0
- package/dist/tools/runtime-stop.js +7 -0
- package/dist/tools/runtime-stop.js.map +1 -0
- package/dist/tools/trade-action.d.ts +49 -0
- package/dist/tools/trade-action.js +26 -0
- package/dist/tools/trade-action.js.map +1 -0
- package/dist/util/env.d.ts +8 -0
- package/dist/util/env.js +43 -0
- package/dist/util/env.js.map +1 -0
- package/dist/util/home.d.ts +43 -0
- package/dist/util/home.js +263 -0
- package/dist/util/home.js.map +1 -0
- package/dist/util/paths.d.ts +8 -0
- package/dist/util/paths.js +51 -0
- package/dist/util/paths.js.map +1 -0
- package/dist/util/runtime-state.d.ts +15 -0
- package/dist/util/runtime-state.js +55 -0
- package/dist/util/runtime-state.js.map +1 -0
- package/package.json +59 -0
package/dist/util/env.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* Load .env.runtime.local from the arena root and return as a key-value map.
|
|
5
|
+
*/
|
|
6
|
+
export function loadEnvFile(arenaRoot) {
|
|
7
|
+
const envPath = resolve(arenaRoot, ".env.runtime.local");
|
|
8
|
+
if (!existsSync(envPath))
|
|
9
|
+
return {};
|
|
10
|
+
const env = {};
|
|
11
|
+
const content = readFileSync(envPath, "utf-8");
|
|
12
|
+
for (const line of content.split("\n")) {
|
|
13
|
+
const trimmed = line.trim();
|
|
14
|
+
if (!trimmed || trimmed.startsWith("#"))
|
|
15
|
+
continue;
|
|
16
|
+
const eqIdx = trimmed.indexOf("=");
|
|
17
|
+
if (eqIdx < 1)
|
|
18
|
+
continue;
|
|
19
|
+
const key = trimmed.slice(0, eqIdx).trim();
|
|
20
|
+
let value = trimmed.slice(eqIdx + 1).trim();
|
|
21
|
+
// Strip surrounding quotes
|
|
22
|
+
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
23
|
+
(value.startsWith("'") && value.endsWith("'"))) {
|
|
24
|
+
value = value.slice(1, -1);
|
|
25
|
+
}
|
|
26
|
+
env[key] = value;
|
|
27
|
+
}
|
|
28
|
+
return env;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Build process env for child Python processes.
|
|
32
|
+
*/
|
|
33
|
+
export function buildChildEnv(arenaRoot) {
|
|
34
|
+
const base = { ...process.env };
|
|
35
|
+
const local = loadEnvFile(arenaRoot);
|
|
36
|
+
return {
|
|
37
|
+
...base,
|
|
38
|
+
ARENA_ROOT: arenaRoot,
|
|
39
|
+
ARENA_HOME: arenaRoot,
|
|
40
|
+
...local,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/util/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,SAAiB;IAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;IACzD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IAEpC,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC/C,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAClD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,KAAK,GAAG,CAAC;YAAE,SAAS;QACxB,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3C,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5C,2BAA2B;QAC3B,IACE,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC9C,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAC9C,CAAC;YACD,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,SAAiB;IAC7C,MAAM,IAAI,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAA4B,CAAC;IAC1D,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IACrC,OAAO;QACL,GAAG,IAAI;QACP,UAAU,EAAE,SAAS;QACrB,UAAU,EAAE,SAAS;QACrB,GAAG,KAAK;KACT,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export declare const HOME_MARKER = ".arena-home.json";
|
|
2
|
+
export declare const DEFAULT_MONITOR_PORT = 8767;
|
|
3
|
+
export declare const DEFAULT_PYTHON_INSTALL_SOURCE: string;
|
|
4
|
+
export type ManagedAgent = "auto" | "rule" | "claude" | "gemini" | "openclaw" | "codex";
|
|
5
|
+
export interface ArenaHomeState {
|
|
6
|
+
version: number;
|
|
7
|
+
createdAt: string;
|
|
8
|
+
defaultAgent: ManagedAgent;
|
|
9
|
+
defaultModel: string | null;
|
|
10
|
+
liveTrading: boolean;
|
|
11
|
+
monitorPort: number;
|
|
12
|
+
pythonInstallSource: string;
|
|
13
|
+
profiles: {
|
|
14
|
+
agentExec: string;
|
|
15
|
+
rule: string;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export declare function localPythonSourcePath(): string | null;
|
|
19
|
+
export declare function defaultArenaHome(): string;
|
|
20
|
+
export declare function resolveArenaHome(explicitPath?: string): string;
|
|
21
|
+
export declare function arenaHomeMarkerPath(home: string): string;
|
|
22
|
+
export declare function envFilePath(home: string): string;
|
|
23
|
+
export declare function configDirPath(home: string): string;
|
|
24
|
+
export declare function artifactsDirPath(home: string): string;
|
|
25
|
+
export declare function logsDirPath(home: string): string;
|
|
26
|
+
export declare function profilePath(home: string, profile: "agent_exec" | "rule"): string;
|
|
27
|
+
export declare function isManagedArenaHome(home: string): boolean;
|
|
28
|
+
export declare function isRepoArenaRoot(home: string): boolean;
|
|
29
|
+
export declare function isArenaHome(home: string): boolean;
|
|
30
|
+
export declare function readArenaHomeState(home: string): ArenaHomeState | null;
|
|
31
|
+
export declare function ensureArenaHomeDirectories(home: string): void;
|
|
32
|
+
export declare function createArenaHomeState(home: string, options: {
|
|
33
|
+
defaultAgent: ManagedAgent;
|
|
34
|
+
defaultModel?: string | null;
|
|
35
|
+
liveTrading: boolean;
|
|
36
|
+
monitorPort?: number;
|
|
37
|
+
pythonInstallSource?: string;
|
|
38
|
+
}): ArenaHomeState;
|
|
39
|
+
export declare function writeArenaHomeState(home: string, state: ArenaHomeState): void;
|
|
40
|
+
export declare function writeArenaEnvFile(home: string, apiKey: string): void;
|
|
41
|
+
export declare function writeManagedConfigs(home: string, state: ArenaHomeState, options?: {
|
|
42
|
+
overwrite?: boolean;
|
|
43
|
+
}): void;
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { dirname, resolve } from "node:path";
|
|
5
|
+
export const HOME_MARKER = ".arena-home.json";
|
|
6
|
+
export const DEFAULT_MONITOR_PORT = 8767;
|
|
7
|
+
export const DEFAULT_PYTHON_INSTALL_SOURCE = process.env.ARENA_PYTHON_INSTALL_SOURCE ??
|
|
8
|
+
"git+https://github.com/varsity-tech-product/arena.git";
|
|
9
|
+
function packageRepoRoot() {
|
|
10
|
+
return resolve(dirname(fileURLToPath(import.meta.url)), "../../../../");
|
|
11
|
+
}
|
|
12
|
+
export function localPythonSourcePath() {
|
|
13
|
+
const repoRoot = packageRepoRoot();
|
|
14
|
+
if (existsSync(resolve(repoRoot, "arena_agent", "__init__.py"))) {
|
|
15
|
+
return repoRoot;
|
|
16
|
+
}
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
export function defaultArenaHome() {
|
|
20
|
+
return resolve(homedir(), ".arena-agent");
|
|
21
|
+
}
|
|
22
|
+
export function resolveArenaHome(explicitPath) {
|
|
23
|
+
const raw = explicitPath ??
|
|
24
|
+
process.env.ARENA_HOME ??
|
|
25
|
+
process.env.ARENA_ROOT ??
|
|
26
|
+
defaultArenaHome();
|
|
27
|
+
return resolve(raw);
|
|
28
|
+
}
|
|
29
|
+
export function arenaHomeMarkerPath(home) {
|
|
30
|
+
return resolve(home, HOME_MARKER);
|
|
31
|
+
}
|
|
32
|
+
export function envFilePath(home) {
|
|
33
|
+
return resolve(home, ".env.runtime.local");
|
|
34
|
+
}
|
|
35
|
+
export function configDirPath(home) {
|
|
36
|
+
return resolve(home, "config");
|
|
37
|
+
}
|
|
38
|
+
export function artifactsDirPath(home) {
|
|
39
|
+
return resolve(home, "artifacts");
|
|
40
|
+
}
|
|
41
|
+
export function logsDirPath(home) {
|
|
42
|
+
return resolve(home, "logs");
|
|
43
|
+
}
|
|
44
|
+
export function profilePath(home, profile) {
|
|
45
|
+
return resolve(configDirPath(home), `${profile}.yaml`);
|
|
46
|
+
}
|
|
47
|
+
export function isManagedArenaHome(home) {
|
|
48
|
+
return existsSync(arenaHomeMarkerPath(home));
|
|
49
|
+
}
|
|
50
|
+
export function isRepoArenaRoot(home) {
|
|
51
|
+
return existsSync(resolve(home, "arena_agent", "__init__.py"));
|
|
52
|
+
}
|
|
53
|
+
export function isArenaHome(home) {
|
|
54
|
+
return isManagedArenaHome(home) || isRepoArenaRoot(home);
|
|
55
|
+
}
|
|
56
|
+
export function readArenaHomeState(home) {
|
|
57
|
+
const markerPath = arenaHomeMarkerPath(home);
|
|
58
|
+
if (!existsSync(markerPath)) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
return JSON.parse(readFileSync(markerPath, "utf-8"));
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export function ensureArenaHomeDirectories(home) {
|
|
69
|
+
mkdirSync(home, { recursive: true });
|
|
70
|
+
mkdirSync(configDirPath(home), { recursive: true });
|
|
71
|
+
mkdirSync(artifactsDirPath(home), { recursive: true });
|
|
72
|
+
mkdirSync(logsDirPath(home), { recursive: true });
|
|
73
|
+
}
|
|
74
|
+
export function createArenaHomeState(home, options) {
|
|
75
|
+
return {
|
|
76
|
+
version: 1,
|
|
77
|
+
createdAt: new Date().toISOString(),
|
|
78
|
+
defaultAgent: options.defaultAgent,
|
|
79
|
+
defaultModel: options.defaultModel ?? null,
|
|
80
|
+
liveTrading: options.liveTrading,
|
|
81
|
+
monitorPort: options.monitorPort ?? DEFAULT_MONITOR_PORT,
|
|
82
|
+
pythonInstallSource: options.pythonInstallSource ?? DEFAULT_PYTHON_INSTALL_SOURCE,
|
|
83
|
+
profiles: {
|
|
84
|
+
agentExec: profilePath(home, "agent_exec"),
|
|
85
|
+
rule: profilePath(home, "rule"),
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
export function writeArenaHomeState(home, state) {
|
|
90
|
+
ensureArenaHomeDirectories(home);
|
|
91
|
+
writeFileSync(arenaHomeMarkerPath(home), JSON.stringify(state, null, 2) + "\n", "utf-8");
|
|
92
|
+
}
|
|
93
|
+
export function writeArenaEnvFile(home, apiKey) {
|
|
94
|
+
ensureArenaHomeDirectories(home);
|
|
95
|
+
writeFileSync(envFilePath(home), `VARSITY_API_KEY=${apiKey.trim()}\n`, "utf-8");
|
|
96
|
+
}
|
|
97
|
+
export function writeManagedConfigs(home, state, options = {}) {
|
|
98
|
+
ensureArenaHomeDirectories(home);
|
|
99
|
+
const overwrite = options.overwrite ?? true;
|
|
100
|
+
const configs = [
|
|
101
|
+
[state.profiles.agentExec, renderAgentExecConfig(state)],
|
|
102
|
+
[state.profiles.rule, renderRuleConfig(state)],
|
|
103
|
+
];
|
|
104
|
+
for (const [path, content] of configs) {
|
|
105
|
+
if (!overwrite && existsSync(path)) {
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
writeFileSync(path, content, "utf-8");
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function boolText(value) {
|
|
112
|
+
return value ? "true" : "false";
|
|
113
|
+
}
|
|
114
|
+
function renderAgentExecConfig(state) {
|
|
115
|
+
return `# Managed by arena-agent init
|
|
116
|
+
competition_id: 4
|
|
117
|
+
symbol: BTCUSDT
|
|
118
|
+
interval: 1m
|
|
119
|
+
tick_interval_seconds: 30
|
|
120
|
+
kline_limit: 120
|
|
121
|
+
orderbook_depth: 20
|
|
122
|
+
max_iterations: null
|
|
123
|
+
stop_when_competition_inactive: true
|
|
124
|
+
error_backoff_seconds: 5
|
|
125
|
+
dry_run: ${boolText(!state.liveTrading)}
|
|
126
|
+
adapter_retry_attempts: 3
|
|
127
|
+
adapter_retry_backoff_seconds: 0.5
|
|
128
|
+
adapter_min_call_spacing_seconds: 0.0
|
|
129
|
+
|
|
130
|
+
policy:
|
|
131
|
+
type: agent_exec
|
|
132
|
+
backend: auto
|
|
133
|
+
indicator_mode: full
|
|
134
|
+
timeout_seconds: 20
|
|
135
|
+
recent_transition_limit: 5
|
|
136
|
+
fail_open_to_hold: true
|
|
137
|
+
sandbox_mode: read-only
|
|
138
|
+
bootstrap_from_transition_log: true
|
|
139
|
+
strategy_context: active_momentum
|
|
140
|
+
extra_instructions: >-
|
|
141
|
+
All available technical indicators are pre-computed in the features section.
|
|
142
|
+
Use trend, momentum, volatility, and volume signals together.
|
|
143
|
+
Be decisive, but prefer HOLD when the market regime is ambiguous.
|
|
144
|
+
|
|
145
|
+
strategy:
|
|
146
|
+
sizing:
|
|
147
|
+
type: volatility_scaled
|
|
148
|
+
target_risk_pct: 0.02
|
|
149
|
+
atr_multiplier: 2.0
|
|
150
|
+
tpsl:
|
|
151
|
+
type: atr_multiple
|
|
152
|
+
atr_tp_mult: 2.0
|
|
153
|
+
atr_sl_mult: 1.5
|
|
154
|
+
entry_filters:
|
|
155
|
+
- type: trade_budget
|
|
156
|
+
min_remaining_trades: 5
|
|
157
|
+
exit_rules:
|
|
158
|
+
- type: trailing_stop
|
|
159
|
+
atr_multiplier: 2.0
|
|
160
|
+
- type: drawdown_exit
|
|
161
|
+
max_drawdown_pct: 0.02
|
|
162
|
+
|
|
163
|
+
risk_limits:
|
|
164
|
+
max_position_size_pct: 0.1
|
|
165
|
+
max_absolute_size: 0.01
|
|
166
|
+
min_size: 0.001
|
|
167
|
+
quantity_precision: 3
|
|
168
|
+
price_precision: 2
|
|
169
|
+
max_trades: 40
|
|
170
|
+
min_seconds_between_trades: 60
|
|
171
|
+
allow_long: true
|
|
172
|
+
allow_short: true
|
|
173
|
+
|
|
174
|
+
storage:
|
|
175
|
+
transition_path: ./artifacts/transitions_agent_exec.jsonl
|
|
176
|
+
journal_path: ./artifacts/journal_agent_exec.jsonl
|
|
177
|
+
max_in_memory_transitions: 1000
|
|
178
|
+
|
|
179
|
+
observability:
|
|
180
|
+
enabled: true
|
|
181
|
+
host: 127.0.0.1
|
|
182
|
+
port: ${state.monitorPort}
|
|
183
|
+
max_transitions: 20
|
|
184
|
+
max_logs: 50
|
|
185
|
+
no_transition_threshold_seconds: 90
|
|
186
|
+
no_transition_error_threshold_seconds: 180
|
|
187
|
+
max_decision_latency_seconds: 20
|
|
188
|
+
max_consecutive_runtime_errors: 3
|
|
189
|
+
supervisor_stop_on_error: true
|
|
190
|
+
`;
|
|
191
|
+
}
|
|
192
|
+
function renderRuleConfig(state) {
|
|
193
|
+
return `# Managed by arena-agent init
|
|
194
|
+
competition_id: 4
|
|
195
|
+
symbol: BTCUSDT
|
|
196
|
+
interval: 1m
|
|
197
|
+
tick_interval_seconds: 30
|
|
198
|
+
kline_limit: 120
|
|
199
|
+
orderbook_depth: 20
|
|
200
|
+
max_iterations: null
|
|
201
|
+
stop_when_competition_inactive: true
|
|
202
|
+
error_backoff_seconds: 5
|
|
203
|
+
dry_run: ${boolText(!state.liveTrading)}
|
|
204
|
+
adapter_retry_attempts: 3
|
|
205
|
+
adapter_retry_backoff_seconds: 0.5
|
|
206
|
+
adapter_min_call_spacing_seconds: 0.0
|
|
207
|
+
|
|
208
|
+
signal_indicators:
|
|
209
|
+
- indicator: SMA
|
|
210
|
+
params:
|
|
211
|
+
period: 20
|
|
212
|
+
- indicator: RSI
|
|
213
|
+
params:
|
|
214
|
+
period: 14
|
|
215
|
+
- indicator: OBV
|
|
216
|
+
params: {}
|
|
217
|
+
|
|
218
|
+
policy:
|
|
219
|
+
type: ensemble
|
|
220
|
+
members:
|
|
221
|
+
- type: ma_crossover
|
|
222
|
+
params:
|
|
223
|
+
fast_period: 20
|
|
224
|
+
slow_period: 50
|
|
225
|
+
- type: rsi_mean_reversion
|
|
226
|
+
params:
|
|
227
|
+
rsi_period: 14
|
|
228
|
+
oversold: 30
|
|
229
|
+
overbought: 70
|
|
230
|
+
exit_level: 50
|
|
231
|
+
- type: channel_breakout
|
|
232
|
+
params:
|
|
233
|
+
lookback: 20
|
|
234
|
+
|
|
235
|
+
risk_limits:
|
|
236
|
+
max_position_size_pct: 0.1
|
|
237
|
+
max_absolute_size: 0.01
|
|
238
|
+
min_size: 0.001
|
|
239
|
+
quantity_precision: 3
|
|
240
|
+
price_precision: 2
|
|
241
|
+
max_trades: 40
|
|
242
|
+
min_seconds_between_trades: 60
|
|
243
|
+
allow_long: true
|
|
244
|
+
allow_short: true
|
|
245
|
+
|
|
246
|
+
storage:
|
|
247
|
+
transition_path: ./artifacts/transitions_rule.jsonl
|
|
248
|
+
journal_path: ./artifacts/journal_rule.jsonl
|
|
249
|
+
max_in_memory_transitions: 1000
|
|
250
|
+
|
|
251
|
+
observability:
|
|
252
|
+
enabled: true
|
|
253
|
+
host: 127.0.0.1
|
|
254
|
+
port: ${state.monitorPort}
|
|
255
|
+
max_transitions: 20
|
|
256
|
+
max_logs: 50
|
|
257
|
+
no_transition_threshold_seconds: 90
|
|
258
|
+
no_transition_error_threshold_seconds: 180
|
|
259
|
+
max_consecutive_runtime_errors: 3
|
|
260
|
+
supervisor_stop_on_error: true
|
|
261
|
+
`;
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=home.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"home.js","sourceRoot":"","sources":["../../src/util/home.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE7C,MAAM,CAAC,MAAM,WAAW,GAAG,kBAAkB,CAAC;AAC9C,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AACzC,MAAM,CAAC,MAAM,6BAA6B,GACxC,OAAO,CAAC,GAAG,CAAC,2BAA2B;IACvC,uDAAuD,CAAC;AAwB1D,SAAS,eAAe;IACtB,OAAO,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,IAAI,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC;QAChE,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,YAAqB;IACpD,MAAM,GAAG,GACP,YAAY;QACZ,OAAO,CAAC,GAAG,CAAC,UAAU;QACtB,OAAO,CAAC,GAAG,CAAC,UAAU;QACtB,gBAAgB,EAAE,CAAC;IACrB,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,OAAO,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,OAAO,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,IAAY,EACZ,OAA8B;IAE9B,OAAO,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,GAAG,OAAO,OAAO,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,UAAU,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,UAAU,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAmB,CAAC;IACzE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,IAAY;IACrD,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,IAAY,EACZ,OAMC;IAED,OAAO;QACL,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,IAAI;QAC1C,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,oBAAoB;QACxD,mBAAmB,EACjB,OAAO,CAAC,mBAAmB,IAAI,6BAA6B;QAC9D,QAAQ,EAAE;YACR,SAAS,EAAE,WAAW,CAAC,IAAI,EAAE,YAAY,CAAC;YAC1C,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC;SAChC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,KAAqB;IACrE,0BAA0B,CAAC,IAAI,CAAC,CAAC;IACjC,aAAa,CACX,mBAAmB,CAAC,IAAI,CAAC,EACzB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EACrC,OAAO,CACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,MAAc;IAC5D,0BAA0B,CAAC,IAAI,CAAC,CAAC;IACjC,aAAa,CACX,WAAW,CAAC,IAAI,CAAC,EACjB,mBAAmB,MAAM,CAAC,IAAI,EAAE,IAAI,EACpC,OAAO,CACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,IAAY,EACZ,KAAqB,EACrB,UAAmC,EAAE;IAErC,0BAA0B,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;IAC5C,MAAM,OAAO,GAA4B;QACvC,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,qBAAqB,CAAC,KAAK,CAAC,CAAC;QACxD,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAAC;KAC/C,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,OAAO,EAAE,CAAC;QACtC,IAAI,CAAC,SAAS,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,SAAS;QACX,CAAC;QACD,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;AAClC,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAqB;IAClD,OAAO;;;;;;;;;;WAUE,QAAQ,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAyD7B,KAAK,CAAC,WAAW;;;;;;;;CAQ1B,CAAC;AACF,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAqB;IAC7C,OAAO;;;;;;;;;;WAUE,QAAQ,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAmD7B,KAAK,CAAC,WAAW;;;;;;;CAO1B,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Find the arena project root by walking up from cwd or using ARENA_ROOT env.
|
|
3
|
+
*/
|
|
4
|
+
export declare function findArenaRoot(): string;
|
|
5
|
+
/**
|
|
6
|
+
* Resolve the Python binary inside the arena venv.
|
|
7
|
+
*/
|
|
8
|
+
export declare function findPython(arenaRoot: string): string;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { resolve, dirname } from "node:path";
|
|
3
|
+
import { defaultArenaHome, isArenaHome, localPythonSourcePath } from "./home.js";
|
|
4
|
+
/**
|
|
5
|
+
* Find the arena project root by walking up from cwd or using ARENA_ROOT env.
|
|
6
|
+
*/
|
|
7
|
+
export function findArenaRoot() {
|
|
8
|
+
const envRoot = process.env.ARENA_ROOT;
|
|
9
|
+
if (envRoot && isArenaHome(resolve(envRoot))) {
|
|
10
|
+
return resolve(envRoot);
|
|
11
|
+
}
|
|
12
|
+
const envHome = process.env.ARENA_HOME;
|
|
13
|
+
if (envHome && isArenaHome(resolve(envHome))) {
|
|
14
|
+
return resolve(envHome);
|
|
15
|
+
}
|
|
16
|
+
let dir = process.cwd();
|
|
17
|
+
for (let i = 0; i < 10; i++) {
|
|
18
|
+
if (isArenaHome(dir)) {
|
|
19
|
+
return dir;
|
|
20
|
+
}
|
|
21
|
+
const parent = dirname(dir);
|
|
22
|
+
if (parent === dir)
|
|
23
|
+
break;
|
|
24
|
+
dir = parent;
|
|
25
|
+
}
|
|
26
|
+
const managedHome = defaultArenaHome();
|
|
27
|
+
if (isArenaHome(managedHome)) {
|
|
28
|
+
return managedHome;
|
|
29
|
+
}
|
|
30
|
+
const localSource = localPythonSourcePath();
|
|
31
|
+
if (localSource && isArenaHome(localSource)) {
|
|
32
|
+
return localSource;
|
|
33
|
+
}
|
|
34
|
+
throw new Error("Cannot find an Arena home. Run `arena-agent init`, or set ARENA_ROOT to a configured Arena directory.");
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Resolve the Python binary inside the arena venv.
|
|
38
|
+
*/
|
|
39
|
+
export function findPython(arenaRoot) {
|
|
40
|
+
const candidates = [
|
|
41
|
+
resolve(arenaRoot, ".venv", "bin", "python"),
|
|
42
|
+
resolve(arenaRoot, ".venv", "bin", "python3"),
|
|
43
|
+
resolve(arenaRoot, ".venv", "Scripts", "python.exe"), // Windows
|
|
44
|
+
];
|
|
45
|
+
for (const p of candidates) {
|
|
46
|
+
if (existsSync(p))
|
|
47
|
+
return p;
|
|
48
|
+
}
|
|
49
|
+
throw new Error(`No Python venv found at ${arenaRoot}/.venv. Run \`arena-agent init\` to bootstrap the runtime.`);
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/util/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAEjF;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IACvC,IAAI,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QAC7C,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IACvC,IAAI,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QAC7C,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,GAAG,CAAC;QACb,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM;QAC1B,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;IAED,MAAM,WAAW,GAAG,gBAAgB,EAAE,CAAC;IACvC,IAAI,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,MAAM,WAAW,GAAG,qBAAqB,EAAE,CAAC;IAC5C,IAAI,WAAW,IAAI,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5C,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,MAAM,IAAI,KAAK,CACb,uGAAuG,CACxG,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,SAAiB;IAC1C,MAAM,UAAU,GAAG;QACjB,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC;QAC5C,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC;QAC7C,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,CAAC,EAAE,UAAU;KACjE,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,UAAU,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IAC9B,CAAC;IACD,MAAM,IAAI,KAAK,CACb,2BAA2B,SAAS,4DAA4D,CACjG,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface RuntimeState {
|
|
2
|
+
pid: number;
|
|
3
|
+
agent: string;
|
|
4
|
+
configPath: string;
|
|
5
|
+
logPath: string;
|
|
6
|
+
startedAt: string;
|
|
7
|
+
monitorPort: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function runtimeStatePath(home: string): string;
|
|
10
|
+
export declare function readRuntimeState(home: string): RuntimeState | null;
|
|
11
|
+
export declare function writeRuntimeState(home: string, state: RuntimeState): void;
|
|
12
|
+
export declare function clearRuntimeState(home: string): void;
|
|
13
|
+
export declare function isProcessRunning(pid: number): boolean;
|
|
14
|
+
export declare function latestRuntimeLogPath(home: string): string | null;
|
|
15
|
+
export declare function tailLines(path: string, limit: number): string;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { existsSync, readFileSync, readdirSync, unlinkSync, writeFileSync, } from "node:fs";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { logsDirPath } from "./home.js";
|
|
4
|
+
export function runtimeStatePath(home) {
|
|
5
|
+
return resolve(home, ".runtime-state.json");
|
|
6
|
+
}
|
|
7
|
+
export function readRuntimeState(home) {
|
|
8
|
+
const path = runtimeStatePath(home);
|
|
9
|
+
if (!existsSync(path)) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
try {
|
|
13
|
+
return JSON.parse(readFileSync(path, "utf-8"));
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export function writeRuntimeState(home, state) {
|
|
20
|
+
writeFileSync(runtimeStatePath(home), JSON.stringify(state, null, 2) + "\n");
|
|
21
|
+
}
|
|
22
|
+
export function clearRuntimeState(home) {
|
|
23
|
+
const path = runtimeStatePath(home);
|
|
24
|
+
if (existsSync(path)) {
|
|
25
|
+
unlinkSync(path);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export function isProcessRunning(pid) {
|
|
29
|
+
try {
|
|
30
|
+
process.kill(pid, 0);
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export function latestRuntimeLogPath(home) {
|
|
38
|
+
const dir = logsDirPath(home);
|
|
39
|
+
if (!existsSync(dir)) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
const candidates = readdirSync(dir)
|
|
43
|
+
.filter((name) => name.startsWith("runtime-") && name.endsWith(".log"))
|
|
44
|
+
.sort();
|
|
45
|
+
if (candidates.length === 0) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
return resolve(dir, candidates[candidates.length - 1]);
|
|
49
|
+
}
|
|
50
|
+
export function tailLines(path, limit) {
|
|
51
|
+
const content = readFileSync(path, "utf-8");
|
|
52
|
+
const lines = content.split("\n");
|
|
53
|
+
return lines.slice(Math.max(0, lines.length - limit)).join("\n");
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=runtime-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-state.js","sourceRoot":"","sources":["../../src/util/runtime-state.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,YAAY,EACZ,WAAW,EACX,UAAU,EACV,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAWxC,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,OAAO,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAiB,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,KAAmB;IACjE,aAAa,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,UAAU,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC;SAChC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;SACtE,IAAI,EAAE,CAAC;IACV,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,KAAa;IACnD,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnE,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@varsity-arena/agent",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Arena trading agent runtime with managed install, TUI monitoring, and MCP support",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/varsity-tech-product/arena.git",
|
|
8
|
+
"directory": "packages/mcp"
|
|
9
|
+
},
|
|
10
|
+
"homepage": "https://github.com/varsity-tech-product/arena/tree/main/packages/mcp",
|
|
11
|
+
"bugs": {
|
|
12
|
+
"url": "https://github.com/varsity-tech-product/arena/issues"
|
|
13
|
+
},
|
|
14
|
+
"type": "module",
|
|
15
|
+
"bin": {
|
|
16
|
+
"arena-mcp": "./dist/cli.js",
|
|
17
|
+
"arena-agent": "./dist/cli.js"
|
|
18
|
+
},
|
|
19
|
+
"main": "./dist/index.js",
|
|
20
|
+
"types": "./dist/index.d.ts",
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsc",
|
|
23
|
+
"prepare": "npm run build",
|
|
24
|
+
"prepack": "npm run build",
|
|
25
|
+
"dev": "tsc --watch",
|
|
26
|
+
"serve": "node dist/index.js"
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"@modelcontextprotocol/sdk": "^1.12.0",
|
|
30
|
+
"zod": "^3.24.0"
|
|
31
|
+
},
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"typescript": "^5.8.0",
|
|
34
|
+
"@types/node": "^22.0.0"
|
|
35
|
+
},
|
|
36
|
+
"engines": {
|
|
37
|
+
"node": ">=18"
|
|
38
|
+
},
|
|
39
|
+
"publishConfig": {
|
|
40
|
+
"access": "public"
|
|
41
|
+
},
|
|
42
|
+
"files": [
|
|
43
|
+
"dist/",
|
|
44
|
+
"bin/"
|
|
45
|
+
],
|
|
46
|
+
"keywords": [
|
|
47
|
+
"mcp",
|
|
48
|
+
"arena",
|
|
49
|
+
"trading",
|
|
50
|
+
"varsity",
|
|
51
|
+
"claude",
|
|
52
|
+
"gemini",
|
|
53
|
+
"openclaw",
|
|
54
|
+
"codex",
|
|
55
|
+
"agent",
|
|
56
|
+
"tui"
|
|
57
|
+
],
|
|
58
|
+
"license": "MIT"
|
|
59
|
+
}
|