ccpoke 1.4.2 → 1.5.0

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 (89) hide show
  1. package/README.en.md +26 -11
  2. package/README.md +26 -11
  3. package/dist/agent/agent-handler.d.ts +12 -0
  4. package/dist/agent/agent-handler.js +49 -0
  5. package/dist/agent/agent-handler.js.map +1 -0
  6. package/dist/agent/agent-registry.d.ts +9 -0
  7. package/dist/agent/agent-registry.js +24 -0
  8. package/dist/agent/agent-registry.js.map +1 -0
  9. package/dist/{hook/hook-installer.d.ts → agent/claude-code/claude-code-installer.d.ts} +2 -2
  10. package/dist/agent/claude-code/claude-code-installer.js +82 -0
  11. package/dist/agent/claude-code/claude-code-installer.js.map +1 -0
  12. package/dist/{monitor/transcript-parser.d.ts → agent/claude-code/claude-code-parser.d.ts} +6 -0
  13. package/dist/{monitor/transcript-parser.js → agent/claude-code/claude-code-parser.js} +10 -2
  14. package/dist/agent/claude-code/claude-code-parser.js.map +1 -0
  15. package/dist/agent/claude-code/claude-code-provider.d.ts +12 -0
  16. package/dist/agent/claude-code/claude-code-provider.js +72 -0
  17. package/dist/agent/claude-code/claude-code-provider.js.map +1 -0
  18. package/dist/agent/cursor/cursor-installer.d.ts +9 -0
  19. package/dist/agent/cursor/cursor-installer.js +89 -0
  20. package/dist/agent/cursor/cursor-installer.js.map +1 -0
  21. package/dist/agent/cursor/cursor-parser.d.ts +19 -0
  22. package/dist/agent/cursor/cursor-parser.js +61 -0
  23. package/dist/agent/cursor/cursor-parser.js.map +1 -0
  24. package/dist/agent/cursor/cursor-provider.d.ts +12 -0
  25. package/dist/agent/cursor/cursor-provider.js +72 -0
  26. package/dist/agent/cursor/cursor-provider.js.map +1 -0
  27. package/dist/agent/types.d.ts +27 -0
  28. package/dist/agent/types.js +11 -0
  29. package/dist/agent/types.js.map +1 -0
  30. package/dist/channel/telegram/telegram-channel.js +7 -90
  31. package/dist/channel/telegram/telegram-channel.js.map +1 -1
  32. package/dist/channel/types.d.ts +2 -0
  33. package/dist/commands/setup.js +83 -19
  34. package/dist/commands/setup.js.map +1 -1
  35. package/dist/commands/uninstall.js +12 -9
  36. package/dist/commands/uninstall.js.map +1 -1
  37. package/dist/config-manager.d.ts +2 -1
  38. package/dist/config-manager.js +21 -17
  39. package/dist/config-manager.js.map +1 -1
  40. package/dist/i18n/index.d.ts +7 -2
  41. package/dist/i18n/index.js +10 -5
  42. package/dist/i18n/index.js.map +1 -1
  43. package/dist/i18n/locales/en.js +11 -0
  44. package/dist/i18n/locales/en.js.map +1 -1
  45. package/dist/i18n/locales/vi.js +11 -0
  46. package/dist/i18n/locales/vi.js.map +1 -1
  47. package/dist/i18n/locales/zh.js +11 -0
  48. package/dist/i18n/locales/zh.js.map +1 -1
  49. package/dist/i18n/types.d.ts +11 -0
  50. package/dist/index.js +28 -8
  51. package/dist/index.js.map +1 -1
  52. package/dist/{hook/hook-server.d.ts → server/api-server.d.ts} +3 -3
  53. package/dist/{hook/hook-server.js → server/api-server.js} +6 -4
  54. package/dist/server/api-server.js.map +1 -0
  55. package/dist/utils/git-collector.js.map +1 -0
  56. package/dist/utils/markdown.d.ts +4 -0
  57. package/dist/utils/markdown.js +47 -0
  58. package/dist/utils/markdown.js.map +1 -0
  59. package/dist/utils/paths.d.ts +4 -1
  60. package/dist/utils/paths.js +5 -1
  61. package/dist/utils/paths.js.map +1 -1
  62. package/dist/utils/response-store.d.ts +2 -0
  63. package/dist/utils/response-store.js.map +1 -1
  64. package/dist/utils/stats-format.d.ts +3 -0
  65. package/dist/utils/stats-format.js +44 -0
  66. package/dist/utils/stats-format.js.map +1 -0
  67. package/package.json +4 -1
  68. package/dist/hook/hook-handler.d.ts +0 -10
  69. package/dist/hook/hook-handler.js +0 -76
  70. package/dist/hook/hook-handler.js.map +0 -1
  71. package/dist/hook/hook-installer.js +0 -110
  72. package/dist/hook/hook-installer.js.map +0 -1
  73. package/dist/hook/hook-server.js.map +0 -1
  74. package/dist/hook/response-store.d.ts +0 -8
  75. package/dist/hook/response-store.js +0 -18
  76. package/dist/monitor/git-collector.js.map +0 -1
  77. package/dist/monitor/transcript-parser.js.map +0 -1
  78. package/dist/setup.d.ts +0 -1
  79. package/dist/setup.js +0 -130
  80. package/dist/telegram/bot.d.ts +0 -20
  81. package/dist/telegram/bot.js +0 -130
  82. package/dist/telegram/message-formatter.d.ts +0 -18
  83. package/dist/telegram/message-formatter.js +0 -56
  84. package/dist/telegram/message-sender.d.ts +0 -2
  85. package/dist/telegram/message-sender.js +0 -76
  86. package/dist/utils/error-utils.d.ts +0 -1
  87. package/dist/utils/error-utils.js +0 -3
  88. /package/dist/{monitor → utils}/git-collector.d.ts +0 -0
  89. /package/dist/{monitor → utils}/git-collector.js +0 -0
@@ -1,18 +0,0 @@
1
- import { GitChangeStatus } from "../utils/constants.js";
2
- export interface GitChange {
3
- file: string;
4
- status: GitChangeStatus;
5
- }
6
- export interface NotificationData {
7
- projectName: string;
8
- responseSummary: string;
9
- durationMs: number;
10
- gitChanges: GitChange[];
11
- inputTokens: number;
12
- outputTokens: number;
13
- cacheCreationTokens: number;
14
- cacheReadTokens: number;
15
- }
16
- export declare function formatNotification(data: NotificationData): string;
17
- export declare function escapeHtml(text: string): string;
18
- export declare function extractProjectName(cwd: string): string;
@@ -1,56 +0,0 @@
1
- import { basename } from "node:path";
2
- import { GitChangeStatus } from "../utils/constants.js";
3
- import { t } from "../i18n/index.js";
4
- export function formatNotification(data) {
5
- const parts = [];
6
- let header = `<b>${escapeHtml(data.projectName)}</b>`;
7
- if (data.durationMs > 0) {
8
- header += ` — ${escapeHtml(formatDuration(data.durationMs))}`;
9
- }
10
- parts.push(header);
11
- if (data.inputTokens > 0 || data.outputTokens > 0) {
12
- parts.push(`${t("notification.tokens")}: ${formatTokenCount(data.inputTokens)} → ${formatTokenCount(data.outputTokens)}`);
13
- }
14
- if (data.cacheReadTokens > 0 || data.cacheCreationTokens > 0) {
15
- const cacheParts = [];
16
- if (data.cacheReadTokens > 0)
17
- cacheParts.push(`${formatTokenCount(data.cacheReadTokens)} ${t("notification.cacheRead")}`);
18
- if (data.cacheCreationTokens > 0)
19
- cacheParts.push(`${formatTokenCount(data.cacheCreationTokens)} ${t("notification.cacheWrite")}`);
20
- parts.push(`${t("notification.cache")}: ${cacheParts.join(", ")}`);
21
- }
22
- return parts.join("\n");
23
- }
24
- export function escapeHtml(text) {
25
- return text.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
26
- }
27
- function formatDuration(ms) {
28
- const totalSeconds = Math.floor(ms / 1000);
29
- if (totalSeconds < 60)
30
- return `${totalSeconds}s`;
31
- const minutes = Math.floor(totalSeconds / 60);
32
- const seconds = totalSeconds % 60;
33
- return `${minutes}m${seconds}s`;
34
- }
35
- function formatTokenCount(tokens) {
36
- if (tokens >= 1_000_000)
37
- return `${(tokens / 1_000_000).toFixed(1)}M`;
38
- if (tokens >= 1_000)
39
- return `${(tokens / 1_000).toFixed(1)}k`;
40
- return `${tokens}`;
41
- }
42
- function gitChangeEmoji(status) {
43
- switch (status) {
44
- case GitChangeStatus.Added:
45
- return "➕";
46
- case GitChangeStatus.Deleted:
47
- return "❌";
48
- case GitChangeStatus.Renamed:
49
- return "📝";
50
- default:
51
- return "✏️";
52
- }
53
- }
54
- export function extractProjectName(cwd) {
55
- return basename(cwd);
56
- }
@@ -1,2 +0,0 @@
1
- import TelegramBot from "node-telegram-bot-api";
2
- export declare function sendMessage(bot: TelegramBot, chatId: number, text: string, responseUrl?: string): Promise<void>;
@@ -1,76 +0,0 @@
1
- import { t } from "../i18n/index.js";
2
- import { log } from "../utils/log.js";
3
- const TELEGRAM_MAX_MESSAGE_LENGTH = 4096;
4
- const PAGINATION_FOOTER_RESERVE = 30;
5
- export async function sendMessage(bot, chatId, text, responseUrl) {
6
- const pages = splitMessage(text, TELEGRAM_MAX_MESSAGE_LENGTH - PAGINATION_FOOTER_RESERVE);
7
- for (let i = 0; i < pages.length; i++) {
8
- let content = pages[i];
9
- if (pages.length > 1) {
10
- content = `${content}\n\n<i>[${i + 1}/${pages.length}]</i>`;
11
- }
12
- const isLastPage = i === pages.length - 1;
13
- const opts = { parse_mode: "HTML" };
14
- if (isLastPage && responseUrl) {
15
- const buttonText = t("bot.viewDetails");
16
- opts.reply_markup = {
17
- inline_keyboard: [[
18
- responseUrl.startsWith("https://")
19
- ? { text: buttonText, web_app: { url: responseUrl } }
20
- : { text: buttonText, url: responseUrl },
21
- ]],
22
- };
23
- }
24
- try {
25
- await bot.sendMessage(chatId, content, opts);
26
- }
27
- catch (err) {
28
- log(`HTML send failed, falling back. Error: ${err instanceof Error ? err.message : err}`);
29
- const fallbackOpts = {};
30
- if (isLastPage && responseUrl) {
31
- const buttonText = t("bot.viewDetails");
32
- fallbackOpts.reply_markup = {
33
- inline_keyboard: [[
34
- responseUrl.startsWith("https://")
35
- ? { text: buttonText, web_app: { url: responseUrl } }
36
- : { text: buttonText, url: responseUrl },
37
- ]],
38
- };
39
- }
40
- try {
41
- await bot.sendMessage(chatId, pages[i], fallbackOpts);
42
- }
43
- catch (err2) {
44
- log(`fallback also failed. Error: ${err2 instanceof Error ? err2.message : err2}`);
45
- await bot.sendMessage(chatId, pages[i]);
46
- }
47
- }
48
- }
49
- }
50
- function splitMessage(text, maxLen) {
51
- if (text.length <= maxLen)
52
- return [text];
53
- const pages = [];
54
- let remaining = text;
55
- while (remaining.length > 0) {
56
- if (remaining.length <= maxLen) {
57
- pages.push(remaining);
58
- break;
59
- }
60
- const splitAt = findSplitPoint(remaining, maxLen);
61
- pages.push(remaining.slice(0, splitAt));
62
- remaining = remaining.slice(splitAt);
63
- }
64
- return pages;
65
- }
66
- function findSplitPoint(text, maxLen) {
67
- for (let i = maxLen; i > maxLen - 200 && i > 0; i--) {
68
- if (text[i] === "\n" && text[i - 1] !== "\\")
69
- return i + 1;
70
- }
71
- for (let i = maxLen; i > maxLen - 200 && i > 0; i--) {
72
- if (text[i] === " " && text[i - 1] !== "\\")
73
- return i + 1;
74
- }
75
- return maxLen;
76
- }
@@ -1 +0,0 @@
1
- export declare function formatError(err: unknown): string;
@@ -1,3 +0,0 @@
1
- export function formatError(err) {
2
- return err instanceof Error ? err.message : String(err);
3
- }
File without changes
File without changes