eniac-slack 0.1.12 → 0.1.13
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/CHANGELOG.md +5 -0
- package/dist/services/claude.d.ts.map +1 -1
- package/dist/services/claude.js +14 -27
- package/dist/services/claude.js.map +1 -1
- package/dist/utils/slack-files.d.ts.map +1 -1
- package/dist/utils/slack-files.js +32 -4
- package/dist/utils/slack-files.js.map +1 -1
- package/package.json +3 -1
- package/src/services/claude.ts +16 -31
- package/src/utils/slack-files.ts +34 -4
package/CHANGELOG.md
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/services/claude.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/services/claude.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAK9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,UAAU,OAAO;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAuJvC;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CASzE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAExE;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,GACnB,OAAO,CAaT;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAEhE;AAkBD;;;;;GAKG;AACH,wBAAuB,IAAI,CACzB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,SAAS,EACtB,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,cAAc,EAAE,GACxB,cAAc,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CA4L1C"}
|
package/dist/services/claude.js
CHANGED
|
@@ -233,39 +233,26 @@ export async function* chat(threadTs, userMessage, slackClient, channel, images)
|
|
|
233
233
|
session.lastActivityAt = Date.now();
|
|
234
234
|
saveSessions();
|
|
235
235
|
console.log(`[claude] starting query, cwd=${session.workDir}, hasStarted=${session.hasStarted}`);
|
|
236
|
-
//
|
|
237
|
-
let
|
|
236
|
+
// Save normalized images to disk for Claude to read
|
|
237
|
+
let prompt = userMessage;
|
|
238
238
|
if (images && images.length > 0) {
|
|
239
|
-
const
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
},
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
content.push({ type: "text", text: userMessage });
|
|
251
|
-
async function* imagePrompt() {
|
|
252
|
-
yield {
|
|
253
|
-
type: "user",
|
|
254
|
-
message: { role: "user", content },
|
|
255
|
-
parent_tool_use_id: null,
|
|
256
|
-
session_id: session.sessionId,
|
|
257
|
-
};
|
|
239
|
+
const imgDir = path.join(session.workDir, ".eniac-images");
|
|
240
|
+
fs.mkdirSync(imgDir, { recursive: true });
|
|
241
|
+
const imagePaths = [];
|
|
242
|
+
for (let i = 0; i < images.length; i++) {
|
|
243
|
+
const ext = images[i].mediaType.split("/")[1] ?? "png";
|
|
244
|
+
const imgPath = path.join(imgDir, `img-${Date.now()}-${i}.${ext}`);
|
|
245
|
+
fs.writeFileSync(imgPath, Buffer.from(images[i].base64, "base64"));
|
|
246
|
+
imagePaths.push(imgPath);
|
|
258
247
|
}
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
else {
|
|
263
|
-
queryPrompt = userMessage;
|
|
248
|
+
const fileList = imagePaths.map((p) => `- ${p}`).join("\n");
|
|
249
|
+
prompt = `사용자가 이미지를 첨부했습니다. Read 도구로 아래 이미지 파일을 읽어서 분석해주세요:\n${fileList}\n\n${userMessage}`;
|
|
250
|
+
console.log(`[claude] saved ${imagePaths.length} normalized image(s) to ${imgDir}`);
|
|
264
251
|
}
|
|
265
252
|
let receivedSuccessResult = false;
|
|
266
253
|
try {
|
|
267
254
|
const q = query({
|
|
268
|
-
prompt
|
|
255
|
+
prompt,
|
|
269
256
|
options: {
|
|
270
257
|
cwd: session.workDir,
|
|
271
258
|
canUseTool,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/services/claude.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/services/claude.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slack-files.d.ts","sourceRoot":"","sources":["../../src/utils/slack-files.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"slack-files.d.ts","sourceRoot":"","sources":["../../src/utils/slack-files.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,YAAY,GAAG,WAAW,GAAG,WAAW,GAAG,YAAY,CAAC;CACpE;AA8CD;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,KAAK,CAAC;IAAE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GACvF,OAAO,CAAC,cAAc,EAAE,CAAC,CAkD3B"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import sharp from "sharp";
|
|
1
2
|
const SUPPORTED_TYPES = new Set([
|
|
2
3
|
"image/jpeg",
|
|
3
4
|
"image/png",
|
|
@@ -24,6 +25,21 @@ function isValidImage(buf, expectedMime) {
|
|
|
24
25
|
return false;
|
|
25
26
|
}
|
|
26
27
|
}
|
|
28
|
+
const MAX_IMAGE_DIMENSION = 1568; // Claude API recommended max
|
|
29
|
+
/**
|
|
30
|
+
* Normalize an image buffer: resize to max dimensions and re-encode as PNG.
|
|
31
|
+
* This fixes issues with exotic color spaces, corrupted chunks, and oversized images.
|
|
32
|
+
*/
|
|
33
|
+
async function normalizeImage(buf) {
|
|
34
|
+
const normalized = await sharp(buf)
|
|
35
|
+
.resize(MAX_IMAGE_DIMENSION, MAX_IMAGE_DIMENSION, {
|
|
36
|
+
fit: "inside",
|
|
37
|
+
withoutEnlargement: true,
|
|
38
|
+
})
|
|
39
|
+
.png()
|
|
40
|
+
.toBuffer();
|
|
41
|
+
return { data: normalized, mediaType: "image/png" };
|
|
42
|
+
}
|
|
27
43
|
/**
|
|
28
44
|
* Download image files from a Slack message's `files` array.
|
|
29
45
|
*
|
|
@@ -54,10 +70,22 @@ export async function downloadSlackImages(client, files) {
|
|
|
54
70
|
console.warn(`[slack-files] downloaded data is not a valid ${mime} image (${buf.length} bytes), skipping`);
|
|
55
71
|
continue;
|
|
56
72
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
mediaType
|
|
60
|
-
|
|
73
|
+
// Normalize: resize + re-encode to fix exotic formats and oversized images
|
|
74
|
+
try {
|
|
75
|
+
const { data, mediaType } = await normalizeImage(buf);
|
|
76
|
+
console.log(`[slack-files] normalized image: ${buf.length} → ${data.length} bytes`);
|
|
77
|
+
results.push({
|
|
78
|
+
base64: data.toString("base64"),
|
|
79
|
+
mediaType,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
catch (normErr) {
|
|
83
|
+
console.warn(`[slack-files] failed to normalize image, using raw:`, normErr);
|
|
84
|
+
results.push({
|
|
85
|
+
base64: buf.toString("base64"),
|
|
86
|
+
mediaType: mime,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
61
89
|
}
|
|
62
90
|
catch (err) {
|
|
63
91
|
console.warn(`[slack-files] error downloading file:`, err);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slack-files.js","sourceRoot":"","sources":["../../src/utils/slack-files.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"slack-files.js","sourceRoot":"","sources":["../../src/utils/slack-files.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eniac-slack",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.13",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": "./dist/cli.js",
|
|
6
6
|
"scripts": {
|
|
@@ -12,10 +12,12 @@
|
|
|
12
12
|
"@anthropic-ai/claude-agent-sdk": "^0.2.72",
|
|
13
13
|
"@slack/bolt": "^4.1.0",
|
|
14
14
|
"dotenv": "^16.4.0",
|
|
15
|
+
"sharp": "^0.34.5",
|
|
15
16
|
"simple-git": "^3.27.0"
|
|
16
17
|
},
|
|
17
18
|
"devDependencies": {
|
|
18
19
|
"@types/node": "^22.0.0",
|
|
20
|
+
"@types/sharp": "^0.32.0",
|
|
19
21
|
"tsx": "^4.19.0",
|
|
20
22
|
"typescript": "^5.9.3"
|
|
21
23
|
}
|
package/src/services/claude.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { query } from "@anthropic-ai/claude-agent-sdk";
|
|
2
2
|
import type {
|
|
3
3
|
SDKMessage,
|
|
4
|
-
SDKUserMessage,
|
|
5
4
|
CanUseTool,
|
|
6
5
|
PermissionResult,
|
|
7
6
|
McpServerConfig,
|
|
@@ -325,44 +324,30 @@ export async function* chat(
|
|
|
325
324
|
|
|
326
325
|
console.log(`[claude] starting query, cwd=${session.workDir}, hasStarted=${session.hasStarted}`);
|
|
327
326
|
|
|
328
|
-
//
|
|
329
|
-
let
|
|
327
|
+
// Save normalized images to disk for Claude to read
|
|
328
|
+
let prompt = userMessage;
|
|
330
329
|
if (images && images.length > 0) {
|
|
331
|
-
const
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
for (
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
media_type: img.mediaType,
|
|
341
|
-
data: img.base64,
|
|
342
|
-
},
|
|
343
|
-
});
|
|
344
|
-
}
|
|
345
|
-
content.push({ type: "text", text: userMessage });
|
|
346
|
-
|
|
347
|
-
async function* imagePrompt(): AsyncGenerator<SDKUserMessage> {
|
|
348
|
-
yield {
|
|
349
|
-
type: "user",
|
|
350
|
-
message: { role: "user", content },
|
|
351
|
-
parent_tool_use_id: null,
|
|
352
|
-
session_id: session!.sessionId,
|
|
353
|
-
};
|
|
330
|
+
const imgDir = path.join(session.workDir, ".eniac-images");
|
|
331
|
+
fs.mkdirSync(imgDir, { recursive: true });
|
|
332
|
+
|
|
333
|
+
const imagePaths: string[] = [];
|
|
334
|
+
for (let i = 0; i < images.length; i++) {
|
|
335
|
+
const ext = images[i]!.mediaType.split("/")[1] ?? "png";
|
|
336
|
+
const imgPath = path.join(imgDir, `img-${Date.now()}-${i}.${ext}`);
|
|
337
|
+
fs.writeFileSync(imgPath, Buffer.from(images[i]!.base64, "base64"));
|
|
338
|
+
imagePaths.push(imgPath);
|
|
354
339
|
}
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
340
|
+
|
|
341
|
+
const fileList = imagePaths.map((p) => `- ${p}`).join("\n");
|
|
342
|
+
prompt = `사용자가 이미지를 첨부했습니다. Read 도구로 아래 이미지 파일을 읽어서 분석해주세요:\n${fileList}\n\n${userMessage}`;
|
|
343
|
+
console.log(`[claude] saved ${imagePaths.length} normalized image(s) to ${imgDir}`);
|
|
359
344
|
}
|
|
360
345
|
|
|
361
346
|
let receivedSuccessResult = false;
|
|
362
347
|
|
|
363
348
|
try {
|
|
364
349
|
const q = query({
|
|
365
|
-
prompt
|
|
350
|
+
prompt,
|
|
366
351
|
options: {
|
|
367
352
|
cwd: session.workDir,
|
|
368
353
|
canUseTool,
|
package/src/utils/slack-files.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { WebClient } from "@slack/web-api";
|
|
2
|
+
import sharp from "sharp";
|
|
2
3
|
|
|
3
4
|
export interface SlackImageFile {
|
|
4
5
|
base64: string;
|
|
@@ -32,6 +33,23 @@ function isValidImage(buf: Buffer, expectedMime: string): boolean {
|
|
|
32
33
|
}
|
|
33
34
|
}
|
|
34
35
|
|
|
36
|
+
const MAX_IMAGE_DIMENSION = 1568; // Claude API recommended max
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Normalize an image buffer: resize to max dimensions and re-encode as PNG.
|
|
40
|
+
* This fixes issues with exotic color spaces, corrupted chunks, and oversized images.
|
|
41
|
+
*/
|
|
42
|
+
async function normalizeImage(buf: Buffer): Promise<{ data: Buffer; mediaType: SlackImageFile["mediaType"] }> {
|
|
43
|
+
const normalized = await sharp(buf)
|
|
44
|
+
.resize(MAX_IMAGE_DIMENSION, MAX_IMAGE_DIMENSION, {
|
|
45
|
+
fit: "inside",
|
|
46
|
+
withoutEnlargement: true,
|
|
47
|
+
})
|
|
48
|
+
.png()
|
|
49
|
+
.toBuffer();
|
|
50
|
+
return { data: normalized, mediaType: "image/png" };
|
|
51
|
+
}
|
|
52
|
+
|
|
35
53
|
/**
|
|
36
54
|
* Download image files from a Slack message's `files` array.
|
|
37
55
|
*
|
|
@@ -68,10 +86,22 @@ export async function downloadSlackImages(
|
|
|
68
86
|
console.warn(`[slack-files] downloaded data is not a valid ${mime} image (${buf.length} bytes), skipping`);
|
|
69
87
|
continue;
|
|
70
88
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
89
|
+
|
|
90
|
+
// Normalize: resize + re-encode to fix exotic formats and oversized images
|
|
91
|
+
try {
|
|
92
|
+
const { data, mediaType } = await normalizeImage(buf);
|
|
93
|
+
console.log(`[slack-files] normalized image: ${buf.length} → ${data.length} bytes`);
|
|
94
|
+
results.push({
|
|
95
|
+
base64: data.toString("base64"),
|
|
96
|
+
mediaType,
|
|
97
|
+
});
|
|
98
|
+
} catch (normErr) {
|
|
99
|
+
console.warn(`[slack-files] failed to normalize image, using raw:`, normErr);
|
|
100
|
+
results.push({
|
|
101
|
+
base64: buf.toString("base64"),
|
|
102
|
+
mediaType: mime as SlackImageFile["mediaType"],
|
|
103
|
+
});
|
|
104
|
+
}
|
|
75
105
|
} catch (err) {
|
|
76
106
|
console.warn(`[slack-files] error downloading file:`, err);
|
|
77
107
|
}
|