@ob1-sg/horizon 0.1.10 → 0.1.12
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/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +43 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +10 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +293 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +635 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/__tests__/attachment-downloader.test.d.ts +2 -0
- package/dist/lib/__tests__/attachment-downloader.test.d.ts.map +1 -0
- package/dist/lib/__tests__/attachment-downloader.test.js +163 -0
- package/dist/lib/__tests__/attachment-downloader.test.js.map +1 -0
- package/dist/lib/__tests__/cli-detection.test.d.ts +2 -0
- package/dist/lib/__tests__/cli-detection.test.d.ts.map +1 -0
- package/dist/lib/__tests__/cli-detection.test.js +119 -0
- package/dist/lib/__tests__/cli-detection.test.js.map +1 -0
- package/dist/lib/__tests__/config.test.d.ts +2 -0
- package/dist/lib/__tests__/config.test.d.ts.map +1 -0
- package/dist/lib/__tests__/config.test.js +291 -0
- package/dist/lib/__tests__/config.test.js.map +1 -0
- package/dist/lib/__tests__/gcp.test.d.ts +2 -0
- package/dist/lib/__tests__/gcp.test.d.ts.map +1 -0
- package/dist/lib/__tests__/gcp.test.js +104 -0
- package/dist/lib/__tests__/gcp.test.js.map +1 -0
- package/dist/lib/__tests__/git.test.d.ts +2 -0
- package/dist/lib/__tests__/git.test.d.ts.map +1 -0
- package/dist/lib/__tests__/git.test.js +62 -0
- package/dist/lib/__tests__/git.test.js.map +1 -0
- package/dist/lib/__tests__/linear-quick-check.test.d.ts +2 -0
- package/dist/lib/__tests__/linear-quick-check.test.d.ts.map +1 -0
- package/dist/lib/__tests__/linear-quick-check.test.js +152 -0
- package/dist/lib/__tests__/linear-quick-check.test.js.map +1 -0
- package/dist/lib/__tests__/loop-instance-name.test.d.ts +2 -0
- package/dist/lib/__tests__/loop-instance-name.test.d.ts.map +1 -0
- package/dist/lib/__tests__/loop-instance-name.test.js +90 -0
- package/dist/lib/__tests__/loop-instance-name.test.js.map +1 -0
- package/dist/lib/__tests__/output-logger.test.d.ts +2 -0
- package/dist/lib/__tests__/output-logger.test.d.ts.map +1 -0
- package/dist/lib/__tests__/output-logger.test.js +136 -0
- package/dist/lib/__tests__/output-logger.test.js.map +1 -0
- package/dist/lib/__tests__/prompts.test.d.ts +2 -0
- package/dist/lib/__tests__/prompts.test.d.ts.map +1 -0
- package/dist/lib/__tests__/prompts.test.js +70 -0
- package/dist/lib/__tests__/prompts.test.js.map +1 -0
- package/dist/lib/__tests__/provider.test.d.ts +2 -0
- package/dist/lib/__tests__/provider.test.d.ts.map +1 -0
- package/dist/lib/__tests__/provider.test.js +89 -0
- package/dist/lib/__tests__/provider.test.js.map +1 -0
- package/dist/lib/__tests__/rate-limit.test.d.ts +2 -0
- package/dist/lib/__tests__/rate-limit.test.d.ts.map +1 -0
- package/dist/lib/__tests__/rate-limit.test.js +275 -0
- package/dist/lib/__tests__/rate-limit.test.js.map +1 -0
- package/dist/lib/__tests__/readline.test.d.ts +2 -0
- package/dist/lib/__tests__/readline.test.d.ts.map +1 -0
- package/dist/lib/__tests__/readline.test.js +55 -0
- package/dist/lib/__tests__/readline.test.js.map +1 -0
- package/dist/lib/__tests__/stats-logger.test.d.ts +2 -0
- package/dist/lib/__tests__/stats-logger.test.d.ts.map +1 -0
- package/dist/lib/__tests__/stats-logger.test.js +297 -0
- package/dist/lib/__tests__/stats-logger.test.js.map +1 -0
- package/dist/lib/__tests__/update-checker.test.d.ts +2 -0
- package/dist/lib/__tests__/update-checker.test.d.ts.map +1 -0
- package/dist/lib/__tests__/update-checker.test.js +141 -0
- package/dist/lib/__tests__/update-checker.test.js.map +1 -0
- package/dist/lib/__tests__/version.test.d.ts +2 -0
- package/dist/lib/__tests__/version.test.d.ts.map +1 -0
- package/dist/lib/__tests__/version.test.js +51 -0
- package/dist/lib/__tests__/version.test.js.map +1 -0
- package/dist/lib/attachment-downloader.d.ts +26 -0
- package/dist/lib/attachment-downloader.d.ts.map +1 -0
- package/dist/lib/attachment-downloader.js +259 -0
- package/dist/lib/attachment-downloader.js.map +1 -0
- package/dist/lib/claude.d.ts +6 -0
- package/dist/lib/claude.d.ts.map +1 -0
- package/dist/lib/claude.js +459 -0
- package/dist/lib/claude.js.map +1 -0
- package/dist/lib/cli-detection.d.ts +25 -0
- package/dist/lib/cli-detection.d.ts.map +1 -0
- package/dist/lib/cli-detection.js +53 -0
- package/dist/lib/cli-detection.js.map +1 -0
- package/dist/lib/codex.d.ts +4 -0
- package/dist/lib/codex.d.ts.map +1 -0
- package/dist/lib/codex.js +320 -0
- package/dist/lib/codex.js.map +1 -0
- package/dist/lib/gcp.d.ts +21 -0
- package/dist/lib/gcp.d.ts.map +1 -0
- package/dist/lib/gcp.js +96 -0
- package/dist/lib/gcp.js.map +1 -0
- package/dist/lib/git.d.ts +3 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +24 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/init-project.d.ts +13 -0
- package/dist/lib/init-project.d.ts.map +1 -0
- package/dist/lib/init-project.js +420 -0
- package/dist/lib/init-project.js.map +1 -0
- package/dist/lib/linear-api.d.ts +32 -0
- package/dist/lib/linear-api.d.ts.map +1 -0
- package/dist/lib/linear-api.js +267 -0
- package/dist/lib/linear-api.js.map +1 -0
- package/dist/lib/linear-quick-check.d.ts +13 -0
- package/dist/lib/linear-quick-check.d.ts.map +1 -0
- package/dist/lib/linear-quick-check.js +61 -0
- package/dist/lib/linear-quick-check.js.map +1 -0
- package/dist/lib/loop-instance-name.d.ts +29 -0
- package/dist/lib/loop-instance-name.d.ts.map +1 -0
- package/dist/lib/loop-instance-name.js +105 -0
- package/dist/lib/loop-instance-name.js.map +1 -0
- package/dist/lib/output-logger.d.ts +23 -0
- package/dist/lib/output-logger.d.ts.map +1 -0
- package/dist/lib/output-logger.js +104 -0
- package/dist/lib/output-logger.js.map +1 -0
- package/dist/lib/prompts.d.ts +17 -0
- package/dist/lib/prompts.d.ts.map +1 -0
- package/dist/lib/prompts.js +65 -0
- package/dist/lib/prompts.js.map +1 -0
- package/dist/lib/provider.d.ts +32 -0
- package/dist/lib/provider.d.ts.map +1 -0
- package/dist/lib/provider.js +27 -0
- package/dist/lib/provider.js.map +1 -0
- package/dist/lib/rate-limit.d.ts +14 -0
- package/dist/lib/rate-limit.d.ts.map +1 -0
- package/dist/lib/rate-limit.js +154 -0
- package/dist/lib/rate-limit.js.map +1 -0
- package/dist/lib/readline.d.ts +4 -0
- package/dist/lib/readline.d.ts.map +1 -0
- package/dist/lib/readline.js +39 -0
- package/dist/lib/readline.js.map +1 -0
- package/dist/lib/setup.d.ts +126 -0
- package/dist/lib/setup.d.ts.map +1 -0
- package/dist/lib/setup.js +482 -0
- package/dist/lib/setup.js.map +1 -0
- package/dist/lib/stats-logger.d.ts +92 -0
- package/dist/lib/stats-logger.d.ts.map +1 -0
- package/dist/lib/stats-logger.js +258 -0
- package/dist/lib/stats-logger.js.map +1 -0
- package/dist/lib/ui.d.ts +38 -0
- package/dist/lib/ui.d.ts.map +1 -0
- package/dist/lib/ui.js +69 -0
- package/dist/lib/ui.js.map +1 -0
- package/dist/lib/update-checker.d.ts +17 -0
- package/dist/lib/update-checker.d.ts.map +1 -0
- package/dist/lib/update-checker.js +138 -0
- package/dist/lib/update-checker.js.map +1 -0
- package/dist/lib/version.d.ts +10 -0
- package/dist/lib/version.d.ts.map +1 -0
- package/dist/lib/version.js +37 -0
- package/dist/lib/version.js.map +1 -0
- package/dist/types.d.ts +92 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +5 -2
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
import { spawn, execSync } from 'child_process';
|
|
2
|
+
import { getConfig } from '../config.js';
|
|
3
|
+
import { logAgentOutput, logTerminalOutput } from './output-logger.js';
|
|
4
|
+
import { registerCodexProvider } from './provider.js';
|
|
5
|
+
import { isRateLimitError } from './rate-limit.js';
|
|
6
|
+
import { BOLD, DIM, GREEN, YELLOW, BLUE, RESET, box } from './ui.js';
|
|
7
|
+
// MCP tool call collapsing state
|
|
8
|
+
let mcpConsecutiveCount = 0;
|
|
9
|
+
const MCP_SHOW_LIMIT = 3;
|
|
10
|
+
// Dimmed compact format for MCP calls beyond the show limit
|
|
11
|
+
function formatMcpCompact(item) {
|
|
12
|
+
const server = item.server || '';
|
|
13
|
+
const tool = item.tool || 'unknown';
|
|
14
|
+
const display = server ? `${server}:${tool}` : tool;
|
|
15
|
+
let sig = display;
|
|
16
|
+
if (item.arguments && Object.keys(item.arguments).length > 0) {
|
|
17
|
+
sig += `(${formatArgs(item.arguments)})`;
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
sig += '()';
|
|
21
|
+
}
|
|
22
|
+
return `${DIM} ○ ${sig}${RESET}`;
|
|
23
|
+
}
|
|
24
|
+
// Codex pricing per 1M tokens (approximate, based on OpenAI pricing)
|
|
25
|
+
// These are estimates and may need updating
|
|
26
|
+
const CODEX_PRICING = {
|
|
27
|
+
'gpt-5.2-codex': { input: 2.00, output: 8.00 },
|
|
28
|
+
'gpt-5-codex': { input: 2.00, output: 8.00 },
|
|
29
|
+
'gpt-4-codex': { input: 1.50, output: 6.00 },
|
|
30
|
+
'default': { input: 2.00, output: 8.00 },
|
|
31
|
+
};
|
|
32
|
+
// Helper: Clean up file paths for display
|
|
33
|
+
function cleanPath(path) {
|
|
34
|
+
return path
|
|
35
|
+
.replace(/\/home\/ubuntu\/repos\/[^/]+\//g, '')
|
|
36
|
+
.replace(/\/Users\/[^/]+\/repos\/[^/]+\//g, '');
|
|
37
|
+
}
|
|
38
|
+
// Helper: Clean up command for display
|
|
39
|
+
function cleanCommand(cmd) {
|
|
40
|
+
return cmd
|
|
41
|
+
.replace(/^\/bin\/zsh -lc /, '')
|
|
42
|
+
.replace(/^\/bin\/bash -lc /, '')
|
|
43
|
+
.replace(/^['"]|['"]$/g, '');
|
|
44
|
+
}
|
|
45
|
+
// Helper: Truncate string to max length (default 120 for better visibility)
|
|
46
|
+
function truncate(str, maxLen = 120) {
|
|
47
|
+
if (str.length <= maxLen)
|
|
48
|
+
return str;
|
|
49
|
+
return str.substring(0, maxLen) + '...';
|
|
50
|
+
}
|
|
51
|
+
// Format tool arguments as function signature params
|
|
52
|
+
function formatArgs(args) {
|
|
53
|
+
const params = Object.entries(args)
|
|
54
|
+
.filter(([, v]) => v !== undefined && v !== null)
|
|
55
|
+
.map(([k, v]) => {
|
|
56
|
+
if (typeof v === 'string')
|
|
57
|
+
return `${k}="${truncate(v, 60)}"`;
|
|
58
|
+
if (typeof v === 'object')
|
|
59
|
+
return `${k}={...}`;
|
|
60
|
+
return `${k}=${v}`;
|
|
61
|
+
})
|
|
62
|
+
.join(', ');
|
|
63
|
+
return truncate(params, 120);
|
|
64
|
+
}
|
|
65
|
+
// Format a single Codex JSON event for terminal display
|
|
66
|
+
function formatCodexEvent(event) {
|
|
67
|
+
const tag = `${DIM}[codex]${RESET}`;
|
|
68
|
+
if (event.type === 'item.completed') {
|
|
69
|
+
const itemEvent = event;
|
|
70
|
+
const item = itemEvent.item;
|
|
71
|
+
switch (item.type) {
|
|
72
|
+
case 'command_execution': {
|
|
73
|
+
const cmd = cleanCommand(item.command || '');
|
|
74
|
+
const shortCmd = truncate(cmd.replace(/\n/g, ' '), 100);
|
|
75
|
+
const exitCode = item.exit_code ?? 0;
|
|
76
|
+
let output = `${GREEN}${BOLD}●${RESET} Bash(command="${shortCmd}") ${tag}`;
|
|
77
|
+
if (exitCode !== 0) {
|
|
78
|
+
const errText = item.aggregated_output ? truncate(item.aggregated_output, 100) : '';
|
|
79
|
+
output += `\n${DIM} └ Error (exit ${exitCode})${errText ? ': ' + errText : ''}${RESET}`;
|
|
80
|
+
}
|
|
81
|
+
return output;
|
|
82
|
+
}
|
|
83
|
+
case 'file_change': {
|
|
84
|
+
if (item.changes && item.changes.length > 0) {
|
|
85
|
+
return item.changes
|
|
86
|
+
.map(change => `${GREEN}${BOLD}●${RESET} FileChange(${change.kind || 'update'} "${cleanPath(change.path)}") ${tag}`)
|
|
87
|
+
.join('\n');
|
|
88
|
+
}
|
|
89
|
+
return `${GREEN}${BOLD}●${RESET} FileChange() ${tag}`;
|
|
90
|
+
}
|
|
91
|
+
case 'reasoning': {
|
|
92
|
+
const text = item.text || '';
|
|
93
|
+
const firstLine = text.split('\n')[0] || '';
|
|
94
|
+
const cleanLine = firstLine.replace(/^\*\*|\*\*$/g, '').trim();
|
|
95
|
+
return `${DIM}* Thinking...${cleanLine ? ' ' + cleanLine : ''}${RESET}`;
|
|
96
|
+
}
|
|
97
|
+
case 'agent_message': {
|
|
98
|
+
return `${item.text || ''} ${tag}`;
|
|
99
|
+
}
|
|
100
|
+
case 'mcp_tool_call': {
|
|
101
|
+
const server = item.server || '';
|
|
102
|
+
const tool = item.tool || 'unknown';
|
|
103
|
+
const toolDisplay = server ? `${server}:${tool}` : tool;
|
|
104
|
+
let sig = toolDisplay;
|
|
105
|
+
if (item.arguments && Object.keys(item.arguments).length > 0) {
|
|
106
|
+
sig += `(${formatArgs(item.arguments)})`;
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
sig += '()';
|
|
110
|
+
}
|
|
111
|
+
return `${GREEN}${BOLD}●${RESET} ${sig} ${tag}`;
|
|
112
|
+
}
|
|
113
|
+
case 'web_search': {
|
|
114
|
+
const query = item.query || item.text || 'search';
|
|
115
|
+
return `${GREEN}${BOLD}●${RESET} WebSearch(query="${truncate(query, 100)}") ${tag}`;
|
|
116
|
+
}
|
|
117
|
+
case 'plan_update': {
|
|
118
|
+
const text = item.text || 'plan updated';
|
|
119
|
+
const firstLine = text.split('\n')[0] || '';
|
|
120
|
+
return `${DIM}~ Plan: ${truncate(firstLine, 100)}${RESET} ${tag}`;
|
|
121
|
+
}
|
|
122
|
+
default:
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if (event.type === 'error') {
|
|
127
|
+
const errorEvent = event;
|
|
128
|
+
const message = errorEvent.message || errorEvent.error || 'error';
|
|
129
|
+
return `${YELLOW}✗ Error: ${message}${RESET} ${tag}`;
|
|
130
|
+
}
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
// Estimate cost based on token usage and model
|
|
134
|
+
function estimateCost(tokenUsage, model) {
|
|
135
|
+
const pricing = CODEX_PRICING[model] || CODEX_PRICING['default'];
|
|
136
|
+
// Input tokens (non-cached) - cached tokens are typically free or discounted
|
|
137
|
+
const inputCost = ((tokenUsage.input - tokenUsage.cached) / 1_000_000) * pricing.input;
|
|
138
|
+
const outputCost = (tokenUsage.output / 1_000_000) * pricing.output;
|
|
139
|
+
return inputCost + outputCost;
|
|
140
|
+
}
|
|
141
|
+
// Extract final text output from Codex streaming JSON
|
|
142
|
+
function extractCodexFinalOutput(streamOutput) {
|
|
143
|
+
const lines = streamOutput.split('\n');
|
|
144
|
+
let lastAgentMessage = '';
|
|
145
|
+
for (const line of lines) {
|
|
146
|
+
if (!line.trim())
|
|
147
|
+
continue;
|
|
148
|
+
try {
|
|
149
|
+
const json = JSON.parse(line);
|
|
150
|
+
if (json.type === 'item.completed' && json.item?.type === 'agent_message') {
|
|
151
|
+
lastAgentMessage = json.item.text || '';
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
// Not JSON, ignore
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return lastAgentMessage;
|
|
159
|
+
}
|
|
160
|
+
// Codex provider implementation
|
|
161
|
+
class CodexProvider {
|
|
162
|
+
name = 'codex';
|
|
163
|
+
async spawn(options, agentNumber) {
|
|
164
|
+
// Reset MCP collapsing state for new session
|
|
165
|
+
mcpConsecutiveCount = 0;
|
|
166
|
+
const config = getConfig();
|
|
167
|
+
const model = options.model || config.codexModel;
|
|
168
|
+
const reasoningEffort = options.reasoningEffort || config.codexReasoningEffort;
|
|
169
|
+
return new Promise((resolve, reject) => {
|
|
170
|
+
const args = [
|
|
171
|
+
'exec',
|
|
172
|
+
'--dangerously-bypass-approvals-and-sandbox',
|
|
173
|
+
'--json',
|
|
174
|
+
'--model', model,
|
|
175
|
+
'-c', `model_reasoning_effort="${reasoningEffort}"`,
|
|
176
|
+
];
|
|
177
|
+
const spawnMsg = `${DIM} spawning codex --model ${model} --json ...${RESET}`;
|
|
178
|
+
console.log(spawnMsg);
|
|
179
|
+
if (agentNumber !== undefined) {
|
|
180
|
+
logTerminalOutput(agentNumber, spawnMsg).catch(() => { });
|
|
181
|
+
}
|
|
182
|
+
const proc = spawn('codex', args, {
|
|
183
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
184
|
+
cwd: config.workingDirectory,
|
|
185
|
+
env: { ...process.env },
|
|
186
|
+
});
|
|
187
|
+
// Feed prompt via stdin
|
|
188
|
+
proc.stdin.write(options.prompt);
|
|
189
|
+
proc.stdin.end();
|
|
190
|
+
let output = '';
|
|
191
|
+
let rateLimited = false;
|
|
192
|
+
let retryAfterMs;
|
|
193
|
+
const startTime = Date.now();
|
|
194
|
+
// Token tracking
|
|
195
|
+
const tokenUsage = { input: 0, output: 0, cached: 0 };
|
|
196
|
+
proc.stdout.on('data', (chunk) => {
|
|
197
|
+
const text = chunk.toString();
|
|
198
|
+
output += text;
|
|
199
|
+
// Parse streaming JSON output line by line
|
|
200
|
+
for (const line of text.split('\n')) {
|
|
201
|
+
if (!line.trim())
|
|
202
|
+
continue;
|
|
203
|
+
// Skip non-JSON lines (like "Reading prompt from stdin...")
|
|
204
|
+
if (!line.startsWith('{'))
|
|
205
|
+
continue;
|
|
206
|
+
// Persist raw line to output log file
|
|
207
|
+
if (agentNumber !== undefined) {
|
|
208
|
+
logAgentOutput(agentNumber, line).catch(() => { });
|
|
209
|
+
}
|
|
210
|
+
try {
|
|
211
|
+
const json = JSON.parse(line);
|
|
212
|
+
// Track token usage from turn.completed events
|
|
213
|
+
if (json.type === 'turn.completed') {
|
|
214
|
+
const turnEvent = json;
|
|
215
|
+
tokenUsage.input += turnEvent.usage.input_tokens || 0;
|
|
216
|
+
tokenUsage.output += turnEvent.usage.output_tokens || 0;
|
|
217
|
+
tokenUsage.cached += turnEvent.usage.cached_input_tokens || 0;
|
|
218
|
+
}
|
|
219
|
+
// Check for rate limits in error events
|
|
220
|
+
if (json.type === 'error') {
|
|
221
|
+
const errorEvent = json;
|
|
222
|
+
const errorText = errorEvent.message || errorEvent.error || '';
|
|
223
|
+
if (isRateLimitError(errorText)) {
|
|
224
|
+
rateLimited = true;
|
|
225
|
+
// Default wait time for Codex rate limits (5 minutes)
|
|
226
|
+
retryAfterMs = 5 * 60 * 1000;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
// MCP tool call collapsing
|
|
230
|
+
const isMcp = json.type === 'item.completed' && json.item?.type === 'mcp_tool_call';
|
|
231
|
+
if (isMcp) {
|
|
232
|
+
mcpConsecutiveCount++;
|
|
233
|
+
if (mcpConsecutiveCount > MCP_SHOW_LIMIT) {
|
|
234
|
+
const compact = formatMcpCompact(json.item);
|
|
235
|
+
console.log(compact);
|
|
236
|
+
if (agentNumber !== undefined) {
|
|
237
|
+
logTerminalOutput(agentNumber, compact).catch(() => { });
|
|
238
|
+
}
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
mcpConsecutiveCount = 0;
|
|
244
|
+
}
|
|
245
|
+
// Format and display the event
|
|
246
|
+
const formatted = formatCodexEvent(json);
|
|
247
|
+
if (formatted) {
|
|
248
|
+
console.log(formatted);
|
|
249
|
+
if (agentNumber !== undefined) {
|
|
250
|
+
logTerminalOutput(agentNumber, formatted).catch(() => { });
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
catch {
|
|
255
|
+
// Not valid JSON, ignore
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
proc.stderr.on('data', (chunk) => {
|
|
260
|
+
const text = chunk.toString().trim();
|
|
261
|
+
if (text && !text.includes('Reading prompt from stdin')) {
|
|
262
|
+
const stderrMsg = `${DIM}stderr: ${text}${RESET}`;
|
|
263
|
+
console.error(stderrMsg);
|
|
264
|
+
if (agentNumber !== undefined) {
|
|
265
|
+
logTerminalOutput(agentNumber, stderrMsg).catch(() => { });
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
proc.on('close', (code) => {
|
|
270
|
+
const duration = Date.now() - startTime;
|
|
271
|
+
const cost = estimateCost(tokenUsage, model);
|
|
272
|
+
// Format session end summary
|
|
273
|
+
const sessionEnd = '\n' + box([
|
|
274
|
+
` Duration: ${Math.floor(duration / 1000)}s | Cost: ~$${cost.toFixed(4)} (estimated) `,
|
|
275
|
+
` Tokens: in=${tokenUsage.input.toLocaleString()} cached=${tokenUsage.cached.toLocaleString()} out=${tokenUsage.output.toLocaleString()} `,
|
|
276
|
+
], { title: 'SESSION END', color: BLUE, width: 80 });
|
|
277
|
+
console.log(sessionEnd);
|
|
278
|
+
if (agentNumber !== undefined) {
|
|
279
|
+
logTerminalOutput(agentNumber, sessionEnd).catch(() => { });
|
|
280
|
+
}
|
|
281
|
+
resolve({
|
|
282
|
+
output,
|
|
283
|
+
finalOutput: extractCodexFinalOutput(output),
|
|
284
|
+
rateLimited,
|
|
285
|
+
retryAfterMs,
|
|
286
|
+
cost,
|
|
287
|
+
costEstimated: true, // Codex cost is always estimated
|
|
288
|
+
duration,
|
|
289
|
+
exitCode: code || 0,
|
|
290
|
+
tokenUsage,
|
|
291
|
+
});
|
|
292
|
+
});
|
|
293
|
+
proc.on('error', (err) => {
|
|
294
|
+
if (err.message.includes('ENOENT')) {
|
|
295
|
+
reject(new Error('Codex CLI not found. Install from https://github.com/openai/codex'));
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
reject(new Error(`Failed to spawn codex: ${err.message}`));
|
|
299
|
+
}
|
|
300
|
+
});
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
// Factory function
|
|
305
|
+
export function createCodexProvider() {
|
|
306
|
+
return new CodexProvider();
|
|
307
|
+
}
|
|
308
|
+
// Check if Linear MCP is configured in Codex
|
|
309
|
+
export function checkCodexLinearMcpConfigured() {
|
|
310
|
+
try {
|
|
311
|
+
const result = execSync('codex mcp list', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });
|
|
312
|
+
return result.toLowerCase().includes('linear');
|
|
313
|
+
}
|
|
314
|
+
catch {
|
|
315
|
+
return false;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
// Register the Codex provider
|
|
319
|
+
registerCodexProvider(createCodexProvider);
|
|
320
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/lib/codex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GCP (Google Cloud Platform) utilities for detecting if running on a VM
|
|
3
|
+
* and for auto-stopping the instance when work is complete.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Detect if we're running inside a Google Cloud VM by querying the metadata server.
|
|
7
|
+
* The metadata server is only available from within GCP VMs and responds with
|
|
8
|
+
* `Metadata-Flavor: Google` header.
|
|
9
|
+
*/
|
|
10
|
+
export declare function isRunningOnGcp(): Promise<boolean>;
|
|
11
|
+
/**
|
|
12
|
+
* Stop the current GCP VM instance.
|
|
13
|
+
* This will shut down the VM, saving compute costs.
|
|
14
|
+
*
|
|
15
|
+
* Uses `gcloud compute instances stop` which is available on all GCP VMs.
|
|
16
|
+
* The VM must have IAM permissions to stop itself (compute.instances.stop).
|
|
17
|
+
*
|
|
18
|
+
* @returns true if stop command was issued successfully, false otherwise
|
|
19
|
+
*/
|
|
20
|
+
export declare function stopGcpInstance(): Promise<boolean>;
|
|
21
|
+
//# sourceMappingURL=gcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gcp.d.ts","sourceRoot":"","sources":["../../src/lib/gcp.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH;;;;GAIG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAgBvD;AAqCD;;;;;;;;GAQG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAyBxD"}
|
package/dist/lib/gcp.js
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GCP (Google Cloud Platform) utilities for detecting if running on a VM
|
|
3
|
+
* and for auto-stopping the instance when work is complete.
|
|
4
|
+
*/
|
|
5
|
+
import { execSync } from 'child_process';
|
|
6
|
+
const GCP_METADATA_URL = 'http://metadata.google.internal/computeMetadata/v1/';
|
|
7
|
+
const GCP_METADATA_FLAVOR = 'Metadata-Flavor: Google';
|
|
8
|
+
/**
|
|
9
|
+
* Detect if we're running inside a Google Cloud VM by querying the metadata server.
|
|
10
|
+
* The metadata server is only available from within GCP VMs and responds with
|
|
11
|
+
* `Metadata-Flavor: Google` header.
|
|
12
|
+
*/
|
|
13
|
+
export async function isRunningOnGcp() {
|
|
14
|
+
try {
|
|
15
|
+
// Use a short timeout since this should respond instantly if on GCP
|
|
16
|
+
const response = await fetch(GCP_METADATA_URL, {
|
|
17
|
+
method: 'GET',
|
|
18
|
+
headers: { 'Metadata-Flavor': 'Google' },
|
|
19
|
+
signal: AbortSignal.timeout(2000), // 2 second timeout
|
|
20
|
+
});
|
|
21
|
+
// Check for the GCP metadata flavor header in response
|
|
22
|
+
const flavor = response.headers.get('Metadata-Flavor');
|
|
23
|
+
return flavor === 'Google';
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// If fetch fails (timeout, network error, etc.), we're not on GCP
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get the current VM's instance name from GCP metadata.
|
|
32
|
+
*/
|
|
33
|
+
async function getInstanceName() {
|
|
34
|
+
try {
|
|
35
|
+
const response = await fetch(`${GCP_METADATA_URL}instance/name`, {
|
|
36
|
+
headers: { 'Metadata-Flavor': 'Google' },
|
|
37
|
+
signal: AbortSignal.timeout(2000),
|
|
38
|
+
});
|
|
39
|
+
if (!response.ok)
|
|
40
|
+
return null;
|
|
41
|
+
return (await response.text()).trim();
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get the current VM's zone from GCP metadata.
|
|
49
|
+
* Returns just the zone name (e.g., 'us-central1-a'), not the full path.
|
|
50
|
+
*/
|
|
51
|
+
async function getInstanceZone() {
|
|
52
|
+
try {
|
|
53
|
+
const response = await fetch(`${GCP_METADATA_URL}instance/zone`, {
|
|
54
|
+
headers: { 'Metadata-Flavor': 'Google' },
|
|
55
|
+
signal: AbortSignal.timeout(2000),
|
|
56
|
+
});
|
|
57
|
+
if (!response.ok)
|
|
58
|
+
return null;
|
|
59
|
+
// Response is like 'projects/123456/zones/us-central1-a'
|
|
60
|
+
const fullZone = (await response.text()).trim();
|
|
61
|
+
return fullZone.split('/').pop() || null;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Stop the current GCP VM instance.
|
|
69
|
+
* This will shut down the VM, saving compute costs.
|
|
70
|
+
*
|
|
71
|
+
* Uses `gcloud compute instances stop` which is available on all GCP VMs.
|
|
72
|
+
* The VM must have IAM permissions to stop itself (compute.instances.stop).
|
|
73
|
+
*
|
|
74
|
+
* @returns true if stop command was issued successfully, false otherwise
|
|
75
|
+
*/
|
|
76
|
+
export async function stopGcpInstance() {
|
|
77
|
+
try {
|
|
78
|
+
const instanceName = await getInstanceName();
|
|
79
|
+
const zone = await getInstanceZone();
|
|
80
|
+
if (!instanceName || !zone) {
|
|
81
|
+
console.error('GCP auto-stop: Could not determine instance name or zone');
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
console.log(`GCP auto-stop: Stopping instance ${instanceName} in zone ${zone}...`);
|
|
85
|
+
// Use gcloud to stop the instance
|
|
86
|
+
// --quiet suppresses confirmation prompts
|
|
87
|
+
// Running async so the process doesn't wait for the stop to complete
|
|
88
|
+
execSync(`gcloud compute instances stop "${instanceName}" --zone="${zone}" --quiet &`, { stdio: 'inherit', shell: '/bin/bash' });
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
console.error('GCP auto-stop: Failed to stop instance:', error);
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=gcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gcp.js","sourceRoot":"","sources":["../../src/lib/gcp.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,gBAAgB,GAAG,qDAAqD,CAAC;AAC/E,MAAM,mBAAmB,GAAG,yBAAyB,CAAC;AAEtD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,CAAC;QACH,oEAAoE;QACpE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,gBAAgB,EAAE;YAC7C,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,EAAE,iBAAiB,EAAE,QAAQ,EAAE;YACxC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,mBAAmB;SACvD,CAAC,CAAC;QAEH,uDAAuD;QACvD,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QACvD,OAAO,MAAM,KAAK,QAAQ,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,kEAAkE;QAClE,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,eAAe;IAC5B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,gBAAgB,eAAe,EAAE;YAC/D,OAAO,EAAE,EAAE,iBAAiB,EAAE,QAAQ,EAAE;YACxC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;SAClC,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAC9B,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,eAAe;IAC5B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,gBAAgB,eAAe,EAAE;YAC/D,OAAO,EAAE,EAAE,iBAAiB,EAAE,QAAQ,EAAE;YACxC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;SAClC,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAC9B,yDAAyD;QACzD,MAAM,QAAQ,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAChD,OAAO,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,MAAM,eAAe,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,MAAM,eAAe,EAAE,CAAC;QAErC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;YAC1E,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,oCAAoC,YAAY,YAAY,IAAI,KAAK,CAAC,CAAC;QAEnF,kCAAkC;QAClC,0CAA0C;QAC1C,qEAAqE;QACrE,QAAQ,CACN,kCAAkC,YAAY,aAAa,IAAI,aAAa,EAC5E,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,CACzC,CAAC;QAEF,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAC;QAChE,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/lib/git.ts"],"names":[],"mappings":"AAIA,wBAAgB,OAAO,IAAI,OAAO,CAQjC;AAGD,wBAAgB,gBAAgB,IAAI,MAAM,CAOzC"}
|
package/dist/lib/git.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { execSync } from 'child_process';
|
|
2
|
+
import { getConfig } from '../config.js';
|
|
3
|
+
// Pull latest changes from remote
|
|
4
|
+
export function gitPull() {
|
|
5
|
+
const config = getConfig();
|
|
6
|
+
try {
|
|
7
|
+
execSync('git pull origin main', { stdio: 'pipe', cwd: config.workingDirectory });
|
|
8
|
+
return true;
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
// Get current branch
|
|
15
|
+
export function getCurrentBranch() {
|
|
16
|
+
const config = getConfig();
|
|
17
|
+
try {
|
|
18
|
+
return execSync('git branch --show-current', { encoding: 'utf-8', cwd: config.workingDirectory }).trim();
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return 'unknown';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/lib/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,kCAAkC;AAClC,MAAM,UAAU,OAAO;IACrB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAI,CAAC;QACH,QAAQ,CAAC,sBAAsB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAClF,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,qBAAqB;AACrB,MAAM,UAAU,gBAAgB;IAC9B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,2BAA2B,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3G,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Horizon configuration wizard (`horizon config`).
|
|
3
|
+
* Shows all current values and allows user to change them with "Enter to keep" UX.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Main configuration wizard for `horizon config`.
|
|
7
|
+
*/
|
|
8
|
+
export declare function configProject(): Promise<void>;
|
|
9
|
+
/**
|
|
10
|
+
* Removes Horizon from the current project (`horizon uninstall`).
|
|
11
|
+
*/
|
|
12
|
+
export declare function uninstallProject(): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=init-project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-project.d.ts","sourceRoot":"","sources":["../../src/lib/init-project.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA6CH;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CA6SnD;AAED;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAsJtD"}
|