choavis-agent 1.4.0 → 1.4.2
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/.env.example +3 -2
- package/README.md +120 -205
- package/dist/agent/adapters/claude.d.ts +13 -0
- package/dist/agent/adapters/claude.d.ts.map +1 -0
- package/dist/agent/adapters/claude.js +199 -0
- package/dist/agent/adapters/claude.js.map +1 -0
- package/dist/agent/protocol.d.ts +56 -0
- package/dist/agent/protocol.d.ts.map +1 -0
- package/dist/agent/protocol.js +9 -0
- package/dist/agent/protocol.js.map +1 -0
- package/dist/agent/queue.d.ts.map +1 -1
- package/dist/agent/queue.js +4 -2
- package/dist/agent/queue.js.map +1 -1
- package/dist/agent/runner.d.ts +8 -0
- package/dist/agent/runner.d.ts.map +1 -1
- package/dist/agent/runner.js +13 -39
- package/dist/agent/runner.js.map +1 -1
- package/dist/agent/session.d.ts +27 -1
- package/dist/agent/session.d.ts.map +1 -1
- package/dist/agent/session.js +79 -3
- package/dist/agent/session.js.map +1 -1
- package/dist/agent/usage.d.ts +8 -5
- package/dist/agent/usage.d.ts.map +1 -1
- package/dist/agent/usage.js +21 -0
- package/dist/agent/usage.js.map +1 -1
- package/dist/approval/server.d.ts +11 -1
- package/dist/approval/server.d.ts.map +1 -1
- package/dist/approval/server.js +46 -4
- package/dist/approval/server.js.map +1 -1
- package/dist/approval/setup.d.ts +5 -0
- package/dist/approval/setup.d.ts.map +1 -1
- package/dist/approval/setup.js +31 -0
- package/dist/approval/setup.js.map +1 -1
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +18 -8
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/onboard.d.ts.map +1 -1
- package/dist/cli/onboard.js +299 -51
- package/dist/cli/onboard.js.map +1 -1
- package/dist/cli.js +10 -5
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +5 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +9 -1
- package/dist/config.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/slack/commands/compact.js +2 -2
- package/dist/slack/commands/compact.js.map +1 -1
- package/dist/slack/commands/help.d.ts.map +1 -1
- package/dist/slack/commands/help.js +16 -11
- package/dist/slack/commands/help.js.map +1 -1
- package/dist/slack/commands/index.d.ts.map +1 -1
- package/dist/slack/commands/index.js +26 -0
- package/dist/slack/commands/index.js.map +1 -1
- package/dist/slack/commands/inject.d.ts +3 -0
- package/dist/slack/commands/inject.d.ts.map +1 -0
- package/dist/slack/commands/inject.js +44 -0
- package/dist/slack/commands/inject.js.map +1 -0
- package/dist/slack/commands/memory.js +7 -7
- package/dist/slack/commands/memory.js.map +1 -1
- package/dist/slack/commands/model.d.ts +3 -0
- package/dist/slack/commands/model.d.ts.map +1 -0
- package/dist/slack/commands/model.js +43 -0
- package/dist/slack/commands/model.js.map +1 -0
- package/dist/slack/commands/new.js +1 -1
- package/dist/slack/commands/new.js.map +1 -1
- package/dist/slack/commands/permission.d.ts +3 -0
- package/dist/slack/commands/permission.d.ts.map +1 -0
- package/dist/slack/commands/permission.js +51 -0
- package/dist/slack/commands/permission.js.map +1 -0
- package/dist/slack/commands/project.js +2 -2
- package/dist/slack/commands/project.js.map +1 -1
- package/dist/slack/commands/resume.d.ts +3 -0
- package/dist/slack/commands/resume.d.ts.map +1 -0
- package/dist/slack/commands/resume.js +93 -0
- package/dist/slack/commands/resume.js.map +1 -0
- package/dist/slack/commands/session-info.d.ts +3 -0
- package/dist/slack/commands/session-info.d.ts.map +1 -0
- package/dist/slack/commands/session-info.js +33 -0
- package/dist/slack/commands/session-info.js.map +1 -0
- package/dist/slack/commands/sessions.d.ts +3 -0
- package/dist/slack/commands/sessions.d.ts.map +1 -0
- package/dist/slack/commands/sessions.js +54 -0
- package/dist/slack/commands/sessions.js.map +1 -0
- package/dist/slack/commands/status.d.ts.map +1 -1
- package/dist/slack/commands/status.js +7 -2
- package/dist/slack/commands/status.js.map +1 -1
- package/dist/slack/commands/usage.d.ts +5 -0
- package/dist/slack/commands/usage.d.ts.map +1 -1
- package/dist/slack/commands/usage.js +93 -12
- package/dist/slack/commands/usage.js.map +1 -1
- package/dist/slack/context.d.ts +11 -8
- package/dist/slack/context.d.ts.map +1 -1
- package/dist/slack/context.js +36 -14
- package/dist/slack/context.js.map +1 -1
- package/dist/slack/file-downloader.d.ts +18 -0
- package/dist/slack/file-downloader.d.ts.map +1 -0
- package/dist/slack/file-downloader.js +196 -0
- package/dist/slack/file-downloader.js.map +1 -0
- package/dist/slack/formatter.d.ts +0 -4
- package/dist/slack/formatter.d.ts.map +1 -1
- package/dist/slack/formatter.js +0 -8
- package/dist/slack/formatter.js.map +1 -1
- package/dist/slack/handlers.d.ts +3 -4
- package/dist/slack/handlers.d.ts.map +1 -1
- package/dist/slack/handlers.js +372 -259
- package/dist/slack/handlers.js.map +1 -1
- package/dist/slack/link-resolver.d.ts +24 -0
- package/dist/slack/link-resolver.d.ts.map +1 -0
- package/dist/slack/link-resolver.js +52 -0
- package/dist/slack/link-resolver.js.map +1 -0
- package/dist/slack/middleware.d.ts +17 -0
- package/dist/slack/middleware.d.ts.map +1 -0
- package/dist/slack/middleware.js +73 -0
- package/dist/slack/middleware.js.map +1 -0
- package/dist/slack/slack-retry.d.ts +18 -0
- package/dist/slack/slack-retry.d.ts.map +1 -0
- package/dist/slack/slack-retry.js +71 -0
- package/dist/slack/slack-retry.js.map +1 -0
- package/dist/slack/tool-formatter.d.ts +18 -0
- package/dist/slack/tool-formatter.d.ts.map +1 -0
- package/dist/slack/tool-formatter.js +154 -0
- package/dist/slack/tool-formatter.js.map +1 -0
- package/dist/slack/types.d.ts +22 -0
- package/dist/slack/types.d.ts.map +1 -0
- package/dist/slack/types.js +2 -0
- package/dist/slack/types.js.map +1 -0
- package/package.json +10 -10
- package/scripts/pretool-hook.mjs +0 -0
- package/slack-app-manifest.json +12 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { getWorkDir } from '../../agent/session.js';
|
|
2
2
|
import { config } from '../../config.js';
|
|
3
|
-
const TRIGGERS = ['$help', '$도움말', '
|
|
3
|
+
const TRIGGERS = ['$help', '$도움말', '/help'];
|
|
4
4
|
export const helpCommand = {
|
|
5
5
|
name: 'help',
|
|
6
6
|
match(text) {
|
|
@@ -29,16 +29,21 @@ export const helpCommand = {
|
|
|
29
29
|
' - 아무 메시지나 보내면 작업을 수행합니다',
|
|
30
30
|
' - 같은 스레드 내 대화는 맥락이 유지됩니다',
|
|
31
31
|
'',
|
|
32
|
-
'*명령어:*
|
|
33
|
-
' -
|
|
34
|
-
' -
|
|
35
|
-
' -
|
|
36
|
-
' -
|
|
37
|
-
' -
|
|
38
|
-
' -
|
|
39
|
-
' -
|
|
40
|
-
' -
|
|
41
|
-
' -
|
|
32
|
+
'*명령어:*',
|
|
33
|
+
' - `프로젝트: 이름` — 작업 디렉토리 전환',
|
|
34
|
+
' - `$status` — 현재 설정 및 상태 확인',
|
|
35
|
+
' - `$usage` / `사용량` — 사용량 조회 (`$usage me`, `$usage week`, `$usage month`)',
|
|
36
|
+
' - `$sessions` / `$세션` — 활성 세션 목록 조회',
|
|
37
|
+
' - `$resume <ID>` / `$이어서` — 기존 세션에 연결',
|
|
38
|
+
' - `$inject <ID> <명령>` — 특정 세션에 명령 주입',
|
|
39
|
+
' - `$new` — 세션 초기화 (대화 리셋)',
|
|
40
|
+
' - `$compact` — 컨텍스트 압축',
|
|
41
|
+
' - `$stop` / `$중지` — 현재 처리 중단',
|
|
42
|
+
' - `$model <이름>` — 모델 변경 (sonnet/opus/haiku)',
|
|
43
|
+
' - `$permission <모드>` — 권한 모드 변경 (bypass/plan/accept)',
|
|
44
|
+
' - `기억해: 내용` — 기억 저장 (모든 대화에 반영)',
|
|
45
|
+
' - `기억 목록` — 저장된 기억 조회',
|
|
46
|
+
' - `$help` — 이 메시지',
|
|
42
47
|
'',
|
|
43
48
|
`:file_folder: *현재 작업 디렉토리*: \`${getWorkDir(ctx.threadTs) || config.agent.workDir}\``,
|
|
44
49
|
].join('\n');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../../src/slack/commands/help.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAGzC,MAAM,QAAQ,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../../src/slack/commands/help.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAGzC,MAAM,QAAQ,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAE5C,MAAM,CAAC,MAAM,WAAW,GAAY;IAClC,IAAI,EAAE,MAAM;IAEZ,KAAK,CAAC,IAAY;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACjC,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QACpC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAmB;QAC/B,MAAM,QAAQ,GAAG;YACf,sCAAsC;YACtC,EAAE;YACF,4CAA4C;YAC5C,iCAAiC;YACjC,EAAE;YACF,aAAa;YACb,yBAAyB;YACzB,6BAA6B;YAC7B,yBAAyB;YACzB,qBAAqB;YACrB,6BAA6B;YAC7B,uBAAuB;YACvB,EAAE;YACF,QAAQ;YACR,2BAA2B;YAC3B,4BAA4B;YAC5B,EAAE;YACF,QAAQ;YACR,6BAA6B;YAC7B,+BAA+B;YAC/B,4EAA4E;YAC5E,uCAAuC;YACvC,yCAAyC;YACzC,wCAAwC;YACxC,6BAA6B;YAC7B,0BAA0B;YAC1B,gCAAgC;YAChC,+CAA+C;YAC/C,wDAAwD;YACxD,mCAAmC;YACnC,yBAAyB;YACzB,qBAAqB;YACrB,EAAE;YACF,iCAAiC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI;SACtF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;YAChC,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,SAAS,EAAE,GAAG,CAAC,QAAQ;YACvB,IAAI,EAAE,QAAQ;SACf,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACrB,CAAC;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/slack/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/slack/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAkBxE,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAElD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAO9D;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAK5F;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAgB1C;AAED,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -1,4 +1,17 @@
|
|
|
1
1
|
import { stopCommand } from './stop.js';
|
|
2
|
+
import { modelCommand } from './model.js';
|
|
3
|
+
import { permissionCommand } from './permission.js';
|
|
4
|
+
import { helpCommand } from './help.js';
|
|
5
|
+
import { statusCommand } from './status.js';
|
|
6
|
+
import { newCommand } from './new.js';
|
|
7
|
+
import { compactCommand } from './compact.js';
|
|
8
|
+
import { projectCommand } from './project.js';
|
|
9
|
+
import { usageCommand } from './usage.js';
|
|
10
|
+
import { memoryCommand } from './memory.js';
|
|
11
|
+
import { sessionsCommand } from './sessions.js';
|
|
12
|
+
import { sessionInfoCommand } from './session-info.js';
|
|
13
|
+
import { resumeCommand } from './resume.js';
|
|
14
|
+
import { injectCommand } from './inject.js';
|
|
2
15
|
const commands = [];
|
|
3
16
|
export function registerCommand(cmd) {
|
|
4
17
|
commands.push(cmd);
|
|
@@ -21,5 +34,18 @@ export async function executeCommand(match, ctx) {
|
|
|
21
34
|
export function registerAllCommands() {
|
|
22
35
|
commands.length = 0;
|
|
23
36
|
registerCommand(stopCommand);
|
|
37
|
+
registerCommand(modelCommand);
|
|
38
|
+
registerCommand(permissionCommand);
|
|
39
|
+
registerCommand(helpCommand);
|
|
40
|
+
registerCommand(statusCommand);
|
|
41
|
+
registerCommand(newCommand);
|
|
42
|
+
registerCommand(compactCommand);
|
|
43
|
+
registerCommand(projectCommand);
|
|
44
|
+
registerCommand(usageCommand);
|
|
45
|
+
registerCommand(memoryCommand);
|
|
46
|
+
registerCommand(sessionsCommand);
|
|
47
|
+
registerCommand(sessionInfoCommand);
|
|
48
|
+
registerCommand(resumeCommand);
|
|
49
|
+
registerCommand(injectCommand);
|
|
24
50
|
}
|
|
25
51
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/slack/commands/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/slack/commands/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,QAAQ,GAAc,EAAE,CAAC;AAE/B,MAAM,UAAU,eAAe,CAAC,GAAY;IAC1C,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACjC,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;IAC1B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAmB,EAAE,GAAmB;IAC3E,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC;IACxD,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,GAAG,CAAC,OAAO,CAAC,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IACpB,eAAe,CAAC,WAAW,CAAC,CAAC;IAC7B,eAAe,CAAC,YAAY,CAAC,CAAC;IAC9B,eAAe,CAAC,iBAAiB,CAAC,CAAC;IACnC,eAAe,CAAC,WAAW,CAAC,CAAC;IAC7B,eAAe,CAAC,aAAa,CAAC,CAAC;IAC/B,eAAe,CAAC,UAAU,CAAC,CAAC;IAC5B,eAAe,CAAC,cAAc,CAAC,CAAC;IAChC,eAAe,CAAC,cAAc,CAAC,CAAC;IAChC,eAAe,CAAC,YAAY,CAAC,CAAC;IAC9B,eAAe,CAAC,aAAa,CAAC,CAAC;IAC/B,eAAe,CAAC,eAAe,CAAC,CAAC;IACjC,eAAe,CAAC,kBAAkB,CAAC,CAAC;IACpC,eAAe,CAAC,aAAa,CAAC,CAAC;IAC/B,eAAe,CAAC,aAAa,CAAC,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inject.d.ts","sourceRoot":"","sources":["../../../src/slack/commands/inject.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAgC,MAAM,YAAY,CAAC;AAKxE,eAAO,MAAM,aAAa,EAAE,OA8C3B,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { getAllSessions, setSession } from '../../agent/session.js';
|
|
2
|
+
const INJECT_RE = /^\$inject\s+(\S+)\s+(.+)/is;
|
|
3
|
+
export const injectCommand = {
|
|
4
|
+
name: 'inject',
|
|
5
|
+
match(text) {
|
|
6
|
+
const m = INJECT_RE.exec(text);
|
|
7
|
+
if (!m)
|
|
8
|
+
return null;
|
|
9
|
+
return { name: 'inject', args: `${m[1]} ${m[2]}` };
|
|
10
|
+
},
|
|
11
|
+
async execute(ctx) {
|
|
12
|
+
const m = INJECT_RE.exec(ctx.text);
|
|
13
|
+
if (!m)
|
|
14
|
+
return;
|
|
15
|
+
const partialId = m[1];
|
|
16
|
+
const command = m[2];
|
|
17
|
+
// 세션 ID 부분 매칭
|
|
18
|
+
const allSessions = getAllSessions();
|
|
19
|
+
const found = allSessions.find((s) => s.sessionId.startsWith(partialId));
|
|
20
|
+
if (!found) {
|
|
21
|
+
await ctx.client.chat.postMessage({
|
|
22
|
+
channel: ctx.channel,
|
|
23
|
+
thread_ts: ctx.threadTs,
|
|
24
|
+
text: `:x: 세션 \`${partialId}\`을(를) 찾을 수 없습니다.`,
|
|
25
|
+
}).catch(() => { });
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
// 현재 스레드에 세션 연결
|
|
29
|
+
setSession(ctx.threadTs, found.sessionId, {
|
|
30
|
+
userId: ctx.userId,
|
|
31
|
+
channel: ctx.channel,
|
|
32
|
+
});
|
|
33
|
+
// 안내 메시지
|
|
34
|
+
await ctx.client.chat.postMessage({
|
|
35
|
+
channel: ctx.channel,
|
|
36
|
+
thread_ts: ctx.threadTs,
|
|
37
|
+
text: `:syringe: 세션 \`${found.sessionId}\`에 명령 주입 중...\n> ${command}`,
|
|
38
|
+
}).catch(() => { });
|
|
39
|
+
// 명령 전달 (순환 의존성 방지를 위해 dynamic import)
|
|
40
|
+
const { handleIncomingDirect } = await import('../handlers.js');
|
|
41
|
+
await handleIncomingDirect(command, ctx.channel, ctx.threadTs, ctx.messageTs, ctx.client, ctx.userId);
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=inject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inject.js","sourceRoot":"","sources":["../../../src/slack/commands/inject.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpE,MAAM,SAAS,GAAG,4BAA4B,CAAC;AAE/C,MAAM,CAAC,MAAM,aAAa,GAAY;IACpC,IAAI,EAAE,QAAQ;IAEd,KAAK,CAAC,IAAY;QAChB,MAAM,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QACpB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAmB;QAC/B,MAAM,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,CAAC;YAAE,OAAO;QAEf,MAAM,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAErB,cAAc;QACd,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;QAEzE,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;gBAChC,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,SAAS,EAAE,GAAG,CAAC,QAAQ;gBACvB,IAAI,EAAE,YAAY,SAAS,mBAAmB;aAC/C,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACnB,OAAO;QACT,CAAC;QAED,gBAAgB;QAChB,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,EAAE;YACxC,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,OAAO,EAAE,GAAG,CAAC,OAAO;SACrB,CAAC,CAAC;QAEH,SAAS;QACT,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;YAChC,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,SAAS,EAAE,GAAG,CAAC,QAAQ;YACvB,IAAI,EAAE,kBAAkB,KAAK,CAAC,SAAS,qBAAqB,OAAO,EAAE;SACtE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAEnB,uCAAuC;QACvC,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAChE,MAAM,oBAAoB,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACxG,CAAC;CACF,CAAC"}
|
|
@@ -3,16 +3,16 @@ import { config } from '../../config.js';
|
|
|
3
3
|
export const memoryCommand = {
|
|
4
4
|
name: 'memory',
|
|
5
5
|
match(text) {
|
|
6
|
-
//
|
|
7
|
-
let m = text.match(/^(
|
|
6
|
+
// 기억해: content
|
|
7
|
+
let m = text.match(/^(기억해|\$remember|\/remember)\s*[::]\s*(.+)$/is);
|
|
8
8
|
if (m)
|
|
9
9
|
return { name: 'memory', args: `add:${m[2].trim()}` };
|
|
10
|
-
//
|
|
11
|
-
m = text.match(/^(
|
|
10
|
+
// 기억 삭제: id
|
|
11
|
+
m = text.match(/^(기억\s*삭제|\$forget|\/forget)\s*[::]\s*(\S+)$/i);
|
|
12
12
|
if (m)
|
|
13
13
|
return { name: 'memory', args: `delete:${m[2].trim()}` };
|
|
14
|
-
//
|
|
15
|
-
if (/^(
|
|
14
|
+
// 기억 목록
|
|
15
|
+
if (/^(기억\s*목록|\$memories|\/memories)$/i.test(text)) {
|
|
16
16
|
return { name: 'memory', args: 'list' };
|
|
17
17
|
}
|
|
18
18
|
return null;
|
|
@@ -69,7 +69,7 @@ export const memoryCommand = {
|
|
|
69
69
|
const date = new Date(e.createdAt).toLocaleDateString('ko-KR');
|
|
70
70
|
text += `\`${e.id}\` ${e.content} _${date}_\n`;
|
|
71
71
|
}
|
|
72
|
-
text += '\n_삭제:
|
|
72
|
+
text += '\n_삭제: `기억 삭제: <ID>`_';
|
|
73
73
|
await ctx.client.chat.postMessage({
|
|
74
74
|
channel: ctx.channel,
|
|
75
75
|
thread_ts: ctx.threadTs,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/slack/commands/memory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,MAAM,CAAC,MAAM,aAAa,GAAY;IACpC,IAAI,EAAE,QAAQ;IAEd,KAAK,CAAC,IAAY;QAChB,
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/slack/commands/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/slack/commands/model.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAgC,MAAM,YAAY,CAAC;AASxE,eAAO,MAAM,YAAY,EAAE,OAuC1B,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { config, setRuntimeConfig } from '../../config.js';
|
|
2
|
+
// 모델 별칭 → 실제 모델 ID
|
|
3
|
+
const MODEL_ALIASES = {
|
|
4
|
+
sonnet: 'claude-sonnet-4-20250514',
|
|
5
|
+
opus: 'claude-opus-4-20250514',
|
|
6
|
+
haiku: 'claude-haiku-4-5-20251001',
|
|
7
|
+
};
|
|
8
|
+
export const modelCommand = {
|
|
9
|
+
name: 'model',
|
|
10
|
+
match(text) {
|
|
11
|
+
const lower = text.toLowerCase();
|
|
12
|
+
if (lower === '$model' || lower === '$모델') {
|
|
13
|
+
return { name: 'model', args: '' };
|
|
14
|
+
}
|
|
15
|
+
if (lower.startsWith('$model ') || lower.startsWith('$모델 ')) {
|
|
16
|
+
const args = text.slice(text.indexOf(' ') + 1).trim();
|
|
17
|
+
return { name: 'model', args };
|
|
18
|
+
}
|
|
19
|
+
return null;
|
|
20
|
+
},
|
|
21
|
+
async execute(ctx) {
|
|
22
|
+
const arg = ctx.text.trim();
|
|
23
|
+
// 인자 없으면 현재 모델 표시
|
|
24
|
+
if (!arg) {
|
|
25
|
+
const current = config.agent.model || '(기본값)';
|
|
26
|
+
await ctx.client.chat.postMessage({
|
|
27
|
+
channel: ctx.channel,
|
|
28
|
+
thread_ts: ctx.threadTs,
|
|
29
|
+
text: `:brain: 현재 모델: \`${current}\``,
|
|
30
|
+
}).catch(() => { });
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
// 별칭 또는 직접 지정
|
|
34
|
+
const resolved = MODEL_ALIASES[arg.toLowerCase()] ?? arg;
|
|
35
|
+
setRuntimeConfig('model', resolved);
|
|
36
|
+
await ctx.client.chat.postMessage({
|
|
37
|
+
channel: ctx.channel,
|
|
38
|
+
thread_ts: ctx.threadTs,
|
|
39
|
+
text: `:brain: 모델 변경: \`${resolved}\``,
|
|
40
|
+
}).catch(() => { });
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../../src/slack/commands/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAG3D,mBAAmB;AACnB,MAAM,aAAa,GAA2B;IAC5C,MAAM,EAAE,0BAA0B;IAClC,IAAI,EAAE,wBAAwB;IAC9B,KAAK,EAAE,2BAA2B;CACnC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAY;IACnC,IAAI,EAAE,OAAO;IAEb,KAAK,CAAC,IAAY;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACjC,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;YAC1C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QACrC,CAAC;QACD,IAAI,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACtD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACjC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAmB;QAC/B,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5B,kBAAkB;QAClB,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC;YAC9C,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;gBAChC,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,SAAS,EAAE,GAAG,CAAC,QAAQ;gBACvB,IAAI,EAAE,oBAAoB,OAAO,IAAI;aACtC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACnB,OAAO;QACT,CAAC;QAED,cAAc;QACd,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,IAAI,GAAG,CAAC;QACzD,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAEpC,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;YAChC,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,SAAS,EAAE,GAAG,CAAC,QAAQ;YACvB,IAAI,EAAE,oBAAoB,QAAQ,IAAI;SACvC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACrB,CAAC;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"new.js","sourceRoot":"","sources":["../../../src/slack/commands/new.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAGtD,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"new.js","sourceRoot":"","sources":["../../../src/slack/commands/new.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAGtD,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;AAE9D,MAAM,CAAC,MAAM,UAAU,GAAY;IACjC,IAAI,EAAE,KAAK;IAEX,KAAK,CAAC,IAAY;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACjC,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QACnC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAmB;QAC/B,MAAM,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,YAAY;YACtB,CAAC,CAAC,iDAAiD,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ;YACnF,CAAC,CAAC,yCAAyC,CAAC;QAE9C,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;YAChC,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,SAAS,EAAE,GAAG,CAAC,QAAQ;YACvB,IAAI,EAAE,GAAG;SACV,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACrB,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission.d.ts","sourceRoot":"","sources":["../../../src/slack/commands/permission.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAgC,MAAM,YAAY,CAAC;AAUxE,eAAO,MAAM,iBAAiB,EAAE,OA+C/B,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { config, setRuntimeConfig } from '../../config.js';
|
|
2
|
+
// 허용되는 권한 모드
|
|
3
|
+
const VALID_MODES = {
|
|
4
|
+
bypass: 'bypassPermissions',
|
|
5
|
+
plan: 'plan',
|
|
6
|
+
accept: 'acceptEdits',
|
|
7
|
+
acceptedits: 'acceptEdits',
|
|
8
|
+
};
|
|
9
|
+
export const permissionCommand = {
|
|
10
|
+
name: 'permission',
|
|
11
|
+
match(text) {
|
|
12
|
+
const lower = text.toLowerCase();
|
|
13
|
+
if (lower === '$permission' || lower === '$권한') {
|
|
14
|
+
return { name: 'permission', args: '' };
|
|
15
|
+
}
|
|
16
|
+
if (lower.startsWith('$permission ') || lower.startsWith('$권한 ')) {
|
|
17
|
+
const args = text.slice(text.indexOf(' ') + 1).trim();
|
|
18
|
+
return { name: 'permission', args };
|
|
19
|
+
}
|
|
20
|
+
return null;
|
|
21
|
+
},
|
|
22
|
+
async execute(ctx) {
|
|
23
|
+
const arg = ctx.text.trim();
|
|
24
|
+
// 인자 없으면 현재 모드 표시
|
|
25
|
+
if (!arg) {
|
|
26
|
+
await ctx.client.chat.postMessage({
|
|
27
|
+
channel: ctx.channel,
|
|
28
|
+
thread_ts: ctx.threadTs,
|
|
29
|
+
text: `:lock: 현재 권한 모드: \`${config.agent.permissionMode}\``,
|
|
30
|
+
}).catch(() => { });
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const resolved = VALID_MODES[arg.toLowerCase()];
|
|
34
|
+
if (!resolved) {
|
|
35
|
+
const validKeys = Object.keys(VALID_MODES).join(', ');
|
|
36
|
+
await ctx.client.chat.postMessage({
|
|
37
|
+
channel: ctx.channel,
|
|
38
|
+
thread_ts: ctx.threadTs,
|
|
39
|
+
text: `:warning: 알 수 없는 모드: \`${arg}\`\n사용 가능: ${validKeys}`,
|
|
40
|
+
}).catch(() => { });
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
setRuntimeConfig('permissionMode', resolved);
|
|
44
|
+
await ctx.client.chat.postMessage({
|
|
45
|
+
channel: ctx.channel,
|
|
46
|
+
thread_ts: ctx.threadTs,
|
|
47
|
+
text: `:lock: 권한 모드 변경: \`${resolved}\``,
|
|
48
|
+
}).catch(() => { });
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=permission.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission.js","sourceRoot":"","sources":["../../../src/slack/commands/permission.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAG3D,aAAa;AACb,MAAM,WAAW,GAA2B;IAC1C,MAAM,EAAE,mBAAmB;IAC3B,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,aAAa;IACrB,WAAW,EAAE,aAAa;CAC3B,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAY;IACxC,IAAI,EAAE,YAAY;IAElB,KAAK,CAAC,IAAY;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACjC,IAAI,KAAK,KAAK,aAAa,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;YAC/C,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QAC1C,CAAC;QACD,IAAI,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACjE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACtD,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;QACtC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAmB;QAC/B,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5B,kBAAkB;QAClB,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;gBAChC,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,SAAS,EAAE,GAAG,CAAC,QAAQ;gBACvB,IAAI,EAAE,sBAAsB,MAAM,CAAC,KAAK,CAAC,cAAc,IAAI;aAC5D,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACnB,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtD,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;gBAChC,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,SAAS,EAAE,GAAG,CAAC,QAAQ;gBACvB,IAAI,EAAE,0BAA0B,GAAG,cAAc,SAAS,EAAE;aAC7D,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACnB,OAAO;QACT,CAAC;QAED,gBAAgB,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;QAE7C,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;YAChC,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,SAAS,EAAE,GAAG,CAAC,QAAQ;YACvB,IAAI,EAAE,sBAAsB,QAAQ,IAAI;SACzC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACrB,CAAC;CACF,CAAC"}
|
|
@@ -3,9 +3,9 @@ import { config } from '../../config.js';
|
|
|
3
3
|
export const projectCommand = {
|
|
4
4
|
name: 'project',
|
|
5
5
|
match(text) {
|
|
6
|
-
const m = text.match(
|
|
6
|
+
const m = text.match(/^프로젝트[:\s]+(\S+)$/);
|
|
7
7
|
if (m) {
|
|
8
|
-
return { name: 'project', args: m[
|
|
8
|
+
return { name: 'project', args: m[1] };
|
|
9
9
|
}
|
|
10
10
|
return null;
|
|
11
11
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../../src/slack/commands/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAGzC,MAAM,CAAC,MAAM,cAAc,GAAY;IACrC,IAAI,EAAE,SAAS;IAEf,KAAK,CAAC,IAAY;QAChB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../../src/slack/commands/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAGzC,MAAM,CAAC,MAAM,cAAc,GAAY;IACrC,IAAI,EAAE,SAAS;IAEf,KAAK,CAAC,IAAY;QAChB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAC1C,IAAI,CAAC,EAAE,CAAC;YACN,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAmB;QAC/B,MAAM,WAAW,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,kBAAkB;QAChD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;QACvC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE1C,IAAI,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAC1B,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;YAChD,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;gBAChC,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,SAAS,EAAE,GAAG,CAAC,QAAQ;gBACvB,IAAI,EAAE,wBAAwB,WAAW,mBAAmB,QAAQ,CAAC,WAAW,CAAC,IAAI;aACtF,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACrB,CAAC;aAAM,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,IAAI,QAAQ,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzF,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;gBAChC,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,SAAS,EAAE,GAAG,CAAC,QAAQ;gBACvB,IAAI,EAAE,eAAe,WAAW,qCAAqC,IAAI,EAAE;aAC5E,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;gBAChC,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,SAAS,EAAE,GAAG,CAAC,QAAQ;gBACvB,IAAI,EAAE,yDAAyD;aAChE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume.d.ts","sourceRoot":"","sources":["../../../src/slack/commands/resume.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAgC,MAAM,YAAY,CAAC;AAExE,eAAO,MAAM,aAAa,EAAE,OAiG3B,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { getAllSessions, findSessionById, findBySessionId, getSession, setSession, setWorkDir } from '../../agent/session.js';
|
|
2
|
+
export const resumeCommand = {
|
|
3
|
+
name: 'resume',
|
|
4
|
+
match(text) {
|
|
5
|
+
const lower = text.toLowerCase();
|
|
6
|
+
if (lower === '$resume' || lower === '$이어서') {
|
|
7
|
+
return { name: 'resume', args: '' };
|
|
8
|
+
}
|
|
9
|
+
const patterns = [/^\$resume\s+(.+)$/i, /^\$이어서\s+(.+)$/i];
|
|
10
|
+
for (const pattern of patterns) {
|
|
11
|
+
const m = text.match(pattern);
|
|
12
|
+
if (m)
|
|
13
|
+
return { name: 'resume', args: m[1].trim() };
|
|
14
|
+
}
|
|
15
|
+
return null;
|
|
16
|
+
},
|
|
17
|
+
async execute(ctx) {
|
|
18
|
+
const partialId = ctx.text.trim();
|
|
19
|
+
// 인자 없으면 활성 세션 목록 표시
|
|
20
|
+
if (!partialId) {
|
|
21
|
+
const sessions = getAllSessions();
|
|
22
|
+
let text = ':mag: *사용법:* `$resume <세션ID>` (8자리 이상 부분 매칭)\n';
|
|
23
|
+
if (sessions.length > 0) {
|
|
24
|
+
text += '\n*최근 세션:*\n';
|
|
25
|
+
for (const s of sessions.slice(0, 5)) {
|
|
26
|
+
const short = s.sessionId.slice(0, 8);
|
|
27
|
+
const user = s.userId ? `<@${s.userId}>` : '(알 수 없음)';
|
|
28
|
+
const prompt = s.lastPrompt ? `_${s.lastPrompt}_` : '(없음)';
|
|
29
|
+
text += ` \`${short}\` ${user} - ${prompt}\n`;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
text += '\n활성 세션이 없습니다.';
|
|
34
|
+
}
|
|
35
|
+
await ctx.client.chat.postMessage({
|
|
36
|
+
channel: ctx.channel,
|
|
37
|
+
thread_ts: ctx.threadTs,
|
|
38
|
+
text,
|
|
39
|
+
}).catch(() => { });
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
// 이미 같은 세션이 연결되어 있는지 확인
|
|
43
|
+
const current = getSession(ctx.threadTs);
|
|
44
|
+
if (current && current.startsWith(partialId)) {
|
|
45
|
+
await ctx.client.chat.postMessage({
|
|
46
|
+
channel: ctx.channel,
|
|
47
|
+
thread_ts: ctx.threadTs,
|
|
48
|
+
text: ':information_source: 이미 이 세션이 연결되어 있습니다.',
|
|
49
|
+
}).catch(() => { });
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
// 부분 매칭으로 세션 검색
|
|
53
|
+
const found = findSessionById(partialId);
|
|
54
|
+
if (!found) {
|
|
55
|
+
await ctx.client.chat.postMessage({
|
|
56
|
+
channel: ctx.channel,
|
|
57
|
+
thread_ts: ctx.threadTs,
|
|
58
|
+
text: `:x: 세션 \`${partialId}\`을(를) 찾을 수 없습니다.\n\`$resume\`으로 활성 세션 목록을 확인하세요.`,
|
|
59
|
+
}).catch(() => { });
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
// workDir 복사 (정확한 세션 ID로 조회)
|
|
63
|
+
const source = findBySessionId(found.sessionId);
|
|
64
|
+
setSession(ctx.threadTs, found.sessionId, {
|
|
65
|
+
userId: ctx.userId,
|
|
66
|
+
channel: ctx.channel,
|
|
67
|
+
});
|
|
68
|
+
if (source?.workDir) {
|
|
69
|
+
setWorkDir(ctx.threadTs, source.workDir);
|
|
70
|
+
// setWorkDir이 세션을 초기화하므로 다시 설정
|
|
71
|
+
setSession(ctx.threadTs, found.sessionId, {
|
|
72
|
+
userId: ctx.userId,
|
|
73
|
+
channel: ctx.channel,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
const shortId = found.sessionId.slice(0, 8);
|
|
77
|
+
const origUser = found.userId ? `<@${found.userId}>` : '(알 수 없음)';
|
|
78
|
+
const lastPrompt = found.lastPrompt ? `_${found.lastPrompt}_` : '(없음)';
|
|
79
|
+
await ctx.client.chat.postMessage({
|
|
80
|
+
channel: ctx.channel,
|
|
81
|
+
thread_ts: ctx.threadTs,
|
|
82
|
+
text: [
|
|
83
|
+
`:link: 세션 \`${shortId}\` 연결됨`,
|
|
84
|
+
`*원래 사용자:* ${origUser}`,
|
|
85
|
+
`*마지막 작업:* ${lastPrompt}`,
|
|
86
|
+
source?.workDir ? `*작업 디렉토리:* \`${source.workDir}\`` : '',
|
|
87
|
+
'',
|
|
88
|
+
'이제 이 스레드에서 해당 세션으로 이어서 대화할 수 있습니다.',
|
|
89
|
+
].filter(Boolean).join('\n'),
|
|
90
|
+
}).catch(() => { });
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
//# sourceMappingURL=resume.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume.js","sourceRoot":"","sources":["../../../src/slack/commands/resume.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-info.d.ts","sourceRoot":"","sources":["../../../src/slack/commands/session-info.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAgC,MAAM,YAAY,CAAC;AAExE,eAAO,MAAM,kBAAkB,EAAE,OAgChC,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { getSession, getWorkDir } from '../../agent/session.js';
|
|
2
|
+
export const sessionInfoCommand = {
|
|
3
|
+
name: 'session-info',
|
|
4
|
+
match(text) {
|
|
5
|
+
const lower = text.toLowerCase();
|
|
6
|
+
if (['$session', '$세션'].includes(lower)) {
|
|
7
|
+
return { name: 'session-info', args: '' };
|
|
8
|
+
}
|
|
9
|
+
return null;
|
|
10
|
+
},
|
|
11
|
+
async execute(ctx) {
|
|
12
|
+
const sessionId = getSession(ctx.threadTs);
|
|
13
|
+
const workDir = getWorkDir(ctx.threadTs);
|
|
14
|
+
let msg;
|
|
15
|
+
if (sessionId) {
|
|
16
|
+
const parts = [`:brain: *세션 정보*`];
|
|
17
|
+
parts.push(`• ID: \`${sessionId}\``);
|
|
18
|
+
if (workDir)
|
|
19
|
+
parts.push(`• 작업 디렉토리: \`${workDir}\``);
|
|
20
|
+
parts.push(`\n다른 스레드에서 이어서 사용하려면:\n\`$resume ${sessionId}\``);
|
|
21
|
+
msg = parts.join('\n');
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
msg = ':information_source: 이 스레드에 활성 세션이 없습니다.';
|
|
25
|
+
}
|
|
26
|
+
await ctx.client.chat.postMessage({
|
|
27
|
+
channel: ctx.channel,
|
|
28
|
+
thread_ts: ctx.threadTs,
|
|
29
|
+
text: msg,
|
|
30
|
+
}).catch(() => { });
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=session-info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-info.js","sourceRoot":"","sources":["../../../src/slack/commands/session-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGhE,MAAM,CAAC,MAAM,kBAAkB,GAAY;IACzC,IAAI,EAAE,cAAc;IAEpB,KAAK,CAAC,IAAY;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACjC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACxC,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QAC5C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAmB;QAC/B,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEzC,IAAI,GAAW,CAAC;QAChB,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,KAAK,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,WAAW,SAAS,IAAI,CAAC,CAAC;YACrC,IAAI,OAAO;gBAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,OAAO,IAAI,CAAC,CAAC;YACrD,KAAK,CAAC,IAAI,CAAC,oCAAoC,SAAS,IAAI,CAAC,CAAC;YAC9D,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,GAAG,GAAG,0CAA0C,CAAC;QACnD,CAAC;QAED,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;YAChC,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,SAAS,EAAE,GAAG,CAAC,QAAQ;YACvB,IAAI,EAAE,GAAG;SACV,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACrB,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../../src/slack/commands/sessions.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAgC,MAAM,YAAY,CAAC;AAaxE,eAAO,MAAM,eAAe,EAAE,OA6C7B,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { getAllSessions } from '../../agent/session.js';
|
|
2
|
+
import { getActiveAgentCount, getMaxConcurrent } from '../middleware.js';
|
|
3
|
+
const TRIGGERS = ['$sessions', '$세션', '$세션목록'];
|
|
4
|
+
function formatTimeAgo(ms) {
|
|
5
|
+
const seconds = Math.floor(ms / 1000);
|
|
6
|
+
if (seconds < 60)
|
|
7
|
+
return `${seconds}초 전`;
|
|
8
|
+
const minutes = Math.floor(seconds / 60);
|
|
9
|
+
if (minutes < 60)
|
|
10
|
+
return `${minutes}분 전`;
|
|
11
|
+
const hours = Math.floor(minutes / 60);
|
|
12
|
+
return `${hours}시간 전`;
|
|
13
|
+
}
|
|
14
|
+
export const sessionsCommand = {
|
|
15
|
+
name: 'sessions',
|
|
16
|
+
match(text) {
|
|
17
|
+
const lower = text.toLowerCase();
|
|
18
|
+
if (TRIGGERS.includes(lower)) {
|
|
19
|
+
return { name: 'sessions', args: '' };
|
|
20
|
+
}
|
|
21
|
+
return null;
|
|
22
|
+
},
|
|
23
|
+
async execute(ctx) {
|
|
24
|
+
const sessions = getAllSessions();
|
|
25
|
+
const activeCount = getActiveAgentCount();
|
|
26
|
+
const maxCount = getMaxConcurrent();
|
|
27
|
+
const now = Date.now();
|
|
28
|
+
let output = `:desktop_computer: *활성 세션 ${sessions.length}개* (처리 중 ${activeCount}/${maxCount})\n`;
|
|
29
|
+
if (sessions.length === 0) {
|
|
30
|
+
output += '\n_활성 세션이 없습니다._\n';
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
output += '\n';
|
|
34
|
+
for (let i = 0; i < sessions.length; i++) {
|
|
35
|
+
const s = sessions[i];
|
|
36
|
+
const shortId = s.sessionId.slice(0, 8);
|
|
37
|
+
const timeAgo = formatTimeAgo(now - s.lastAccessedAt);
|
|
38
|
+
const userMention = s.userId ? `<@${s.userId}>` : '(알 수 없음)';
|
|
39
|
+
// 자신의 세션만 프롬프트 공개, 타인 세션은 보호
|
|
40
|
+
const isOwn = ctx.userId && s.userId === ctx.userId;
|
|
41
|
+
const prompt = isOwn && s.lastPrompt ? s.lastPrompt : '(비공개)';
|
|
42
|
+
output += `*${i + 1}.* \`${shortId}\` · ${userMention} · ${timeAgo}\n`;
|
|
43
|
+
output += ` _${prompt}_\n`;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
output += '\n_`$resume <세션ID>` 로 세션에 연결, `$inject <세션ID> <명령>` 으로 명령 주입_';
|
|
47
|
+
await ctx.client.chat.postMessage({
|
|
48
|
+
channel: ctx.channel,
|
|
49
|
+
thread_ts: ctx.threadTs,
|
|
50
|
+
text: output,
|
|
51
|
+
}).catch(() => { });
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../../src/slack/commands/sessions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/slack/commands/status.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/slack/commands/status.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAgC,MAAM,YAAY,CAAC;AAIxE,eAAO,MAAM,aAAa,EAAE,OA+D3B,CAAC"}
|