@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,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: 
|
|
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., )
|
|
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: 
|
|
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"}
|