claude-telegram-mirror 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 (99) hide show
  1. package/README.md +331 -0
  2. package/dist/bot/commands.d.ts +41 -0
  3. package/dist/bot/commands.d.ts.map +1 -0
  4. package/dist/bot/commands.js +231 -0
  5. package/dist/bot/commands.js.map +1 -0
  6. package/dist/bot/formatting.d.ts +62 -0
  7. package/dist/bot/formatting.d.ts.map +1 -0
  8. package/dist/bot/formatting.js +295 -0
  9. package/dist/bot/formatting.js.map +1 -0
  10. package/dist/bot/telegram.d.ts +93 -0
  11. package/dist/bot/telegram.d.ts.map +1 -0
  12. package/dist/bot/telegram.js +378 -0
  13. package/dist/bot/telegram.js.map +1 -0
  14. package/dist/bot/types.d.ts +28 -0
  15. package/dist/bot/types.d.ts.map +1 -0
  16. package/dist/bot/types.js +5 -0
  17. package/dist/bot/types.js.map +1 -0
  18. package/dist/bridge/daemon.d.ts +93 -0
  19. package/dist/bridge/daemon.d.ts.map +1 -0
  20. package/dist/bridge/daemon.js +626 -0
  21. package/dist/bridge/daemon.js.map +1 -0
  22. package/dist/bridge/index.d.ts +10 -0
  23. package/dist/bridge/index.d.ts.map +1 -0
  24. package/dist/bridge/index.js +9 -0
  25. package/dist/bridge/index.js.map +1 -0
  26. package/dist/bridge/injector.d.ts +97 -0
  27. package/dist/bridge/injector.d.ts.map +1 -0
  28. package/dist/bridge/injector.js +289 -0
  29. package/dist/bridge/injector.js.map +1 -0
  30. package/dist/bridge/session.d.ts +108 -0
  31. package/dist/bridge/session.d.ts.map +1 -0
  32. package/dist/bridge/session.js +381 -0
  33. package/dist/bridge/session.js.map +1 -0
  34. package/dist/bridge/socket.d.ts +97 -0
  35. package/dist/bridge/socket.d.ts.map +1 -0
  36. package/dist/bridge/socket.js +436 -0
  37. package/dist/bridge/socket.js.map +1 -0
  38. package/dist/bridge/types.d.ts +38 -0
  39. package/dist/bridge/types.d.ts.map +1 -0
  40. package/dist/bridge/types.js +5 -0
  41. package/dist/bridge/types.js.map +1 -0
  42. package/dist/cli.d.ts +7 -0
  43. package/dist/cli.d.ts.map +1 -0
  44. package/dist/cli.js +332 -0
  45. package/dist/cli.js.map +1 -0
  46. package/dist/hooks/handler.d.ts +94 -0
  47. package/dist/hooks/handler.d.ts.map +1 -0
  48. package/dist/hooks/handler.js +431 -0
  49. package/dist/hooks/handler.js.map +1 -0
  50. package/dist/hooks/index.d.ts +8 -0
  51. package/dist/hooks/index.d.ts.map +1 -0
  52. package/dist/hooks/index.js +7 -0
  53. package/dist/hooks/index.js.map +1 -0
  54. package/dist/hooks/installer.d.ts +46 -0
  55. package/dist/hooks/installer.d.ts.map +1 -0
  56. package/dist/hooks/installer.js +317 -0
  57. package/dist/hooks/installer.js.map +1 -0
  58. package/dist/hooks/types.d.ts +88 -0
  59. package/dist/hooks/types.d.ts.map +1 -0
  60. package/dist/hooks/types.js +6 -0
  61. package/dist/hooks/types.js.map +1 -0
  62. package/dist/index.d.ts +19 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +20 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/service/doctor.d.ts +10 -0
  67. package/dist/service/doctor.d.ts.map +1 -0
  68. package/dist/service/doctor.js +424 -0
  69. package/dist/service/doctor.js.map +1 -0
  70. package/dist/service/manager.d.ts +48 -0
  71. package/dist/service/manager.d.ts.map +1 -0
  72. package/dist/service/manager.js +584 -0
  73. package/dist/service/manager.js.map +1 -0
  74. package/dist/service/setup.d.ts +10 -0
  75. package/dist/service/setup.d.ts.map +1 -0
  76. package/dist/service/setup.js +266 -0
  77. package/dist/service/setup.js.map +1 -0
  78. package/dist/utils/chunker.d.ts +24 -0
  79. package/dist/utils/chunker.d.ts.map +1 -0
  80. package/dist/utils/chunker.js +123 -0
  81. package/dist/utils/chunker.js.map +1 -0
  82. package/dist/utils/config.d.ts +48 -0
  83. package/dist/utils/config.d.ts.map +1 -0
  84. package/dist/utils/config.js +154 -0
  85. package/dist/utils/config.js.map +1 -0
  86. package/dist/utils/logger.d.ts +7 -0
  87. package/dist/utils/logger.d.ts.map +1 -0
  88. package/dist/utils/logger.js +28 -0
  89. package/dist/utils/logger.js.map +1 -0
  90. package/package.json +88 -0
  91. package/postinstall.cjs +76 -0
  92. package/scripts/claude-wrapper.sh +122 -0
  93. package/scripts/doctor.sh +433 -0
  94. package/scripts/get-chat-id.sh +64 -0
  95. package/scripts/global-hooks.sh +39 -0
  96. package/scripts/install.sh +831 -0
  97. package/scripts/start-daemon.sh +49 -0
  98. package/scripts/telegram-hook.sh +449 -0
  99. package/scripts/uninstall.sh +261 -0
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Bridge Module
3
+ * Exports all bridge-related functionality
4
+ */
5
+ export { BridgeDaemon } from './daemon.js';
6
+ export { SocketServer, SocketClient, DEFAULT_SOCKET_PATH } from './socket.js';
7
+ export { SessionManager } from './session.js';
8
+ export { InputInjector, createInjector } from './injector.js';
9
+ export type { BridgeMessage, Session, PendingApproval } from './types.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bridge/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC9D,YAAY,EACV,aAAa,EACb,OAAO,EACP,eAAe,EAChB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Bridge Module
3
+ * Exports all bridge-related functionality
4
+ */
5
+ export { BridgeDaemon } from './daemon.js';
6
+ export { SocketServer, SocketClient, DEFAULT_SOCKET_PATH } from './socket.js';
7
+ export { SessionManager } from './session.js';
8
+ export { InputInjector, createInjector } from './injector.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bridge/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Input Injector
3
+ * Injects user input from Telegram into Claude Code CLI
4
+ */
5
+ import { EventEmitter } from 'events';
6
+ /**
7
+ * Injection method types
8
+ */
9
+ type InjectionMethod = 'tmux' | 'pty' | 'fifo' | 'none';
10
+ /**
11
+ * Input Injector Configuration
12
+ */
13
+ interface InjectorConfig {
14
+ method: InjectionMethod;
15
+ tmuxSession?: string;
16
+ tmuxSocket?: string;
17
+ fifoPath?: string;
18
+ }
19
+ /**
20
+ * Input Injector Class
21
+ * Handles sending user input from Telegram to Claude Code
22
+ */
23
+ export declare class InputInjector extends EventEmitter {
24
+ private config;
25
+ private method;
26
+ private tmuxSession;
27
+ private tmuxSocket;
28
+ constructor(config?: Partial<InjectorConfig>);
29
+ /**
30
+ * Detect available injection method
31
+ */
32
+ detectMethod(): Promise<InjectionMethod>;
33
+ /**
34
+ * Initialize injector
35
+ */
36
+ init(): Promise<boolean>;
37
+ /**
38
+ * Inject input text into Claude Code
39
+ */
40
+ inject(text: string): Promise<boolean>;
41
+ /**
42
+ * Inject via tmux send-keys
43
+ */
44
+ private injectViaTmux;
45
+ /**
46
+ * Inject via PTY (direct stdin)
47
+ */
48
+ private injectViaPty;
49
+ /**
50
+ * Inject via FIFO pipe
51
+ */
52
+ private injectViaFifo;
53
+ /**
54
+ * Check if tmux is available
55
+ */
56
+ private isTmuxAvailable;
57
+ /**
58
+ * Detect current tmux session
59
+ */
60
+ private detectTmuxSession;
61
+ /**
62
+ * Find a tmux session running Claude Code
63
+ */
64
+ private findClaudeCodeSession;
65
+ /**
66
+ * Escape text for tmux send-keys with -l flag
67
+ * With -l (literal), tmux handles most characters, we only need to escape double quotes
68
+ * since we wrap the text in double quotes for the shell command
69
+ */
70
+ private escapeTmuxText;
71
+ /**
72
+ * Send special key
73
+ */
74
+ sendKey(key: 'Enter' | 'Escape' | 'Tab' | 'Ctrl-C'): Promise<boolean>;
75
+ /**
76
+ * Get current injection method
77
+ */
78
+ getMethod(): InjectionMethod;
79
+ /**
80
+ * Get tmux session name
81
+ */
82
+ getTmuxSession(): string | null;
83
+ /**
84
+ * Set tmux session explicitly (with optional socket path)
85
+ */
86
+ setTmuxSession(session: string, socket?: string): void;
87
+ /**
88
+ * Get tmux socket path
89
+ */
90
+ getTmuxSocket(): string | null;
91
+ }
92
+ /**
93
+ * Create and initialize an input injector
94
+ */
95
+ export declare function createInjector(config?: Partial<InjectorConfig>): Promise<InputInjector | null>;
96
+ export default InputInjector;
97
+ //# sourceMappingURL=injector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injector.d.ts","sourceRoot":"","sources":["../../src/bridge/injector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGtC;;GAEG;AACH,KAAK,eAAe,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAExD;;GAEG;AACH,UAAU,cAAc;IACtB,MAAM,EAAE,eAAe,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,UAAU,CAAuB;gBAE7B,MAAM,GAAE,OAAO,CAAC,cAAc,CAAM;IAShD;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,eAAe,CAAC;IAoB9C;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IAY9B;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiB5C;;OAEG;IACH,OAAO,CAAC,aAAa;IAkDrB;;OAEG;IACH,OAAO,CAAC,YAAY;IAUpB;;OAEG;IACH,OAAO,CAAC,aAAa;IAiBrB;;OAEG;IACH,OAAO,CAAC,eAAe;IASvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAkBzB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAmC7B;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAQtB;;OAEG;IACG,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAuB3E;;OAEG;IACH,SAAS,IAAI,eAAe;IAI5B;;OAEG;IACH,cAAc,IAAI,MAAM,GAAG,IAAI;IAI/B;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAQtD;;OAEG;IACH,aAAa,IAAI,MAAM,GAAG,IAAI;CAG/B;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAIpG;AAED,eAAe,aAAa,CAAC"}
@@ -0,0 +1,289 @@
1
+ /**
2
+ * Input Injector
3
+ * Injects user input from Telegram into Claude Code CLI
4
+ */
5
+ import { execSync } from 'child_process';
6
+ import { existsSync } from 'fs';
7
+ import { EventEmitter } from 'events';
8
+ import logger from '../utils/logger.js';
9
+ /**
10
+ * Input Injector Class
11
+ * Handles sending user input from Telegram to Claude Code
12
+ */
13
+ export class InputInjector extends EventEmitter {
14
+ config;
15
+ method = 'none';
16
+ tmuxSession = null;
17
+ tmuxSocket = null; // Socket path for explicit targeting
18
+ constructor(config = {}) {
19
+ super();
20
+ this.config = {
21
+ method: config.method || 'tmux',
22
+ tmuxSession: config.tmuxSession,
23
+ fifoPath: config.fifoPath
24
+ };
25
+ }
26
+ /**
27
+ * Detect available injection method
28
+ */
29
+ async detectMethod() {
30
+ // Check for tmux
31
+ if (this.isTmuxAvailable()) {
32
+ const session = this.detectTmuxSession();
33
+ if (session) {
34
+ this.tmuxSession = session;
35
+ logger.info('Detected tmux session', { session });
36
+ return 'tmux';
37
+ }
38
+ }
39
+ // Check for PTY
40
+ if (process.stdout.isTTY && process.stdin.isTTY) {
41
+ return 'pty';
42
+ }
43
+ logger.warn('No injection method available');
44
+ return 'none';
45
+ }
46
+ /**
47
+ * Initialize injector
48
+ */
49
+ async init() {
50
+ this.method = await this.detectMethod();
51
+ if (this.method === 'none') {
52
+ logger.warn('Input injection not available');
53
+ return false;
54
+ }
55
+ logger.info('Input injector initialized', { method: this.method });
56
+ return true;
57
+ }
58
+ /**
59
+ * Inject input text into Claude Code
60
+ */
61
+ async inject(text) {
62
+ switch (this.method) {
63
+ case 'tmux':
64
+ return this.injectViaTmux(text);
65
+ case 'pty':
66
+ return this.injectViaPty(text);
67
+ case 'fifo':
68
+ return this.injectViaFifo(text);
69
+ default:
70
+ logger.warn('No injection method configured');
71
+ return false;
72
+ }
73
+ }
74
+ /**
75
+ * Inject via tmux send-keys
76
+ */
77
+ injectViaTmux(text) {
78
+ if (!this.tmuxSession) {
79
+ logger.warn('No tmux session');
80
+ return false;
81
+ }
82
+ try {
83
+ // Escape special characters for tmux
84
+ const escapedText = this.escapeTmuxText(text);
85
+ // Build tmux command with explicit socket if available
86
+ // -S specifies the socket path, -t specifies the target session:window.pane
87
+ const socketFlag = this.tmuxSocket ? `-S "${this.tmuxSocket}"` : '';
88
+ const sendKeysCmd = `tmux ${socketFlag} send-keys -t "${this.tmuxSession}" -l "${escapedText}"`;
89
+ const enterCmd = `tmux ${socketFlag} send-keys -t "${this.tmuxSession}" Enter`;
90
+ logger.debug('Running tmux command', {
91
+ cmd: sendKeysCmd,
92
+ session: this.tmuxSession,
93
+ socket: this.tmuxSocket,
94
+ textLength: text.length
95
+ });
96
+ execSync(sendKeysCmd, {
97
+ stdio: 'pipe',
98
+ encoding: 'utf8'
99
+ });
100
+ // Send Enter key separately to submit
101
+ execSync(enterCmd, {
102
+ stdio: 'pipe',
103
+ encoding: 'utf8'
104
+ });
105
+ logger.debug('Injected via tmux', { session: this.tmuxSession, socket: this.tmuxSocket });
106
+ return true;
107
+ }
108
+ catch (error) {
109
+ const execError = error;
110
+ logger.error('Failed to inject via tmux', {
111
+ error,
112
+ stderr: execError.stderr,
113
+ message: execError.message,
114
+ session: this.tmuxSession,
115
+ socket: this.tmuxSocket,
116
+ textLength: text.length
117
+ });
118
+ return false;
119
+ }
120
+ }
121
+ /**
122
+ * Inject via PTY (direct stdin)
123
+ */
124
+ injectViaPty(text) {
125
+ try {
126
+ process.stdin.push(text + '\n');
127
+ return true;
128
+ }
129
+ catch (error) {
130
+ logger.error('Failed to inject via PTY', { error });
131
+ return false;
132
+ }
133
+ }
134
+ /**
135
+ * Inject via FIFO pipe
136
+ */
137
+ injectViaFifo(text) {
138
+ if (!this.config.fifoPath || !existsSync(this.config.fifoPath)) {
139
+ logger.warn('FIFO path not available');
140
+ return false;
141
+ }
142
+ try {
143
+ execSync(`echo "${text}" > "${this.config.fifoPath}"`, {
144
+ stdio: 'ignore'
145
+ });
146
+ return true;
147
+ }
148
+ catch (error) {
149
+ logger.error('Failed to inject via FIFO', { error });
150
+ return false;
151
+ }
152
+ }
153
+ /**
154
+ * Check if tmux is available
155
+ */
156
+ isTmuxAvailable() {
157
+ try {
158
+ execSync('which tmux', { stdio: 'ignore' });
159
+ return true;
160
+ }
161
+ catch {
162
+ return false;
163
+ }
164
+ }
165
+ /**
166
+ * Detect current tmux session
167
+ */
168
+ detectTmuxSession() {
169
+ // Check if we're inside tmux
170
+ if (!process.env.TMUX) {
171
+ // Look for Claude Code sessions
172
+ return this.findClaudeCodeSession();
173
+ }
174
+ try {
175
+ // Get current session name
176
+ const session = execSync('tmux display-message -p "#S"', {
177
+ encoding: 'utf8'
178
+ }).trim();
179
+ return session;
180
+ }
181
+ catch {
182
+ return null;
183
+ }
184
+ }
185
+ /**
186
+ * Find a tmux session running Claude Code
187
+ */
188
+ findClaudeCodeSession() {
189
+ try {
190
+ // List all tmux sessions and panes
191
+ const output = execSync('tmux list-panes -a -F "#{session_name}:#{pane_current_command}" 2>/dev/null', { encoding: 'utf8' });
192
+ const lines = output.trim().split('\n');
193
+ for (const line of lines) {
194
+ const [session, command] = line.split(':');
195
+ // Look for node/claude processes
196
+ if (command && (command.includes('claude') || command.includes('node'))) {
197
+ return session;
198
+ }
199
+ }
200
+ // Fallback: look for any session with "claude" in the name
201
+ const sessions = execSync('tmux list-sessions -F "#{session_name}" 2>/dev/null', {
202
+ encoding: 'utf8'
203
+ }).trim().split('\n');
204
+ for (const session of sessions) {
205
+ if (session.toLowerCase().includes('claude') || session.toLowerCase().includes('code')) {
206
+ return session;
207
+ }
208
+ }
209
+ return null;
210
+ }
211
+ catch {
212
+ return null;
213
+ }
214
+ }
215
+ /**
216
+ * Escape text for tmux send-keys with -l flag
217
+ * With -l (literal), tmux handles most characters, we only need to escape double quotes
218
+ * since we wrap the text in double quotes for the shell command
219
+ */
220
+ escapeTmuxText(text) {
221
+ // Only escape double quotes and backslashes for the shell
222
+ // Single quotes, $, ` are all fine with -l flag
223
+ return text
224
+ .replace(/\\/g, '\\\\')
225
+ .replace(/"/g, '\\"');
226
+ }
227
+ /**
228
+ * Send special key
229
+ */
230
+ async sendKey(key) {
231
+ if (this.method !== 'tmux' || !this.tmuxSession) {
232
+ return false;
233
+ }
234
+ try {
235
+ const keyMap = {
236
+ 'Enter': 'Enter',
237
+ 'Escape': 'Escape',
238
+ 'Tab': 'Tab',
239
+ 'Ctrl-C': 'C-c'
240
+ };
241
+ execSync(`tmux send-keys -t "${this.tmuxSession}" ${keyMap[key]}`, {
242
+ stdio: 'ignore'
243
+ });
244
+ return true;
245
+ }
246
+ catch (error) {
247
+ logger.error('Failed to send key', { key, error });
248
+ return false;
249
+ }
250
+ }
251
+ /**
252
+ * Get current injection method
253
+ */
254
+ getMethod() {
255
+ return this.method;
256
+ }
257
+ /**
258
+ * Get tmux session name
259
+ */
260
+ getTmuxSession() {
261
+ return this.tmuxSession;
262
+ }
263
+ /**
264
+ * Set tmux session explicitly (with optional socket path)
265
+ */
266
+ setTmuxSession(session, socket) {
267
+ this.tmuxSession = session;
268
+ this.tmuxSocket = socket || null;
269
+ if (session) {
270
+ this.method = 'tmux';
271
+ }
272
+ }
273
+ /**
274
+ * Get tmux socket path
275
+ */
276
+ getTmuxSocket() {
277
+ return this.tmuxSocket;
278
+ }
279
+ }
280
+ /**
281
+ * Create and initialize an input injector
282
+ */
283
+ export async function createInjector(config) {
284
+ const injector = new InputInjector(config);
285
+ const success = await injector.init();
286
+ return success ? injector : null;
287
+ }
288
+ export default InputInjector;
289
+ //# sourceMappingURL=injector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injector.js","sourceRoot":"","sources":["../../src/bridge/injector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Session Management with SQLite
3
+ * Tracks CLI sessions and pending approvals
4
+ */
5
+ import type { Session, PendingApproval } from './types.js';
6
+ /**
7
+ * Session Manager
8
+ * Handles session and approval lifecycle
9
+ */
10
+ export declare class SessionManager {
11
+ private db;
12
+ private approvalTimeout;
13
+ constructor(dbPath?: string, approvalTimeoutMinutes?: number);
14
+ /**
15
+ * Initialize database schema
16
+ */
17
+ private initSchema;
18
+ /**
19
+ * Migration: Add tmux columns to existing databases
20
+ */
21
+ private migrateAddTmuxTarget;
22
+ /**
23
+ * Create a new session with optional specific ID (for using Claude's native session_id)
24
+ */
25
+ createSession(chatId: number, projectDir?: string, threadId?: number, hostname?: string, sessionId?: string, tmuxTarget?: string, tmuxSocket?: string): string;
26
+ /**
27
+ * Update session thread ID
28
+ */
29
+ setSessionThread(sessionId: string, threadId: number): void;
30
+ /**
31
+ * Get session thread ID
32
+ */
33
+ getSessionThread(sessionId: string): number | null;
34
+ /**
35
+ * Set session tmux info (target and socket for input injection)
36
+ */
37
+ setTmuxInfo(sessionId: string, tmuxTarget?: string, tmuxSocket?: string): void;
38
+ /**
39
+ * Get session tmux info (target and socket)
40
+ */
41
+ getTmuxInfo(sessionId: string): {
42
+ target: string | null;
43
+ socket: string | null;
44
+ };
45
+ /**
46
+ * Get session by ID
47
+ */
48
+ getSession(sessionId: string): Session | null;
49
+ /**
50
+ * Get session by chat ID (most recent active)
51
+ */
52
+ getSessionByChatId(chatId: number): Session | null;
53
+ /**
54
+ * Get session by thread ID (for routing Telegram replies)
55
+ */
56
+ getSessionByThreadId(threadId: number): Session | null;
57
+ /**
58
+ * Get all active sessions
59
+ */
60
+ getActiveSessions(): Session[];
61
+ /**
62
+ * Update session activity
63
+ */
64
+ updateActivity(sessionId: string): void;
65
+ /**
66
+ * End a session
67
+ */
68
+ endSession(sessionId: string, status?: 'ended' | 'aborted'): void;
69
+ /**
70
+ * Create a pending approval
71
+ */
72
+ createApproval(sessionId: string, prompt: string, messageId?: number): string;
73
+ /**
74
+ * Get approval by ID
75
+ */
76
+ getApproval(approvalId: string): PendingApproval | null;
77
+ /**
78
+ * Get pending approvals for a session
79
+ */
80
+ getPendingApprovals(sessionId: string): PendingApproval[];
81
+ /**
82
+ * Resolve an approval
83
+ */
84
+ resolveApproval(approvalId: string, status: 'approved' | 'rejected'): boolean;
85
+ /**
86
+ * Expire old approvals
87
+ */
88
+ expireOldApprovals(): number;
89
+ /**
90
+ * Clean up old sessions
91
+ */
92
+ cleanupOldSessions(maxAgeDays?: number): number;
93
+ /**
94
+ * Get database stats
95
+ */
96
+ getStats(): {
97
+ activeSessions: number;
98
+ pendingApprovals: number;
99
+ };
100
+ /**
101
+ * Close database connection
102
+ */
103
+ close(): void;
104
+ private rowToSession;
105
+ private rowToApproval;
106
+ }
107
+ export default SessionManager;
108
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/bridge/session.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAc3D;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,eAAe,CAAS;gBAEpB,MAAM,GAAE,MAAgB,EAAE,sBAAsB,GAAE,MAAU;IAaxE;;OAEG;IACH,OAAO,CAAC,UAAU;IAwClB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAqB5B;;OAEG;IACH,aAAa,CACX,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM;IA0BT;;OAEG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAO3D;;OAEG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAOlD;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IAiB9E;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE;IAUhF;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAQ7C;;OAEG;IACH,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAWlD;;OAEG;IACH,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAUtD;;OAEG;IACH,iBAAiB,IAAI,OAAO,EAAE;IAS9B;;OAEG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAMvC;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,GAAE,OAAO,GAAG,SAAmB,GAAG,IAAI;IAiB1E;;OAEG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM;IAsB7E;;OAEG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;IAQvD;;OAEG;IACH,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,EAAE;IAUzD;;OAEG;IACH,eAAe,CACb,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,UAAU,GAAG,UAAU,GAC9B,OAAO;IAgBV;;OAEG;IACH,kBAAkB,IAAI,MAAM;IAiB5B;;OAEG;IACH,kBAAkB,CAAC,UAAU,GAAE,MAAU,GAAG,MAAM;IAwBlD;;OAEG;IACH,QAAQ,IAAI;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE;IAehE;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,aAAa;CAUtB;AA2BD,eAAe,cAAc,CAAC"}