@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.
Files changed (157) hide show
  1. package/dist/cli.d.ts +3 -0
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +43 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/config.d.ts +10 -0
  6. package/dist/config.d.ts.map +1 -0
  7. package/dist/config.js +293 -0
  8. package/dist/config.js.map +1 -0
  9. package/dist/index.d.ts +4 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +635 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/lib/__tests__/attachment-downloader.test.d.ts +2 -0
  14. package/dist/lib/__tests__/attachment-downloader.test.d.ts.map +1 -0
  15. package/dist/lib/__tests__/attachment-downloader.test.js +163 -0
  16. package/dist/lib/__tests__/attachment-downloader.test.js.map +1 -0
  17. package/dist/lib/__tests__/cli-detection.test.d.ts +2 -0
  18. package/dist/lib/__tests__/cli-detection.test.d.ts.map +1 -0
  19. package/dist/lib/__tests__/cli-detection.test.js +119 -0
  20. package/dist/lib/__tests__/cli-detection.test.js.map +1 -0
  21. package/dist/lib/__tests__/config.test.d.ts +2 -0
  22. package/dist/lib/__tests__/config.test.d.ts.map +1 -0
  23. package/dist/lib/__tests__/config.test.js +291 -0
  24. package/dist/lib/__tests__/config.test.js.map +1 -0
  25. package/dist/lib/__tests__/gcp.test.d.ts +2 -0
  26. package/dist/lib/__tests__/gcp.test.d.ts.map +1 -0
  27. package/dist/lib/__tests__/gcp.test.js +104 -0
  28. package/dist/lib/__tests__/gcp.test.js.map +1 -0
  29. package/dist/lib/__tests__/git.test.d.ts +2 -0
  30. package/dist/lib/__tests__/git.test.d.ts.map +1 -0
  31. package/dist/lib/__tests__/git.test.js +62 -0
  32. package/dist/lib/__tests__/git.test.js.map +1 -0
  33. package/dist/lib/__tests__/linear-quick-check.test.d.ts +2 -0
  34. package/dist/lib/__tests__/linear-quick-check.test.d.ts.map +1 -0
  35. package/dist/lib/__tests__/linear-quick-check.test.js +152 -0
  36. package/dist/lib/__tests__/linear-quick-check.test.js.map +1 -0
  37. package/dist/lib/__tests__/loop-instance-name.test.d.ts +2 -0
  38. package/dist/lib/__tests__/loop-instance-name.test.d.ts.map +1 -0
  39. package/dist/lib/__tests__/loop-instance-name.test.js +90 -0
  40. package/dist/lib/__tests__/loop-instance-name.test.js.map +1 -0
  41. package/dist/lib/__tests__/output-logger.test.d.ts +2 -0
  42. package/dist/lib/__tests__/output-logger.test.d.ts.map +1 -0
  43. package/dist/lib/__tests__/output-logger.test.js +136 -0
  44. package/dist/lib/__tests__/output-logger.test.js.map +1 -0
  45. package/dist/lib/__tests__/prompts.test.d.ts +2 -0
  46. package/dist/lib/__tests__/prompts.test.d.ts.map +1 -0
  47. package/dist/lib/__tests__/prompts.test.js +70 -0
  48. package/dist/lib/__tests__/prompts.test.js.map +1 -0
  49. package/dist/lib/__tests__/provider.test.d.ts +2 -0
  50. package/dist/lib/__tests__/provider.test.d.ts.map +1 -0
  51. package/dist/lib/__tests__/provider.test.js +89 -0
  52. package/dist/lib/__tests__/provider.test.js.map +1 -0
  53. package/dist/lib/__tests__/rate-limit.test.d.ts +2 -0
  54. package/dist/lib/__tests__/rate-limit.test.d.ts.map +1 -0
  55. package/dist/lib/__tests__/rate-limit.test.js +275 -0
  56. package/dist/lib/__tests__/rate-limit.test.js.map +1 -0
  57. package/dist/lib/__tests__/readline.test.d.ts +2 -0
  58. package/dist/lib/__tests__/readline.test.d.ts.map +1 -0
  59. package/dist/lib/__tests__/readline.test.js +55 -0
  60. package/dist/lib/__tests__/readline.test.js.map +1 -0
  61. package/dist/lib/__tests__/stats-logger.test.d.ts +2 -0
  62. package/dist/lib/__tests__/stats-logger.test.d.ts.map +1 -0
  63. package/dist/lib/__tests__/stats-logger.test.js +297 -0
  64. package/dist/lib/__tests__/stats-logger.test.js.map +1 -0
  65. package/dist/lib/__tests__/update-checker.test.d.ts +2 -0
  66. package/dist/lib/__tests__/update-checker.test.d.ts.map +1 -0
  67. package/dist/lib/__tests__/update-checker.test.js +141 -0
  68. package/dist/lib/__tests__/update-checker.test.js.map +1 -0
  69. package/dist/lib/__tests__/version.test.d.ts +2 -0
  70. package/dist/lib/__tests__/version.test.d.ts.map +1 -0
  71. package/dist/lib/__tests__/version.test.js +51 -0
  72. package/dist/lib/__tests__/version.test.js.map +1 -0
  73. package/dist/lib/attachment-downloader.d.ts +26 -0
  74. package/dist/lib/attachment-downloader.d.ts.map +1 -0
  75. package/dist/lib/attachment-downloader.js +259 -0
  76. package/dist/lib/attachment-downloader.js.map +1 -0
  77. package/dist/lib/claude.d.ts +6 -0
  78. package/dist/lib/claude.d.ts.map +1 -0
  79. package/dist/lib/claude.js +459 -0
  80. package/dist/lib/claude.js.map +1 -0
  81. package/dist/lib/cli-detection.d.ts +25 -0
  82. package/dist/lib/cli-detection.d.ts.map +1 -0
  83. package/dist/lib/cli-detection.js +53 -0
  84. package/dist/lib/cli-detection.js.map +1 -0
  85. package/dist/lib/codex.d.ts +4 -0
  86. package/dist/lib/codex.d.ts.map +1 -0
  87. package/dist/lib/codex.js +320 -0
  88. package/dist/lib/codex.js.map +1 -0
  89. package/dist/lib/gcp.d.ts +21 -0
  90. package/dist/lib/gcp.d.ts.map +1 -0
  91. package/dist/lib/gcp.js +96 -0
  92. package/dist/lib/gcp.js.map +1 -0
  93. package/dist/lib/git.d.ts +3 -0
  94. package/dist/lib/git.d.ts.map +1 -0
  95. package/dist/lib/git.js +24 -0
  96. package/dist/lib/git.js.map +1 -0
  97. package/dist/lib/init-project.d.ts +13 -0
  98. package/dist/lib/init-project.d.ts.map +1 -0
  99. package/dist/lib/init-project.js +420 -0
  100. package/dist/lib/init-project.js.map +1 -0
  101. package/dist/lib/linear-api.d.ts +32 -0
  102. package/dist/lib/linear-api.d.ts.map +1 -0
  103. package/dist/lib/linear-api.js +267 -0
  104. package/dist/lib/linear-api.js.map +1 -0
  105. package/dist/lib/linear-quick-check.d.ts +13 -0
  106. package/dist/lib/linear-quick-check.d.ts.map +1 -0
  107. package/dist/lib/linear-quick-check.js +61 -0
  108. package/dist/lib/linear-quick-check.js.map +1 -0
  109. package/dist/lib/loop-instance-name.d.ts +29 -0
  110. package/dist/lib/loop-instance-name.d.ts.map +1 -0
  111. package/dist/lib/loop-instance-name.js +105 -0
  112. package/dist/lib/loop-instance-name.js.map +1 -0
  113. package/dist/lib/output-logger.d.ts +23 -0
  114. package/dist/lib/output-logger.d.ts.map +1 -0
  115. package/dist/lib/output-logger.js +104 -0
  116. package/dist/lib/output-logger.js.map +1 -0
  117. package/dist/lib/prompts.d.ts +17 -0
  118. package/dist/lib/prompts.d.ts.map +1 -0
  119. package/dist/lib/prompts.js +65 -0
  120. package/dist/lib/prompts.js.map +1 -0
  121. package/dist/lib/provider.d.ts +32 -0
  122. package/dist/lib/provider.d.ts.map +1 -0
  123. package/dist/lib/provider.js +27 -0
  124. package/dist/lib/provider.js.map +1 -0
  125. package/dist/lib/rate-limit.d.ts +14 -0
  126. package/dist/lib/rate-limit.d.ts.map +1 -0
  127. package/dist/lib/rate-limit.js +154 -0
  128. package/dist/lib/rate-limit.js.map +1 -0
  129. package/dist/lib/readline.d.ts +4 -0
  130. package/dist/lib/readline.d.ts.map +1 -0
  131. package/dist/lib/readline.js +39 -0
  132. package/dist/lib/readline.js.map +1 -0
  133. package/dist/lib/setup.d.ts +126 -0
  134. package/dist/lib/setup.d.ts.map +1 -0
  135. package/dist/lib/setup.js +482 -0
  136. package/dist/lib/setup.js.map +1 -0
  137. package/dist/lib/stats-logger.d.ts +92 -0
  138. package/dist/lib/stats-logger.d.ts.map +1 -0
  139. package/dist/lib/stats-logger.js +258 -0
  140. package/dist/lib/stats-logger.js.map +1 -0
  141. package/dist/lib/ui.d.ts +38 -0
  142. package/dist/lib/ui.d.ts.map +1 -0
  143. package/dist/lib/ui.js +69 -0
  144. package/dist/lib/ui.js.map +1 -0
  145. package/dist/lib/update-checker.d.ts +17 -0
  146. package/dist/lib/update-checker.d.ts.map +1 -0
  147. package/dist/lib/update-checker.js +138 -0
  148. package/dist/lib/update-checker.js.map +1 -0
  149. package/dist/lib/version.d.ts +10 -0
  150. package/dist/lib/version.d.ts.map +1 -0
  151. package/dist/lib/version.js +37 -0
  152. package/dist/lib/version.js.map +1 -0
  153. package/dist/types.d.ts +92 -0
  154. package/dist/types.d.ts.map +1 -0
  155. package/dist/types.js +3 -0
  156. package/dist/types.js.map +1 -0
  157. 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"}
@@ -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":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function gitPull(): boolean;
2
+ export declare function getCurrentBranch(): string;
3
+ //# sourceMappingURL=git.d.ts.map
@@ -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"}
@@ -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"}