@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,259 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import { getRepoRoot } from '../config.js';
4
+ // Pattern to match Linear upload URLs in markdown content
5
+ const LINEAR_UPLOAD_PATTERN = /https:\/\/uploads\.linear\.app\/[^\s\)\]"'<>]+/g;
6
+ // Pattern to match markdown image syntax with alt text: ![alt text](url)
7
+ const MARKDOWN_IMAGE_PATTERN = /!\[([^\]]*)\]\((https:\/\/uploads\.linear\.app\/[^\s\)]+)\)/g;
8
+ // Pattern to match markdown link syntax with link text: [link text](url)
9
+ const MARKDOWN_LINK_PATTERN = /\[([^\]]+)\]\((https:\/\/uploads\.linear\.app\/[^\s\)]+)\)/g;
10
+ // Size limit warning threshold (10MB)
11
+ const SIZE_WARNING_THRESHOLD = 10 * 1024 * 1024;
12
+ // Map Content-Type to file extension
13
+ const CONTENT_TYPE_TO_EXT = {
14
+ 'image/png': '.png',
15
+ 'image/jpeg': '.jpg',
16
+ 'image/jpg': '.jpg',
17
+ 'image/gif': '.gif',
18
+ 'image/webp': '.webp',
19
+ 'image/svg+xml': '.svg',
20
+ 'application/pdf': '.pdf',
21
+ 'text/plain': '.txt',
22
+ 'application/json': '.json',
23
+ 'application/zip': '.zip',
24
+ };
25
+ /**
26
+ * Extracts Linear upload URLs from markdown content (descriptions, comments, etc.)
27
+ * Preserves original filenames from markdown alt text (e.g., ![image.png](url))
28
+ */
29
+ export function extractLinearUrls(markdown) {
30
+ const seen = new Set();
31
+ const attachments = [];
32
+ // First, extract images with alt text (which contains the original filename)
33
+ // This gives us the best filename info: ![Screenshot 2026-01-27.png](url)
34
+ const imageMatches = [...markdown.matchAll(MARKDOWN_IMAGE_PATTERN)];
35
+ for (const match of imageMatches) {
36
+ const [, altText, url] = match;
37
+ if (seen.has(url))
38
+ continue;
39
+ seen.add(url);
40
+ // Use alt text as filename if it looks like a filename (has extension)
41
+ const filename = hasFileExtension(altText) ? altText : getFilenameFromUrl(url);
42
+ // Generate a unique ID from URL hash
43
+ const id = Buffer.from(url).toString('base64').slice(0, 12);
44
+ attachments.push({
45
+ id,
46
+ url,
47
+ filename: decodeURIComponent(filename),
48
+ source: 'embedded',
49
+ });
50
+ }
51
+ // Then extract markdown links: [filename.md](url)
52
+ const linkMatches = [...markdown.matchAll(MARKDOWN_LINK_PATTERN)];
53
+ for (const match of linkMatches) {
54
+ const [, linkText, url] = match;
55
+ if (seen.has(url))
56
+ continue;
57
+ seen.add(url);
58
+ // Use link text as filename if it looks like a filename (has extension)
59
+ const filename = hasFileExtension(linkText) ? linkText : getFilenameFromUrl(url);
60
+ const id = Buffer.from(url).toString('base64').slice(0, 12);
61
+ attachments.push({
62
+ id,
63
+ url,
64
+ filename: decodeURIComponent(filename),
65
+ source: 'embedded',
66
+ });
67
+ }
68
+ // Finally extract any standalone URLs that weren't in markdown syntax
69
+ const urls = markdown.match(LINEAR_UPLOAD_PATTERN) || [];
70
+ for (const url of urls) {
71
+ if (seen.has(url))
72
+ continue;
73
+ seen.add(url);
74
+ const filename = getFilenameFromUrl(url);
75
+ const id = Buffer.from(url).toString('base64').slice(0, 12);
76
+ attachments.push({
77
+ id,
78
+ url,
79
+ filename: decodeURIComponent(filename),
80
+ source: 'embedded',
81
+ });
82
+ }
83
+ return attachments;
84
+ }
85
+ /**
86
+ * Checks if a string looks like a filename (has a file extension)
87
+ */
88
+ function hasFileExtension(text) {
89
+ return /\.\w{2,5}$/.test(text.trim());
90
+ }
91
+ /**
92
+ * Extracts filename from URL path (fallback when no alt text available)
93
+ */
94
+ function getFilenameFromUrl(url) {
95
+ const urlPath = new URL(url).pathname;
96
+ const segments = urlPath.split('/');
97
+ return segments[segments.length - 1] || 'attachment';
98
+ }
99
+ /**
100
+ * Parses attachment metadata from Agent 1's output.
101
+ * Looks for the Attachments section and extracts Linear upload URLs.
102
+ */
103
+ export function parseAgent1Attachments(agent1Output) {
104
+ // First extract any URLs from the entire output (embedded images in description)
105
+ const allUrls = extractLinearUrls(agent1Output);
106
+ // Also look for explicit attachment section
107
+ // Agent 1 outputs attachments like:
108
+ // ### Attachments
109
+ // - Screenshot: https://uploads.linear.app/...
110
+ const attachmentSection = agent1Output.match(/### Attachments\n([\s\S]*?)(?=\n###|\n---|\n##|$)/);
111
+ if (attachmentSection) {
112
+ const sectionUrls = extractLinearUrls(attachmentSection[1]);
113
+ // Mark these as explicit attachments
114
+ for (const att of sectionUrls) {
115
+ const existing = allUrls.find(a => a.url === att.url);
116
+ if (existing) {
117
+ existing.source = 'attachment';
118
+ }
119
+ else {
120
+ att.source = 'attachment';
121
+ allUrls.push(att);
122
+ }
123
+ }
124
+ }
125
+ return allUrls;
126
+ }
127
+ /**
128
+ * Ensures the attachment directory exists for a given issue
129
+ */
130
+ export function ensureAttachmentDir(issueIdentifier) {
131
+ const attachmentsDir = path.join(getRepoRoot(), '.horizon', 'attachments', issueIdentifier);
132
+ if (!fs.existsSync(attachmentsDir)) {
133
+ fs.mkdirSync(attachmentsDir, { recursive: true });
134
+ }
135
+ return attachmentsDir;
136
+ }
137
+ /**
138
+ * Sanitizes a filename for safe filesystem use
139
+ */
140
+ function sanitizeFilename(filename) {
141
+ // Remove or replace problematic characters
142
+ return filename
143
+ .replace(/[<>:"/\\|?*]/g, '-')
144
+ .replace(/\s+/g, '-')
145
+ .replace(/-+/g, '-')
146
+ .slice(0, 200); // Limit length
147
+ }
148
+ /**
149
+ * Gets file extension from Content-Type header
150
+ */
151
+ function getExtensionFromContentType(contentType) {
152
+ if (!contentType)
153
+ return null;
154
+ // Content-Type can include charset, e.g., "image/png; charset=utf-8"
155
+ const mimeType = contentType.split(';')[0].trim().toLowerCase();
156
+ return CONTENT_TYPE_TO_EXT[mimeType] || null;
157
+ }
158
+ /**
159
+ * Ensures a filename has an extension, inferring from Content-Type if needed
160
+ */
161
+ function ensureFileExtension(filename, contentType) {
162
+ if (hasFileExtension(filename)) {
163
+ return filename;
164
+ }
165
+ const ext = getExtensionFromContentType(contentType);
166
+ return ext ? `${filename}${ext}` : filename;
167
+ }
168
+ /**
169
+ * Downloads a single attachment from Linear
170
+ */
171
+ async function downloadAttachment(_apiKey, attachment, outputDir) {
172
+ try {
173
+ // Linear attachment URLs are pre-signed with ?signature= query parameters
174
+ // No Authorization header needed - the signature provides access
175
+ const response = await fetch(attachment.url);
176
+ if (!response.ok) {
177
+ return {
178
+ success: false,
179
+ error: `HTTP ${response.status}: ${response.statusText}`,
180
+ };
181
+ }
182
+ // Check content length for warning
183
+ const contentLength = response.headers.get('content-length');
184
+ if (contentLength && parseInt(contentLength, 10) > SIZE_WARNING_THRESHOLD) {
185
+ console.log(` Warning: Large file (${Math.round(parseInt(contentLength, 10) / 1024 / 1024)}MB): ${attachment.filename}`);
186
+ }
187
+ const buffer = await response.arrayBuffer();
188
+ // Ensure filename has extension (use Content-Type as fallback)
189
+ const contentType = response.headers.get('content-type');
190
+ const filenameWithExt = ensureFileExtension(attachment.filename, contentType);
191
+ const sanitizedFilename = sanitizeFilename(filenameWithExt);
192
+ const localPath = path.join(outputDir, sanitizedFilename);
193
+ fs.writeFileSync(localPath, Buffer.from(buffer));
194
+ return { success: true, localPath };
195
+ }
196
+ catch (error) {
197
+ const message = error instanceof Error ? error.message : String(error);
198
+ return { success: false, error: message };
199
+ }
200
+ }
201
+ /**
202
+ * Downloads all attachments for an issue.
203
+ * Returns the local file paths for successfully downloaded files.
204
+ */
205
+ export async function downloadIssueAttachments(apiKey, issueIdentifier, attachments) {
206
+ if (attachments.length === 0) {
207
+ return { success: true, attachments: [], errors: [] };
208
+ }
209
+ console.log(`Downloading ${attachments.length} attachment(s) for ${issueIdentifier}...`);
210
+ const outputDir = ensureAttachmentDir(issueIdentifier);
211
+ const downloaded = [];
212
+ const errors = [];
213
+ for (const attachment of attachments) {
214
+ console.log(` Downloading: ${attachment.filename}`);
215
+ const result = await downloadAttachment(apiKey, attachment, outputDir);
216
+ if (result.success && result.localPath) {
217
+ downloaded.push({
218
+ originalUrl: attachment.url,
219
+ localPath: result.localPath,
220
+ filename: attachment.filename,
221
+ });
222
+ console.log(` ✓ Saved to ${result.localPath}`);
223
+ }
224
+ else {
225
+ const errorMsg = `Failed to download ${attachment.filename}: ${result.error}`;
226
+ errors.push(errorMsg);
227
+ console.log(` ✗ ${result.error}`);
228
+ }
229
+ }
230
+ console.log(` Downloaded ${downloaded.length}/${attachments.length} files`);
231
+ return {
232
+ success: errors.length === 0,
233
+ attachments: downloaded,
234
+ errors,
235
+ };
236
+ }
237
+ /**
238
+ * Main entry point: Downloads attachments from Agent 1's output.
239
+ * Returns an array of local file paths that Agent 2 can read.
240
+ */
241
+ export async function downloadAttachmentsFromAgent1Output(apiKey, agent1Output, issueIdentifier) {
242
+ // Parse attachments from Agent 1's output
243
+ const attachments = parseAgent1Attachments(agent1Output);
244
+ if (attachments.length === 0) {
245
+ return [];
246
+ }
247
+ // Download all attachments
248
+ const result = await downloadIssueAttachments(apiKey, issueIdentifier, attachments);
249
+ // Log any errors but don't crash
250
+ if (result.errors.length > 0) {
251
+ console.log(' Some attachments failed to download:');
252
+ for (const error of result.errors) {
253
+ console.log(` - ${error}`);
254
+ }
255
+ }
256
+ // Return the local file paths
257
+ return result.attachments.map(a => a.localPath);
258
+ }
259
+ //# sourceMappingURL=attachment-downloader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment-downloader.js","sourceRoot":"","sources":["../../src/lib/attachment-downloader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { ClaudeResult, ClaudeOptions } from '../types.js';
2
+ import { LLMProvider } from './provider.js';
3
+ export declare function spawnClaude(options: ClaudeOptions, agentNumber?: number): Promise<ClaudeResult>;
4
+ export declare function extractFinalOutput(streamOutput: string): string;
5
+ export declare function createClaudeProvider(): LLMProvider;
6
+ //# sourceMappingURL=claude.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/lib/claude.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAe,MAAM,aAAa,CAAC;AAIvE,OAAO,EAAE,WAAW,EAA2D,MAAM,eAAe,CAAC;AA8RrG,wBAAsB,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAiIrG;AAGD,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAgC/D;AAqDD,wBAAgB,oBAAoB,IAAI,WAAW,CAElD"}