tg-claude 0.1.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 (111) hide show
  1. package/README.md +175 -0
  2. package/bin/cli.js +2 -0
  3. package/dist/claude/ClaudeProcess.d.ts +77 -0
  4. package/dist/claude/ClaudeProcess.d.ts.map +1 -0
  5. package/dist/claude/ClaudeProcess.js +270 -0
  6. package/dist/claude/ClaudeProcess.js.map +1 -0
  7. package/dist/claude/EventAdapter.d.ts +44 -0
  8. package/dist/claude/EventAdapter.d.ts.map +1 -0
  9. package/dist/claude/EventAdapter.js +129 -0
  10. package/dist/claude/EventAdapter.js.map +1 -0
  11. package/dist/claude/index.d.ts +10 -0
  12. package/dist/claude/index.d.ts.map +1 -0
  13. package/dist/claude/index.js +9 -0
  14. package/dist/claude/index.js.map +1 -0
  15. package/dist/claude/types.d.ts +244 -0
  16. package/dist/claude/types.d.ts.map +1 -0
  17. package/dist/claude/types.js +8 -0
  18. package/dist/claude/types.js.map +1 -0
  19. package/dist/env.d.ts +21 -0
  20. package/dist/env.d.ts.map +1 -0
  21. package/dist/env.js +49 -0
  22. package/dist/env.js.map +1 -0
  23. package/dist/index.d.ts +2 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +360 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/parser/AnsiStripper.d.ts +54 -0
  28. package/dist/parser/AnsiStripper.d.ts.map +1 -0
  29. package/dist/parser/AnsiStripper.js +115 -0
  30. package/dist/parser/AnsiStripper.js.map +1 -0
  31. package/dist/parser/OptionExtractor.d.ts +31 -0
  32. package/dist/parser/OptionExtractor.d.ts.map +1 -0
  33. package/dist/parser/OptionExtractor.js +91 -0
  34. package/dist/parser/OptionExtractor.js.map +1 -0
  35. package/dist/parser/OutputParser.d.ts +121 -0
  36. package/dist/parser/OutputParser.d.ts.map +1 -0
  37. package/dist/parser/OutputParser.js +306 -0
  38. package/dist/parser/OutputParser.js.map +1 -0
  39. package/dist/parser/PromptDetector.d.ts +20 -0
  40. package/dist/parser/PromptDetector.d.ts.map +1 -0
  41. package/dist/parser/PromptDetector.js +68 -0
  42. package/dist/parser/PromptDetector.js.map +1 -0
  43. package/dist/parser/index.d.ts +7 -0
  44. package/dist/parser/index.d.ts.map +1 -0
  45. package/dist/parser/index.js +5 -0
  46. package/dist/parser/index.js.map +1 -0
  47. package/dist/parser/types.d.ts +73 -0
  48. package/dist/parser/types.d.ts.map +1 -0
  49. package/dist/parser/types.js +2 -0
  50. package/dist/parser/types.js.map +1 -0
  51. package/dist/pty/OutputBuffer.d.ts +39 -0
  52. package/dist/pty/OutputBuffer.d.ts.map +1 -0
  53. package/dist/pty/OutputBuffer.js +55 -0
  54. package/dist/pty/OutputBuffer.js.map +1 -0
  55. package/dist/pty/PtyProcess.d.ts +47 -0
  56. package/dist/pty/PtyProcess.d.ts.map +1 -0
  57. package/dist/pty/PtyProcess.js +94 -0
  58. package/dist/pty/PtyProcess.js.map +1 -0
  59. package/dist/pty/PtyService.d.ts +55 -0
  60. package/dist/pty/PtyService.d.ts.map +1 -0
  61. package/dist/pty/PtyService.js +115 -0
  62. package/dist/pty/PtyService.js.map +1 -0
  63. package/dist/pty/index.d.ts +5 -0
  64. package/dist/pty/index.d.ts.map +1 -0
  65. package/dist/pty/index.js +4 -0
  66. package/dist/pty/index.js.map +1 -0
  67. package/dist/pty/types.d.ts +36 -0
  68. package/dist/pty/types.d.ts.map +1 -0
  69. package/dist/pty/types.js +2 -0
  70. package/dist/pty/types.js.map +1 -0
  71. package/dist/router/BoundedQueue.d.ts +57 -0
  72. package/dist/router/BoundedQueue.d.ts.map +1 -0
  73. package/dist/router/BoundedQueue.js +86 -0
  74. package/dist/router/BoundedQueue.js.map +1 -0
  75. package/dist/router/EventRouter.d.ts +103 -0
  76. package/dist/router/EventRouter.d.ts.map +1 -0
  77. package/dist/router/EventRouter.js +169 -0
  78. package/dist/router/EventRouter.js.map +1 -0
  79. package/dist/router/index.d.ts +13 -0
  80. package/dist/router/index.d.ts.map +1 -0
  81. package/dist/router/index.js +12 -0
  82. package/dist/router/index.js.map +1 -0
  83. package/dist/router/types.d.ts +104 -0
  84. package/dist/router/types.d.ts.map +1 -0
  85. package/dist/router/types.js +6 -0
  86. package/dist/router/types.js.map +1 -0
  87. package/dist/telegram/TelegramBot.d.ts +151 -0
  88. package/dist/telegram/TelegramBot.d.ts.map +1 -0
  89. package/dist/telegram/TelegramBot.js +514 -0
  90. package/dist/telegram/TelegramBot.js.map +1 -0
  91. package/dist/telegram/index.d.ts +7 -0
  92. package/dist/telegram/index.d.ts.map +1 -0
  93. package/dist/telegram/index.js +6 -0
  94. package/dist/telegram/index.js.map +1 -0
  95. package/dist/telegram/types.d.ts +30 -0
  96. package/dist/telegram/types.d.ts.map +1 -0
  97. package/dist/telegram/types.js +5 -0
  98. package/dist/telegram/types.js.map +1 -0
  99. package/dist/terminal/TerminalInterface.d.ts +61 -0
  100. package/dist/terminal/TerminalInterface.d.ts.map +1 -0
  101. package/dist/terminal/TerminalInterface.js +218 -0
  102. package/dist/terminal/TerminalInterface.js.map +1 -0
  103. package/dist/terminal/index.d.ts +3 -0
  104. package/dist/terminal/index.d.ts.map +1 -0
  105. package/dist/terminal/index.js +2 -0
  106. package/dist/terminal/index.js.map +1 -0
  107. package/dist/terminal/types.d.ts +17 -0
  108. package/dist/terminal/types.d.ts.map +1 -0
  109. package/dist/terminal/types.js +2 -0
  110. package/dist/terminal/types.js.map +1 -0
  111. package/package.json +43 -0
@@ -0,0 +1,61 @@
1
+ import type { QuestionOption } from '../claude/types.js';
2
+ import type { TerminalInterfaceOptions } from './types.js';
3
+ /**
4
+ * Terminal interface for stdin/stdout interaction alongside Telegram.
5
+ * Handles user input via readline and publishes to EventRouter.
6
+ *
7
+ * Uses composition pattern consistent with EventRouter and ClaudeProcess.
8
+ */
9
+ export declare class TerminalInterface {
10
+ private readonly router;
11
+ private readonly sessionId;
12
+ private readonly rl;
13
+ private readonly promptString;
14
+ /** Whether the interface is waiting for user input */
15
+ private awaitingInput;
16
+ /** Current question options for numeric selection */
17
+ private currentOptions;
18
+ /** Whether current question is multi-select */
19
+ private isMultiSelect;
20
+ constructor(options: TerminalInterfaceOptions);
21
+ /**
22
+ * Set up handler for line input events
23
+ */
24
+ private setupLineHandler;
25
+ /**
26
+ * Set up handler for close event (Ctrl+D)
27
+ */
28
+ private setupCloseHandler;
29
+ /**
30
+ * Display an AskUserQuestion prompt with numbered options
31
+ * @param question - The question text
32
+ * @param options - Available options
33
+ * @param multiSelect - Whether multiple options can be selected
34
+ */
35
+ displayQuestion(question: string, options: QuestionOption[], multiSelect?: boolean): void;
36
+ /**
37
+ * Display text output to terminal stdout
38
+ */
39
+ displayText(text: string): void;
40
+ /**
41
+ * Display a notification/status message (clears current line for clean output)
42
+ */
43
+ displayNotification(message: string): void;
44
+ /**
45
+ * Set whether the interface is awaiting user input
46
+ */
47
+ setAwaitingInput(value: boolean): void;
48
+ /**
49
+ * Get current awaiting input state
50
+ */
51
+ isAwaitingInput(): boolean;
52
+ /**
53
+ * Get the current session ID
54
+ */
55
+ getSessionId(): string;
56
+ /**
57
+ * Close the terminal interface and cleanup readline
58
+ */
59
+ close(): void;
60
+ }
61
+ //# sourceMappingURL=TerminalInterface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TerminalInterface.d.ts","sourceRoot":"","sources":["../../src/terminal/TerminalInterface.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE3D;;;;;GAKG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAoB;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IAEtC,sDAAsD;IACtD,OAAO,CAAC,aAAa,CAAS;IAE9B,qDAAqD;IACrD,OAAO,CAAC,cAAc,CAAwB;IAE9C,+CAA+C;IAC/C,OAAO,CAAC,aAAa,CAAS;gBAElB,OAAO,EAAE,wBAAwB;IAe7C;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAgGxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAMzB;;;;;OAKG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,WAAW,UAAQ,GAAG,IAAI;IAoCvF;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI/B;;OAEG;IACH,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAW1C;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAOtC;;OAEG;IACH,eAAe,IAAI,OAAO;IAI1B;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,218 @@
1
+ import { createInterface } from 'node:readline';
2
+ import { stdin, stdout, stderr } from 'node:process';
3
+ /**
4
+ * Terminal interface for stdin/stdout interaction alongside Telegram.
5
+ * Handles user input via readline and publishes to EventRouter.
6
+ *
7
+ * Uses composition pattern consistent with EventRouter and ClaudeProcess.
8
+ */
9
+ export class TerminalInterface {
10
+ router;
11
+ sessionId;
12
+ rl;
13
+ promptString;
14
+ /** Whether the interface is waiting for user input */
15
+ awaitingInput = false;
16
+ /** Current question options for numeric selection */
17
+ currentOptions = [];
18
+ /** Whether current question is multi-select */
19
+ isMultiSelect = false;
20
+ constructor(options) {
21
+ this.router = options.router;
22
+ this.sessionId = options.sessionId;
23
+ this.promptString = options.prompt ?? '> ';
24
+ this.rl = createInterface({
25
+ input: stdin,
26
+ output: stdout,
27
+ prompt: this.promptString,
28
+ });
29
+ this.setupLineHandler();
30
+ this.setupCloseHandler();
31
+ }
32
+ /**
33
+ * Set up handler for line input events
34
+ */
35
+ setupLineHandler() {
36
+ this.rl.on('line', (line) => {
37
+ // Skip if not awaiting input
38
+ if (!this.awaitingInput) {
39
+ return;
40
+ }
41
+ // Skip empty lines
42
+ const trimmed = line.trim();
43
+ if (trimmed === '') {
44
+ this.rl.prompt();
45
+ return;
46
+ }
47
+ if (this.isMultiSelect && trimmed.includes(',')) {
48
+ // Multi-select: parse comma-separated numbers
49
+ const indices = [];
50
+ const labels = [];
51
+ for (const part of trimmed.split(',')) {
52
+ const num = parseInt(part.trim(), 10);
53
+ if (!isNaN(num) && num >= 1 && num <= this.currentOptions.length) {
54
+ const idx = num - 1; // 0-based
55
+ if (!indices.includes(idx)) {
56
+ indices.push(idx);
57
+ // Get the option label
58
+ const opt = this.currentOptions[idx];
59
+ labels.push(opt.label);
60
+ }
61
+ }
62
+ }
63
+ if (indices.length > 0) {
64
+ // Send comma-separated labels as text
65
+ const responseText = labels.join(', ');
66
+ this.router.publishInbound({
67
+ sessionId: this.sessionId,
68
+ type: 'response',
69
+ payload: {
70
+ text: responseText,
71
+ },
72
+ timestamp: Date.now(),
73
+ source: 'terminal',
74
+ });
75
+ }
76
+ else {
77
+ // No valid numbers, treat as freeform
78
+ this.router.publishInbound({
79
+ sessionId: this.sessionId,
80
+ type: 'response',
81
+ payload: {
82
+ text: trimmed,
83
+ },
84
+ timestamp: Date.now(),
85
+ source: 'terminal',
86
+ });
87
+ }
88
+ }
89
+ else {
90
+ // Single number or freeform text (existing logic)
91
+ const numericValue = parseInt(trimmed, 10);
92
+ if (!isNaN(numericValue) &&
93
+ numericValue >= 1 &&
94
+ numericValue <= this.currentOptions.length) {
95
+ // Numeric selection - publish with optionIndex (0-based)
96
+ this.router.publishInbound({
97
+ sessionId: this.sessionId,
98
+ type: 'response',
99
+ payload: {
100
+ text: trimmed,
101
+ optionIndex: numericValue - 1,
102
+ },
103
+ timestamp: Date.now(),
104
+ source: 'terminal',
105
+ });
106
+ }
107
+ else {
108
+ // Freeform text response
109
+ this.router.publishInbound({
110
+ sessionId: this.sessionId,
111
+ type: 'response',
112
+ payload: {
113
+ text: trimmed,
114
+ },
115
+ timestamp: Date.now(),
116
+ source: 'terminal',
117
+ });
118
+ }
119
+ }
120
+ // Clear awaiting state after input received
121
+ this.awaitingInput = false;
122
+ this.currentOptions = [];
123
+ this.isMultiSelect = false;
124
+ });
125
+ }
126
+ /**
127
+ * Set up handler for close event (Ctrl+D)
128
+ */
129
+ setupCloseHandler() {
130
+ this.rl.on('close', () => {
131
+ stderr.write('[Terminal] Input stream closed (Ctrl+D)\n');
132
+ });
133
+ }
134
+ /**
135
+ * Display an AskUserQuestion prompt with numbered options
136
+ * @param question - The question text
137
+ * @param options - Available options
138
+ * @param multiSelect - Whether multiple options can be selected
139
+ */
140
+ displayQuestion(question, options, multiSelect = false) {
141
+ // Clear current line for clean output
142
+ process.stdout.clearLine?.(0);
143
+ process.stdout.cursorTo?.(0);
144
+ // Print separator and question
145
+ console.log('\n' + '='.repeat(60));
146
+ const selectHint = multiSelect ? ' [multi-select]' : '';
147
+ console.log(`Claude is asking:${selectHint}\n`);
148
+ console.log(question + '\n');
149
+ // Print numbered options
150
+ options.forEach((opt, index) => {
151
+ const line = opt.description
152
+ ? ` ${index + 1}. ${opt.label} - ${opt.description}`
153
+ : ` ${index + 1}. ${opt.label}`;
154
+ console.log(line);
155
+ });
156
+ // Different hint for multi-select vs single-select
157
+ if (multiSelect) {
158
+ console.log('\nEnter numbers separated by commas (e.g., 1,3), or type a response:');
159
+ }
160
+ else {
161
+ console.log('\nEnter number to select, or type a response:');
162
+ }
163
+ console.log('='.repeat(60) + '\n');
164
+ // Set state for input handling
165
+ this.awaitingInput = true;
166
+ this.currentOptions = options;
167
+ this.isMultiSelect = multiSelect;
168
+ // Show prompt
169
+ this.rl.prompt();
170
+ }
171
+ /**
172
+ * Display text output to terminal stdout
173
+ */
174
+ displayText(text) {
175
+ stdout.write(text);
176
+ }
177
+ /**
178
+ * Display a notification/status message (clears current line for clean output)
179
+ */
180
+ displayNotification(message) {
181
+ // Clear current line and move cursor to start for clean output
182
+ process.stdout.clearLine?.(0);
183
+ process.stdout.cursorTo?.(0);
184
+ console.log(`\n${message}`);
185
+ // Re-show prompt if awaiting input
186
+ if (this.awaitingInput) {
187
+ this.rl.prompt(true);
188
+ }
189
+ }
190
+ /**
191
+ * Set whether the interface is awaiting user input
192
+ */
193
+ setAwaitingInput(value) {
194
+ this.awaitingInput = value;
195
+ if (value) {
196
+ this.rl.prompt();
197
+ }
198
+ }
199
+ /**
200
+ * Get current awaiting input state
201
+ */
202
+ isAwaitingInput() {
203
+ return this.awaitingInput;
204
+ }
205
+ /**
206
+ * Get the current session ID
207
+ */
208
+ getSessionId() {
209
+ return this.sessionId;
210
+ }
211
+ /**
212
+ * Close the terminal interface and cleanup readline
213
+ */
214
+ close() {
215
+ this.rl.close();
216
+ }
217
+ }
218
+ //# sourceMappingURL=TerminalInterface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TerminalInterface.js","sourceRoot":"","sources":["../../src/terminal/TerminalInterface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAkC,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAKrD;;;;;GAKG;AACH,MAAM,OAAO,iBAAiB;IACX,MAAM,CAAc;IACpB,SAAS,CAAS;IAClB,EAAE,CAAoB;IACtB,YAAY,CAAS;IAEtC,sDAAsD;IAC9C,aAAa,GAAG,KAAK,CAAC;IAE9B,qDAAqD;IAC7C,cAAc,GAAqB,EAAE,CAAC;IAE9C,+CAA+C;IACvC,aAAa,GAAG,KAAK,CAAC;IAE9B,YAAY,OAAiC;QAC3C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC;QAE3C,IAAI,CAAC,EAAE,GAAG,eAAe,CAAC;YACxB,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,IAAI,CAAC,YAAY;SAC1B,CAAC,CAAC;QAEH,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACK,gBAAgB;QACtB,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YAClC,6BAA6B;YAC7B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;gBACxB,OAAO;YACT,CAAC;YAED,mBAAmB;YACnB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;gBACnB,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;gBACjB,OAAO;YACT,CAAC;YAED,IAAI,IAAI,CAAC,aAAa,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAChD,8CAA8C;gBAC9C,MAAM,OAAO,GAAa,EAAE,CAAC;gBAC7B,MAAM,MAAM,GAAa,EAAE,CAAC;gBAE5B,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;oBACtC,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;oBACtC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;wBACjE,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU;wBAC/B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;4BAC3B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;4BAClB,uBAAuB;4BACvB,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;4BACrC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;wBACzB,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,sCAAsC;oBACtC,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACvC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;wBACzB,SAAS,EAAE,IAAI,CAAC,SAAS;wBACzB,IAAI,EAAE,UAAU;wBAChB,OAAO,EAAE;4BACP,IAAI,EAAE,YAAY;yBACnB;wBACD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;wBACrB,MAAM,EAAE,UAAU;qBACnB,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,sCAAsC;oBACtC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;wBACzB,SAAS,EAAE,IAAI,CAAC,SAAS;wBACzB,IAAI,EAAE,UAAU;wBAChB,OAAO,EAAE;4BACP,IAAI,EAAE,OAAO;yBACd;wBACD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;wBACrB,MAAM,EAAE,UAAU;qBACnB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,kDAAkD;gBAClD,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBAC3C,IACE,CAAC,KAAK,CAAC,YAAY,CAAC;oBACpB,YAAY,IAAI,CAAC;oBACjB,YAAY,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,EAC1C,CAAC;oBACD,yDAAyD;oBACzD,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;wBACzB,SAAS,EAAE,IAAI,CAAC,SAAS;wBACzB,IAAI,EAAE,UAAU;wBAChB,OAAO,EAAE;4BACP,IAAI,EAAE,OAAO;4BACb,WAAW,EAAE,YAAY,GAAG,CAAC;yBAC9B;wBACD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;wBACrB,MAAM,EAAE,UAAU;qBACnB,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,yBAAyB;oBACzB,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;wBACzB,SAAS,EAAE,IAAI,CAAC,SAAS;wBACzB,IAAI,EAAE,UAAU;wBAChB,OAAO,EAAE;4BACP,IAAI,EAAE,OAAO;yBACd;wBACD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;wBACrB,MAAM,EAAE,UAAU;qBACnB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,4CAA4C;YAC5C,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;YAC3B,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;YACzB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,iBAAiB;QACvB,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACvB,MAAM,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,eAAe,CAAC,QAAgB,EAAE,OAAyB,EAAE,WAAW,GAAG,KAAK;QAC9E,sCAAsC;QACtC,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9B,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;QAE7B,+BAA+B;QAC/B,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QACnC,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,oBAAoB,UAAU,IAAI,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;QAE7B,yBAAyB;QACzB,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YAC7B,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW;gBAC1B,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,KAAK,MAAM,GAAG,CAAC,WAAW,EAAE;gBACrD,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,KAAK,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;QAEH,mDAAmD;QACnD,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;QACtF,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QAEnC,+BAA+B;QAC/B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;QAC9B,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC;QAEjC,cAAc;QACd,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,IAAY;QACtB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,OAAe;QACjC,+DAA+D;QAC/D,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9B,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;QAC5B,mCAAmC;QACnC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,KAAc;QAC7B,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;QACnB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ export { TerminalInterface } from './TerminalInterface.js';
2
+ export type { TerminalInterfaceOptions, TerminalQuestionDisplay } from './types.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/terminal/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,YAAY,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { TerminalInterface } from './TerminalInterface.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/terminal/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { QuestionOption } from '../claude/types.js';
2
+ import type { EventRouter } from '../router/EventRouter.js';
3
+ /** Options for creating TerminalInterface */
4
+ export interface TerminalInterfaceOptions {
5
+ /** EventRouter for publishing inbound events */
6
+ router: EventRouter;
7
+ /** Session ID for this terminal instance */
8
+ sessionId: string;
9
+ /** Prompt string (default: '> ') */
10
+ prompt?: string;
11
+ }
12
+ /** Display options for AskUserQuestion in terminal */
13
+ export interface TerminalQuestionDisplay {
14
+ question: string;
15
+ options: QuestionOption[];
16
+ }
17
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/terminal/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D,6CAA6C;AAC7C,MAAM,WAAW,wBAAwB;IACvC,gDAAgD;IAChD,MAAM,EAAE,WAAW,CAAC;IACpB,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,sDAAsD;AACtD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,cAAc,EAAE,CAAC;CAC3B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/terminal/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "tg-claude",
3
+ "version": "0.1.0",
4
+ "description": "Bridge between Claude Code CLI and Telegram for mobile interaction",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "tg-claude": "bin/cli.js"
9
+ },
10
+ "files": [
11
+ "dist/",
12
+ "bin/"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "start": "node dist/index.js",
17
+ "dev": "tsx src/index.ts",
18
+ "prepare": "npm run build"
19
+ },
20
+ "engines": {
21
+ "node": ">=20"
22
+ },
23
+ "keywords": [
24
+ "claude",
25
+ "telegram",
26
+ "pty",
27
+ "terminal"
28
+ ],
29
+ "author": "",
30
+ "license": "MIT",
31
+ "dependencies": {
32
+ "ansi-regex": "^6.2.2",
33
+ "dotenv": "^17.2.3",
34
+ "grammy": "^1.39.3",
35
+ "node-pty": "^1.1.0",
36
+ "strip-ansi": "^7.1.2"
37
+ },
38
+ "devDependencies": {
39
+ "@types/node": "^22.0.0",
40
+ "tsx": "^4.0.0",
41
+ "typescript": "^5.7.0"
42
+ }
43
+ }