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.
Files changed (73) hide show
  1. package/dist/channel/agent-launcher.d.ts +6 -0
  2. package/dist/channel/agent-launcher.js +70 -0
  3. package/dist/channel/agent-launcher.js.map +1 -0
  4. package/dist/channel/discord/discord-agent-launcher.d.ts +1 -0
  5. package/dist/channel/discord/discord-agent-launcher.js +2 -0
  6. package/dist/channel/discord/discord-agent-launcher.js.map +1 -0
  7. package/dist/channel/discord/discord-ask-question-handler.d.ts +23 -0
  8. package/dist/channel/discord/discord-ask-question-handler.js +261 -0
  9. package/dist/channel/discord/discord-ask-question-handler.js.map +1 -0
  10. package/dist/channel/discord/discord-channel.d.ts +32 -0
  11. package/dist/channel/discord/discord-channel.js +277 -0
  12. package/dist/channel/discord/discord-channel.js.map +1 -0
  13. package/dist/channel/discord/discord-markdown.d.ts +3 -0
  14. package/dist/channel/discord/discord-markdown.js +35 -0
  15. package/dist/channel/discord/discord-markdown.js.map +1 -0
  16. package/dist/channel/discord/discord-permission-handler.d.ts +18 -0
  17. package/dist/channel/discord/discord-permission-handler.js +118 -0
  18. package/dist/channel/discord/discord-permission-handler.js.map +1 -0
  19. package/dist/channel/discord/discord-prompt-handler.d.ts +22 -0
  20. package/dist/channel/discord/discord-prompt-handler.js +117 -0
  21. package/dist/channel/discord/discord-prompt-handler.js.map +1 -0
  22. package/dist/channel/discord/discord-sender.d.ts +2 -0
  23. package/dist/channel/discord/discord-sender.js +38 -0
  24. package/dist/channel/discord/discord-sender.js.map +1 -0
  25. package/dist/channel/discord/discord-session-command-handler.d.ts +19 -0
  26. package/dist/channel/discord/discord-session-command-handler.js +191 -0
  27. package/dist/channel/discord/discord-session-command-handler.js.map +1 -0
  28. package/dist/channel/multi-channel.d.ts +12 -0
  29. package/dist/channel/multi-channel.js +33 -0
  30. package/dist/channel/multi-channel.js.map +1 -0
  31. package/dist/channel/slack/slack-block-builder.d.ts +3 -0
  32. package/dist/channel/slack/slack-block-builder.js +52 -0
  33. package/dist/channel/slack/slack-block-builder.js.map +1 -0
  34. package/dist/channel/slack/slack-channel.d.ts +15 -0
  35. package/dist/channel/slack/slack-channel.js +43 -0
  36. package/dist/channel/slack/slack-channel.js.map +1 -0
  37. package/dist/channel/slack/slack-sender.d.ts +7 -0
  38. package/dist/channel/slack/slack-sender.js +33 -0
  39. package/dist/channel/slack/slack-sender.js.map +1 -0
  40. package/dist/channel/summarize-tool.d.ts +2 -0
  41. package/dist/channel/summarize-tool.js +26 -0
  42. package/dist/channel/summarize-tool.js.map +1 -0
  43. package/dist/channel/telegram/permission-request-handler.d.ts +0 -1
  44. package/dist/channel/telegram/permission-request-handler.js +2 -28
  45. package/dist/channel/telegram/permission-request-handler.js.map +1 -1
  46. package/dist/channel/telegram/telegram-channel.d.ts +2 -8
  47. package/dist/channel/telegram/telegram-channel.js +9 -71
  48. package/dist/channel/telegram/telegram-channel.js.map +1 -1
  49. package/dist/channel/types.d.ts +14 -0
  50. package/dist/commands/setup.js +263 -15
  51. package/dist/commands/setup.js.map +1 -1
  52. package/dist/config-manager.d.ts +6 -0
  53. package/dist/config-manager.js +47 -8
  54. package/dist/config-manager.js.map +1 -1
  55. package/dist/i18n/locales/en.js +30 -1
  56. package/dist/i18n/locales/en.js.map +1 -1
  57. package/dist/i18n/locales/vi.js +30 -1
  58. package/dist/i18n/locales/vi.js.map +1 -1
  59. package/dist/i18n/locales/zh.js +30 -1
  60. package/dist/i18n/locales/zh.js.map +1 -1
  61. package/dist/i18n/types.d.ts +29 -0
  62. package/dist/index.js +16 -2
  63. package/dist/index.js.map +1 -1
  64. package/dist/utils/constants.d.ts +6 -0
  65. package/dist/utils/constants.js +5 -0
  66. package/dist/utils/constants.js.map +1 -1
  67. package/package.json +3 -1
  68. package/dist/channel/chat-types.d.ts +0 -19
  69. package/dist/channel/chat-types.js +0 -2
  70. package/dist/channel/chat-types.js.map +0 -1
  71. package/dist/utils/single-instance.d.ts +0 -1
  72. package/dist/utils/single-instance.js +0 -31
  73. 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,2 @@
1
+ export { autoTrustWorkspace, launchAgent } from "../agent-launcher.js";
2
+ //# sourceMappingURL=discord-agent-launcher.js.map
@@ -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
+ }