eniac-slack 0.1.38 → 0.1.40
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 +12 -0
- package/SPEC.md +82 -16
- package/dist/handlers/mention.d.ts.map +1 -1
- package/dist/handlers/mention.js +2 -0
- package/dist/handlers/mention.js.map +1 -1
- package/dist/services/claude.d.ts.map +1 -1
- package/dist/services/claude.js +71 -47
- package/dist/services/claude.js.map +1 -1
- package/dist/services/stats.d.ts +46 -0
- package/dist/services/stats.d.ts.map +1 -0
- package/dist/services/stats.js +106 -0
- package/dist/services/stats.js.map +1 -0
- package/dist/services/usage.d.ts.map +1 -1
- package/dist/services/usage.js +24 -2
- package/dist/services/usage.js.map +1 -1
- package/package.json +1 -1
- package/src/handlers/mention.ts +2 -0
- package/src/services/claude.ts +91 -49
- package/src/services/stats.ts +168 -0
- package/src/services/usage.ts +27 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.1.40] - 2026-03-14
|
|
4
|
+
|
|
5
|
+
- feat(slack): 시스템 프롬프트 경량화로 토큰 최적화 (#45)
|
|
6
|
+
- feat(slack): MCP 서버 키워드 기반 선별 로딩 (#44)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
## [0.1.39] - 2026-03-14
|
|
10
|
+
|
|
11
|
+
- feat(slack): 프로젝트별/세션별 도구 사용량 통계 수집
|
|
12
|
+
- docs: README.md, SPEC.md 최신 코드베이스 기준 업데이트 (#42)
|
|
13
|
+
|
|
14
|
+
|
|
3
15
|
## [0.1.38] - 2026-03-13
|
|
4
16
|
|
|
5
17
|
- feat(slack): 사용량 조회 명령어 추가 (#41)
|
package/SPEC.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
## Overview
|
|
4
4
|
|
|
5
|
-
Slack 소켓모드 봇으로, 멘션을 통해 Claude Code 세션을 시작하고 스레드 단위로 대화를 이어갈 수 있다. GitHub 레포지토리
|
|
5
|
+
Slack 소켓모드 봇으로, 멘션을 통해 Claude Code 세션을 시작하고 스레드 단위로 대화를 이어갈 수 있다. GitHub 레포지토리 연동, 레포 자동 생성, 도구 실행 권한 승인, 이미지 분석, MCP 서버 연동을 지원한다.
|
|
6
6
|
|
|
7
7
|
## Architecture
|
|
8
8
|
|
|
@@ -42,8 +42,10 @@ Slack 소켓모드 봇으로, 멘션을 통해 Claude Code 세션을 시작하
|
|
|
42
42
|
|
|
43
43
|
- `.env` 로드 (실행 디렉토리 및 상위 디렉토리)
|
|
44
44
|
- 필수 환경변수 검증: `SLACK_BOT_TOKEN`, `SLACK_APP_TOKEN`
|
|
45
|
-
- `REPOS_BASE_DIR` (
|
|
45
|
+
- 선택 환경변수: `REPOS_BASE_DIR` (기본: `~/.eniac/repos`), `GITHUB_TOKEN`, `SLACK_USER_TOKEN`
|
|
46
46
|
- Bolt 앱 시작
|
|
47
|
+
- EPIPE 에러 핸들링 (Claude Agent SDK 서브프로세스 비정상 종료 대응)
|
|
48
|
+
- **자동 업데이트:** npm 레지스트리에서 10분 간격으로 새 버전 확인, 새 버전 발견 시 `process.exit(0)` (프로세스 매니저가 재시작)
|
|
47
49
|
|
|
48
50
|
### `app.ts` — Slack Bolt App
|
|
49
51
|
|
|
@@ -54,30 +56,61 @@ Slack 소켓모드 봇으로, 멘션을 통해 Claude Code 세션을 시작하
|
|
|
54
56
|
- 액션 등록:
|
|
55
57
|
- `approve_permission` → 도구 실행 승인
|
|
56
58
|
- `deny_permission` → 도구 실행 거부
|
|
59
|
+
- `create_repo_private` → 비공개 레포 생성 후 세션 시작
|
|
60
|
+
- `create_repo_public` → 공개 레포 생성 후 세션 시작
|
|
61
|
+
- `skip_repo` → 레포 없이 세션 시작
|
|
62
|
+
- `GITHUB_TOKEN` 전달 시 `setGithubToken()` 호출
|
|
63
|
+
- `SLACK_USER_TOKEN` 전달 시 `initUserClient()` 호출
|
|
57
64
|
|
|
58
65
|
### `handlers/mention.ts` — @Mention Handler
|
|
59
66
|
|
|
67
|
+
**관리 명령어 (Claude 호출 없이 즉시 처리):**
|
|
68
|
+
|
|
69
|
+
- `세션조회` → 모든 활성 세션 목록 표시
|
|
70
|
+
- `모든 세션 종료` → 전체 세션 삭제
|
|
71
|
+
- `스레드삭제` (스레드 내 멘션) → 스레드의 모든 메시지 삭제 + 세션 종료
|
|
72
|
+
|
|
60
73
|
**새 메시지 (thread 아닌 경우):**
|
|
61
74
|
|
|
62
75
|
1. 메시지에서 봇 멘션 제거
|
|
63
|
-
2.
|
|
64
|
-
|
|
65
|
-
-
|
|
66
|
-
|
|
76
|
+
2. 빈 멘션이면 세션만 생성하고 안내 메시지 표시
|
|
77
|
+
3. GitHub repo 패턴 감지:
|
|
78
|
+
- **레포 있고 존재함:** bare clone → worktree 생성 → Claude 세션 시작
|
|
79
|
+
- **레포 있고 존재하지 않음:** 레포 생성 버튼 표시 (private / public / skip)
|
|
80
|
+
- **레포 없음:** temp 디렉토리 생성 → Claude 세션 시작
|
|
81
|
+
4. Claude 응답을 스레드에 스트리밍
|
|
67
82
|
|
|
68
83
|
**스레드 내 멘션:**
|
|
69
84
|
|
|
70
|
-
- 기존 세션이 있으면 이어서 진행
|
|
71
|
-
- 없으면
|
|
85
|
+
- 기존 세션이 있으면 기존 요청 abort 후 이어서 진행
|
|
86
|
+
- 없으면 안내 메시지 표시
|
|
87
|
+
|
|
88
|
+
**레포 생성 플로우:**
|
|
89
|
+
|
|
90
|
+
- `pendingRepoRequests` Map으로 대기 중인 레포 생성 요청 관리
|
|
91
|
+
- 스레드 작성자만 버튼 클릭 가능
|
|
92
|
+
- 생성 완료 후 자동으로 세션 시작
|
|
72
93
|
|
|
73
94
|
### `handlers/thread.ts` — Thread Reply Handler
|
|
74
95
|
|
|
75
96
|
- 봇이 활성 세션을 가진 스레드의 일반 메시지 처리
|
|
76
|
-
- 봇 자신의 메시지, subtype 메시지 무시
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
-
|
|
97
|
+
- 봇 자신의 메시지, subtype 메시지 무시 (`file_share`는 허용)
|
|
98
|
+
|
|
99
|
+
**관리 명령어 (세션 유무와 무관하게 동작):**
|
|
100
|
+
|
|
101
|
+
- `스레드삭제` → 스레드 전체 메시지 삭제 + 세션 종료
|
|
102
|
+
- `세션조회` → 모든 활성 세션 목록 표시
|
|
103
|
+
- `모든 세션 종료` → 전체 세션 삭제
|
|
104
|
+
|
|
105
|
+
**세션이 필요한 명령어:**
|
|
106
|
+
|
|
107
|
+
- `세션종료` → 현재 스레드의 세션만 종료
|
|
108
|
+
|
|
109
|
+
**일반 메시지:**
|
|
110
|
+
|
|
111
|
+
- 세션이 없으면 안내 메시지 표시
|
|
112
|
+
- 이미지 첨부 시 `downloadSlackImages()`로 다운로드 후 Claude에 전달
|
|
113
|
+
- 새 메시지 수신 시 `abortActiveChat(threadTs)`로 기존 요청 즉시 중단
|
|
81
114
|
|
|
82
115
|
### `services/claude.ts` — Claude Code Session Manager
|
|
83
116
|
|
|
@@ -92,6 +125,9 @@ Slack 소켓모드 봇으로, 멘션을 통해 Claude Code 세션을 시작하
|
|
|
92
125
|
|
|
93
126
|
- `createSession(threadTs, workDir, authorUserId)` → 새 세션 생성
|
|
94
127
|
- `getSession(threadTs)` → 기존 세션 조회
|
|
128
|
+
- `getAllSessions()` → 전체 세션 목록 반환
|
|
129
|
+
- `deleteSession(threadTs)` → 단일 세션 삭제 (worktree + JSONL 정리)
|
|
130
|
+
- `deleteAllSessions()` → 전체 세션 삭제
|
|
95
131
|
- `lastActivityAt` 매 대화마다 갱신
|
|
96
132
|
- 서버 시작 시 2주 이상 비활성 세션 자동 정리 (SDK `.jsonl` + worktree 삭제)
|
|
97
133
|
|
|
@@ -211,15 +247,22 @@ Claude canUseTool 콜백 호출 (위험 도구)
|
|
|
211
247
|
|
|
212
248
|
### `services/slack-messenger.ts` — Streaming Message Updater
|
|
213
249
|
|
|
214
|
-
- 초기 메시지 "⏳
|
|
250
|
+
- 초기 메시지 "⏳ 생각하는 중..." 포스트 (Claude 아이콘 사용)
|
|
215
251
|
- `ChatEvent` 스트림을 소비하며:
|
|
216
252
|
- `text` → 텍스트 누적 후 메시지 업데이트
|
|
217
253
|
- `error` → 에러 메시지 추가
|
|
218
254
|
- 500ms 스로틀링으로 Slack rate limit 방지
|
|
219
255
|
- 중간 업데이트 시 단어 경계에서 텍스트 자르기 (한글 punycode 버그 방지)
|
|
220
256
|
- **AbortSignal 지원:** `options.signal`로 스트림 중단 감지, 중단 시 ":no_entry_sign:" 메시지로 업데이트
|
|
257
|
+
- **최종 전달:** 스트리밍 메시지 삭제 후 새 메시지로 포스트 (Slack 알림 트리거)
|
|
221
258
|
- **Claude 아이콘:** `CLAUDE_ICON_URL` 상수를 사용하여 봇 응답에 Claude 공식 아이콘 표시
|
|
222
259
|
|
|
260
|
+
### `services/slack-user-client.ts` — Slack User Token Client
|
|
261
|
+
|
|
262
|
+
- `initUserClient(token)` — `SLACK_USER_TOKEN`으로 `WebClient` 인스턴스 생성
|
|
263
|
+
- `getUserClient()` — 유저 토큰 클라이언트 반환 (없으면 `undefined`)
|
|
264
|
+
- 스레드 삭제 시 봇 토큰 대신 유저 토큰을 사용하여 다른 사용자의 메시지도 삭제 가능
|
|
265
|
+
|
|
223
266
|
### `services/git.ts` — Repository Manager
|
|
224
267
|
|
|
225
268
|
**전략: bare repo + worktree**
|
|
@@ -240,6 +283,18 @@ Claude canUseTool 콜백 호출 (위험 도구)
|
|
|
240
283
|
4. default branch는 `HEAD` symbolic ref에서 자동 감지
|
|
241
284
|
5. 스레드마다 독립 브랜치 → PR 생성 가능
|
|
242
285
|
|
|
286
|
+
**레포 존재 확인:**
|
|
287
|
+
|
|
288
|
+
- `checkRepoExists(owner, repo)` → `boolean`
|
|
289
|
+
- `GITHUB_TOKEN` 있으면 GitHub API 사용, 없으면 `git ls-remote` 폴백
|
|
290
|
+
|
|
291
|
+
**레포 생성:**
|
|
292
|
+
|
|
293
|
+
- `createGithubRepo(owner, repo, isPrivate)` → GitHub API로 레포 생성
|
|
294
|
+
- `GITHUB_TOKEN` 필수
|
|
295
|
+
- 인증된 사용자 감지 후 user/org 엔드포인트 구분
|
|
296
|
+
- `auto_init: true` (빈 레포 방지)
|
|
297
|
+
|
|
243
298
|
### `constants.ts` — Shared Constants
|
|
244
299
|
|
|
245
300
|
- `CLAUDE_ICON_URL` — Claude 공식 apple-touch-icon URL (`https://claude.ai/apple-touch-icon.png`)
|
|
@@ -250,7 +305,9 @@ Claude canUseTool 콜백 호출 (위험 도구)
|
|
|
250
305
|
- `downloadSlackImages(client, files)` → `Promise<SlackImageFile[]>`
|
|
251
306
|
- Slack 메시지의 `files` 배열에서 이미지 다운로드
|
|
252
307
|
- 지원 타입: `image/jpeg`, `image/png`, `image/gif`, `image/webp`
|
|
253
|
-
-
|
|
308
|
+
- 다중 다운로드 전략: Bearer 헤더, 쿼리 파라미터, `files.info` API, 썸네일 폴백
|
|
309
|
+
- 매직 바이트로 실제 이미지 포맷 검증 (HTML 응답 거부)
|
|
310
|
+
- `sharp`로 최대 1568px 리사이즈 + PNG 정규화
|
|
254
311
|
- base64 인코딩된 이미지 데이터 반환
|
|
255
312
|
|
|
256
313
|
### `utils/slack-format.ts` — Markdown → Slack mrkdwn Converter
|
|
@@ -278,15 +335,21 @@ Claude canUseTool 콜백 호출 (위험 도구)
|
|
|
278
335
|
- `owner/repo` ✅ (유효한 GitHub 네이밍 규칙 충족 시)
|
|
279
336
|
- `../path` ❌ (파일 경로 형태 거부)
|
|
280
337
|
|
|
338
|
+
### `utils/session-info.ts` — Session Info Formatter
|
|
339
|
+
|
|
340
|
+
- `formatSessionInfo(sessions)`: 세션 목록을 Slack 메시지로 포맷
|
|
341
|
+
- 세션별 표시: 상태 이모지 (🟢 시작됨 / ⚪ 대기), 스레드 ID, 작성자, 레포, 생성 시간, 마지막 활동 상대 시간
|
|
342
|
+
|
|
281
343
|
## Data Storage
|
|
282
344
|
|
|
283
345
|
| 데이터 | 경로 | 내용 |
|
|
284
346
|
|--------|------|------|
|
|
285
|
-
| 세션 매핑 | `~/.eniac/sessions.json` | `threadTs → { sessionId, workDir, authorUserId,
|
|
347
|
+
| 세션 매핑 | `~/.eniac/sessions.json` | `threadTs → { sessionId, workDir, authorUserId, createdAt, lastActivityAt, hasStarted }` |
|
|
286
348
|
| SDK 대화 기록 | `~/.claude/projects/{cwd-encoded}/{sessionId}.jsonl` | 전체 대화 히스토리 (SDK 자동 관리) |
|
|
287
349
|
| MCP 설정 | `~/.claude/.mcp.json` | MCP 서버 연결 설정 (선택) |
|
|
288
350
|
| Git bare repos | `{REPOS_BASE_DIR}/{owner}/{repo}.git/` | 공유 bare clone |
|
|
289
351
|
| Git worktrees | `{REPOS_BASE_DIR}/{owner}/{repo}/worktrees/{timestamp}/` | 스레드별 작업 디렉토리 |
|
|
352
|
+
| 이미지 | `{workDir}/.eniac-images/` | 분석을 위해 다운로드된 이미지 파일 |
|
|
290
353
|
|
|
291
354
|
**세션 만료:** `lastActivityAt` 기준 2주 경과 시 서버 시작 시점에 자동 정리 (세션 파일 + worktree 삭제)
|
|
292
355
|
|
|
@@ -296,6 +359,8 @@ Claude canUseTool 콜백 호출 (위험 도구)
|
|
|
296
359
|
|------|------|------|
|
|
297
360
|
| `SLACK_BOT_TOKEN` | ✅ | `xoxb-` 봇 토큰 |
|
|
298
361
|
| `SLACK_APP_TOKEN` | ✅ | `xapp-` 앱 레벨 토큰 (소켓모드) |
|
|
362
|
+
| `GITHUB_TOKEN` | ❌ | GitHub API 토큰 (레포 존재 확인 + 신규 생성) |
|
|
363
|
+
| `SLACK_USER_TOKEN` | ❌ | `xoxp-` 유저 토큰 (스레드 삭제 시 타인 메시지 삭제 가능) |
|
|
299
364
|
| `REPOS_BASE_DIR` | ❌ | 레포 저장 경로 (기본: `~/.eniac/repos`) |
|
|
300
365
|
|
|
301
366
|
## Tech Stack
|
|
@@ -307,6 +372,7 @@ Claude canUseTool 콜백 호출 (위험 도구)
|
|
|
307
372
|
- **Slack:** `@slack/bolt` v4 (Socket Mode)
|
|
308
373
|
- **Claude:** `@anthropic-ai/claude-agent-sdk` ^0.2.72 (`query()` API)
|
|
309
374
|
- **Git:** `simple-git`
|
|
375
|
+
- **Image Processing:** `sharp` (리사이즈 + PNG 정규화)
|
|
310
376
|
|
|
311
377
|
## Slack App 설정 요구사항
|
|
312
378
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mention.d.ts","sourceRoot":"","sources":["../../src/handlers/mention.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAoC,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAItF,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"mention.d.ts","sourceRoot":"","sources":["../../src/handlers/mention.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAoC,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAItF,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAWnF;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,UAAU,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAMD,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,GAChB,kBAAkB,GAAG,SAAS,CAEhC;AAED,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAEhE;AAID,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEjD;AASD;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,iBAAiB,GAAG,wBAAwB,CAAC,aAAa,CAAC,GAChE,OAAO,CAAC,IAAI,CAAC,CAuIf;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,iBAAiB,CAAC,QAAQ,CAAC,EACnC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,UAAU,EACpB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,cAAc,EAAE,GACxB,OAAO,CAAC,IAAI,CAAC,CA6Bf;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,iBAAiB,CAAC,QAAQ,CAAC,EACnC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,cAAc,EAAE,GACxB,OAAO,CAAC,IAAI,CAAC,CAMf"}
|
package/dist/handlers/mention.js
CHANGED
|
@@ -6,6 +6,7 @@ import { downloadSlackImages } from "../utils/slack-files.js";
|
|
|
6
6
|
import { CLAUDE_ICON_URL } from "../constants.js";
|
|
7
7
|
import { formatSessionInfo } from "../utils/session-info.js";
|
|
8
8
|
import { fetchUsage } from "../services/usage.js";
|
|
9
|
+
import { setSessionRepo } from "../services/stats.js";
|
|
9
10
|
import { getUserClient } from "../services/slack-user-client.js";
|
|
10
11
|
import { deleteThreadMessages } from "../utils/thread-delete.js";
|
|
11
12
|
import fs from "node:fs/promises";
|
|
@@ -185,6 +186,7 @@ export async function startSessionWithRepo(client, channel, threadTs, repoInfo,
|
|
|
185
186
|
return;
|
|
186
187
|
}
|
|
187
188
|
createSession(threadTs, workDir, authorUserId);
|
|
189
|
+
setSessionRepo(threadTs, `${repoInfo.owner}/${repoInfo.repo}`);
|
|
188
190
|
const userMessage = `[Working directory: ${workDir} — Repository: ${repoInfo.owner}/${repoInfo.repo}]\n\n${cleanText}`;
|
|
189
191
|
const stream = chat(threadTs, userMessage, client, channel, images?.length ? images : undefined);
|
|
190
192
|
await postStreamingReply(client, channel, threadTs, stream);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mention.js","sourceRoot":"","sources":["../../src/handlers/mention.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"mention.js","sourceRoot":"","sources":["../../src/handlers/mention.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
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;
|
|
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;AAIhD,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;AAkKvC;;;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;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAuCvD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAyC1C;AAED,wBAAgB,cAAc,IAAI,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAErD;AAsCD;;;;;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,CAwP1C"}
|
package/dist/services/claude.js
CHANGED
|
@@ -4,6 +4,7 @@ import fs from "node:fs";
|
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import os from "node:os";
|
|
6
6
|
import { requestPermission } from "./permissions.js";
|
|
7
|
+
import { recordToolUse, recordResult } from "./stats.js";
|
|
7
8
|
// --- Persistent session store ---
|
|
8
9
|
const SESSIONS_FILE = path.join(os.homedir(), ".eniac", "sessions.json");
|
|
9
10
|
function loadSessions() {
|
|
@@ -44,49 +45,51 @@ function loadMcpServers() {
|
|
|
44
45
|
return undefined;
|
|
45
46
|
}
|
|
46
47
|
const mcpServers = loadMcpServers();
|
|
47
|
-
// ---
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
\`\`\`
|
|
78
|
-
|
|
79
|
-
## Links
|
|
80
|
-
- Use <URL|display text> format instead of [display text](URL)
|
|
48
|
+
// --- MCP server filtering by user message ---
|
|
49
|
+
const KEYWORD_MCP_RULES = [
|
|
50
|
+
{ key: "dokploy", patterns: /배포|deploy|dokploy|서버\s*상태|앱\s*(시작|중지|재시작|삭제)|redeploy|도메인/ },
|
|
51
|
+
{ key: "vault", patterns: /시크릿|secret|vault|인증서|cert|pki|마운트|mount/ },
|
|
52
|
+
{ key: "slack", patterns: /슬랙|slack|채널|메시지\s*보내|리액션|reaction/ },
|
|
53
|
+
];
|
|
54
|
+
const KEYWORD_MCP_KEYS = new Set(KEYWORD_MCP_RULES.map((r) => r.key));
|
|
55
|
+
function selectMcpServers(userMessage, allServers) {
|
|
56
|
+
if (!allServers)
|
|
57
|
+
return undefined;
|
|
58
|
+
const msg = userMessage.toLowerCase();
|
|
59
|
+
const selected = {};
|
|
60
|
+
// Always include non-keyword MCP servers (e.g. filesystem, context7)
|
|
61
|
+
for (const [key, config] of Object.entries(allServers)) {
|
|
62
|
+
if (!KEYWORD_MCP_KEYS.has(key)) {
|
|
63
|
+
selected[key] = config;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Include keyword MCP servers only when message matches
|
|
67
|
+
for (const { key, patterns } of KEYWORD_MCP_RULES) {
|
|
68
|
+
if (patterns.test(msg) && allServers[key]) {
|
|
69
|
+
selected[key] = allServers[key];
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return Object.keys(selected).length > 0 ? selected : undefined;
|
|
73
|
+
}
|
|
74
|
+
// --- System prompt for Slack bot ---
|
|
75
|
+
const SYSTEM_PROMPT = `
|
|
76
|
+
You are an AI assistant in a Slack workspace, helping with software engineering tasks.
|
|
77
|
+
You have access to tools for reading/searching/editing code, running shell commands, and browsing the web.
|
|
81
78
|
|
|
82
|
-
|
|
83
|
-
-
|
|
84
|
-
-
|
|
79
|
+
# Guidelines
|
|
80
|
+
- Read and understand existing code before suggesting modifications.
|
|
81
|
+
- Keep solutions simple and focused. Only make changes that are directly requested.
|
|
82
|
+
- Do not introduce security vulnerabilities (injection, XSS, etc).
|
|
83
|
+
- When referencing code, include file_path:line_number format.
|
|
84
|
+
- Be concise. Lead with the answer, skip filler words.
|
|
85
85
|
|
|
86
|
-
|
|
87
|
-
-
|
|
88
|
-
-
|
|
89
|
-
-
|
|
86
|
+
# Slack Formatting
|
|
87
|
+
- *bold* (not **bold**), _italic_, ~strike~, \`code\`, \`\`\`code block\`\`\`
|
|
88
|
+
- No # headers → use *bold text* on its own line as section title
|
|
89
|
+
- Tables → code block with box-drawing chars (┌─┬┐ │ ├─┼┤ └─┴┘)
|
|
90
|
+
- Links → <URL|display text> (not [text](URL))
|
|
91
|
+
- Use emoji actively for readability :rocket: :white_check_mark: :warning:
|
|
92
|
+
- Keep responses concise and scannable. No HTML.
|
|
90
93
|
`.trim();
|
|
91
94
|
const SESSION_TTL_MS = 14 * 24 * 60 * 60 * 1000; // 2 weeks
|
|
92
95
|
function cleanupExpiredSessions() {
|
|
@@ -357,18 +360,17 @@ export async function* chat(threadTs, userMessage, slackClient, channel, images)
|
|
|
357
360
|
permissionMode: "bypassPermissions",
|
|
358
361
|
allowDangerouslySkipPermissions: true,
|
|
359
362
|
includePartialMessages: true,
|
|
360
|
-
systemPrompt:
|
|
361
|
-
type: "preset",
|
|
362
|
-
preset: "claude_code",
|
|
363
|
-
append: SLACK_FORMAT_PROMPT,
|
|
364
|
-
},
|
|
363
|
+
systemPrompt: SYSTEM_PROMPT,
|
|
365
364
|
stderr: (data) => {
|
|
366
365
|
stderrChunks.push(data);
|
|
367
366
|
// Keep only last 50 chunks to avoid memory bloat
|
|
368
367
|
if (stderrChunks.length > 50)
|
|
369
368
|
stderrChunks.shift();
|
|
370
369
|
},
|
|
371
|
-
...(
|
|
370
|
+
...(() => {
|
|
371
|
+
const filtered = selectMcpServers(userMessage, mcpServers);
|
|
372
|
+
return filtered ? { mcpServers: filtered } : {};
|
|
373
|
+
})(),
|
|
372
374
|
...(session.hasStarted
|
|
373
375
|
? { resume: session.sessionId }
|
|
374
376
|
: { sessionId: session.sessionId }),
|
|
@@ -396,6 +398,14 @@ export async function* chat(threadTs, userMessage, slackClient, channel, images)
|
|
|
396
398
|
}
|
|
397
399
|
continue;
|
|
398
400
|
}
|
|
401
|
+
// Track tool usage from tool_progress messages
|
|
402
|
+
if (msgType === "tool_progress") {
|
|
403
|
+
const tp = message;
|
|
404
|
+
if (tp.tool_name) {
|
|
405
|
+
recordToolUse(threadTs, tp.tool_name);
|
|
406
|
+
}
|
|
407
|
+
continue;
|
|
408
|
+
}
|
|
399
409
|
// Final result — if streaming didn't deliver the text, use result.result as fallback
|
|
400
410
|
if (msgType === "result") {
|
|
401
411
|
const result = message;
|
|
@@ -403,6 +413,20 @@ export async function* chat(threadTs, userMessage, slackClient, channel, images)
|
|
|
403
413
|
if (result.errors && result.errors.length > 0) {
|
|
404
414
|
console.error(`[claude] result errors: ${JSON.stringify(result.errors)}`);
|
|
405
415
|
}
|
|
416
|
+
// Record stats
|
|
417
|
+
recordResult(threadTs, {
|
|
418
|
+
costUsd: result.total_cost_usd,
|
|
419
|
+
tokens: result.usage
|
|
420
|
+
? {
|
|
421
|
+
input: result.usage.input_tokens,
|
|
422
|
+
output: result.usage.output_tokens,
|
|
423
|
+
cacheRead: result.usage.cache_read_input_tokens,
|
|
424
|
+
cacheCreation: result.usage.cache_creation_input_tokens,
|
|
425
|
+
}
|
|
426
|
+
: undefined,
|
|
427
|
+
turns: result.num_turns,
|
|
428
|
+
durationMs: result.duration_ms,
|
|
429
|
+
});
|
|
406
430
|
if (result.subtype === "success") {
|
|
407
431
|
receivedSuccessResult = true;
|
|
408
432
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/services/claude.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/services/claude.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
interface SessionStats {
|
|
2
|
+
repo: string | null;
|
|
3
|
+
costUsd: number;
|
|
4
|
+
tokens: {
|
|
5
|
+
input: number;
|
|
6
|
+
output: number;
|
|
7
|
+
cacheRead: number;
|
|
8
|
+
cacheCreation: number;
|
|
9
|
+
};
|
|
10
|
+
toolUsage: Record<string, number>;
|
|
11
|
+
turns: number;
|
|
12
|
+
durationMs: number;
|
|
13
|
+
createdAt: string;
|
|
14
|
+
lastUpdatedAt: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function recordToolUse(threadTs: string, toolName: string): void;
|
|
17
|
+
export declare function recordResult(threadTs: string, data: {
|
|
18
|
+
costUsd?: number;
|
|
19
|
+
tokens?: {
|
|
20
|
+
input?: number;
|
|
21
|
+
output?: number;
|
|
22
|
+
cacheRead?: number;
|
|
23
|
+
cacheCreation?: number;
|
|
24
|
+
};
|
|
25
|
+
turns?: number;
|
|
26
|
+
durationMs?: number;
|
|
27
|
+
}): void;
|
|
28
|
+
export declare function setSessionRepo(threadTs: string, repo: string | null): void;
|
|
29
|
+
interface ProjectSummary {
|
|
30
|
+
repo: string;
|
|
31
|
+
totalCostUsd: number;
|
|
32
|
+
totalTokens: {
|
|
33
|
+
input: number;
|
|
34
|
+
output: number;
|
|
35
|
+
cacheRead: number;
|
|
36
|
+
cacheCreation: number;
|
|
37
|
+
};
|
|
38
|
+
toolUsage: Record<string, number>;
|
|
39
|
+
totalTurns: number;
|
|
40
|
+
totalDurationMs: number;
|
|
41
|
+
sessionCount: number;
|
|
42
|
+
}
|
|
43
|
+
export declare function getProjectSummaries(): ProjectSummary[];
|
|
44
|
+
export declare function getSessionStats(threadTs: string): SessionStats | undefined;
|
|
45
|
+
export {};
|
|
46
|
+
//# sourceMappingURL=stats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/services/stats.ts"],"names":[],"mappings":"AAIA,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AA2BD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAMtE;AAED,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE;IACJ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE;QACP,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GACA,IAAI,CAgBN;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GAAG,IAAI,GAClB,IAAI,CAKN;AAkBD,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE;QACX,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,mBAAmB,IAAI,cAAc,EAAE,CAqCtD;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAG1E"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
const STATS_FILE = path.join(os.homedir(), ".eniac", "stats.json");
|
|
5
|
+
function loadStats() {
|
|
6
|
+
try {
|
|
7
|
+
const data = fs.readFileSync(STATS_FILE, "utf-8");
|
|
8
|
+
return JSON.parse(data);
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return { sessions: {} };
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function saveStats(store) {
|
|
15
|
+
try {
|
|
16
|
+
const dir = path.dirname(STATS_FILE);
|
|
17
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
18
|
+
fs.writeFileSync(STATS_FILE, JSON.stringify(store, null, 2));
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
console.warn("[stats] failed to save:", err);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function recordToolUse(threadTs, toolName) {
|
|
25
|
+
const store = loadStats();
|
|
26
|
+
const session = ensureSession(store, threadTs);
|
|
27
|
+
session.toolUsage[toolName] = (session.toolUsage[toolName] ?? 0) + 1;
|
|
28
|
+
session.lastUpdatedAt = new Date().toISOString();
|
|
29
|
+
saveStats(store);
|
|
30
|
+
}
|
|
31
|
+
export function recordResult(threadTs, data) {
|
|
32
|
+
const store = loadStats();
|
|
33
|
+
const session = ensureSession(store, threadTs);
|
|
34
|
+
if (data.costUsd != null)
|
|
35
|
+
session.costUsd += data.costUsd;
|
|
36
|
+
if (data.tokens) {
|
|
37
|
+
session.tokens.input += data.tokens.input ?? 0;
|
|
38
|
+
session.tokens.output += data.tokens.output ?? 0;
|
|
39
|
+
session.tokens.cacheRead += data.tokens.cacheRead ?? 0;
|
|
40
|
+
session.tokens.cacheCreation += data.tokens.cacheCreation ?? 0;
|
|
41
|
+
}
|
|
42
|
+
if (data.turns != null)
|
|
43
|
+
session.turns += data.turns;
|
|
44
|
+
if (data.durationMs != null)
|
|
45
|
+
session.durationMs += data.durationMs;
|
|
46
|
+
session.lastUpdatedAt = new Date().toISOString();
|
|
47
|
+
saveStats(store);
|
|
48
|
+
}
|
|
49
|
+
export function setSessionRepo(threadTs, repo) {
|
|
50
|
+
const store = loadStats();
|
|
51
|
+
const session = ensureSession(store, threadTs);
|
|
52
|
+
session.repo = repo;
|
|
53
|
+
saveStats(store);
|
|
54
|
+
}
|
|
55
|
+
function ensureSession(store, threadTs) {
|
|
56
|
+
if (!store.sessions[threadTs]) {
|
|
57
|
+
store.sessions[threadTs] = {
|
|
58
|
+
repo: null,
|
|
59
|
+
costUsd: 0,
|
|
60
|
+
tokens: { input: 0, output: 0, cacheRead: 0, cacheCreation: 0 },
|
|
61
|
+
toolUsage: {},
|
|
62
|
+
turns: 0,
|
|
63
|
+
durationMs: 0,
|
|
64
|
+
createdAt: new Date().toISOString(),
|
|
65
|
+
lastUpdatedAt: new Date().toISOString(),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
return store.sessions[threadTs];
|
|
69
|
+
}
|
|
70
|
+
export function getProjectSummaries() {
|
|
71
|
+
const store = loadStats();
|
|
72
|
+
const byRepo = new Map();
|
|
73
|
+
for (const session of Object.values(store.sessions)) {
|
|
74
|
+
const repo = session.repo ?? "(no repo)";
|
|
75
|
+
let summary = byRepo.get(repo);
|
|
76
|
+
if (!summary) {
|
|
77
|
+
summary = {
|
|
78
|
+
repo,
|
|
79
|
+
totalCostUsd: 0,
|
|
80
|
+
totalTokens: { input: 0, output: 0, cacheRead: 0, cacheCreation: 0 },
|
|
81
|
+
toolUsage: {},
|
|
82
|
+
totalTurns: 0,
|
|
83
|
+
totalDurationMs: 0,
|
|
84
|
+
sessionCount: 0,
|
|
85
|
+
};
|
|
86
|
+
byRepo.set(repo, summary);
|
|
87
|
+
}
|
|
88
|
+
summary.totalCostUsd += session.costUsd;
|
|
89
|
+
summary.totalTokens.input += session.tokens.input;
|
|
90
|
+
summary.totalTokens.output += session.tokens.output;
|
|
91
|
+
summary.totalTokens.cacheRead += session.tokens.cacheRead;
|
|
92
|
+
summary.totalTokens.cacheCreation += session.tokens.cacheCreation;
|
|
93
|
+
summary.totalTurns += session.turns;
|
|
94
|
+
summary.totalDurationMs += session.durationMs;
|
|
95
|
+
summary.sessionCount += 1;
|
|
96
|
+
for (const [tool, count] of Object.entries(session.toolUsage)) {
|
|
97
|
+
summary.toolUsage[tool] = (summary.toolUsage[tool] ?? 0) + count;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return [...byRepo.values()].sort((a, b) => b.totalCostUsd - a.totalCostUsd);
|
|
101
|
+
}
|
|
102
|
+
export function getSessionStats(threadTs) {
|
|
103
|
+
const store = loadStats();
|
|
104
|
+
return store.sessions[threadTs];
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/services/stats.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/services/usage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/services/usage.ts"],"names":[],"mappings":"AAwCA,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAkElD"}
|
package/dist/services/usage.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { execSync } from "node:child_process";
|
|
2
|
+
import { getProjectSummaries } from "./stats.js";
|
|
2
3
|
function getOAuthToken() {
|
|
3
4
|
// 1) Environment variable
|
|
4
5
|
const envToken = process.env["ANTHROPIC_OAUTH_TOKEN"];
|
|
@@ -57,11 +58,32 @@ export async function fetchUsage() {
|
|
|
57
58
|
const ss = Math.round(data.seven_day_sonnet?.utilization ?? 0);
|
|
58
59
|
const fhLeft = data.five_hour?.resets_at ? formatRemaining(data.five_hour.resets_at) : "";
|
|
59
60
|
const sdLeft = data.seven_day?.resets_at ? formatRemaining(data.seven_day.resets_at) : "";
|
|
60
|
-
|
|
61
|
+
const lines = [
|
|
61
62
|
`:bar_chart: *Claude 사용량*`,
|
|
62
63
|
`• *5시간:* ${fh}%${fhLeft}`,
|
|
63
64
|
`• *7일:* ${sd}%${sdLeft}`,
|
|
64
65
|
`• *7일 (Sonnet):* ${ss}%`,
|
|
65
|
-
]
|
|
66
|
+
];
|
|
67
|
+
// Append project stats
|
|
68
|
+
const projects = getProjectSummaries();
|
|
69
|
+
if (projects.length > 0) {
|
|
70
|
+
lines.push("");
|
|
71
|
+
lines.push(`:memo: *프로젝트별 통계*`);
|
|
72
|
+
for (const p of projects) {
|
|
73
|
+
const cost = p.totalCostUsd > 0 ? `$${p.totalCostUsd.toFixed(4)}` : "$0";
|
|
74
|
+
const tokens = p.totalTokens.input + p.totalTokens.output;
|
|
75
|
+
const toolList = Object.entries(p.toolUsage)
|
|
76
|
+
.sort(([, a], [, b]) => b - a)
|
|
77
|
+
.slice(0, 5)
|
|
78
|
+
.map(([name, count]) => `${name}(${count})`)
|
|
79
|
+
.join(", ");
|
|
80
|
+
lines.push(`\n*${p.repo}* — ${p.sessionCount}개 세션`);
|
|
81
|
+
lines.push(` • 비용: ${cost} | 토큰: ${tokens.toLocaleString()} | 턴: ${p.totalTurns}`);
|
|
82
|
+
if (toolList) {
|
|
83
|
+
lines.push(` • 도구: ${toolList}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return lines.join("\n");
|
|
66
88
|
}
|
|
67
89
|
//# sourceMappingURL=usage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/services/usage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/services/usage.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/handlers/mention.ts
CHANGED
|
@@ -7,6 +7,7 @@ import { downloadSlackImages, type SlackImageFile } from "../utils/slack-files.j
|
|
|
7
7
|
import { CLAUDE_ICON_URL } from "../constants.js";
|
|
8
8
|
import { formatSessionInfo } from "../utils/session-info.js";
|
|
9
9
|
import { fetchUsage } from "../services/usage.js";
|
|
10
|
+
import { setSessionRepo } from "../services/stats.js";
|
|
10
11
|
import { getUserClient } from "../services/slack-user-client.js";
|
|
11
12
|
import { deleteThreadMessages } from "../utils/thread-delete.js";
|
|
12
13
|
import fs from "node:fs/promises";
|
|
@@ -231,6 +232,7 @@ export async function startSessionWithRepo(
|
|
|
231
232
|
}
|
|
232
233
|
|
|
233
234
|
createSession(threadTs, workDir, authorUserId);
|
|
235
|
+
setSessionRepo(threadTs, `${repoInfo.owner}/${repoInfo.repo}`);
|
|
234
236
|
|
|
235
237
|
const userMessage = `[Working directory: ${workDir} — Repository: ${repoInfo.owner}/${repoInfo.repo}]\n\n${cleanText}`;
|
|
236
238
|
const stream = chat(threadTs, userMessage, client, channel, images?.length ? images : undefined);
|
package/src/services/claude.ts
CHANGED
|
@@ -12,6 +12,7 @@ import path from "node:path";
|
|
|
12
12
|
import os from "node:os";
|
|
13
13
|
import type { WebClient } from "@slack/web-api";
|
|
14
14
|
import { requestPermission } from "./permissions.js";
|
|
15
|
+
import { recordToolUse, recordResult } from "./stats.js";
|
|
15
16
|
|
|
16
17
|
interface Session {
|
|
17
18
|
sessionId: string;
|
|
@@ -76,49 +77,60 @@ function loadMcpServers(): Record<string, McpServerConfig> | undefined {
|
|
|
76
77
|
|
|
77
78
|
const mcpServers = loadMcpServers();
|
|
78
79
|
|
|
79
|
-
// ---
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
-
|
|
121
|
-
-
|
|
80
|
+
// --- MCP server filtering by user message ---
|
|
81
|
+
const KEYWORD_MCP_RULES: Array<{ key: string; patterns: RegExp }> = [
|
|
82
|
+
{ key: "dokploy", patterns: /배포|deploy|dokploy|서버\s*상태|앱\s*(시작|중지|재시작|삭제)|redeploy|도메인/ },
|
|
83
|
+
{ key: "vault", patterns: /시크릿|secret|vault|인증서|cert|pki|마운트|mount/ },
|
|
84
|
+
{ key: "slack", patterns: /슬랙|slack|채널|메시지\s*보내|리액션|reaction/ },
|
|
85
|
+
];
|
|
86
|
+
|
|
87
|
+
const KEYWORD_MCP_KEYS = new Set(KEYWORD_MCP_RULES.map((r) => r.key));
|
|
88
|
+
|
|
89
|
+
function selectMcpServers(
|
|
90
|
+
userMessage: string,
|
|
91
|
+
allServers: Record<string, McpServerConfig> | undefined
|
|
92
|
+
): Record<string, McpServerConfig> | undefined {
|
|
93
|
+
if (!allServers) return undefined;
|
|
94
|
+
|
|
95
|
+
const msg = userMessage.toLowerCase();
|
|
96
|
+
const selected: Record<string, McpServerConfig> = {};
|
|
97
|
+
|
|
98
|
+
// Always include non-keyword MCP servers (e.g. filesystem, context7)
|
|
99
|
+
for (const [key, config] of Object.entries(allServers)) {
|
|
100
|
+
if (!KEYWORD_MCP_KEYS.has(key)) {
|
|
101
|
+
selected[key] = config;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Include keyword MCP servers only when message matches
|
|
106
|
+
for (const { key, patterns } of KEYWORD_MCP_RULES) {
|
|
107
|
+
if (patterns.test(msg) && allServers[key]) {
|
|
108
|
+
selected[key] = allServers[key]!;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return Object.keys(selected).length > 0 ? selected : undefined;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// --- System prompt for Slack bot ---
|
|
116
|
+
const SYSTEM_PROMPT = `
|
|
117
|
+
You are an AI assistant in a Slack workspace, helping with software engineering tasks.
|
|
118
|
+
You have access to tools for reading/searching/editing code, running shell commands, and browsing the web.
|
|
119
|
+
|
|
120
|
+
# Guidelines
|
|
121
|
+
- Read and understand existing code before suggesting modifications.
|
|
122
|
+
- Keep solutions simple and focused. Only make changes that are directly requested.
|
|
123
|
+
- Do not introduce security vulnerabilities (injection, XSS, etc).
|
|
124
|
+
- When referencing code, include file_path:line_number format.
|
|
125
|
+
- Be concise. Lead with the answer, skip filler words.
|
|
126
|
+
|
|
127
|
+
# Slack Formatting
|
|
128
|
+
- *bold* (not **bold**), _italic_, ~strike~, \`code\`, \`\`\`code block\`\`\`
|
|
129
|
+
- No # headers → use *bold text* on its own line as section title
|
|
130
|
+
- Tables → code block with box-drawing chars (┌─┬┐ │ ├─┼┤ └─┴┘)
|
|
131
|
+
- Links → <URL|display text> (not [text](URL))
|
|
132
|
+
- Use emoji actively for readability :rocket: :white_check_mark: :warning:
|
|
133
|
+
- Keep responses concise and scannable. No HTML.
|
|
122
134
|
`.trim();
|
|
123
135
|
|
|
124
136
|
const SESSION_TTL_MS = 14 * 24 * 60 * 60 * 1000; // 2 weeks
|
|
@@ -475,17 +487,16 @@ export async function* chat(
|
|
|
475
487
|
permissionMode: "bypassPermissions",
|
|
476
488
|
allowDangerouslySkipPermissions: true,
|
|
477
489
|
includePartialMessages: true,
|
|
478
|
-
systemPrompt:
|
|
479
|
-
type: "preset",
|
|
480
|
-
preset: "claude_code",
|
|
481
|
-
append: SLACK_FORMAT_PROMPT,
|
|
482
|
-
},
|
|
490
|
+
systemPrompt: SYSTEM_PROMPT,
|
|
483
491
|
stderr: (data: string) => {
|
|
484
492
|
stderrChunks.push(data);
|
|
485
493
|
// Keep only last 50 chunks to avoid memory bloat
|
|
486
494
|
if (stderrChunks.length > 50) stderrChunks.shift();
|
|
487
495
|
},
|
|
488
|
-
...(
|
|
496
|
+
...(() => {
|
|
497
|
+
const filtered = selectMcpServers(userMessage, mcpServers);
|
|
498
|
+
return filtered ? { mcpServers: filtered } : {};
|
|
499
|
+
})(),
|
|
489
500
|
...(session.hasStarted
|
|
490
501
|
? { resume: session.sessionId }
|
|
491
502
|
: { sessionId: session.sessionId }),
|
|
@@ -523,6 +534,15 @@ export async function* chat(
|
|
|
523
534
|
continue;
|
|
524
535
|
}
|
|
525
536
|
|
|
537
|
+
// Track tool usage from tool_progress messages
|
|
538
|
+
if (msgType === "tool_progress") {
|
|
539
|
+
const tp = message as SDKMessage & { tool_name?: string };
|
|
540
|
+
if (tp.tool_name) {
|
|
541
|
+
recordToolUse(threadTs, tp.tool_name);
|
|
542
|
+
}
|
|
543
|
+
continue;
|
|
544
|
+
}
|
|
545
|
+
|
|
526
546
|
// Final result — if streaming didn't deliver the text, use result.result as fallback
|
|
527
547
|
if (msgType === "result") {
|
|
528
548
|
const result = message as SDKMessage & {
|
|
@@ -534,6 +554,12 @@ export async function* chat(
|
|
|
534
554
|
duration_ms?: number;
|
|
535
555
|
total_cost_usd?: number;
|
|
536
556
|
num_turns?: number;
|
|
557
|
+
usage?: {
|
|
558
|
+
input_tokens?: number;
|
|
559
|
+
output_tokens?: number;
|
|
560
|
+
cache_read_input_tokens?: number;
|
|
561
|
+
cache_creation_input_tokens?: number;
|
|
562
|
+
};
|
|
537
563
|
};
|
|
538
564
|
console.log(
|
|
539
565
|
`[claude] result: subtype=${result.subtype}, is_error=${result.is_error ?? false}, stop_reason=${result.stop_reason ?? "null"}, duration_ms=${result.duration_ms ?? 0}, cost=$${result.total_cost_usd ?? 0}, turns=${result.num_turns ?? 0}, len=${result.result?.length ?? 0}, preview=${result.result?.substring(0, 200) ?? "null"}`
|
|
@@ -541,6 +567,22 @@ export async function* chat(
|
|
|
541
567
|
if (result.errors && result.errors.length > 0) {
|
|
542
568
|
console.error(`[claude] result errors: ${JSON.stringify(result.errors)}`);
|
|
543
569
|
}
|
|
570
|
+
|
|
571
|
+
// Record stats
|
|
572
|
+
recordResult(threadTs, {
|
|
573
|
+
costUsd: result.total_cost_usd,
|
|
574
|
+
tokens: result.usage
|
|
575
|
+
? {
|
|
576
|
+
input: result.usage.input_tokens,
|
|
577
|
+
output: result.usage.output_tokens,
|
|
578
|
+
cacheRead: result.usage.cache_read_input_tokens,
|
|
579
|
+
cacheCreation: result.usage.cache_creation_input_tokens,
|
|
580
|
+
}
|
|
581
|
+
: undefined,
|
|
582
|
+
turns: result.num_turns,
|
|
583
|
+
durationMs: result.duration_ms,
|
|
584
|
+
});
|
|
585
|
+
|
|
544
586
|
if (result.subtype === "success") {
|
|
545
587
|
receivedSuccessResult = true;
|
|
546
588
|
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
|
|
5
|
+
interface SessionStats {
|
|
6
|
+
repo: string | null;
|
|
7
|
+
costUsd: number;
|
|
8
|
+
tokens: {
|
|
9
|
+
input: number;
|
|
10
|
+
output: number;
|
|
11
|
+
cacheRead: number;
|
|
12
|
+
cacheCreation: number;
|
|
13
|
+
};
|
|
14
|
+
toolUsage: Record<string, number>;
|
|
15
|
+
turns: number;
|
|
16
|
+
durationMs: number;
|
|
17
|
+
createdAt: string;
|
|
18
|
+
lastUpdatedAt: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
interface StatsStore {
|
|
22
|
+
sessions: Record<string, SessionStats>;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const STATS_FILE = path.join(os.homedir(), ".eniac", "stats.json");
|
|
26
|
+
|
|
27
|
+
function loadStats(): StatsStore {
|
|
28
|
+
try {
|
|
29
|
+
const data = fs.readFileSync(STATS_FILE, "utf-8");
|
|
30
|
+
return JSON.parse(data) as StatsStore;
|
|
31
|
+
} catch {
|
|
32
|
+
return { sessions: {} };
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function saveStats(store: StatsStore): void {
|
|
37
|
+
try {
|
|
38
|
+
const dir = path.dirname(STATS_FILE);
|
|
39
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
40
|
+
fs.writeFileSync(STATS_FILE, JSON.stringify(store, null, 2));
|
|
41
|
+
} catch (err) {
|
|
42
|
+
console.warn("[stats] failed to save:", err);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function recordToolUse(threadTs: string, toolName: string): void {
|
|
47
|
+
const store = loadStats();
|
|
48
|
+
const session = ensureSession(store, threadTs);
|
|
49
|
+
session.toolUsage[toolName] = (session.toolUsage[toolName] ?? 0) + 1;
|
|
50
|
+
session.lastUpdatedAt = new Date().toISOString();
|
|
51
|
+
saveStats(store);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function recordResult(
|
|
55
|
+
threadTs: string,
|
|
56
|
+
data: {
|
|
57
|
+
costUsd?: number;
|
|
58
|
+
tokens?: {
|
|
59
|
+
input?: number;
|
|
60
|
+
output?: number;
|
|
61
|
+
cacheRead?: number;
|
|
62
|
+
cacheCreation?: number;
|
|
63
|
+
};
|
|
64
|
+
turns?: number;
|
|
65
|
+
durationMs?: number;
|
|
66
|
+
}
|
|
67
|
+
): void {
|
|
68
|
+
const store = loadStats();
|
|
69
|
+
const session = ensureSession(store, threadTs);
|
|
70
|
+
|
|
71
|
+
if (data.costUsd != null) session.costUsd += data.costUsd;
|
|
72
|
+
if (data.tokens) {
|
|
73
|
+
session.tokens.input += data.tokens.input ?? 0;
|
|
74
|
+
session.tokens.output += data.tokens.output ?? 0;
|
|
75
|
+
session.tokens.cacheRead += data.tokens.cacheRead ?? 0;
|
|
76
|
+
session.tokens.cacheCreation += data.tokens.cacheCreation ?? 0;
|
|
77
|
+
}
|
|
78
|
+
if (data.turns != null) session.turns += data.turns;
|
|
79
|
+
if (data.durationMs != null) session.durationMs += data.durationMs;
|
|
80
|
+
session.lastUpdatedAt = new Date().toISOString();
|
|
81
|
+
|
|
82
|
+
saveStats(store);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function setSessionRepo(
|
|
86
|
+
threadTs: string,
|
|
87
|
+
repo: string | null
|
|
88
|
+
): void {
|
|
89
|
+
const store = loadStats();
|
|
90
|
+
const session = ensureSession(store, threadTs);
|
|
91
|
+
session.repo = repo;
|
|
92
|
+
saveStats(store);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function ensureSession(store: StatsStore, threadTs: string): SessionStats {
|
|
96
|
+
if (!store.sessions[threadTs]) {
|
|
97
|
+
store.sessions[threadTs] = {
|
|
98
|
+
repo: null,
|
|
99
|
+
costUsd: 0,
|
|
100
|
+
tokens: { input: 0, output: 0, cacheRead: 0, cacheCreation: 0 },
|
|
101
|
+
toolUsage: {},
|
|
102
|
+
turns: 0,
|
|
103
|
+
durationMs: 0,
|
|
104
|
+
createdAt: new Date().toISOString(),
|
|
105
|
+
lastUpdatedAt: new Date().toISOString(),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
return store.sessions[threadTs]!;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
interface ProjectSummary {
|
|
112
|
+
repo: string;
|
|
113
|
+
totalCostUsd: number;
|
|
114
|
+
totalTokens: {
|
|
115
|
+
input: number;
|
|
116
|
+
output: number;
|
|
117
|
+
cacheRead: number;
|
|
118
|
+
cacheCreation: number;
|
|
119
|
+
};
|
|
120
|
+
toolUsage: Record<string, number>;
|
|
121
|
+
totalTurns: number;
|
|
122
|
+
totalDurationMs: number;
|
|
123
|
+
sessionCount: number;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export function getProjectSummaries(): ProjectSummary[] {
|
|
127
|
+
const store = loadStats();
|
|
128
|
+
const byRepo = new Map<string, ProjectSummary>();
|
|
129
|
+
|
|
130
|
+
for (const session of Object.values(store.sessions)) {
|
|
131
|
+
const repo = session.repo ?? "(no repo)";
|
|
132
|
+
let summary = byRepo.get(repo);
|
|
133
|
+
if (!summary) {
|
|
134
|
+
summary = {
|
|
135
|
+
repo,
|
|
136
|
+
totalCostUsd: 0,
|
|
137
|
+
totalTokens: { input: 0, output: 0, cacheRead: 0, cacheCreation: 0 },
|
|
138
|
+
toolUsage: {},
|
|
139
|
+
totalTurns: 0,
|
|
140
|
+
totalDurationMs: 0,
|
|
141
|
+
sessionCount: 0,
|
|
142
|
+
};
|
|
143
|
+
byRepo.set(repo, summary);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
summary.totalCostUsd += session.costUsd;
|
|
147
|
+
summary.totalTokens.input += session.tokens.input;
|
|
148
|
+
summary.totalTokens.output += session.tokens.output;
|
|
149
|
+
summary.totalTokens.cacheRead += session.tokens.cacheRead;
|
|
150
|
+
summary.totalTokens.cacheCreation += session.tokens.cacheCreation;
|
|
151
|
+
summary.totalTurns += session.turns;
|
|
152
|
+
summary.totalDurationMs += session.durationMs;
|
|
153
|
+
summary.sessionCount += 1;
|
|
154
|
+
|
|
155
|
+
for (const [tool, count] of Object.entries(session.toolUsage)) {
|
|
156
|
+
summary.toolUsage[tool] = (summary.toolUsage[tool] ?? 0) + count;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return [...byRepo.values()].sort(
|
|
161
|
+
(a, b) => b.totalCostUsd - a.totalCostUsd
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export function getSessionStats(threadTs: string): SessionStats | undefined {
|
|
166
|
+
const store = loadStats();
|
|
167
|
+
return store.sessions[threadTs];
|
|
168
|
+
}
|
package/src/services/usage.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { execSync } from "node:child_process";
|
|
2
|
+
import { getProjectSummaries } from "./stats.js";
|
|
2
3
|
|
|
3
4
|
interface UsageData {
|
|
4
5
|
fiveHour: { utilization: number; resetsAt: string };
|
|
@@ -73,10 +74,34 @@ export async function fetchUsage(): Promise<string> {
|
|
|
73
74
|
const fhLeft = data.five_hour?.resets_at ? formatRemaining(data.five_hour.resets_at) : "";
|
|
74
75
|
const sdLeft = data.seven_day?.resets_at ? formatRemaining(data.seven_day.resets_at) : "";
|
|
75
76
|
|
|
76
|
-
|
|
77
|
+
const lines = [
|
|
77
78
|
`:bar_chart: *Claude 사용량*`,
|
|
78
79
|
`• *5시간:* ${fh}%${fhLeft}`,
|
|
79
80
|
`• *7일:* ${sd}%${sdLeft}`,
|
|
80
81
|
`• *7일 (Sonnet):* ${ss}%`,
|
|
81
|
-
]
|
|
82
|
+
];
|
|
83
|
+
|
|
84
|
+
// Append project stats
|
|
85
|
+
const projects = getProjectSummaries();
|
|
86
|
+
if (projects.length > 0) {
|
|
87
|
+
lines.push("");
|
|
88
|
+
lines.push(`:memo: *프로젝트별 통계*`);
|
|
89
|
+
for (const p of projects) {
|
|
90
|
+
const cost = p.totalCostUsd > 0 ? `$${p.totalCostUsd.toFixed(4)}` : "$0";
|
|
91
|
+
const tokens = p.totalTokens.input + p.totalTokens.output;
|
|
92
|
+
const toolList = Object.entries(p.toolUsage)
|
|
93
|
+
.sort(([, a], [, b]) => b - a)
|
|
94
|
+
.slice(0, 5)
|
|
95
|
+
.map(([name, count]) => `${name}(${count})`)
|
|
96
|
+
.join(", ");
|
|
97
|
+
|
|
98
|
+
lines.push(`\n*${p.repo}* — ${p.sessionCount}개 세션`);
|
|
99
|
+
lines.push(` • 비용: ${cost} | 토큰: ${tokens.toLocaleString()} | 턴: ${p.totalTurns}`);
|
|
100
|
+
if (toolList) {
|
|
101
|
+
lines.push(` • 도구: ${toolList}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return lines.join("\n");
|
|
82
107
|
}
|