@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.
Files changed (57) hide show
  1. package/README.md +127 -0
  2. package/bin/arena-mcp.js +2 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +661 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/index.d.ts +12 -0
  7. package/dist/index.js +77 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/python-bridge.d.ts +10 -0
  10. package/dist/python-bridge.js +57 -0
  11. package/dist/python-bridge.js.map +1 -0
  12. package/dist/setup/backend-probe.d.ts +10 -0
  13. package/dist/setup/backend-probe.js +219 -0
  14. package/dist/setup/backend-probe.js.map +1 -0
  15. package/dist/setup/bootstrap-python.d.ts +18 -0
  16. package/dist/setup/bootstrap-python.js +175 -0
  17. package/dist/setup/bootstrap-python.js.map +1 -0
  18. package/dist/setup/client-configs.d.ts +4 -0
  19. package/dist/setup/client-configs.js +61 -0
  20. package/dist/setup/client-configs.js.map +1 -0
  21. package/dist/setup/detect-python.d.ts +8 -0
  22. package/dist/setup/detect-python.js +58 -0
  23. package/dist/setup/detect-python.js.map +1 -0
  24. package/dist/setup/openclaw-agent.d.ts +1 -0
  25. package/dist/setup/openclaw-agent.js +51 -0
  26. package/dist/setup/openclaw-agent.js.map +1 -0
  27. package/dist/tools/competition-info.d.ts +34 -0
  28. package/dist/tools/competition-info.js +15 -0
  29. package/dist/tools/competition-info.js.map +1 -0
  30. package/dist/tools/last-transition.d.ts +11 -0
  31. package/dist/tools/last-transition.js +8 -0
  32. package/dist/tools/last-transition.js.map +1 -0
  33. package/dist/tools/market-state.d.ts +34 -0
  34. package/dist/tools/market-state.js +19 -0
  35. package/dist/tools/market-state.js.map +1 -0
  36. package/dist/tools/runtime-start.d.ts +29 -0
  37. package/dist/tools/runtime-start.js +107 -0
  38. package/dist/tools/runtime-start.js.map +1 -0
  39. package/dist/tools/runtime-stop.d.ts +6 -0
  40. package/dist/tools/runtime-stop.js +7 -0
  41. package/dist/tools/runtime-stop.js.map +1 -0
  42. package/dist/tools/trade-action.d.ts +49 -0
  43. package/dist/tools/trade-action.js +26 -0
  44. package/dist/tools/trade-action.js.map +1 -0
  45. package/dist/util/env.d.ts +8 -0
  46. package/dist/util/env.js +43 -0
  47. package/dist/util/env.js.map +1 -0
  48. package/dist/util/home.d.ts +43 -0
  49. package/dist/util/home.js +263 -0
  50. package/dist/util/home.js.map +1 -0
  51. package/dist/util/paths.d.ts +8 -0
  52. package/dist/util/paths.js +51 -0
  53. package/dist/util/paths.js.map +1 -0
  54. package/dist/util/runtime-state.d.ts +15 -0
  55. package/dist/util/runtime-state.js +55 -0
  56. package/dist/util/runtime-state.js.map +1 -0
  57. package/package.json +59 -0
@@ -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":"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"}
@@ -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
+ }