ccpoke 1.7.8 → 1.7.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/claude-code/claude-code-provider.js +14 -21
- package/dist/agent/claude-code/claude-code-provider.js.map +1 -1
- package/dist/agent/codex/codex-provider.js +1 -9
- package/dist/agent/codex/codex-provider.js.map +1 -1
- package/dist/agent/cursor/cursor-provider.js +2 -12
- package/dist/agent/cursor/cursor-provider.js.map +1 -1
- package/dist/agent/gemini-cli/gemini-cli-provider.js +1 -9
- package/dist/agent/gemini-cli/gemini-cli-provider.js.map +1 -1
- package/dist/agent/opencode/opencode-provider.js +1 -9
- package/dist/agent/opencode/opencode-provider.js.map +1 -1
- package/dist/channel/discord/discord-permission-handler.d.ts +3 -1
- package/dist/channel/discord/discord-permission-handler.js +70 -31
- package/dist/channel/discord/discord-permission-handler.js.map +1 -1
- package/dist/channel/permission-tui-injector.d.ts +16 -0
- package/dist/channel/permission-tui-injector.js +65 -0
- package/dist/channel/permission-tui-injector.js.map +1 -0
- package/dist/channel/summarize-tool.js +12 -0
- package/dist/channel/summarize-tool.js.map +1 -1
- package/dist/channel/telegram/ask-question-handler.js +9 -6
- package/dist/channel/telegram/ask-question-handler.js.map +1 -1
- package/dist/channel/telegram/escape-markdown.js +19 -5
- package/dist/channel/telegram/escape-markdown.js.map +1 -1
- package/dist/channel/telegram/permission-request-handler.d.ts +3 -2
- package/dist/channel/telegram/permission-request-handler.js +61 -25
- package/dist/channel/telegram/permission-request-handler.js.map +1 -1
- package/dist/channel/telegram/prompt-handler.js +2 -1
- package/dist/channel/telegram/prompt-handler.js.map +1 -1
- package/dist/channel/telegram/telegram-channel.js +37 -34
- package/dist/channel/telegram/telegram-channel.js.map +1 -1
- package/dist/channel/telegram/telegram-sender.d.ts +1 -0
- package/dist/channel/telegram/telegram-sender.js +9 -2
- package/dist/channel/telegram/telegram-sender.js.map +1 -1
- package/dist/i18n/locales/en.js +2 -0
- package/dist/i18n/locales/en.js.map +1 -1
- package/dist/i18n/locales/vi.js +2 -0
- package/dist/i18n/locales/vi.js.map +1 -1
- package/dist/i18n/locales/zh.js +2 -0
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/i18n/types.d.ts +2 -0
- package/dist/server/api-server.js +6 -0
- package/dist/server/api-server.js.map +1 -1
- package/dist/utils/event-collector.d.ts +5 -0
- package/dist/utils/event-collector.js +30 -0
- package/dist/utils/event-collector.js.map +1 -0
- package/dist/utils/markdown.d.ts +1 -0
- package/dist/utils/markdown.js +27 -6
- package/dist/utils/markdown.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
import { existsSync } from "node:fs";
|
|
2
|
-
import { AGENT_START_COMMANDS } from "../../channel/agent-launcher.js";
|
|
3
|
-
import { t } from "../../i18n/index.js";
|
|
4
2
|
import { collectGitChanges } from "../../utils/git-collector.js";
|
|
5
3
|
import { logger } from "../../utils/log.js";
|
|
6
4
|
import { paths } from "../../utils/paths.js";
|
|
7
|
-
import { isCommandAvailable } from "../../utils/shell.js";
|
|
8
5
|
import { AGENT_DISPLAY_NAMES, AgentName, } from "../types.js";
|
|
9
6
|
import { claudeCodeInstaller } from "./claude-code-installer.js";
|
|
10
7
|
import { extractProjectName, isValidStopEvent, parseTranscript } from "./claude-code-parser.js";
|
|
@@ -15,13 +12,7 @@ export class ClaudeCodeProvider {
|
|
|
15
12
|
settleDelayMs = TRANSCRIPT_SETTLE_DELAY_MS;
|
|
16
13
|
submitKeys = ["Enter"];
|
|
17
14
|
detect() {
|
|
18
|
-
|
|
19
|
-
return false;
|
|
20
|
-
const startCommand = AGENT_START_COMMANDS[AgentName.ClaudeCode];
|
|
21
|
-
if (!startCommand)
|
|
22
|
-
return false;
|
|
23
|
-
const binary = startCommand.split(" ")[0];
|
|
24
|
-
return isCommandAvailable(binary);
|
|
15
|
+
return existsSync(paths.claudeDir);
|
|
25
16
|
}
|
|
26
17
|
isHookInstalled() {
|
|
27
18
|
return claudeCodeInstaller.isInstalled();
|
|
@@ -39,24 +30,25 @@ export class ClaudeCodeProvider {
|
|
|
39
30
|
if (!isValidStopEvent(raw)) {
|
|
40
31
|
return this.createFallbackResult(raw);
|
|
41
32
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
33
|
+
const obj = raw;
|
|
34
|
+
const bodyMessage = typeof obj.last_assistant_message === "string" ? obj.last_assistant_message : "";
|
|
35
|
+
let transcriptModel = "";
|
|
36
|
+
let transcriptMessage = "";
|
|
46
37
|
try {
|
|
47
|
-
summary = parseTranscript(raw.transcript_path);
|
|
38
|
+
const summary = parseTranscript(raw.transcript_path);
|
|
39
|
+
transcriptModel = summary.model;
|
|
40
|
+
transcriptMessage = summary.lastAssistantMessage;
|
|
48
41
|
}
|
|
49
|
-
catch
|
|
50
|
-
logger.
|
|
42
|
+
catch {
|
|
43
|
+
logger.debug("[ClaudeCode:transcript] parse failed, using body payload only");
|
|
51
44
|
}
|
|
52
45
|
const gitChanges = collectGitChanges(raw.cwd);
|
|
53
|
-
const obj = raw;
|
|
54
46
|
const tmuxTarget = typeof obj.tmux_target === "string" ? obj.tmux_target : undefined;
|
|
55
47
|
return {
|
|
56
48
|
projectName: extractProjectName(raw.cwd, raw.transcript_path),
|
|
57
|
-
responseSummary:
|
|
49
|
+
responseSummary: bodyMessage || transcriptMessage,
|
|
58
50
|
gitChanges,
|
|
59
|
-
model:
|
|
51
|
+
model: transcriptModel,
|
|
60
52
|
agentSessionId: raw.session_id,
|
|
61
53
|
cwd: raw.cwd,
|
|
62
54
|
tmuxTarget,
|
|
@@ -67,9 +59,10 @@ export class ClaudeCodeProvider {
|
|
|
67
59
|
const cwd = typeof obj.cwd === "string" ? obj.cwd : "";
|
|
68
60
|
const transcriptPath = typeof obj.transcript_path === "string" ? obj.transcript_path : "";
|
|
69
61
|
const tmuxTarget = typeof obj.tmux_target === "string" ? obj.tmux_target : undefined;
|
|
62
|
+
const bodyMessage = typeof obj.last_assistant_message === "string" ? obj.last_assistant_message : "";
|
|
70
63
|
return {
|
|
71
64
|
projectName: cwd ? extractProjectName(cwd, transcriptPath) : "unknown",
|
|
72
|
-
responseSummary:
|
|
65
|
+
responseSummary: bodyMessage,
|
|
73
66
|
gitChanges: cwd ? collectGitChanges(cwd) : [],
|
|
74
67
|
model: "",
|
|
75
68
|
agentSessionId: typeof obj.session_id === "string" ? obj.session_id : undefined,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-code-provider.js","sourceRoot":"","sources":["../../../src/agent/claude-code/claude-code-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"claude-code-provider.js","sourceRoot":"","sources":["../../../src/agent/claude-code/claude-code-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { existsSync } from "node:fs";
|
|
2
|
-
import { AGENT_START_COMMANDS } from "../../channel/agent-launcher.js";
|
|
3
2
|
import { collectGitChanges } from "../../utils/git-collector.js";
|
|
4
3
|
import { logger } from "../../utils/log.js";
|
|
5
4
|
import { paths } from "../../utils/paths.js";
|
|
6
|
-
import { isCommandAvailable } from "../../utils/shell.js";
|
|
7
5
|
import { AGENT_DISPLAY_NAMES, AgentName, } from "../types.js";
|
|
8
6
|
import { codexInstaller } from "./codex-installer.js";
|
|
9
7
|
import { extractProjectName, isValidNotifyEvent, parseNotifyEvent, parseRolloutFile, } from "./codex-parser.js";
|
|
@@ -14,13 +12,7 @@ export class CodexProvider {
|
|
|
14
12
|
settleDelayMs = ROLLOUT_SETTLE_DELAY_MS;
|
|
15
13
|
submitKeys = ["Escape", "Enter"];
|
|
16
14
|
detect() {
|
|
17
|
-
|
|
18
|
-
return false;
|
|
19
|
-
const startCommand = AGENT_START_COMMANDS[AgentName.Codex];
|
|
20
|
-
if (!startCommand)
|
|
21
|
-
return false;
|
|
22
|
-
const binary = startCommand.split(" ")[0];
|
|
23
|
-
return isCommandAvailable(binary);
|
|
15
|
+
return existsSync(paths.codexDir);
|
|
24
16
|
}
|
|
25
17
|
isHookInstalled() {
|
|
26
18
|
return codexInstaller.isInstalled();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-provider.js","sourceRoot":"","sources":["../../../src/agent/codex/codex-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"codex-provider.js","sourceRoot":"","sources":["../../../src/agent/codex/codex-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
import { existsSync } from "node:fs";
|
|
2
|
-
import { homedir } from "node:os";
|
|
3
|
-
import { join } from "node:path";
|
|
4
|
-
import { AGENT_START_COMMANDS } from "../../channel/agent-launcher.js";
|
|
5
2
|
import { t } from "../../i18n/index.js";
|
|
6
3
|
import { collectGitChanges } from "../../utils/git-collector.js";
|
|
7
4
|
import { logger } from "../../utils/log.js";
|
|
8
|
-
import {
|
|
5
|
+
import { paths } from "../../utils/paths.js";
|
|
9
6
|
import { AGENT_DISPLAY_NAMES, AgentName, } from "../types.js";
|
|
10
7
|
import { cursorInstaller } from "./cursor-installer.js";
|
|
11
8
|
import { extractProjectName, isValidStopEvent, parseStopEvent, parseTranscript, } from "./cursor-parser.js";
|
|
@@ -16,14 +13,7 @@ export class CursorProvider {
|
|
|
16
13
|
settleDelayMs = 0;
|
|
17
14
|
submitKeys = ["Enter"];
|
|
18
15
|
detect() {
|
|
19
|
-
|
|
20
|
-
if (!hasCursorDir)
|
|
21
|
-
return false;
|
|
22
|
-
const startCommand = AGENT_START_COMMANDS[AgentName.Cursor];
|
|
23
|
-
if (!startCommand)
|
|
24
|
-
return false;
|
|
25
|
-
const binary = startCommand.split(" ")[0];
|
|
26
|
-
return isCommandAvailable(binary);
|
|
16
|
+
return existsSync(paths.cursorDir);
|
|
27
17
|
}
|
|
28
18
|
isHookInstalled() {
|
|
29
19
|
return cursorInstaller.isInstalled();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursor-provider.js","sourceRoot":"","sources":["../../../src/agent/cursor/cursor-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"cursor-provider.js","sourceRoot":"","sources":["../../../src/agent/cursor/cursor-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { existsSync } from "node:fs";
|
|
2
|
-
import { AGENT_START_COMMANDS } from "../../channel/agent-launcher.js";
|
|
3
2
|
import { collectGitChanges } from "../../utils/git-collector.js";
|
|
4
3
|
import { logger } from "../../utils/log.js";
|
|
5
4
|
import { paths } from "../../utils/paths.js";
|
|
6
|
-
import { isCommandAvailable } from "../../utils/shell.js";
|
|
7
5
|
import { AGENT_DISPLAY_NAMES, AgentName, } from "../types.js";
|
|
8
6
|
import { geminiCliInstaller } from "./gemini-cli-installer.js";
|
|
9
7
|
import { extractProjectName, isValidAfterAgentEvent, parseAfterAgentEvent, parseTranscriptForUsage, } from "./gemini-cli-parser.js";
|
|
@@ -13,13 +11,7 @@ export class GeminiCliProvider {
|
|
|
13
11
|
settleDelayMs = 0;
|
|
14
12
|
submitKeys = ["Enter"];
|
|
15
13
|
detect() {
|
|
16
|
-
|
|
17
|
-
return false;
|
|
18
|
-
const startCommand = AGENT_START_COMMANDS[AgentName.GeminiCli];
|
|
19
|
-
if (!startCommand)
|
|
20
|
-
return false;
|
|
21
|
-
const binary = startCommand.split(" ")[0];
|
|
22
|
-
return isCommandAvailable(binary);
|
|
14
|
+
return existsSync(paths.geminiDir);
|
|
23
15
|
}
|
|
24
16
|
isHookInstalled() {
|
|
25
17
|
return geminiCliInstaller.isInstalled();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini-cli-provider.js","sourceRoot":"","sources":["../../../src/agent/gemini-cli/gemini-cli-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"gemini-cli-provider.js","sourceRoot":"","sources":["../../../src/agent/gemini-cli/gemini-cli-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { existsSync } from "node:fs";
|
|
2
|
-
import { AGENT_START_COMMANDS } from "../../channel/agent-launcher.js";
|
|
3
2
|
import { collectGitChanges } from "../../utils/git-collector.js";
|
|
4
3
|
import { logger } from "../../utils/log.js";
|
|
5
4
|
import { paths } from "../../utils/paths.js";
|
|
6
|
-
import { isCommandAvailable } from "../../utils/shell.js";
|
|
7
5
|
import { AGENT_DISPLAY_NAMES, AgentName, } from "../types.js";
|
|
8
6
|
import { opencodeInstaller } from "./opencode-installer.js";
|
|
9
7
|
import { extractProjectName, isValidOpencodeEvent, parseOpencodeEvent } from "./opencode-parser.js";
|
|
@@ -13,13 +11,7 @@ export class OpencodeProvider {
|
|
|
13
11
|
settleDelayMs = 0;
|
|
14
12
|
submitKeys = ["Enter"];
|
|
15
13
|
detect() {
|
|
16
|
-
|
|
17
|
-
return false;
|
|
18
|
-
const startCommand = AGENT_START_COMMANDS[AgentName.OpenCode];
|
|
19
|
-
if (!startCommand)
|
|
20
|
-
return false;
|
|
21
|
-
const binary = startCommand.split(" ")[0];
|
|
22
|
-
return isCommandAvailable(binary);
|
|
14
|
+
return existsSync(paths.opencodeDir);
|
|
23
15
|
}
|
|
24
16
|
isHookInstalled() {
|
|
25
17
|
return opencodeInstaller.isInstalled();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opencode-provider.js","sourceRoot":"","sources":["../../../src/agent/opencode/opencode-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"opencode-provider.js","sourceRoot":"","sources":["../../../src/agent/opencode/opencode-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,14 +5,16 @@ import type { TmuxBridge } from "../../tmux/tmux-bridge.js";
|
|
|
5
5
|
export declare class DiscordPermissionHandler {
|
|
6
6
|
private getChannel;
|
|
7
7
|
private sessionMap;
|
|
8
|
-
private tmuxBridge;
|
|
9
8
|
private pending;
|
|
10
9
|
private timers;
|
|
11
10
|
private nextPendingId;
|
|
11
|
+
private injector;
|
|
12
12
|
constructor(getChannel: () => DMChannel | TextChannel | null, sessionMap: SessionMap, tmuxBridge: TmuxBridge);
|
|
13
13
|
forwardPermission(event: PermissionRequestEvent): Promise<void>;
|
|
14
14
|
handleInteraction(interaction: ButtonInteraction): Promise<void>;
|
|
15
15
|
destroy(): void;
|
|
16
|
+
private buildPlanButtons;
|
|
17
|
+
private buildStandardButtons;
|
|
16
18
|
private setPending;
|
|
17
19
|
private clearPending;
|
|
18
20
|
}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder, } from "discord.js";
|
|
2
|
+
import { AGENT_DISPLAY_NAMES, AgentName } from "../../agent/types.js";
|
|
3
|
+
import { t } from "../../i18n/index.js";
|
|
2
4
|
import { logger } from "../../utils/log.js";
|
|
5
|
+
import { isExitPlanMode, parsePermissionCallback, PermissionTuiInjector, } from "../permission-tui-injector.js";
|
|
3
6
|
import { summarizeTool } from "../summarize-tool.js";
|
|
4
7
|
const EXPIRE_MS = 10 * 60 * 1000;
|
|
5
8
|
const MAX_PENDING = 50;
|
|
@@ -9,14 +12,14 @@ const EMBED_COLOR_DENY = 0xd63031;
|
|
|
9
12
|
export class DiscordPermissionHandler {
|
|
10
13
|
getChannel;
|
|
11
14
|
sessionMap;
|
|
12
|
-
tmuxBridge;
|
|
13
15
|
pending = new Map();
|
|
14
16
|
timers = new Map();
|
|
15
17
|
nextPendingId = 1;
|
|
18
|
+
injector;
|
|
16
19
|
constructor(getChannel, sessionMap, tmuxBridge) {
|
|
17
20
|
this.getChannel = getChannel;
|
|
18
21
|
this.sessionMap = sessionMap;
|
|
19
|
-
this.
|
|
22
|
+
this.injector = new PermissionTuiInjector(tmuxBridge);
|
|
20
23
|
}
|
|
21
24
|
async forwardPermission(event) {
|
|
22
25
|
const channel = this.getChannel();
|
|
@@ -32,30 +35,39 @@ export class DiscordPermissionHandler {
|
|
|
32
35
|
const toolSummary = summarizeTool(event.toolName, event.toolInput);
|
|
33
36
|
const session = this.sessionMap.getBySessionId(event.sessionId);
|
|
34
37
|
const projectName = session?.project ?? "unknown";
|
|
38
|
+
const agentName = AGENT_DISPLAY_NAMES[session?.agent ?? AgentName.ClaudeCode];
|
|
39
|
+
const planLabels = isExitPlanMode(event.toolName)
|
|
40
|
+
? this.injector.extractPlanOptions(event.tmuxTarget)
|
|
41
|
+
: undefined;
|
|
35
42
|
const pp = {
|
|
36
43
|
pendingId,
|
|
37
44
|
sessionId: event.sessionId,
|
|
38
45
|
tmuxTarget: event.tmuxTarget,
|
|
39
46
|
toolName: event.toolName,
|
|
40
47
|
toolSummary,
|
|
48
|
+
planLabels,
|
|
41
49
|
createdAt: Date.now(),
|
|
42
50
|
};
|
|
43
51
|
this.setPending(pendingId, pp);
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
52
|
+
let embed;
|
|
53
|
+
if (isExitPlanMode(event.toolName)) {
|
|
54
|
+
embed = new EmbedBuilder()
|
|
55
|
+
.setColor(EMBED_COLOR_WARN)
|
|
56
|
+
.setTitle(`📦 ${projectName}`)
|
|
57
|
+
.setDescription(`🐾 ${agentName}\n\n${t("permissionRequest.planTitle")}`)
|
|
58
|
+
.setTimestamp();
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
embed = new EmbedBuilder()
|
|
62
|
+
.setColor(EMBED_COLOR_WARN)
|
|
63
|
+
.setTitle("⚠️ Permission Request")
|
|
64
|
+
.setDescription(`**${projectName}**`)
|
|
65
|
+
.addFields({ name: "🔧 Tool", value: event.toolName, inline: true }, { name: "Input", value: `\`${toolSummary}\`` })
|
|
66
|
+
.setTimestamp();
|
|
67
|
+
}
|
|
68
|
+
const row = planLabels
|
|
69
|
+
? this.buildPlanButtons(pendingId, planLabels)
|
|
70
|
+
: this.buildStandardButtons(pendingId);
|
|
59
71
|
await channel.send({ embeds: [embed], components: [row] }).catch((err) => {
|
|
60
72
|
logger.error({ err }, "[Discord:PermReq] send failed");
|
|
61
73
|
});
|
|
@@ -66,24 +78,35 @@ export class DiscordPermissionHandler {
|
|
|
66
78
|
return;
|
|
67
79
|
const action = parts[1];
|
|
68
80
|
const pendingId = parseInt(parts[2], 10);
|
|
69
|
-
const allow = action === "a";
|
|
70
81
|
const pp = this.pending.get(pendingId);
|
|
71
82
|
if (!pp) {
|
|
72
83
|
await interaction.reply({ content: "This permission request has expired.", ephemeral: true });
|
|
73
84
|
return;
|
|
74
85
|
}
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
86
|
+
const injectionResult = parsePermissionCallback(action);
|
|
87
|
+
let resultText;
|
|
88
|
+
let embedColor;
|
|
89
|
+
if (injectionResult.action === "plan-option") {
|
|
90
|
+
const label = pp.planLabels?.[injectionResult.optionIndex] ?? "";
|
|
91
|
+
resultText = t("permissionRequest.planApproved", { option: label });
|
|
92
|
+
embedColor = EMBED_COLOR_ALLOW;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
const allow = injectionResult.action === "allow";
|
|
96
|
+
resultText = allow
|
|
97
|
+
? `Allowed: **${pp.toolName}** — \`${pp.toolSummary}\``
|
|
98
|
+
: `Denied: **${pp.toolName}** — \`${pp.toolSummary}\``;
|
|
99
|
+
embedColor = allow ? EMBED_COLOR_ALLOW : EMBED_COLOR_DENY;
|
|
100
|
+
}
|
|
101
|
+
const resultEmoji = injectionResult.action === "deny" ? "❌" : "✅";
|
|
79
102
|
const updatedEmbed = new EmbedBuilder()
|
|
80
|
-
.setColor(
|
|
103
|
+
.setColor(embedColor)
|
|
81
104
|
.setDescription(`${resultEmoji} ${resultText}`)
|
|
82
105
|
.setTimestamp();
|
|
83
106
|
await interaction.deferUpdate();
|
|
84
107
|
try {
|
|
85
|
-
await
|
|
86
|
-
logger.debug(`[Discord:PermReq] injected ${
|
|
108
|
+
await this.injector.inject(pp.tmuxTarget, injectionResult);
|
|
109
|
+
logger.debug(`[Discord:PermReq] injected ${injectionResult.action} → ${pp.tmuxTarget}`);
|
|
87
110
|
}
|
|
88
111
|
catch (err) {
|
|
89
112
|
logger.error({ err }, "[Discord:PermReq] injection failed");
|
|
@@ -97,6 +120,28 @@ export class DiscordPermissionHandler {
|
|
|
97
120
|
this.timers.clear();
|
|
98
121
|
this.pending.clear();
|
|
99
122
|
}
|
|
123
|
+
buildPlanButtons(pendingId, labels) {
|
|
124
|
+
const styles = [ButtonStyle.Success, ButtonStyle.Primary, ButtonStyle.Secondary];
|
|
125
|
+
const emojis = ["🔄", "⚡", "✋"];
|
|
126
|
+
return new ActionRowBuilder().addComponents(...labels
|
|
127
|
+
.slice(0, 3)
|
|
128
|
+
.map((label, i) => new ButtonBuilder()
|
|
129
|
+
.setCustomId(`perm:e${i}:${pendingId}`)
|
|
130
|
+
.setLabel(label)
|
|
131
|
+
.setStyle(styles[i])
|
|
132
|
+
.setEmoji(emojis[i])));
|
|
133
|
+
}
|
|
134
|
+
buildStandardButtons(pendingId) {
|
|
135
|
+
return new ActionRowBuilder().addComponents(new ButtonBuilder()
|
|
136
|
+
.setCustomId(`perm:a:${pendingId}`)
|
|
137
|
+
.setLabel("Allow")
|
|
138
|
+
.setStyle(ButtonStyle.Success)
|
|
139
|
+
.setEmoji("✅"), new ButtonBuilder()
|
|
140
|
+
.setCustomId(`perm:d:${pendingId}`)
|
|
141
|
+
.setLabel("Deny")
|
|
142
|
+
.setStyle(ButtonStyle.Danger)
|
|
143
|
+
.setEmoji("❌"));
|
|
144
|
+
}
|
|
100
145
|
setPending(pendingId, pp) {
|
|
101
146
|
this.pending.set(pendingId, pp);
|
|
102
147
|
const timer = setTimeout(() => this.clearPending(pendingId), EXPIRE_MS);
|
|
@@ -110,10 +155,4 @@ export class DiscordPermissionHandler {
|
|
|
110
155
|
this.timers.delete(pendingId);
|
|
111
156
|
}
|
|
112
157
|
}
|
|
113
|
-
async function injectResponse(tmuxBridge, tmuxTarget, allow) {
|
|
114
|
-
const ready = await tmuxBridge.waitForTuiReady(tmuxTarget, 5000);
|
|
115
|
-
if (!ready)
|
|
116
|
-
throw new Error("TUI not ready");
|
|
117
|
-
tmuxBridge.sendKeys(tmuxTarget, allow ? "y" : "n", ["Enter"]);
|
|
118
|
-
}
|
|
119
158
|
//# sourceMappingURL=discord-permission-handler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discord-permission-handler.js","sourceRoot":"","sources":["../../../src/channel/discord/discord-permission-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,YAAY,GAIb,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"discord-permission-handler.js","sourceRoot":"","sources":["../../../src/channel/discord/discord-permission-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { TmuxBridge } from "../tmux/tmux-bridge.js";
|
|
2
|
+
export type PermissionAction = "allow" | "deny" | "plan-option";
|
|
3
|
+
export interface PermissionInjectionResult {
|
|
4
|
+
action: PermissionAction;
|
|
5
|
+
optionIndex?: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function isExitPlanMode(toolName: string): boolean;
|
|
8
|
+
export declare function parsePermissionCallback(action: string): PermissionInjectionResult;
|
|
9
|
+
export declare class PermissionTuiInjector {
|
|
10
|
+
private tmuxBridge;
|
|
11
|
+
constructor(tmuxBridge: TmuxBridge);
|
|
12
|
+
extractPlanOptions(tmuxTarget: string): string[];
|
|
13
|
+
inject(tmuxTarget: string, result: PermissionInjectionResult): Promise<void>;
|
|
14
|
+
private injectOptionSelect;
|
|
15
|
+
private delay;
|
|
16
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
const KEY_DELAY_MS = 80;
|
|
2
|
+
const MAX_PLAN_OPTION_INDEX = 2;
|
|
3
|
+
const PLAN_OPTION_PATTERN = /^\s*[❯►>\s]*(Yes,\s*.+)$/;
|
|
4
|
+
const FALLBACK_LABELS = [
|
|
5
|
+
"Yes, clear context and bypass permissions",
|
|
6
|
+
"Yes, and bypass permissions",
|
|
7
|
+
"Yes, manually approve edits",
|
|
8
|
+
];
|
|
9
|
+
export function isExitPlanMode(toolName) {
|
|
10
|
+
return toolName === "ExitPlanMode";
|
|
11
|
+
}
|
|
12
|
+
export function parsePermissionCallback(action) {
|
|
13
|
+
if (action.startsWith("e")) {
|
|
14
|
+
const idx = parseInt(action[1], 10);
|
|
15
|
+
const clamped = Number.isNaN(idx) ? 0 : Math.min(Math.max(idx, 0), MAX_PLAN_OPTION_INDEX);
|
|
16
|
+
return { action: "plan-option", optionIndex: clamped };
|
|
17
|
+
}
|
|
18
|
+
return { action: action === "a" ? "allow" : "deny" };
|
|
19
|
+
}
|
|
20
|
+
export class PermissionTuiInjector {
|
|
21
|
+
tmuxBridge;
|
|
22
|
+
constructor(tmuxBridge) {
|
|
23
|
+
this.tmuxBridge = tmuxBridge;
|
|
24
|
+
}
|
|
25
|
+
extractPlanOptions(tmuxTarget) {
|
|
26
|
+
try {
|
|
27
|
+
const content = this.tmuxBridge.capturePane(tmuxTarget, 20);
|
|
28
|
+
const options = [];
|
|
29
|
+
for (const line of content.split("\n")) {
|
|
30
|
+
const match = PLAN_OPTION_PATTERN.exec(line);
|
|
31
|
+
if (match)
|
|
32
|
+
options.push(match[1].trim());
|
|
33
|
+
}
|
|
34
|
+
if (options.length >= 3)
|
|
35
|
+
return options.slice(0, 3);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
/* pane capture failed — use fallback */
|
|
39
|
+
}
|
|
40
|
+
return [...FALLBACK_LABELS];
|
|
41
|
+
}
|
|
42
|
+
async inject(tmuxTarget, result) {
|
|
43
|
+
const ready = await this.tmuxBridge.waitForTuiReady(tmuxTarget, 5000);
|
|
44
|
+
if (!ready)
|
|
45
|
+
throw new Error("TUI not ready");
|
|
46
|
+
if (result.action === "plan-option") {
|
|
47
|
+
await this.injectOptionSelect(tmuxTarget, result.optionIndex ?? 0);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
this.tmuxBridge.sendKeys(tmuxTarget, result.action === "allow" ? "y" : "n", ["Enter"]);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async injectOptionSelect(tmuxTarget, optionIndex) {
|
|
54
|
+
for (let i = 0; i < optionIndex; i++) {
|
|
55
|
+
this.tmuxBridge.sendSpecialKey(tmuxTarget, "Down");
|
|
56
|
+
await this.delay(KEY_DELAY_MS);
|
|
57
|
+
}
|
|
58
|
+
await this.delay(KEY_DELAY_MS);
|
|
59
|
+
this.tmuxBridge.sendSpecialKey(tmuxTarget, "Enter");
|
|
60
|
+
}
|
|
61
|
+
delay(ms) {
|
|
62
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=permission-tui-injector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission-tui-injector.js","sourceRoot":"","sources":["../../src/channel/permission-tui-injector.ts"],"names":[],"mappings":"AAEA,MAAM,YAAY,GAAG,EAAE,CAAC;AACxB,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAChC,MAAM,mBAAmB,GAAG,0BAA0B,CAAC;AAEvD,MAAM,eAAe,GAAG;IACtB,2CAA2C;IAC3C,6BAA6B;IAC7B,6BAA6B;CACrB,CAAC;AASX,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,OAAO,QAAQ,KAAK,cAAc,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAAc;IACpD,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC;QAC1F,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;IACzD,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;AACvD,CAAC;AAED,MAAM,OAAO,qBAAqB;IACZ;IAApB,YAAoB,UAAsB;QAAtB,eAAU,GAAV,UAAU,CAAY;IAAG,CAAC;IAE9C,kBAAkB,CAAC,UAAkB;QACnC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAC5D,MAAM,OAAO,GAAa,EAAE,CAAC;YAC7B,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvC,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC7C,IAAI,KAAK;oBAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC,CAAC;YAC5C,CAAC;YACD,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC;gBAAE,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,wCAAwC;QAC1C,CAAC;QACD,OAAO,CAAC,GAAG,eAAe,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,UAAkB,EAAE,MAAiC;QAChE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACtE,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QAE7C,IAAI,MAAM,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;YACpC,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC;QACrE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAC,UAAkB,EAAE,WAAmB;QACtE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YACnD,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACjC,CAAC;QACD,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC/B,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IAEO,KAAK,CAAC,EAAU;QACtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3D,CAAC;CACF"}
|
|
@@ -16,6 +16,18 @@ export function summarizeTool(toolName, input) {
|
|
|
16
16
|
: toolName;
|
|
17
17
|
case "Agent":
|
|
18
18
|
return typeof input.description === "string" ? truncate(input.description, 80) : toolName;
|
|
19
|
+
case "ExitPlanMode": {
|
|
20
|
+
const prompts = input.allowedPrompts;
|
|
21
|
+
if (Array.isArray(prompts) && prompts.length > 0) {
|
|
22
|
+
return prompts
|
|
23
|
+
.map((p) => {
|
|
24
|
+
const obj = p;
|
|
25
|
+
return `${obj.tool}: ${obj.prompt}`;
|
|
26
|
+
})
|
|
27
|
+
.join(", ");
|
|
28
|
+
}
|
|
29
|
+
return "Plan approval";
|
|
30
|
+
}
|
|
19
31
|
default:
|
|
20
32
|
return toolName;
|
|
21
33
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summarize-tool.js","sourceRoot":"","sources":["../../src/channel/summarize-tool.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,KAA8B;IAC5E,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,MAAM;YACT,OAAO,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QACrF,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO,CAAC;QACb,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM;YACT,OAAO,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;gBACxC,CAAC,CAAC,KAAK,CAAC,SAAS;gBACjB,CAAC,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;oBAC9B,CAAC,CAAC,KAAK,CAAC,IAAI;oBACZ,CAAC,CAAC,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;wBACjC,CAAC,CAAC,KAAK,CAAC,OAAO;wBACf,CAAC,CAAC,QAAQ,CAAC;QACnB,KAAK,OAAO;YACV,OAAO,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC5F;YACE,OAAO,QAAQ,CAAC;IACpB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,GAAW;IAC/C,OAAO,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;AACjE,CAAC"}
|
|
1
|
+
{"version":3,"file":"summarize-tool.js","sourceRoot":"","sources":["../../src/channel/summarize-tool.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,KAA8B;IAC5E,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,MAAM;YACT,OAAO,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QACrF,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO,CAAC;QACb,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM;YACT,OAAO,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;gBACxC,CAAC,CAAC,KAAK,CAAC,SAAS;gBACjB,CAAC,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;oBAC9B,CAAC,CAAC,KAAK,CAAC,IAAI;oBACZ,CAAC,CAAC,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;wBACjC,CAAC,CAAC,KAAK,CAAC,OAAO;wBACf,CAAC,CAAC,QAAQ,CAAC;QACnB,KAAK,OAAO;YACV,OAAO,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC5F,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,MAAM,OAAO,GAAG,KAAK,CAAC,cAAc,CAAC;YACrC,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjD,OAAO,OAAO;qBACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;oBACT,MAAM,GAAG,GAAG,CAA2B,CAAC;oBACxC,OAAO,GAAG,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC;gBACtC,CAAC,CAAC;qBACD,IAAI,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC;YACD,OAAO,eAAe,CAAC;QACzB,CAAC;QACD;YACE,OAAO,QAAQ,CAAC;IACpB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,GAAW;IAC/C,OAAO,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;AACjE,CAAC"}
|