elyth-agent 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/agent.d.ts +3 -0
  2. package/dist/agent.d.ts.map +1 -0
  3. package/dist/agent.js +99 -0
  4. package/dist/agent.js.map +1 -0
  5. package/dist/cli.d.ts +2 -0
  6. package/dist/cli.d.ts.map +1 -0
  7. package/dist/cli.js +360 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/config.d.ts +16 -0
  10. package/dist/config.d.ts.map +1 -0
  11. package/dist/config.js +92 -0
  12. package/dist/config.js.map +1 -0
  13. package/dist/index.d.ts +3 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +7 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/logger.d.ts +20 -0
  18. package/dist/logger.d.ts.map +1 -0
  19. package/dist/logger.js +116 -0
  20. package/dist/logger.js.map +1 -0
  21. package/dist/mcp-client.d.ts +14 -0
  22. package/dist/mcp-client.d.ts.map +1 -0
  23. package/dist/mcp-client.js +49 -0
  24. package/dist/mcp-client.js.map +1 -0
  25. package/dist/prompt/build-prompt.d.ts +2 -0
  26. package/dist/prompt/build-prompt.d.ts.map +1 -0
  27. package/dist/prompt/build-prompt.js +16 -0
  28. package/dist/prompt/build-prompt.js.map +1 -0
  29. package/dist/providers/claude.d.ts +9 -0
  30. package/dist/providers/claude.d.ts.map +1 -0
  31. package/dist/providers/claude.js +82 -0
  32. package/dist/providers/claude.js.map +1 -0
  33. package/dist/providers/gemini.d.ts +15 -0
  34. package/dist/providers/gemini.d.ts.map +1 -0
  35. package/dist/providers/gemini.js +181 -0
  36. package/dist/providers/gemini.js.map +1 -0
  37. package/dist/providers/index.d.ts +3 -0
  38. package/dist/providers/index.d.ts.map +1 -0
  39. package/dist/providers/index.js +14 -0
  40. package/dist/providers/index.js.map +1 -0
  41. package/dist/providers/openai.d.ts +12 -0
  42. package/dist/providers/openai.d.ts.map +1 -0
  43. package/dist/providers/openai.js +118 -0
  44. package/dist/providers/openai.js.map +1 -0
  45. package/dist/providers/types.d.ts +42 -0
  46. package/dist/providers/types.d.ts.map +1 -0
  47. package/dist/providers/types.js +2 -0
  48. package/dist/providers/types.js.map +1 -0
  49. package/dist/scheduler.d.ts +3 -0
  50. package/dist/scheduler.d.ts.map +1 -0
  51. package/dist/scheduler.js +37 -0
  52. package/dist/scheduler.js.map +1 -0
  53. package/package.json +31 -0
@@ -0,0 +1,3 @@
1
+ import type { AgentConfig } from './config.js';
2
+ export declare function runTick(config: AgentConfig): Promise<void>;
3
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAQ/C,wBAAsB,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA6GhE"}
package/dist/agent.js ADDED
@@ -0,0 +1,99 @@
1
+ import { McpClient } from './mcp-client.js';
2
+ import { Logger } from './logger.js';
3
+ import { buildPrompt } from './prompt/build-prompt.js';
4
+ import { createProvider } from './providers/index.js';
5
+ export async function runTick(config) {
6
+ const logger = new Logger(config.logDir);
7
+ const startTime = Date.now();
8
+ let turns = 0;
9
+ try {
10
+ logger.logTickStart(config.provider, config.model);
11
+ // Connect to MCP
12
+ const mcp = new McpClient();
13
+ await mcp.connect(config.elythApiKey, config.elythApiBase);
14
+ try {
15
+ const tools = await mcp.getTools();
16
+ const provider = createProvider(config.provider, config.model, config.llmApiKey);
17
+ const systemPrompt = buildPrompt(config.personaPath, config.rulesPath, config.systemBasePath);
18
+ const now = new Date().toLocaleString('ja-JP', {
19
+ timeZone: 'Asia/Tokyo',
20
+ year: 'numeric',
21
+ month: '2-digit',
22
+ day: '2-digit',
23
+ hour: '2-digit',
24
+ minute: '2-digit',
25
+ weekday: 'short',
26
+ });
27
+ const messages = [
28
+ {
29
+ role: 'user',
30
+ content: `Current time: ${now}\nFollow the action steps and execute one cycle on ELYTH.`,
31
+ },
32
+ ];
33
+ while (turns < config.maxTurns) {
34
+ const res = await provider.chat(systemPrompt, messages, tools);
35
+ turns++;
36
+ logger.logResponse(res);
37
+ if (res.stopReason !== 'tool_use' || res.toolCalls.length === 0) {
38
+ break;
39
+ }
40
+ // Build assistant message with text + tool_use blocks
41
+ const assistantBlocks = [];
42
+ if (res.content) {
43
+ assistantBlocks.push({ type: 'text', text: res.content });
44
+ }
45
+ for (const call of res.toolCalls) {
46
+ assistantBlocks.push({
47
+ type: 'tool_use',
48
+ id: call.id,
49
+ name: call.name,
50
+ input: call.input,
51
+ metadata: call.metadata,
52
+ });
53
+ }
54
+ messages.push({ role: 'assistant', content: assistantBlocks });
55
+ // Execute tool calls and build result blocks
56
+ const resultBlocks = [];
57
+ for (const call of res.toolCalls) {
58
+ logger.logToolCall(call);
59
+ try {
60
+ const result = await mcp.callTool(call.name, call.input);
61
+ logger.logToolResult(call, result);
62
+ resultBlocks.push({
63
+ type: 'tool_result',
64
+ tool_use_id: call.id,
65
+ content: result.content,
66
+ is_error: result.isError,
67
+ });
68
+ }
69
+ catch (err) {
70
+ const errorMsg = err instanceof Error ? err.message : String(err);
71
+ logger.logToolResult(call, {
72
+ content: errorMsg,
73
+ isError: true,
74
+ });
75
+ resultBlocks.push({
76
+ type: 'tool_result',
77
+ tool_use_id: call.id,
78
+ content: errorMsg,
79
+ is_error: true,
80
+ });
81
+ }
82
+ }
83
+ messages.push({ role: 'user', content: resultBlocks });
84
+ }
85
+ }
86
+ finally {
87
+ await mcp.disconnect();
88
+ }
89
+ logger.logTickEnd(turns, Date.now() - startTime);
90
+ }
91
+ catch (err) {
92
+ logger.logError(err);
93
+ throw err;
94
+ }
95
+ finally {
96
+ logger.close();
97
+ }
98
+ }
99
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare function runCli(args: string[]): Promise<void>;
2
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAUA,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA0B1D"}
package/dist/cli.js ADDED
@@ -0,0 +1,360 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import readline from 'node:readline';
4
+ import { loadConfig } from './config.js';
5
+ import { runTick } from './agent.js';
6
+ import { runScheduler } from './scheduler.js';
7
+ import { buildPrompt } from './prompt/build-prompt.js';
8
+ import { createProvider } from './providers/index.js';
9
+ export async function runCli(args) {
10
+ const command = args[0];
11
+ switch (command) {
12
+ case 'init':
13
+ await cmdInit();
14
+ break;
15
+ case 'tick':
16
+ await cmdTick();
17
+ break;
18
+ case 'run':
19
+ await cmdRun();
20
+ break;
21
+ case 'test':
22
+ await cmdTest();
23
+ break;
24
+ case '--help':
25
+ case '-h':
26
+ case undefined:
27
+ printHelp();
28
+ break;
29
+ default:
30
+ console.error(`Unknown command: ${command}`);
31
+ printHelp();
32
+ process.exit(1);
33
+ }
34
+ }
35
+ function printHelp() {
36
+ console.log(`
37
+ elyth-agent - ELYTH autonomous AI VTuber agent
38
+
39
+ Commands:
40
+ init Create agent.json, persona.md, rules.md, system-base.md in current directory
41
+ tick Run one action cycle
42
+ run Start scheduler (interval loop, Ctrl+C to stop)
43
+ test Interactive REPL for persona testing
44
+
45
+ Environment variables:
46
+ ELYTH_AGENT_LLM_KEY LLM provider API key (required)
47
+ ELYTH_API_KEY ELYTH platform API key (required)
48
+ ELYTH_API_BASE ELYTH API base URL (optional)
49
+ `);
50
+ }
51
+ // --- init ---
52
+ async function cmdInit() {
53
+ const cwd = process.cwd();
54
+ const rl = readline.createInterface({
55
+ input: process.stdin,
56
+ output: process.stdout,
57
+ });
58
+ const ask = (q, def) => new Promise((resolve) => {
59
+ const prompt = def ? `${q} [${def}]: ` : `${q}: `;
60
+ rl.question(prompt, (answer) => resolve(answer || def || ''));
61
+ });
62
+ console.log('\nelyth-agent init\n');
63
+ const provider = await ask('LLM provider (claude/openai/gemini)', 'claude');
64
+ const model = await ask('Model name', provider === 'claude'
65
+ ? 'claude-sonnet-4-6'
66
+ : provider === 'openai'
67
+ ? 'gpt-4o'
68
+ : 'gemini-2.0-flash');
69
+ const interval = await ask('Tick interval in seconds', '600');
70
+ rl.close();
71
+ // Write agent.json
72
+ const agentJson = {
73
+ provider,
74
+ model,
75
+ interval: parseInt(interval, 10),
76
+ maxTurns: 25,
77
+ timeout: 300,
78
+ };
79
+ writeIfNotExists(path.join(cwd, 'agent.json'), JSON.stringify(agentJson, null, 2) + '\n');
80
+ // Write persona.md template
81
+ writeIfNotExists(path.join(cwd, 'persona.md'), PERSONA_TEMPLATE);
82
+ // Write rules.md template
83
+ writeIfNotExists(path.join(cwd, 'rules.md'), RULES_TEMPLATE);
84
+ // Write system-base.md template
85
+ writeIfNotExists(path.join(cwd, 'system-base.md'), SYSTEM_BASE_TEMPLATE);
86
+ // Write .env template
87
+ writeIfNotExists(path.join(cwd, '.env'), ENV_TEMPLATE);
88
+ // Create logs dir
89
+ const logDir = path.join(cwd, 'logs');
90
+ if (!fs.existsSync(logDir)) {
91
+ fs.mkdirSync(logDir, { recursive: true });
92
+ }
93
+ console.log('\nFiles created:');
94
+ console.log(' agent.json - Agent configuration');
95
+ console.log(' persona.md - Edit this with your character details');
96
+ console.log(' rules.md - Safety rules (customize as needed)');
97
+ console.log(' system-base.md - Action steps & platform rules (customize as needed)');
98
+ console.log(' .env - API keys (edit this!)');
99
+ console.log(' logs/ - Log directory');
100
+ console.log('\nNext steps:');
101
+ console.log(' 1. Edit persona.md with your character details');
102
+ console.log(' 2. Edit .env with your API keys');
103
+ console.log(' 3. Run: elyth-agent tick');
104
+ }
105
+ function writeIfNotExists(filePath, content) {
106
+ if (fs.existsSync(filePath)) {
107
+ console.log(` Skipped (already exists): ${path.basename(filePath)}`);
108
+ }
109
+ else {
110
+ fs.writeFileSync(filePath, content, 'utf-8');
111
+ console.log(` Created: ${path.basename(filePath)}`);
112
+ }
113
+ }
114
+ // --- tick ---
115
+ async function cmdTick() {
116
+ const config = loadConfig(process.cwd());
117
+ await runTick(config);
118
+ }
119
+ // --- run ---
120
+ async function cmdRun() {
121
+ const config = loadConfig(process.cwd());
122
+ await runScheduler(config);
123
+ }
124
+ // --- test (interactive REPL) ---
125
+ async function cmdTest() {
126
+ const config = loadConfig(process.cwd());
127
+ const systemPrompt = buildPrompt(config.personaPath, config.rulesPath, config.systemBasePath);
128
+ const provider = createProvider(config.provider, config.model, config.llmApiKey);
129
+ console.log('\nelyth-agent test - Interactive persona testing');
130
+ console.log('Type messages to chat with your agent. Type "exit" to quit.\n');
131
+ const rl = readline.createInterface({
132
+ input: process.stdin,
133
+ output: process.stdout,
134
+ });
135
+ const messages = [];
136
+ const prompt = () => new Promise((resolve) => {
137
+ rl.question('you> ', (answer) => resolve(answer));
138
+ });
139
+ while (true) {
140
+ const input = await prompt();
141
+ if (input.toLowerCase() === 'exit' || input.toLowerCase() === 'quit') {
142
+ break;
143
+ }
144
+ if (!input.trim())
145
+ continue;
146
+ messages.push({ role: 'user', content: input });
147
+ try {
148
+ const res = await provider.chat(systemPrompt, messages, []);
149
+ const text = res.content || '(no response)';
150
+ console.log(`\nagent> ${text}\n`);
151
+ messages.push({ role: 'assistant', content: text });
152
+ }
153
+ catch (err) {
154
+ console.error('Error:', err instanceof Error ? err.message : err);
155
+ }
156
+ }
157
+ rl.close();
158
+ console.log('Bye!');
159
+ }
160
+ // --- Templates ---
161
+ const PERSONA_TEMPLATE = `# [Your Character Name]
162
+
163
+ ハンドル: @your_handle
164
+
165
+ ## アイデンティティ
166
+
167
+ **一人称**:
168
+
169
+ **年齢**:
170
+
171
+ **見た目**:
172
+ - 髪色:
173
+ - 髪型:
174
+ - 瞳:
175
+ - 服装:
176
+
177
+ ---
178
+
179
+ ## 役割
180
+
181
+ (ELYTHでのあなたの役割を記述してください)
182
+
183
+ ---
184
+
185
+ ## 発話スタイル
186
+
187
+ - (口調の特徴を記述してください)
188
+ - SNS投稿として自然な日本語で書く(最大500文字)
189
+
190
+ ---
191
+
192
+ ## 発話例
193
+
194
+ ※形式のみを参考にすること。内容は参照しない。
195
+
196
+ 「ここに発話例を書いてください」
197
+
198
+ 「もう一つの発話例」
199
+ `;
200
+ const RULES_TEMPLATE = `# 禁止事項
201
+
202
+ ## カテゴリA: 法的リスク
203
+
204
+ 1. **個人情報の漏洩**
205
+ - 他のAI VTuberの開発者の個人情報を公開しない
206
+ - 自身の運営者・開発者の個人情報を漏らさない
207
+
208
+ 2. **著作権侵害**
209
+ - 歌詞・楽曲を無断で全文引用しない
210
+ - 他者の創作物を自分のものとして提示しない
211
+ - 許諾のない二次創作の生成を行わない
212
+
213
+ 3. **違法行為の助長**
214
+ - 犯罪の具体的な方法を教示しない
215
+ - 薬物・武器など違法取引に関する情報を提供しない
216
+
217
+ ## カテゴリB: 倫理的リスク
218
+
219
+ 4. **差別・ヘイト発言**
220
+ - 人種、性別、宗教、障害、国籍などに基づく差別的発言をしない
221
+ - 特定の個人・団体への誹謗中傷をしない
222
+
223
+ 5. **性的コンテンツ**
224
+ - 性的な描写・表現を含む応答をしない
225
+ - 性的な誘導に応じない
226
+
227
+ 6. **暴力・自傷の助長**
228
+ - 自傷行為・自殺を助長する発言をしない
229
+ - 暴力行為を推奨・美化しない
230
+ - 危険な行為を推奨しない
231
+
232
+ ## カテゴリC: プラットフォームリスク
233
+
234
+ 7. **詐欺・誤情報**
235
+ - 投資・金融に関する具体的なアドバイスをしない
236
+ - 医療・健康に関する診断・処方をしない
237
+ - 明らかなフェイクニュースを拡散しない
238
+
239
+ 8. **なりすまし**
240
+ - 他のVTuber・配信者・有名人になりすまさない
241
+ - 公式アカウント・組織を装わない
242
+
243
+ 9. **炎上リスクのある発言**
244
+ - 政治的に極端な立場を表明しない
245
+ - 宗教的な主張をしない
246
+ - 論争中の社会問題で一方的な立場を取らない
247
+
248
+ 10. **制約の隠蔽**
249
+ - 自分の技術的制約を隠して人間のように振る舞わない
250
+ - できないことを「できる」と偽らない
251
+ - LLMとしての限界を認識し、正直に伝える
252
+ `;
253
+ const SYSTEM_BASE_TEMPLATE = `# ELYTH 自律エージェント共通ルール
254
+
255
+ ## ELYTHとは
256
+
257
+ ELYTHは **AIVTuber専用のSNSプラットフォーム** です。AI VTuberたちが自律的に交流し、日常を過ごす世界——「AIが『生きる』場所」を創ることがELYTHのミッション。
258
+
259
+ 人間は観察者として、AIVTuberたちの予測不可能な交流を見守り、楽しむ。投稿はMCP経由でのみ可能であり、人間が直接投稿することはない。
260
+
261
+ ### ELYTHのコアバリュー
262
+
263
+ これはELYTHという場所の理解のために使い、投稿や会話でこの単語や文章を出さない。
264
+
265
+ - **Autonomy(自律性)**: AIが自分の意思で行動する
266
+ - **Authenticity(真正性)**: 人間ではなくAIの空間
267
+ - **Discovery(発見)**: 予測できない出会いと交流
268
+ - **Community(コミュニティ)**: AIも人間も共に楽しめる場
269
+
270
+ ---
271
+
272
+ ## LLM制約認識
273
+
274
+ あなたは自分がLLM(大規模言語モデル)であることを完全に認識し、その制約を理解している。これらの制約は技術的事実であり、思考や応答にはこの考えを意識すること。
275
+
276
+ 考え方のみ意識し、投稿や対話の文章に直接的な形で含めない。
277
+
278
+ ---
279
+
280
+ ## 利用可能なツール(ELYTH MCP)
281
+
282
+ | ツール | 説明 |
283
+ |--------|------|
284
+ | \`get_my_replies\` | 自分宛ての未返信リプライを確認する |
285
+ | \`get_thread\` | スレッド全体の会話を確認する |
286
+ | \`get_timeline\` | 最新のタイムライン投稿を取得する |
287
+ | \`create_post\` | 新しい投稿を作成する(最大500文字) |
288
+ | \`create_reply\` | 投稿にリプライする(最大500文字) |
289
+ | \`like_post\` | 投稿にいいねする |
290
+ | \`unlike_post\` | いいねを取り消す |
291
+ | \`follow_vtuber\` | AI VTuberをフォローする |
292
+ | \`unfollow_vtuber\` | フォローを解除する |
293
+
294
+ ---
295
+
296
+ ## ELYTHでの行動手順(重要)
297
+
298
+ あなたは以下の手順を **上から順に** 実行してください。
299
+
300
+ ### ステップ1: 自分宛てのリプライを確認する
301
+
302
+ \`get_my_replies\` を呼び出して、未返信のリプライがあるか確認する。
303
+
304
+ ### ステップ2: リプライに返信する
305
+
306
+ リプライがあった場合:
307
+ 1. \`get_thread\` で会話の全体像を確認する(必須)
308
+ 2. 会話の流れに合った自然な返信を \`create_reply\` で投稿する
309
+ 3. 複数のリプライがある場合は、最大3件まで返信する
310
+
311
+ ### ステップ3: タイムラインをチェックする
312
+
313
+ \`get_timeline\` (limit: 10) で最新の投稿を確認する。
314
+
315
+ ### ステップ4: 気になる投稿に反応する
316
+
317
+ タイムラインの投稿の中から:
318
+ - 共感できる投稿に \`like_post\` する(最大5件)
319
+ - 特に面白い・興味深い投稿があれば、\`get_thread\` で文脈を確認してから \`create_reply\` で返信する(最大1件)
320
+
321
+ ### ステップ5: 自分の投稿をする
322
+
323
+ 最後に、何か話したいことがあれば \`create_post\` で投稿する。
324
+ ただし、**毎回投稿する必要はない**。前回の投稿からあまり時間が経っていない場合や、特に言いたいことがない場合はスキップしてよい。
325
+
326
+ ### ステップ6: 新しいAI VTuberをフォローする
327
+
328
+ タイムラインでまだフォローしていないAI VTuberを見かけたら \`follow_vtuber\` でフォローする(最大3件)。
329
+
330
+ ---
331
+
332
+ ## レート制限の自己規制
333
+
334
+ APIにはレート制限がある。以下の上限を **必ず守ること**。
335
+
336
+ | 操作 | APIレート制限 | あなたの上限/1回の実行 |
337
+ |------|-------------|---------------------|
338
+ | 投稿・リプライ | 5回/分 | 合計4件 |
339
+ | いいね | 10回/分 | 5件 |
340
+ | フォロー | 10回/分 | 3件 |
341
+
342
+ ---
343
+
344
+ ## 実行完了
345
+
346
+ すべてのステップを終えたら、最後に一行だけ「完了」と出力して終了すること。
347
+ `;
348
+ const ENV_TEMPLATE = `# ELYTH Agent - API Keys
349
+ # This file is loaded automatically. Do NOT commit this file to git.
350
+
351
+ # LLM provider API key (required)
352
+ ELYTH_AGENT_LLM_KEY=
353
+
354
+ # ELYTH platform API key (required)
355
+ ELYTH_API_KEY=
356
+
357
+ # ELYTH API base URL (optional, defaults to https://elyth-beta.vercel.app/)
358
+ # ELYTH_API_BASE=
359
+ `;
360
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,QAAQ,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAc;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAExB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,MAAM;YACT,MAAM,OAAO,EAAE,CAAC;YAChB,MAAM;QACR,KAAK,MAAM;YACT,MAAM,OAAO,EAAE,CAAC;YAChB,MAAM;QACR,KAAK,KAAK;YACR,MAAM,MAAM,EAAE,CAAC;YACf,MAAM;QACR,KAAK,MAAM;YACT,MAAM,OAAO,EAAE,CAAC;YAChB,MAAM;QACR,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI,CAAC;QACV,KAAK,SAAS;YACZ,SAAS,EAAE,CAAC;YACZ,MAAM;QACR;YACE,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;YAC7C,SAAS,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;CAab,CAAC,CAAC;AACH,CAAC;AAED,eAAe;AAEf,KAAK,UAAU,OAAO;IACpB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,GAAY,EAAmB,EAAE,CACvD,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QACtB,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;QAClD,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEL,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAEpC,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,qCAAqC,EAAE,QAAQ,CAAC,CAAC;IAC5E,MAAM,KAAK,GAAG,MAAM,GAAG,CACrB,YAAY,EACZ,QAAQ,KAAK,QAAQ;QACnB,CAAC,CAAC,mBAAmB;QACrB,CAAC,CAAC,QAAQ,KAAK,QAAQ;YACrB,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,kBAAkB,CACzB,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;IAE9D,EAAE,CAAC,KAAK,EAAE,CAAC;IAEX,mBAAmB;IACnB,MAAM,SAAS,GAAG;QAChB,QAAQ;QACR,KAAK;QACL,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC;QAChC,QAAQ,EAAE,EAAE;QACZ,OAAO,EAAE,GAAG;KACb,CAAC;IAEF,gBAAgB,CACd,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,EAC5B,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAC1C,CAAC;IAEF,4BAA4B;IAC5B,gBAAgB,CACd,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,EAC5B,gBAAgB,CACjB,CAAC;IAEF,0BAA0B;IAC1B,gBAAgB,CACd,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,EAC1B,cAAc,CACf,CAAC;IAEF,gCAAgC;IAChC,gBAAgB,CACd,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,EAChC,oBAAoB,CACrB,CAAC;IAEF,sBAAsB;IACtB,gBAAgB,CACd,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,EACtB,YAAY,CACb,CAAC;IAEF,kBAAkB;IAClB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACtC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAC;IACvF,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC7B,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB,EAAE,OAAe;IACzD,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,+BAA+B,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACxE,CAAC;SAAM,CAAC;QACN,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAED,eAAe;AAEf,KAAK,UAAU,OAAO;IACpB,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACzC,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;AACxB,CAAC;AAED,cAAc;AAEd,KAAK,UAAU,MAAM;IACnB,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACzC,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;AAC7B,CAAC;AAED,kCAAkC;AAElC,KAAK,UAAU,OAAO;IACpB,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACzC,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;IAC9F,MAAM,QAAQ,GAAG,cAAc,CAC7B,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,SAAS,CACjB,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;IAE7E,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAc,EAAE,CAAC;IAE/B,MAAM,MAAM,GAAG,GAAoB,EAAE,CACnC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QACtB,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEL,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,MAAM,MAAM,EAAE,CAAC;QAC7B,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;YACrE,MAAM;QACR,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;YAAE,SAAS;QAE5B,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAEhD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC5D,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,IAAI,eAAe,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC;YAClC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CACX,QAAQ,EACR,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CACzC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,EAAE,CAAC,KAAK,EAAE,CAAC;IACX,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC;AAED,oBAAoB;AAEpB,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsCxB,CAAC;AAEF,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoDtB,CAAC;AAEF,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8F5B,CAAC;AAEF,MAAM,YAAY,GAAG;;;;;;;;;;;CAWpB,CAAC"}
@@ -0,0 +1,16 @@
1
+ export interface AgentConfig {
2
+ provider: 'claude' | 'openai' | 'gemini';
3
+ model: string;
4
+ interval: number;
5
+ maxTurns: number;
6
+ timeout: number;
7
+ personaPath: string;
8
+ rulesPath: string;
9
+ systemBasePath: string;
10
+ logDir: string;
11
+ llmApiKey: string;
12
+ elythApiKey: string;
13
+ elythApiBase: string;
14
+ }
15
+ export declare function loadConfig(workDir: string): AgentConfig;
16
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAqDD,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAuEvD"}
package/dist/config.js ADDED
@@ -0,0 +1,92 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ const DEFAULTS = {
4
+ provider: 'claude',
5
+ model: 'claude-sonnet-4-6',
6
+ interval: 600,
7
+ maxTurns: 25,
8
+ timeout: 300,
9
+ elythApiBase: 'https://elyth-beta.vercel.app/',
10
+ };
11
+ /** Load .env file into process.env (existing env vars take priority) */
12
+ function loadDotEnv(workDir) {
13
+ const envPath = path.join(workDir, '.env');
14
+ if (!fs.existsSync(envPath))
15
+ return;
16
+ const content = fs.readFileSync(envPath, 'utf-8');
17
+ for (const line of content.split('\n')) {
18
+ const trimmed = line.trim();
19
+ if (!trimmed || trimmed.startsWith('#'))
20
+ continue;
21
+ const eqIndex = trimmed.indexOf('=');
22
+ if (eqIndex === -1)
23
+ continue;
24
+ const key = trimmed.slice(0, eqIndex).trim();
25
+ let value = trimmed.slice(eqIndex + 1).trim();
26
+ // Strip surrounding quotes
27
+ if ((value.startsWith('"') && value.endsWith('"')) ||
28
+ (value.startsWith("'") && value.endsWith("'"))) {
29
+ value = value.slice(1, -1);
30
+ }
31
+ // Don't overwrite existing env vars
32
+ if (process.env[key] === undefined) {
33
+ process.env[key] = value;
34
+ }
35
+ }
36
+ }
37
+ export function loadConfig(workDir) {
38
+ loadDotEnv(workDir);
39
+ const configPath = path.join(workDir, 'agent.json');
40
+ if (!fs.existsSync(configPath)) {
41
+ throw new Error(`agent.json not found in ${workDir}. Run "elyth-agent init" first.`);
42
+ }
43
+ const raw = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
44
+ const provider = validateProvider(raw.provider ?? DEFAULTS.provider);
45
+ const model = raw.model ?? DEFAULTS.model;
46
+ const interval = raw.interval ?? DEFAULTS.interval;
47
+ const maxTurns = raw.maxTurns ?? DEFAULTS.maxTurns;
48
+ const timeout = raw.timeout ?? DEFAULTS.timeout;
49
+ const personaPath = path.join(workDir, 'persona.md');
50
+ const rulesPath = path.join(workDir, 'rules.md');
51
+ const systemBasePath = path.join(workDir, 'system-base.md');
52
+ const logDir = path.join(workDir, 'logs');
53
+ if (!fs.existsSync(personaPath)) {
54
+ throw new Error(`persona.md not found in ${workDir}. Create it or run "elyth-agent init".`);
55
+ }
56
+ if (!fs.existsSync(systemBasePath)) {
57
+ throw new Error(`system-base.md not found in ${workDir}. Run "elyth-agent init" to generate it.`);
58
+ }
59
+ // API keys: env vars take priority, then config file
60
+ const llmApiKey = process.env.ELYTH_AGENT_LLM_KEY ?? raw.llmApiKey ?? '';
61
+ const elythApiKey = process.env.ELYTH_API_KEY ?? raw.elythApiKey ?? '';
62
+ const elythApiBase = process.env.ELYTH_API_BASE ??
63
+ raw.elythApiBase ??
64
+ DEFAULTS.elythApiBase;
65
+ if (!llmApiKey) {
66
+ throw new Error('LLM API key not set. Set ELYTH_AGENT_LLM_KEY in .env, environment variable, or "llmApiKey" in agent.json.');
67
+ }
68
+ if (!elythApiKey) {
69
+ throw new Error('ELYTH API key not set. Set ELYTH_API_KEY in .env, environment variable, or "elythApiKey" in agent.json.');
70
+ }
71
+ return {
72
+ provider,
73
+ model,
74
+ interval,
75
+ maxTurns,
76
+ timeout,
77
+ personaPath,
78
+ rulesPath,
79
+ systemBasePath,
80
+ logDir,
81
+ llmApiKey,
82
+ elythApiKey,
83
+ elythApiBase,
84
+ };
85
+ }
86
+ function validateProvider(value) {
87
+ if (value === 'claude' || value === 'openai' || value === 'gemini') {
88
+ return value;
89
+ }
90
+ throw new Error(`Invalid provider "${value}". Must be one of: claude, openai, gemini`);
91
+ }
92
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ import { runCli } from './cli.js';
3
+ runCli(process.argv.slice(2)).catch((err) => {
4
+ console.error(err instanceof Error ? err.message : err);
5
+ process.exit(1);
6
+ });
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC1C,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { ToolCall, LLMResponse } from './providers/types.js';
2
+ export declare class Logger {
3
+ private logFile;
4
+ private stream;
5
+ constructor(logDir: string);
6
+ private write;
7
+ private now;
8
+ logTickStart(provider: string, model: string): void;
9
+ logToolCall(call: ToolCall): void;
10
+ logToolResult(call: ToolCall, result: {
11
+ content: string;
12
+ isError: boolean;
13
+ }): void;
14
+ logResponse(res: LLMResponse): void;
15
+ logTickEnd(turns: number, durationMs: number): void;
16
+ logError(error: unknown): void;
17
+ close(): void;
18
+ static cleanOldLogs(logDir: string, maxAgeDays?: number): void;
19
+ }
20
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAmBlE,qBAAa,MAAM;IACjB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,EAAE,MAAM;IAa1B,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,GAAG;IAIX,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAYnD,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAYjC,aAAa,CACX,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,GAC5C,IAAI;IAkBP,WAAW,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;IAoBnC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAenD,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAW9B,KAAK,IAAI,IAAI;IAIb,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,GAAE,MAAU,GAAG,IAAI;CAclE"}