ccpoke 1.6.20 → 1.6.21
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/channel/agent-launcher.d.ts +6 -0
- package/dist/channel/agent-launcher.js +70 -0
- package/dist/channel/agent-launcher.js.map +1 -0
- package/dist/channel/discord/discord-agent-launcher.d.ts +1 -0
- package/dist/channel/discord/discord-agent-launcher.js +2 -0
- package/dist/channel/discord/discord-agent-launcher.js.map +1 -0
- package/dist/channel/discord/discord-ask-question-handler.d.ts +23 -0
- package/dist/channel/discord/discord-ask-question-handler.js +261 -0
- package/dist/channel/discord/discord-ask-question-handler.js.map +1 -0
- package/dist/channel/discord/discord-channel.d.ts +32 -0
- package/dist/channel/discord/discord-channel.js +277 -0
- package/dist/channel/discord/discord-channel.js.map +1 -0
- package/dist/channel/discord/discord-markdown.d.ts +3 -0
- package/dist/channel/discord/discord-markdown.js +35 -0
- package/dist/channel/discord/discord-markdown.js.map +1 -0
- package/dist/channel/discord/discord-permission-handler.d.ts +18 -0
- package/dist/channel/discord/discord-permission-handler.js +118 -0
- package/dist/channel/discord/discord-permission-handler.js.map +1 -0
- package/dist/channel/discord/discord-prompt-handler.d.ts +22 -0
- package/dist/channel/discord/discord-prompt-handler.js +117 -0
- package/dist/channel/discord/discord-prompt-handler.js.map +1 -0
- package/dist/channel/discord/discord-sender.d.ts +2 -0
- package/dist/channel/discord/discord-sender.js +38 -0
- package/dist/channel/discord/discord-sender.js.map +1 -0
- package/dist/channel/discord/discord-session-command-handler.d.ts +19 -0
- package/dist/channel/discord/discord-session-command-handler.js +191 -0
- package/dist/channel/discord/discord-session-command-handler.js.map +1 -0
- package/dist/channel/multi-channel.d.ts +12 -0
- package/dist/channel/multi-channel.js +33 -0
- package/dist/channel/multi-channel.js.map +1 -0
- package/dist/channel/slack/slack-block-builder.d.ts +3 -0
- package/dist/channel/slack/slack-block-builder.js +52 -0
- package/dist/channel/slack/slack-block-builder.js.map +1 -0
- package/dist/channel/slack/slack-channel.d.ts +15 -0
- package/dist/channel/slack/slack-channel.js +43 -0
- package/dist/channel/slack/slack-channel.js.map +1 -0
- package/dist/channel/slack/slack-sender.d.ts +7 -0
- package/dist/channel/slack/slack-sender.js +33 -0
- package/dist/channel/slack/slack-sender.js.map +1 -0
- package/dist/channel/summarize-tool.d.ts +2 -0
- package/dist/channel/summarize-tool.js +26 -0
- package/dist/channel/summarize-tool.js.map +1 -0
- package/dist/channel/telegram/permission-request-handler.d.ts +0 -1
- package/dist/channel/telegram/permission-request-handler.js +2 -28
- package/dist/channel/telegram/permission-request-handler.js.map +1 -1
- package/dist/channel/telegram/telegram-channel.d.ts +2 -8
- package/dist/channel/telegram/telegram-channel.js +9 -71
- package/dist/channel/telegram/telegram-channel.js.map +1 -1
- package/dist/channel/types.d.ts +14 -0
- package/dist/commands/setup.js +263 -15
- package/dist/commands/setup.js.map +1 -1
- package/dist/config-manager.d.ts +6 -0
- package/dist/config-manager.js +47 -8
- package/dist/config-manager.js.map +1 -1
- package/dist/i18n/locales/en.js +30 -1
- package/dist/i18n/locales/en.js.map +1 -1
- package/dist/i18n/locales/vi.js +30 -1
- package/dist/i18n/locales/vi.js.map +1 -1
- package/dist/i18n/locales/zh.js +30 -1
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/i18n/types.d.ts +29 -0
- package/dist/index.js +16 -2
- package/dist/index.js.map +1 -1
- package/dist/utils/constants.d.ts +6 -0
- package/dist/utils/constants.js +5 -0
- package/dist/utils/constants.js.map +1 -1
- package/package.json +3 -1
- package/dist/channel/chat-types.d.ts +0 -19
- package/dist/channel/chat-types.js +0 -2
- package/dist/channel/chat-types.js.map +0 -1
- package/dist/utils/single-instance.d.ts +0 -1
- package/dist/utils/single-instance.js +0 -31
- package/dist/utils/single-instance.js.map +0 -1
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { TmuxBridge } from "../tmux/tmux-bridge.js";
|
|
2
|
+
export declare function launchAgent(tmuxBridge: TmuxBridge, projectPath: string, agentKey: string): {
|
|
3
|
+
paneTarget: string;
|
|
4
|
+
needsTrust: boolean;
|
|
5
|
+
};
|
|
6
|
+
export declare function autoTrustWorkspace(tmuxBridge: TmuxBridge, paneTarget: string, agentKey: string, onInterval: (interval: ReturnType<typeof setInterval>) => void, onClear: (interval: ReturnType<typeof setInterval>) => void): void;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
import { AgentName } from "../agent/types.js";
|
|
3
|
+
import { logDebug } from "../utils/log.js";
|
|
4
|
+
const AGENT_START_COMMANDS = {
|
|
5
|
+
[AgentName.ClaudeCode]: "claude --dangerously-skip-permissions",
|
|
6
|
+
[AgentName.Cursor]: "cursor agent --force",
|
|
7
|
+
[AgentName.Codex]: "codex --full-auto",
|
|
8
|
+
[AgentName.GeminiCli]: "gemini --yolo",
|
|
9
|
+
};
|
|
10
|
+
export function launchAgent(tmuxBridge, projectPath, agentKey) {
|
|
11
|
+
const startCommand = AGENT_START_COMMANDS[agentKey] ?? AGENT_START_COMMANDS[AgentName.ClaudeCode];
|
|
12
|
+
const tmuxSession = getTmuxSessionName();
|
|
13
|
+
const paneTarget = tmuxBridge.createPane(tmuxSession, projectPath);
|
|
14
|
+
tmuxBridge.sendKeys(paneTarget, startCommand, ["Enter"]);
|
|
15
|
+
const needsTrust = agentKey === AgentName.Cursor || agentKey === AgentName.GeminiCli;
|
|
16
|
+
return { paneTarget, needsTrust };
|
|
17
|
+
}
|
|
18
|
+
export function autoTrustWorkspace(tmuxBridge, paneTarget, agentKey, onInterval, onClear) {
|
|
19
|
+
let attempts = 0;
|
|
20
|
+
const maxAttempts = 10;
|
|
21
|
+
const interval = setInterval(() => {
|
|
22
|
+
attempts++;
|
|
23
|
+
if (attempts > maxAttempts) {
|
|
24
|
+
clearInterval(interval);
|
|
25
|
+
onClear(interval);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
const content = tmuxBridge.capturePane(paneTarget, 10);
|
|
30
|
+
if (content.includes("Trust")) {
|
|
31
|
+
tmuxBridge.sendSpecialKey(paneTarget, "Enter");
|
|
32
|
+
logDebug(`[AgentLauncher] auto-trusted workspace at ${paneTarget} for ${agentKey}`);
|
|
33
|
+
clearInterval(interval);
|
|
34
|
+
onClear(interval);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
clearInterval(interval);
|
|
39
|
+
onClear(interval);
|
|
40
|
+
}
|
|
41
|
+
}, 1000);
|
|
42
|
+
onInterval(interval);
|
|
43
|
+
}
|
|
44
|
+
function getTmuxSessionName() {
|
|
45
|
+
if (process.env.TMUX) {
|
|
46
|
+
try {
|
|
47
|
+
return execSync("tmux display-message -p '#{session_name}'", {
|
|
48
|
+
encoding: "utf-8",
|
|
49
|
+
stdio: "pipe",
|
|
50
|
+
timeout: 3000,
|
|
51
|
+
}).trim();
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
/* fall through */
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
const output = execSync("tmux list-sessions -F '#{session_name}'", {
|
|
59
|
+
encoding: "utf-8",
|
|
60
|
+
stdio: "pipe",
|
|
61
|
+
timeout: 3000,
|
|
62
|
+
}).trim();
|
|
63
|
+
const first = output.split("\n")[0];
|
|
64
|
+
return first || "0";
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return "0";
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=agent-launcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-launcher.js","sourceRoot":"","sources":["../../src/channel/agent-launcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { autoTrustWorkspace, launchAgent } from "../agent-launcher.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discord-agent-launcher.js","sourceRoot":"","sources":["../../../src/channel/discord/discord-agent-launcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type ButtonInteraction, type DMChannel, type TextChannel } from "discord.js";
|
|
2
|
+
import type { AskUserQuestionEvent } from "../../agent/agent-handler.js";
|
|
3
|
+
import type { TmuxBridge } from "../../tmux/tmux-bridge.js";
|
|
4
|
+
export declare class DiscordAskQuestionHandler {
|
|
5
|
+
private getChannel;
|
|
6
|
+
private pending;
|
|
7
|
+
private pendingById;
|
|
8
|
+
private nextPendingId;
|
|
9
|
+
private timers;
|
|
10
|
+
private injector;
|
|
11
|
+
constructor(getChannel: () => DMChannel | TextChannel | null, tmuxBridge: TmuxBridge);
|
|
12
|
+
forwardQuestion(event: AskUserQuestionEvent): Promise<void>;
|
|
13
|
+
handleInteraction(interaction: ButtonInteraction): Promise<void>;
|
|
14
|
+
destroy(): void;
|
|
15
|
+
private sendQuestion;
|
|
16
|
+
private handleSingleSelect;
|
|
17
|
+
private handleMultiSelect;
|
|
18
|
+
private injectAnswer;
|
|
19
|
+
private advanceToNext;
|
|
20
|
+
private findPendingByNumericId;
|
|
21
|
+
private setPending;
|
|
22
|
+
private clearPending;
|
|
23
|
+
}
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
import { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder, } from "discord.js";
|
|
2
|
+
import { log, logDebug, logError } from "../../utils/log.js";
|
|
3
|
+
import { truncate } from "../summarize-tool.js";
|
|
4
|
+
import { AskQuestionTuiInjector, } from "../telegram/ask-question-tui-injector.js";
|
|
5
|
+
const EXPIRE_MS = 10 * 60 * 1000;
|
|
6
|
+
const MAX_PENDING = 50;
|
|
7
|
+
const EMBED_COLOR = 0x6c5ce7;
|
|
8
|
+
export class DiscordAskQuestionHandler {
|
|
9
|
+
getChannel;
|
|
10
|
+
pending = new Map();
|
|
11
|
+
pendingById = new Map();
|
|
12
|
+
nextPendingId = 1;
|
|
13
|
+
timers = new Map();
|
|
14
|
+
injector;
|
|
15
|
+
constructor(getChannel, tmuxBridge) {
|
|
16
|
+
this.getChannel = getChannel;
|
|
17
|
+
this.injector = new AskQuestionTuiInjector(tmuxBridge);
|
|
18
|
+
}
|
|
19
|
+
async forwardQuestion(event) {
|
|
20
|
+
const channel = this.getChannel();
|
|
21
|
+
if (!channel || !event.tmuxTarget || event.questions.length === 0)
|
|
22
|
+
return;
|
|
23
|
+
log(`[Discord:AskQ] sessionId=${event.sessionId} tmuxTarget=${event.tmuxTarget} questions=${event.questions.length}`);
|
|
24
|
+
if (this.pending.size >= MAX_PENDING && !this.pending.has(event.sessionId)) {
|
|
25
|
+
const oldest = [...this.pending.entries()].sort((a, b) => a[1].createdAt - b[1].createdAt)[0];
|
|
26
|
+
if (oldest)
|
|
27
|
+
this.clearPending(oldest[0]);
|
|
28
|
+
}
|
|
29
|
+
const pendingId = this.nextPendingId++;
|
|
30
|
+
const pq = {
|
|
31
|
+
pendingId,
|
|
32
|
+
sessionId: event.sessionId,
|
|
33
|
+
tmuxTarget: event.tmuxTarget,
|
|
34
|
+
questions: event.questions,
|
|
35
|
+
currentIndex: 0,
|
|
36
|
+
answers: new Map(),
|
|
37
|
+
messageIds: new Map(),
|
|
38
|
+
multiSelectState: new Map(),
|
|
39
|
+
createdAt: Date.now(),
|
|
40
|
+
};
|
|
41
|
+
this.setPending(event.sessionId, pq);
|
|
42
|
+
await this.sendQuestion(channel, pq, 0);
|
|
43
|
+
}
|
|
44
|
+
async handleInteraction(interaction) {
|
|
45
|
+
const parts = interaction.customId.split(":");
|
|
46
|
+
if (parts.length < 4)
|
|
47
|
+
return;
|
|
48
|
+
const prefix = parts[0];
|
|
49
|
+
const pendingId = parseInt(parts[1], 10);
|
|
50
|
+
const qIdx = parseInt(parts[2], 10);
|
|
51
|
+
const optPart = parts[3];
|
|
52
|
+
const pq = this.findPendingByNumericId(pendingId);
|
|
53
|
+
if (!pq) {
|
|
54
|
+
await interaction.reply({ content: "This question has expired.", ephemeral: true });
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (prefix === "aq") {
|
|
58
|
+
await this.handleSingleSelect(interaction, pq, qIdx, optPart);
|
|
59
|
+
}
|
|
60
|
+
else if (prefix === "am") {
|
|
61
|
+
await this.handleMultiSelect(interaction, pq, qIdx, optPart);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
destroy() {
|
|
65
|
+
for (const timer of this.timers.values())
|
|
66
|
+
clearTimeout(timer);
|
|
67
|
+
this.timers.clear();
|
|
68
|
+
this.pending.clear();
|
|
69
|
+
this.pendingById.clear();
|
|
70
|
+
}
|
|
71
|
+
async sendQuestion(channel, pq, qIdx) {
|
|
72
|
+
const q = pq.questions[qIdx];
|
|
73
|
+
if (!q)
|
|
74
|
+
return;
|
|
75
|
+
const n = qIdx + 1;
|
|
76
|
+
const total = pq.questions.length;
|
|
77
|
+
const embed = new EmbedBuilder()
|
|
78
|
+
.setColor(EMBED_COLOR)
|
|
79
|
+
.setTitle(`Question ${n}/${total}${q.header ? ` [${q.header}]` : ""}`)
|
|
80
|
+
.setDescription(q.question)
|
|
81
|
+
.setTimestamp();
|
|
82
|
+
if (q.options.some((o) => o.description)) {
|
|
83
|
+
const optList = q.options
|
|
84
|
+
.map((o, i) => `**${i + 1}.** ${o.label}${o.description ? ` — ${o.description}` : ""}`)
|
|
85
|
+
.join("\n");
|
|
86
|
+
embed.addFields({ name: "Options", value: optList });
|
|
87
|
+
}
|
|
88
|
+
const rows = q.multiSelect
|
|
89
|
+
? buildMultiSelectRows(pq.pendingId, qIdx, q, new Set())
|
|
90
|
+
: buildSingleSelectRows(pq.pendingId, qIdx, q);
|
|
91
|
+
const msg = await channel
|
|
92
|
+
.send({ embeds: [embed], components: rows })
|
|
93
|
+
.catch(() => null);
|
|
94
|
+
if (msg) {
|
|
95
|
+
pq.messageIds.set(qIdx, msg.id);
|
|
96
|
+
if (q.multiSelect)
|
|
97
|
+
pq.multiSelectState.set(qIdx, new Set());
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
async handleSingleSelect(interaction, pq, qIdx, optPart) {
|
|
101
|
+
const optIdx = parseInt(optPart, 10);
|
|
102
|
+
const q = pq.questions[qIdx];
|
|
103
|
+
if (!q || optIdx < 0 || optIdx >= q.options.length)
|
|
104
|
+
return;
|
|
105
|
+
pq.answers.set(qIdx, { indices: [optIdx] });
|
|
106
|
+
const selected = q.options[optIdx].label;
|
|
107
|
+
const updatedEmbed = new EmbedBuilder()
|
|
108
|
+
.setColor(EMBED_COLOR)
|
|
109
|
+
.setTitle(`Question ${qIdx + 1}/${pq.questions.length}`)
|
|
110
|
+
.setDescription(`Selected: **${selected}**`)
|
|
111
|
+
.setTimestamp();
|
|
112
|
+
await interaction.update({ embeds: [updatedEmbed], components: [] }).catch(() => { });
|
|
113
|
+
await this.injectAnswer(pq, qIdx);
|
|
114
|
+
await this.advanceToNext(pq);
|
|
115
|
+
}
|
|
116
|
+
async handleMultiSelect(interaction, pq, qIdx, optPart) {
|
|
117
|
+
const q = pq.questions[qIdx];
|
|
118
|
+
if (!q)
|
|
119
|
+
return;
|
|
120
|
+
if (optPart === "c") {
|
|
121
|
+
const selected = pq.multiSelectState.get(qIdx) ?? new Set();
|
|
122
|
+
pq.answers.set(qIdx, { indices: [...selected].sort((a, b) => a - b) });
|
|
123
|
+
const labels = [...selected]
|
|
124
|
+
.sort((a, b) => a - b)
|
|
125
|
+
.map((i) => q.options[i]?.label ?? "")
|
|
126
|
+
.filter(Boolean);
|
|
127
|
+
const updatedEmbed = new EmbedBuilder()
|
|
128
|
+
.setColor(EMBED_COLOR)
|
|
129
|
+
.setTitle(`Question ${qIdx + 1}/${pq.questions.length}`)
|
|
130
|
+
.setDescription(`Selected: **${labels.join(", ") || "none"}**`)
|
|
131
|
+
.setTimestamp();
|
|
132
|
+
await interaction.update({ embeds: [updatedEmbed], components: [] }).catch(() => { });
|
|
133
|
+
await this.injectAnswer(pq, qIdx);
|
|
134
|
+
await this.advanceToNext(pq);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
const optIdx = parseInt(optPart, 10);
|
|
138
|
+
if (optIdx < 0 || optIdx >= q.options.length)
|
|
139
|
+
return;
|
|
140
|
+
const toggleSet = pq.multiSelectState.get(qIdx) ?? new Set();
|
|
141
|
+
if (toggleSet.has(optIdx)) {
|
|
142
|
+
toggleSet.delete(optIdx);
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
toggleSet.add(optIdx);
|
|
146
|
+
}
|
|
147
|
+
pq.multiSelectState.set(qIdx, toggleSet);
|
|
148
|
+
const rows = buildMultiSelectRows(pq.pendingId, qIdx, q, toggleSet);
|
|
149
|
+
await interaction.update({ components: rows }).catch(() => { });
|
|
150
|
+
}
|
|
151
|
+
async injectAnswer(pq, qIdx) {
|
|
152
|
+
const q = pq.questions[qIdx];
|
|
153
|
+
const answer = pq.answers.get(qIdx);
|
|
154
|
+
if (!q || !answer)
|
|
155
|
+
return;
|
|
156
|
+
logDebug(`[Discord:AskQ:inject] tmuxTarget=${pq.tmuxTarget} qIdx=${qIdx} indices=${answer.indices}`);
|
|
157
|
+
try {
|
|
158
|
+
const ready = await this.injector.waitForTui(pq.tmuxTarget, 5000);
|
|
159
|
+
if (!ready)
|
|
160
|
+
throw new Error("TUI not ready");
|
|
161
|
+
if (q.multiSelect) {
|
|
162
|
+
await this.injector.injectMultiSelect(pq.tmuxTarget, q, answer);
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
await this.injector.injectSingleSelect(pq.tmuxTarget, q, answer);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
logError("[Discord:AskQ] injection failed", err);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
async advanceToNext(pq) {
|
|
173
|
+
pq.currentIndex++;
|
|
174
|
+
if (pq.currentIndex >= pq.questions.length) {
|
|
175
|
+
logDebug(`[Discord:AskQ:submit] all ${pq.questions.length} questions answered`);
|
|
176
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
177
|
+
try {
|
|
178
|
+
const ready = await this.injector.waitForTui(pq.tmuxTarget, 5000);
|
|
179
|
+
if (ready)
|
|
180
|
+
this.injector.sendEnter(pq.tmuxTarget);
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
/* best-effort */
|
|
184
|
+
}
|
|
185
|
+
this.clearPending(pq.sessionId);
|
|
186
|
+
const channel = this.getChannel();
|
|
187
|
+
if (channel) {
|
|
188
|
+
await channel.send("All questions answered.").catch(() => { });
|
|
189
|
+
}
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
193
|
+
const channel = this.getChannel();
|
|
194
|
+
if (channel)
|
|
195
|
+
await this.sendQuestion(channel, pq, pq.currentIndex);
|
|
196
|
+
}
|
|
197
|
+
findPendingByNumericId(id) {
|
|
198
|
+
const sessionId = this.pendingById.get(id);
|
|
199
|
+
if (!sessionId)
|
|
200
|
+
return undefined;
|
|
201
|
+
return this.pending.get(sessionId);
|
|
202
|
+
}
|
|
203
|
+
setPending(sessionId, pq) {
|
|
204
|
+
this.clearPending(sessionId);
|
|
205
|
+
this.pending.set(sessionId, pq);
|
|
206
|
+
this.pendingById.set(pq.pendingId, sessionId);
|
|
207
|
+
const timer = setTimeout(() => this.clearPending(sessionId), EXPIRE_MS);
|
|
208
|
+
this.timers.set(sessionId, timer);
|
|
209
|
+
}
|
|
210
|
+
clearPending(sessionId) {
|
|
211
|
+
const pq = this.pending.get(sessionId);
|
|
212
|
+
if (pq)
|
|
213
|
+
this.pendingById.delete(pq.pendingId);
|
|
214
|
+
this.pending.delete(sessionId);
|
|
215
|
+
const timer = this.timers.get(sessionId);
|
|
216
|
+
if (timer)
|
|
217
|
+
clearTimeout(timer);
|
|
218
|
+
this.timers.delete(sessionId);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
const MAX_ACTION_ROWS = 5;
|
|
222
|
+
function buildSingleSelectRows(pendingId, qIdx, q) {
|
|
223
|
+
const rows = [];
|
|
224
|
+
const maxOptions = MAX_ACTION_ROWS * 5;
|
|
225
|
+
const optCount = Math.min(q.options.length, maxOptions);
|
|
226
|
+
for (let i = 0; i < optCount; i += 5) {
|
|
227
|
+
const row = new ActionRowBuilder();
|
|
228
|
+
for (let j = i; j < Math.min(i + 5, optCount); j++) {
|
|
229
|
+
row.addComponents(new ButtonBuilder()
|
|
230
|
+
.setCustomId(`aq:${pendingId}:${qIdx}:${j}`)
|
|
231
|
+
.setLabel(truncate(q.options[j].label, 80))
|
|
232
|
+
.setStyle(ButtonStyle.Primary));
|
|
233
|
+
}
|
|
234
|
+
rows.push(row);
|
|
235
|
+
}
|
|
236
|
+
return rows;
|
|
237
|
+
}
|
|
238
|
+
function buildMultiSelectRows(pendingId, qIdx, q, selected) {
|
|
239
|
+
const rows = [];
|
|
240
|
+
const maxOptionRows = MAX_ACTION_ROWS - 1;
|
|
241
|
+
const maxOptions = maxOptionRows * 5;
|
|
242
|
+
const optCount = Math.min(q.options.length, maxOptions);
|
|
243
|
+
for (let i = 0; i < optCount; i += 5) {
|
|
244
|
+
const row = new ActionRowBuilder();
|
|
245
|
+
for (let j = i; j < Math.min(i + 5, optCount); j++) {
|
|
246
|
+
const isSelected = selected.has(j);
|
|
247
|
+
row.addComponents(new ButtonBuilder()
|
|
248
|
+
.setCustomId(`am:${pendingId}:${qIdx}:${j}`)
|
|
249
|
+
.setLabel(`${isSelected ? "✓ " : ""}${truncate(q.options[j].label, 77)}`)
|
|
250
|
+
.setStyle(isSelected ? ButtonStyle.Success : ButtonStyle.Secondary));
|
|
251
|
+
}
|
|
252
|
+
rows.push(row);
|
|
253
|
+
}
|
|
254
|
+
const confirmRow = new ActionRowBuilder().addComponents(new ButtonBuilder()
|
|
255
|
+
.setCustomId(`am:${pendingId}:${qIdx}:c`)
|
|
256
|
+
.setLabel("Confirm")
|
|
257
|
+
.setStyle(ButtonStyle.Primary));
|
|
258
|
+
rows.push(confirmRow);
|
|
259
|
+
return rows;
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=discord-ask-question-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discord-ask-question-handler.js","sourceRoot":"","sources":["../../../src/channel/discord/discord-ask-question-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { AskUserQuestionEvent, NotificationEvent, PermissionRequestEvent } from "../../agent/agent-handler.js";
|
|
2
|
+
import { type Config } from "../../config-manager.js";
|
|
3
|
+
import type { ChannelDeps, NotificationChannel, NotificationData } from "../types.js";
|
|
4
|
+
export declare class DiscordChannel implements NotificationChannel {
|
|
5
|
+
private client;
|
|
6
|
+
private dmChannel;
|
|
7
|
+
private cfg;
|
|
8
|
+
private sessionMap;
|
|
9
|
+
private stateManager;
|
|
10
|
+
private tmuxBridge;
|
|
11
|
+
private registry;
|
|
12
|
+
private permissionHandler;
|
|
13
|
+
private askQuestionHandler;
|
|
14
|
+
private promptHandler;
|
|
15
|
+
private sessionCommandHandler;
|
|
16
|
+
private pendingElicitations;
|
|
17
|
+
private elicitationTimers;
|
|
18
|
+
private activeIntervals;
|
|
19
|
+
constructor(cfg: Config, deps?: ChannelDeps);
|
|
20
|
+
initialize(): Promise<void>;
|
|
21
|
+
shutdown(): Promise<void>;
|
|
22
|
+
handleNotificationEvent(event: NotificationEvent): void;
|
|
23
|
+
handleAskUserQuestionEvent(event: AskUserQuestionEvent): void;
|
|
24
|
+
handlePermissionRequestEvent(event: PermissionRequestEvent): void;
|
|
25
|
+
sendNotification(data: NotificationData, responseUrl?: string): Promise<void>;
|
|
26
|
+
private trackElicitation;
|
|
27
|
+
private clearElicitationTimer;
|
|
28
|
+
private openDMChannel;
|
|
29
|
+
private registerSlashCommands;
|
|
30
|
+
private registerInteractionHandler;
|
|
31
|
+
private registerMessageHandler;
|
|
32
|
+
}
|