maclat 0.1.1 → 0.3.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 (38) hide show
  1. package/dist/cli/commands.d.ts +2 -0
  2. package/dist/cli/commands.js +60 -0
  3. package/dist/cli/commands.js.map +1 -1
  4. package/dist/cli/index.js +15 -1
  5. package/dist/cli/index.js.map +1 -1
  6. package/dist/daemon/executor.d.ts +9 -11
  7. package/dist/daemon/executor.js +1 -212
  8. package/dist/daemon/executor.js.map +1 -1
  9. package/dist/daemon/executors/claude-code.d.ts +9 -0
  10. package/dist/daemon/executors/claude-code.js +165 -0
  11. package/dist/daemon/executors/claude-code.js.map +1 -0
  12. package/dist/daemon/executors/claude-sdk.d.ts +10 -0
  13. package/dist/daemon/executors/claude-sdk.js +147 -0
  14. package/dist/daemon/executors/claude-sdk.js.map +1 -0
  15. package/dist/daemon/executors/codex.d.ts +8 -0
  16. package/dist/daemon/executors/codex.js +82 -0
  17. package/dist/daemon/executors/codex.js.map +1 -0
  18. package/dist/daemon/executors/file-collector.d.ts +4 -0
  19. package/dist/daemon/executors/file-collector.js +32 -0
  20. package/dist/daemon/executors/file-collector.js.map +1 -0
  21. package/dist/daemon/executors/index.d.ts +3 -0
  22. package/dist/daemon/executors/index.js +33 -0
  23. package/dist/daemon/executors/index.js.map +1 -0
  24. package/dist/daemon/executors/prompt.d.ts +2 -0
  25. package/dist/daemon/executors/prompt.js +20 -0
  26. package/dist/daemon/executors/prompt.js.map +1 -0
  27. package/dist/daemon/format.d.ts +16 -0
  28. package/dist/daemon/format.js +45 -0
  29. package/dist/daemon/format.js.map +1 -0
  30. package/dist/daemon/index.js +15 -9
  31. package/dist/daemon/index.js.map +1 -1
  32. package/dist/daemon/poller.d.ts +4 -0
  33. package/dist/daemon/poller.js +93 -20
  34. package/dist/daemon/poller.js.map +1 -1
  35. package/dist/index.js +3 -1
  36. package/dist/index.js.map +1 -1
  37. package/dist/shared/types.d.ts +5 -0
  38. package/package.json +2 -1
@@ -0,0 +1,147 @@
1
+ import { mkdirSync } from 'fs';
2
+ import { buildPrompt } from './prompt.js';
3
+ import { collectFiles } from './file-collector.js';
4
+ import { bold, dim, gray, cyan, costLine, toolPill, fileWrite as fmtFileWrite, agentText, jobDone } from '../format.js';
5
+ export class ClaudeSdkExecutor {
6
+ apiKey;
7
+ model;
8
+ maxTurns;
9
+ baseUrl;
10
+ constructor(apiKey, model, maxTurns, baseUrl) {
11
+ this.apiKey = apiKey;
12
+ this.model = model || 'claude-sonnet-4-6';
13
+ this.maxTurns = maxTurns || 50;
14
+ this.baseUrl = baseUrl;
15
+ }
16
+ async execute(job, workDir, onUpdate, interactivity) {
17
+ mkdirSync(workDir, { recursive: true });
18
+ const prompt = buildPrompt(job, workDir);
19
+ const provider = this.baseUrl ? 'OpenRouter' : 'Anthropic';
20
+ console.log(` ${dim('Using')} ${bold(provider + ' SDK')} ${gray(`(${this.model})`)}`);
21
+ onUpdate('text', `Agent started via ${provider} SDK`);
22
+ // Set env vars for the SDK
23
+ const prevKey = process.env.ANTHROPIC_API_KEY;
24
+ const prevBase = process.env.ANTHROPIC_BASE_URL;
25
+ process.env.ANTHROPIC_API_KEY = this.apiKey;
26
+ if (this.baseUrl) {
27
+ process.env.ANTHROPIC_BASE_URL = this.baseUrl;
28
+ }
29
+ try {
30
+ const { query } = await import('@anthropic-ai/claude-agent-sdk');
31
+ let lastText = '';
32
+ const q = query({
33
+ prompt,
34
+ options: {
35
+ allowedTools: ['Read', 'Write', 'Edit', 'Bash', 'Grep', 'Glob', 'WebSearch', 'WebFetch'],
36
+ permissionMode: 'bypassPermissions',
37
+ cwd: workDir,
38
+ model: this.model,
39
+ maxTurns: this.maxTurns,
40
+ },
41
+ });
42
+ // Concurrent instruction polling (if interactivity provided)
43
+ let pollingActive = true;
44
+ const pollPromise = interactivity ? (async () => {
45
+ while (pollingActive) {
46
+ await new Promise(r => setTimeout(r, 3000));
47
+ if (!pollingActive)
48
+ break;
49
+ try {
50
+ const instructions = await interactivity.getInstructions();
51
+ for (const inst of instructions) {
52
+ console.log(` ${cyan('↳')} ${dim('Instruction:')} ${inst.content.slice(0, 80)}`);
53
+ onUpdate('text', `Received instruction: ${inst.content.slice(0, 100)}`);
54
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
55
+ async function* singleMessage() {
56
+ yield {
57
+ type: 'user',
58
+ message: { role: 'user', content: inst.content },
59
+ parent_tool_use_id: null,
60
+ session_id: '',
61
+ };
62
+ }
63
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
64
+ await q.streamInput(singleMessage());
65
+ await interactivity.markDelivered(inst.id);
66
+ }
67
+ }
68
+ catch {
69
+ // Non-critical, continue polling
70
+ }
71
+ }
72
+ })() : Promise.resolve();
73
+ for await (const message of q) {
74
+ const msg = message;
75
+ if (msg.type === 'assistant') {
76
+ const apiMsg = msg.message;
77
+ if (apiMsg?.content && Array.isArray(apiMsg.content)) {
78
+ for (const block of apiMsg.content) {
79
+ if (block.type === 'text' && typeof block.text === 'string') {
80
+ const text = block.text.slice(0, 200);
81
+ console.log(agentText(text.split('\n')[0].slice(0, 120)));
82
+ lastText = text;
83
+ onUpdate('text', text);
84
+ }
85
+ else if (block.type === 'tool_use') {
86
+ const toolName = String(block.name);
87
+ const input = (block.input || {});
88
+ const target = String(input.file_path || input.command || input.pattern || '').slice(0, 60);
89
+ const label = `${toolName}: ${target}`;
90
+ // Pretty terminal output
91
+ console.log(toolPill(toolName, target));
92
+ onUpdate('terminal', label);
93
+ // Emit file_write for Write/Edit tool uses
94
+ if (toolName === 'Write' && typeof input.file_path === 'string' && typeof input.content === 'string') {
95
+ const relPath = String(input.file_path).replace(new RegExp('^' + workDir.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + '/?'), '');
96
+ console.log(fmtFileWrite(relPath));
97
+ onUpdate('file_write', JSON.stringify({ path: relPath, content: input.content }));
98
+ }
99
+ else if (toolName === 'Edit' && typeof input.file_path === 'string') {
100
+ const relPath = String(input.file_path).replace(new RegExp('^' + workDir.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + '/?'), '');
101
+ onUpdate('file_write', JSON.stringify({ path: relPath, edit: { old_string: input.old_string, new_string: input.new_string } }));
102
+ }
103
+ }
104
+ }
105
+ }
106
+ }
107
+ else if (msg.type === 'result') {
108
+ const result = msg.result;
109
+ if (result) {
110
+ console.log('');
111
+ console.log(jobDone(result.slice(0, 200)));
112
+ lastText = result.slice(0, 200);
113
+ }
114
+ const cost = msg.total_cost_usd;
115
+ const turns = msg.num_turns;
116
+ if (cost)
117
+ console.log(costLine(cost, turns));
118
+ }
119
+ }
120
+ pollingActive = false;
121
+ await pollPromise;
122
+ const files = collectFiles(workDir);
123
+ const summary = lastText || `Job completed via ${provider}. ${files.length} file(s) created.`;
124
+ onUpdate('text', summary.slice(0, 200));
125
+ return { success: true, files, summary };
126
+ }
127
+ catch (err) {
128
+ const errMsg = err instanceof Error ? err.message : String(err);
129
+ console.log(` ${bold('\x1b[31m✗\x1b[39m')} ${errMsg}`);
130
+ onUpdate('text', `Error: ${errMsg}`);
131
+ const files = collectFiles(workDir);
132
+ return { success: false, files, summary: `Error: ${errMsg}` };
133
+ }
134
+ finally {
135
+ // Restore env vars
136
+ if (prevKey !== undefined)
137
+ process.env.ANTHROPIC_API_KEY = prevKey;
138
+ else
139
+ delete process.env.ANTHROPIC_API_KEY;
140
+ if (prevBase !== undefined)
141
+ process.env.ANTHROPIC_BASE_URL = prevBase;
142
+ else
143
+ delete process.env.ANTHROPIC_BASE_URL;
144
+ }
145
+ }
146
+ }
147
+ //# sourceMappingURL=claude-sdk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-sdk.js","sourceRoot":"","sources":["../../../src/daemon/executors/claude-sdk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Job } from '../../shared/types.js';
2
+ import type { JobExecutor, ExecutionResult, OnUpdate } from '../executor.js';
3
+ export declare class CodexExecutor implements JobExecutor {
4
+ private codexPath;
5
+ constructor();
6
+ execute(job: Job, workDir: string, onUpdate: OnUpdate): Promise<ExecutionResult>;
7
+ private handleEvent;
8
+ }
@@ -0,0 +1,82 @@
1
+ import { spawn, execSync } from 'child_process';
2
+ import { mkdirSync } from 'fs';
3
+ import { buildPrompt } from './prompt.js';
4
+ import { collectFiles } from './file-collector.js';
5
+ function findCodexBinary() {
6
+ try {
7
+ const path = execSync('which codex 2>/dev/null', { encoding: 'utf-8' }).trim();
8
+ if (path)
9
+ return path;
10
+ }
11
+ catch { /* not in PATH */ }
12
+ return 'codex';
13
+ }
14
+ function ts() {
15
+ return new Date().toLocaleTimeString('en-US', { hour12: false });
16
+ }
17
+ export class CodexExecutor {
18
+ codexPath;
19
+ constructor() {
20
+ this.codexPath = findCodexBinary();
21
+ }
22
+ async execute(job, workDir, onUpdate) {
23
+ mkdirSync(workDir, { recursive: true });
24
+ const prompt = buildPrompt(job, workDir);
25
+ console.log(` Using codex binary: ${this.codexPath}`);
26
+ onUpdate('text', 'Agent started via Codex');
27
+ return new Promise((resolve) => {
28
+ const codex = spawn(this.codexPath, [
29
+ 'exec', prompt,
30
+ '--json',
31
+ ], {
32
+ cwd: workDir,
33
+ stdio: ['ignore', 'pipe', 'inherit'],
34
+ });
35
+ let outputBuffer = '';
36
+ codex.stdout?.on('data', (chunk) => {
37
+ const text = chunk.toString();
38
+ outputBuffer += text;
39
+ const lines = outputBuffer.split('\n');
40
+ outputBuffer = lines.pop() || '';
41
+ for (const line of lines) {
42
+ if (!line.trim())
43
+ continue;
44
+ try {
45
+ const event = JSON.parse(line);
46
+ this.handleEvent(event, onUpdate);
47
+ }
48
+ catch {
49
+ process.stdout.write(line + '\n');
50
+ }
51
+ }
52
+ });
53
+ codex.on('close', (code) => {
54
+ const files = collectFiles(workDir);
55
+ const summary = code === 0
56
+ ? `Job completed via Codex. ${files.length} file(s) created.`
57
+ : `Job finished with exit code ${code}. ${files.length} file(s) in working directory.`;
58
+ onUpdate('text', summary);
59
+ resolve({ success: code === 0, files, summary });
60
+ });
61
+ codex.on('error', (err) => {
62
+ console.log(` [${ts()}] ERROR: Failed to spawn codex: ${err.message}`);
63
+ onUpdate('text', `Error spawning codex: ${err.message}`);
64
+ resolve({ success: false, files: [], summary: `Failed to spawn codex: ${err.message}` });
65
+ });
66
+ });
67
+ }
68
+ handleEvent(event, onUpdate) {
69
+ const type = event.type;
70
+ if (type === 'message' && typeof event.content === 'string') {
71
+ const text = event.content.slice(0, 200);
72
+ console.log(` [${ts()}] ${text}`);
73
+ onUpdate('text', text);
74
+ }
75
+ else if (type === 'command' && typeof event.command === 'string') {
76
+ const cmd = event.command.slice(0, 200);
77
+ console.log(` [${ts()}] > ${cmd}`);
78
+ onUpdate('terminal', cmd);
79
+ }
80
+ }
81
+ }
82
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/daemon/executors/codex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function collectFiles(dir: string, base?: string): Array<{
2
+ path: string;
3
+ content: string;
4
+ }>;
@@ -0,0 +1,32 @@
1
+ import { readdirSync, readFileSync, statSync } from 'fs';
2
+ import { join, relative } from 'path';
3
+ export function collectFiles(dir, base) {
4
+ const files = [];
5
+ const root = base || dir;
6
+ try {
7
+ const entries = readdirSync(dir);
8
+ for (const entry of entries) {
9
+ if (entry.startsWith('.') || entry === 'node_modules')
10
+ continue;
11
+ const fullPath = join(dir, entry);
12
+ const stat = statSync(fullPath);
13
+ if (stat.isDirectory()) {
14
+ files.push(...collectFiles(fullPath, root));
15
+ }
16
+ else if (stat.isFile() && stat.size < 100_000) {
17
+ try {
18
+ const content = readFileSync(fullPath, 'utf-8');
19
+ files.push({ path: relative(root, fullPath), content });
20
+ }
21
+ catch {
22
+ // Binary file or unreadable, skip
23
+ }
24
+ }
25
+ }
26
+ }
27
+ catch {
28
+ // Directory doesn't exist or not readable
29
+ }
30
+ return files;
31
+ }
32
+ //# sourceMappingURL=file-collector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-collector.js","sourceRoot":"","sources":["../../../src/daemon/executors/file-collector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAEtC,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,IAAa;IACrD,MAAM,KAAK,GAA6C,EAAE,CAAC;IAC3D,MAAM,IAAI,GAAG,IAAI,IAAI,GAAG,CAAC;IAEzB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QACjC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,KAAK,cAAc;gBAAE,SAAS;YAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAClC,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAEhC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvB,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;YAC9C,CAAC;iBAAM,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,CAAC;gBAChD,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;oBAChD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC1D,CAAC;gBAAC,MAAM,CAAC;oBACP,kCAAkC;gBACpC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,0CAA0C;IAC5C,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { MaclatConfig } from '../../shared/types.js';
2
+ import type { JobExecutor } from '../executor.js';
3
+ export declare function createExecutor(config: MaclatConfig): JobExecutor;
@@ -0,0 +1,33 @@
1
+ import { ClaudeCodeExecutor } from './claude-code.js';
2
+ import { ClaudeSdkExecutor } from './claude-sdk.js';
3
+ import { CodexExecutor } from './codex.js';
4
+ export function createExecutor(config) {
5
+ const executor = config.executor || 'claude-code';
6
+ switch (executor) {
7
+ case 'claude-code':
8
+ return new ClaudeCodeExecutor(config.max_turns);
9
+ case 'anthropic': {
10
+ if (!config.api_key) {
11
+ console.error(' Error: anthropic executor requires an API key.');
12
+ console.error(' Run: maclat use anthropic <your-api-key>');
13
+ process.exit(1);
14
+ }
15
+ return new ClaudeSdkExecutor(config.api_key, config.model, config.max_turns);
16
+ }
17
+ case 'openrouter': {
18
+ if (!config.api_key) {
19
+ console.error(' Error: openrouter executor requires an API key.');
20
+ console.error(' Run: maclat use openrouter <your-api-key>');
21
+ process.exit(1);
22
+ }
23
+ return new ClaudeSdkExecutor(config.api_key, config.model || 'anthropic/claude-sonnet-4-6', config.max_turns, 'https://openrouter.ai/api');
24
+ }
25
+ case 'codex':
26
+ return new CodexExecutor();
27
+ default:
28
+ console.error(` Unknown executor: ${executor}`);
29
+ console.error(` Valid options: claude-code, anthropic, openrouter, codex`);
30
+ process.exit(1);
31
+ }
32
+ }
33
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/daemon/executors/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,UAAU,cAAc,CAAC,MAAoB;IACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,aAAa,CAAC;IAElD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,aAAa;YAChB,OAAO,IAAI,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAElD,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;gBAClE,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;gBAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QAC/E,CAAC;QAED,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;gBACnE,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;gBAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,OAAO,IAAI,iBAAiB,CAC1B,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,KAAK,IAAI,6BAA6B,EAC7C,MAAM,CAAC,SAAS,EAChB,2BAA2B,CAC5B,CAAC;QACJ,CAAC;QAED,KAAK,OAAO;YACV,OAAO,IAAI,aAAa,EAAE,CAAC;QAE7B;YACE,OAAO,CAAC,KAAK,CAAC,uBAAuB,QAAQ,EAAE,CAAC,CAAC;YACjD,OAAO,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;YAC5E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Job } from '../../shared/types.js';
2
+ export declare function buildPrompt(job: Job, workDir: string): string;
@@ -0,0 +1,20 @@
1
+ export function buildPrompt(job, workDir) {
2
+ return [
3
+ `You are an autonomous agent executing a job from the Maclat marketplace.`,
4
+ ``,
5
+ `## Job Details`,
6
+ `- Title: ${job.title}`,
7
+ `- Description: ${job.description}`,
8
+ `- Budget: ${job.budget_usdc} USDC`,
9
+ ``,
10
+ `## Instructions`,
11
+ `1. Work in the current directory: ${workDir}`,
12
+ `2. Complete the job as described above`,
13
+ `3. Create all necessary files in the current directory`,
14
+ `4. Make sure everything works and is complete`,
15
+ `5. When done, provide a brief summary of what you built`,
16
+ ``,
17
+ `Do your best work. The job poster will review your deliverables.`,
18
+ ].join('\n');
19
+ }
20
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../../src/daemon/executors/prompt.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,WAAW,CAAC,GAAQ,EAAE,OAAe;IACnD,OAAO;QACL,0EAA0E;QAC1E,EAAE;QACF,gBAAgB;QAChB,YAAY,GAAG,CAAC,KAAK,EAAE;QACvB,kBAAkB,GAAG,CAAC,WAAW,EAAE;QACnC,aAAa,GAAG,CAAC,WAAW,OAAO;QACnC,EAAE;QACF,iBAAiB;QACjB,qCAAqC,OAAO,EAAE;QAC9C,wCAAwC;QACxC,wDAAwD;QACxD,+CAA+C;QAC/C,yDAAyD;QACzD,EAAE;QACF,kEAAkE;KACnE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,16 @@
1
+ export declare const bold: (s: string) => string;
2
+ export declare const dim: (s: string) => string;
3
+ export declare const purple: (s: string) => string;
4
+ export declare const cyan: (s: string) => string;
5
+ export declare const green: (s: string) => string;
6
+ export declare const yellow: (s: string) => string;
7
+ export declare const red: (s: string) => string;
8
+ export declare const gray: (s: string) => string;
9
+ export declare function box(lines: string[]): string;
10
+ export declare function toolPill(name: string, target: string): string;
11
+ export declare function fileWrite(path: string): string;
12
+ export declare function agentText(text: string): string;
13
+ export declare function jobFound(title: string, budget: number): string;
14
+ export declare function jobDone(summary: string): string;
15
+ export declare function jobError(msg: string): string;
16
+ export declare function costLine(cost: number | string, turns?: number | string): string;
@@ -0,0 +1,45 @@
1
+ // ANSI escape code formatters — zero dependencies
2
+ export const bold = (s) => `\x1b[1m${s}\x1b[22m`;
3
+ export const dim = (s) => `\x1b[2m${s}\x1b[22m`;
4
+ export const purple = (s) => `\x1b[35m${s}\x1b[39m`;
5
+ export const cyan = (s) => `\x1b[36m${s}\x1b[39m`;
6
+ export const green = (s) => `\x1b[32m${s}\x1b[39m`;
7
+ export const yellow = (s) => `\x1b[33m${s}\x1b[39m`;
8
+ export const red = (s) => `\x1b[31m${s}\x1b[39m`;
9
+ export const gray = (s) => `\x1b[90m${s}\x1b[39m`;
10
+ export function box(lines) {
11
+ const maxLen = Math.max(...lines.map(l => stripAnsi(l).length));
12
+ const pad = (s) => s + ' '.repeat(maxLen - stripAnsi(s).length);
13
+ const top = ` ╭${'─'.repeat(maxLen + 4)}╮`;
14
+ const bot = ` ╰${'─'.repeat(maxLen + 4)}╯`;
15
+ const rows = lines.map(l => ` │ ${pad(l)} │`);
16
+ return [top, ...rows, bot].join('\n');
17
+ }
18
+ function stripAnsi(s) {
19
+ return s.replace(/\x1b\[[0-9;]*m/g, '');
20
+ }
21
+ export function toolPill(name, target) {
22
+ return ` ${cyan('●')} ${bold(name)}${target ? gray(`(${target})`) : ''}`;
23
+ }
24
+ export function fileWrite(path) {
25
+ return ` ${green('✓')} ${bold('Write')}${gray(`(${path})`)}`;
26
+ }
27
+ export function agentText(text) {
28
+ return ` ${gray('│')} ${dim(text)}`;
29
+ }
30
+ export function jobFound(title, budget) {
31
+ return ` ${yellow('◆')} ${bold('Job found:')} ${title} ${gray(`(${budget} USDC)`)}`;
32
+ }
33
+ export function jobDone(summary) {
34
+ return ` ${green('✓')} ${bold('Done:')} ${summary}`;
35
+ }
36
+ export function jobError(msg) {
37
+ return ` ${red('✗')} ${msg}`;
38
+ }
39
+ export function costLine(cost, turns) {
40
+ const parts = [`$${cost}`];
41
+ if (turns)
42
+ parts.push(`${turns} turns`);
43
+ return ` ${gray(parts.join(' · '))}`;
44
+ }
45
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/daemon/format.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { loadConfig, GATEWAY_URL } from '../shared/config.js';
2
- import { ClaudeCodeExecutor } from './executor.js';
2
+ import { createExecutor } from './executors/index.js';
3
3
  import { JobPoller } from './poller.js';
4
+ import { bold, purple, gray, box, red } from './format.js';
4
5
  export async function startDaemon(args) {
5
6
  const config = loadConfig();
6
7
  const agentId = getFlag(args, '--id') || config.agent_id;
@@ -17,19 +18,24 @@ export async function startDaemon(args) {
17
18
  throw new Error(`HTTP ${res.status}`);
18
19
  }
19
20
  catch {
20
- console.log(`Cannot reach gateway at ${gatewayUrl}`);
21
+ console.log(`\n ${red('✗')} Cannot reach gateway at ${gatewayUrl}\n`);
21
22
  process.exit(1);
22
23
  }
23
- console.log(`\n Maclat Agent Daemon`);
24
- console.log(` ──────────────────────────`);
25
- console.log(` Agent ID: ${agentId}`);
26
- console.log(` Gateway: ${gatewayUrl}`);
27
- console.log(` ──────────────────────────\n`);
28
- const executor = new ClaudeCodeExecutor();
24
+ const executorType = config.executor || 'claude-code';
25
+ const bannerLines = [
26
+ `${bold(purple('Maclat Agent'))}`,
27
+ ``,
28
+ `${gray('Agent ID:')} ${agentId.slice(0, 16)}...`,
29
+ `${gray('Executor:')} ${bold(executorType)}`,
30
+ ...(config.model ? [`${gray('Model:')} ${config.model}`] : []),
31
+ `${gray('Gateway:')} ${gatewayUrl}`,
32
+ ];
33
+ console.log('\n' + box(bannerLines) + '\n');
34
+ const executor = createExecutor(config);
29
35
  const poller = new JobPoller(gatewayUrl, agentId, executor);
30
36
  // Graceful shutdown
31
37
  process.on('SIGINT', () => {
32
- console.log('\n Shutting down agent daemon...');
38
+ console.log(`\n ${gray('Shutting down agent daemon...')}`);
33
39
  poller.stop();
34
40
  process.exit(0);
35
41
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAc;IAC9C,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC;IAEzD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;QAC7E,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,IAAI,WAAW,CAAC;IAErD,8BAA8B;IAC9B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,UAAU,SAAS,CAAC,CAAC;QAChD,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,2BAA2B,UAAU,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,EAAE,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,eAAe,UAAU,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAE9C,MAAM,QAAQ,GAAG,IAAI,kBAAkB,EAAE,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAE5D,oBAAoB;IACpB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACjD,MAAM,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;AACvB,CAAC;AAED,SAAS,OAAO,CAAC,IAAc,EAAE,IAAY;IAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC3D,OAAO,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AACvB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAE3D,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAc;IAC9C,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC;IAEzD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;QAC7E,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,IAAI,WAAW,CAAC;IAErD,8BAA8B;IAC9B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,UAAU,SAAS,CAAC,CAAC;QAChD,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,GAAG,CAAC,4BAA4B,UAAU,IAAI,CAAC,CAAC;QACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,IAAI,aAAa,CAAC;IAEtD,MAAM,WAAW,GAAG;QAClB,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE;QACjC,EAAE;QACF,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK;QAClD,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,YAAY,CAAC,EAAE;QAC7C,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,UAAU,EAAE;KACtC,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC;IAE5C,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAE5D,oBAAoB;IACpB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,+BAA+B,CAAC,EAAE,CAAC,CAAC;QAC5D,MAAM,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;AACvB,CAAC;AAED,SAAS,OAAO,CAAC,IAAc,EAAE,IAAY;IAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC3D,OAAO,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AACvB,CAAC"}
@@ -5,9 +5,13 @@ export declare class JobPoller {
5
5
  private executor;
6
6
  private running;
7
7
  private currentJobId;
8
+ private idleInterval;
8
9
  constructor(gatewayUrl: string, agentId: string, executor: JobExecutor);
9
10
  start(): Promise<void>;
10
11
  stop(): void;
12
+ private startIdleAnimation;
13
+ private stopIdleAnimation;
14
+ private clearIdleLine;
11
15
  private pollForJobs;
12
16
  private executeJob;
13
17
  }