claude-pager 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.
- package/LICENSE +21 -0
- package/README.md +207 -0
- package/dist/channels/channel.d.ts +27 -0
- package/dist/channels/channel.d.ts.map +1 -0
- package/dist/channels/channel.js +3 -0
- package/dist/channels/channel.js.map +1 -0
- package/dist/channels/factory.d.ts +4 -0
- package/dist/channels/factory.d.ts.map +1 -0
- package/dist/channels/factory.js +22 -0
- package/dist/channels/factory.js.map +1 -0
- package/dist/channels/ntfy/__tests__/provider.test.d.ts +2 -0
- package/dist/channels/ntfy/__tests__/provider.test.d.ts.map +1 -0
- package/dist/channels/ntfy/__tests__/provider.test.js +29 -0
- package/dist/channels/ntfy/__tests__/provider.test.js.map +1 -0
- package/dist/channels/ntfy/provider.d.ts +17 -0
- package/dist/channels/ntfy/provider.d.ts.map +1 -0
- package/dist/channels/ntfy/provider.js +142 -0
- package/dist/channels/ntfy/provider.js.map +1 -0
- package/dist/channels/telegram/provider.d.ts +27 -0
- package/dist/channels/telegram/provider.d.ts.map +1 -0
- package/dist/channels/telegram/provider.js +312 -0
- package/dist/channels/telegram/provider.js.map +1 -0
- package/dist/channels/telegram/voice-handler.d.ts +22 -0
- package/dist/channels/telegram/voice-handler.d.ts.map +1 -0
- package/dist/channels/telegram/voice-handler.js +68 -0
- package/dist/channels/telegram/voice-handler.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +99 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/recover.d.ts +2 -0
- package/dist/cli/recover.d.ts.map +1 -0
- package/dist/cli/recover.js +45 -0
- package/dist/cli/recover.js.map +1 -0
- package/dist/cli/run.d.ts +2 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +32 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/setup.d.ts +8 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +238 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/config/index.d.ts +6 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +40 -0
- package/dist/config/index.js.map +1 -0
- package/dist/daemon/__tests__/handlers.test.d.ts +2 -0
- package/dist/daemon/__tests__/handlers.test.d.ts.map +1 -0
- package/dist/daemon/__tests__/handlers.test.js +99 -0
- package/dist/daemon/__tests__/handlers.test.js.map +1 -0
- package/dist/daemon/__tests__/server.test.d.ts +2 -0
- package/dist/daemon/__tests__/server.test.d.ts.map +1 -0
- package/dist/daemon/__tests__/server.test.js +118 -0
- package/dist/daemon/__tests__/server.test.js.map +1 -0
- package/dist/daemon/handlers.d.ts +4 -0
- package/dist/daemon/handlers.d.ts.map +1 -0
- package/dist/daemon/handlers.js +153 -0
- package/dist/daemon/handlers.js.map +1 -0
- package/dist/daemon/index.d.ts +7 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +83 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/server.d.ts +11 -0
- package/dist/daemon/server.d.ts.map +1 -0
- package/dist/daemon/server.js +115 -0
- package/dist/daemon/server.js.map +1 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +172 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/injectors/__tests__/tmux.test.d.ts +2 -0
- package/dist/injectors/__tests__/tmux.test.d.ts.map +1 -0
- package/dist/injectors/__tests__/tmux.test.js +38 -0
- package/dist/injectors/__tests__/tmux.test.js.map +1 -0
- package/dist/injectors/factory.d.ts +3 -0
- package/dist/injectors/factory.d.ts.map +1 -0
- package/dist/injectors/factory.js +22 -0
- package/dist/injectors/factory.js.map +1 -0
- package/dist/injectors/injector.d.ts +7 -0
- package/dist/injectors/injector.d.ts.map +1 -0
- package/dist/injectors/injector.js +3 -0
- package/dist/injectors/injector.js.map +1 -0
- package/dist/injectors/tmux/injector.d.ts +9 -0
- package/dist/injectors/tmux/injector.d.ts.map +1 -0
- package/dist/injectors/tmux/injector.js +55 -0
- package/dist/injectors/tmux/injector.js.map +1 -0
- package/dist/injectors/xdotool/injector.d.ts +9 -0
- package/dist/injectors/xdotool/injector.d.ts.map +1 -0
- package/dist/injectors/xdotool/injector.js +59 -0
- package/dist/injectors/xdotool/injector.js.map +1 -0
- package/dist/sessions/__tests__/events.test.d.ts +2 -0
- package/dist/sessions/__tests__/events.test.d.ts.map +1 -0
- package/dist/sessions/__tests__/events.test.js +103 -0
- package/dist/sessions/__tests__/events.test.js.map +1 -0
- package/dist/sessions/__tests__/tracker.test.d.ts +2 -0
- package/dist/sessions/__tests__/tracker.test.d.ts.map +1 -0
- package/dist/sessions/__tests__/tracker.test.js +24 -0
- package/dist/sessions/__tests__/tracker.test.js.map +1 -0
- package/dist/sessions/events.d.ts +11 -0
- package/dist/sessions/events.d.ts.map +1 -0
- package/dist/sessions/events.js +73 -0
- package/dist/sessions/events.js.map +1 -0
- package/dist/sessions/tracker.d.ts +7 -0
- package/dist/sessions/tracker.d.ts.map +1 -0
- package/dist/sessions/tracker.js +83 -0
- package/dist/sessions/tracker.js.map +1 -0
- package/dist/types.d.ts +55 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/__tests__/html.test.d.ts +2 -0
- package/dist/utils/__tests__/html.test.d.ts.map +1 -0
- package/dist/utils/__tests__/html.test.js +42 -0
- package/dist/utils/__tests__/html.test.js.map +1 -0
- package/dist/utils/__tests__/json.test.d.ts +2 -0
- package/dist/utils/__tests__/json.test.d.ts.map +1 -0
- package/dist/utils/__tests__/json.test.js +27 -0
- package/dist/utils/__tests__/json.test.js.map +1 -0
- package/dist/utils/__tests__/validation.test.d.ts +2 -0
- package/dist/utils/__tests__/validation.test.d.ts.map +1 -0
- package/dist/utils/__tests__/validation.test.js +38 -0
- package/dist/utils/__tests__/validation.test.js.map +1 -0
- package/dist/utils/html.d.ts +3 -0
- package/dist/utils/html.d.ts.map +1 -0
- package/dist/utils/html.js +43 -0
- package/dist/utils/html.js.map +1 -0
- package/dist/utils/json.d.ts +2 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/json.js +13 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/utils/validation.d.ts +4 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +16 -0
- package/dist/utils/validation.js.map +1 -0
- package/dist/voice/transcribe.d.ts +7 -0
- package/dist/voice/transcribe.d.ts.map +1 -0
- package/dist/voice/transcribe.js +66 -0
- package/dist/voice/transcribe.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"AAwFA,wBAAsB,KAAK,CAAC,OAAO,EAAE;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBhB"}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setup = setup;
|
|
4
|
+
const node_fs_1 = require("node:fs");
|
|
5
|
+
const node_path_1 = require("node:path");
|
|
6
|
+
const node_os_1 = require("node:os");
|
|
7
|
+
const node_readline_1 = require("node:readline");
|
|
8
|
+
const index_js_1 = require("../config/index.js");
|
|
9
|
+
const CLAUDE_SETTINGS_FILE = (0, node_path_1.join)((0, node_os_1.homedir)(), '.claude', 'settings.json');
|
|
10
|
+
function prompt(question, defaultValue) {
|
|
11
|
+
const rl = (0, node_readline_1.createInterface)({ input: process.stdin, output: process.stdout });
|
|
12
|
+
const suffix = defaultValue ? ` [${defaultValue}]` : '';
|
|
13
|
+
return new Promise(resolve => {
|
|
14
|
+
rl.question(`${question}${suffix}: `, answer => {
|
|
15
|
+
rl.close();
|
|
16
|
+
resolve(answer.trim() || defaultValue || '');
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
function promptSecret(question) {
|
|
21
|
+
return new Promise(resolve => {
|
|
22
|
+
const rl = (0, node_readline_1.createInterface)({ input: process.stdin, output: process.stdout });
|
|
23
|
+
if (process.stdin.isTTY) {
|
|
24
|
+
process.stdout.write(`${question}: `);
|
|
25
|
+
process.stdin.setRawMode(true);
|
|
26
|
+
let input = '';
|
|
27
|
+
const onData = (ch) => {
|
|
28
|
+
const c = ch.toString();
|
|
29
|
+
if (c === '\n' || c === '\r') {
|
|
30
|
+
process.stdin.setRawMode(false);
|
|
31
|
+
process.stdin.removeListener('data', onData);
|
|
32
|
+
process.stdout.write('\n');
|
|
33
|
+
rl.close();
|
|
34
|
+
resolve(input);
|
|
35
|
+
}
|
|
36
|
+
else if (c === '\u007f' || c === '\b') {
|
|
37
|
+
if (input.length > 0) {
|
|
38
|
+
input = input.slice(0, -1);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
else if (c === '\u0003') {
|
|
42
|
+
rl.close();
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
input += c;
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
process.stdin.on('data', onData);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
rl.question(`${question}: `, answer => {
|
|
53
|
+
rl.close();
|
|
54
|
+
resolve(answer.trim());
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
const HOOKS_CONFIG = {
|
|
60
|
+
SessionStart: [
|
|
61
|
+
{
|
|
62
|
+
matcher: '',
|
|
63
|
+
hooks: [
|
|
64
|
+
{
|
|
65
|
+
type: 'command',
|
|
66
|
+
command: 'claude-pager-hook session-start',
|
|
67
|
+
timeout: 3000,
|
|
68
|
+
},
|
|
69
|
+
],
|
|
70
|
+
},
|
|
71
|
+
],
|
|
72
|
+
Notification: [
|
|
73
|
+
{
|
|
74
|
+
matcher: '',
|
|
75
|
+
hooks: [
|
|
76
|
+
{
|
|
77
|
+
type: 'command',
|
|
78
|
+
command: 'claude-pager-hook notification',
|
|
79
|
+
timeout: 5000,
|
|
80
|
+
},
|
|
81
|
+
],
|
|
82
|
+
},
|
|
83
|
+
],
|
|
84
|
+
};
|
|
85
|
+
async function setup(options) {
|
|
86
|
+
(0, index_js_1.ensureDataDir)();
|
|
87
|
+
const config = (0, index_js_1.loadConfig)();
|
|
88
|
+
console.log('=== claude-pager setup ===\n');
|
|
89
|
+
const channelType = await prompt('Channel: (n)tfy or (t)elegram?', config.channel.type === 'telegram' ? 't' : 'n');
|
|
90
|
+
let channel;
|
|
91
|
+
if (channelType.startsWith('t')) {
|
|
92
|
+
channel = await setupTelegram(config.channel.telegram);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
channel = await setupNtfy(config.channel.ntfy, options);
|
|
96
|
+
}
|
|
97
|
+
config.channel = channel;
|
|
98
|
+
(0, index_js_1.saveConfig)(config);
|
|
99
|
+
console.log('\nConfiguration saved to ~/.claude-pager/config.json');
|
|
100
|
+
installHooks();
|
|
101
|
+
}
|
|
102
|
+
async function setupNtfy(current, options = {}) {
|
|
103
|
+
const server = options.server || await prompt('ntfy server URL', current?.server || 'https://ntfy.sh');
|
|
104
|
+
const topic = options.topic || await prompt('ntfy topic', current?.topic || 'claude-pager');
|
|
105
|
+
const authMethod = await prompt('Authentication: (u)ser/password, (t)oken, or (n)one?', 'u');
|
|
106
|
+
let user;
|
|
107
|
+
let password;
|
|
108
|
+
let token;
|
|
109
|
+
if (authMethod.startsWith('t')) {
|
|
110
|
+
token = options.token || await promptSecret('ntfy access token');
|
|
111
|
+
}
|
|
112
|
+
else if (authMethod.startsWith('u')) {
|
|
113
|
+
user = options.user || await prompt('ntfy username', current?.user || '');
|
|
114
|
+
password = options.password || await promptSecret('ntfy password');
|
|
115
|
+
}
|
|
116
|
+
const ntfy = {
|
|
117
|
+
server,
|
|
118
|
+
topic,
|
|
119
|
+
...(user && { user }),
|
|
120
|
+
...(password && { password }),
|
|
121
|
+
...(token && { token }),
|
|
122
|
+
};
|
|
123
|
+
console.log('\nTesting ntfy connection...');
|
|
124
|
+
const testOk = await testNtfy(ntfy);
|
|
125
|
+
console.log(testOk ? 'ntfy connection OK' : 'Warning: ntfy test failed');
|
|
126
|
+
return { type: 'ntfy', ntfy };
|
|
127
|
+
}
|
|
128
|
+
async function setupTelegram(current) {
|
|
129
|
+
const botToken = await promptSecret('Telegram bot token (from @BotFather)');
|
|
130
|
+
// Verify bot token
|
|
131
|
+
console.log('\nVerifying bot token...');
|
|
132
|
+
try {
|
|
133
|
+
const res = await fetch(`https://api.telegram.org/bot${botToken}/getMe`, {
|
|
134
|
+
signal: AbortSignal.timeout(10000),
|
|
135
|
+
});
|
|
136
|
+
const data = (await res.json());
|
|
137
|
+
if (!data.ok) {
|
|
138
|
+
throw new Error('Invalid bot token');
|
|
139
|
+
}
|
|
140
|
+
console.log(`Bot: @${data.result.username}`);
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
throw new Error(`Bot verification failed: ${err}`, { cause: err });
|
|
144
|
+
}
|
|
145
|
+
// Get chat ID
|
|
146
|
+
let chatId = current?.chatId;
|
|
147
|
+
if (!chatId) {
|
|
148
|
+
console.log('\nSend any message to your bot on Telegram, then press Enter here...');
|
|
149
|
+
await prompt('Press Enter when done');
|
|
150
|
+
// Fetch the latest message to get chat_id
|
|
151
|
+
try {
|
|
152
|
+
const res = await fetch(`https://api.telegram.org/bot${botToken}/getUpdates?limit=1&offset=-1`, {
|
|
153
|
+
signal: AbortSignal.timeout(10000),
|
|
154
|
+
});
|
|
155
|
+
const data = (await res.json());
|
|
156
|
+
if (data.ok && data.result?.length && data.result[0].message) {
|
|
157
|
+
chatId = data.result[0].message.chat.id;
|
|
158
|
+
console.log(`Chat ID: ${chatId} (${data.result[0].message.chat.first_name || 'unknown'})`);
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
throw new Error('No message found. Make sure you sent a message to the bot.');
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
if (err instanceof Error)
|
|
166
|
+
throw err;
|
|
167
|
+
throw new Error(`Failed to get chat ID: ${err}`, { cause: err });
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
console.log(`Using existing chat ID: ${chatId}`);
|
|
172
|
+
}
|
|
173
|
+
// Test by sending a message
|
|
174
|
+
console.log('\nSending test message...');
|
|
175
|
+
try {
|
|
176
|
+
const res = await fetch(`https://api.telegram.org/bot${botToken}/sendMessage`, {
|
|
177
|
+
method: 'POST',
|
|
178
|
+
headers: { 'Content-Type': 'application/json' },
|
|
179
|
+
body: JSON.stringify({
|
|
180
|
+
chat_id: chatId,
|
|
181
|
+
text: 'claude-pager setup OK',
|
|
182
|
+
}),
|
|
183
|
+
signal: AbortSignal.timeout(10000),
|
|
184
|
+
});
|
|
185
|
+
const data = (await res.json());
|
|
186
|
+
console.log(data.ok ? 'Telegram connection OK' : 'Warning: test message failed');
|
|
187
|
+
}
|
|
188
|
+
catch (err) {
|
|
189
|
+
console.log(`Warning: ${err}`);
|
|
190
|
+
}
|
|
191
|
+
return { type: 'telegram', telegram: { botToken, chatId: chatId } };
|
|
192
|
+
}
|
|
193
|
+
async function testNtfy(ntfy) {
|
|
194
|
+
const headers = {
|
|
195
|
+
'Content-Type': 'text/plain',
|
|
196
|
+
Title: 'claude-pager',
|
|
197
|
+
Priority: 'low',
|
|
198
|
+
Tags: 'white_check_mark',
|
|
199
|
+
};
|
|
200
|
+
if (ntfy.token) {
|
|
201
|
+
headers['Authorization'] = `Bearer ${ntfy.token}`;
|
|
202
|
+
}
|
|
203
|
+
else if (ntfy.user && ntfy.password) {
|
|
204
|
+
headers['Authorization'] = `Basic ${Buffer.from(`${ntfy.user}:${ntfy.password}`).toString('base64')}`;
|
|
205
|
+
}
|
|
206
|
+
try {
|
|
207
|
+
const res = await fetch(`${ntfy.server}/${ntfy.topic}`, {
|
|
208
|
+
method: 'POST',
|
|
209
|
+
headers,
|
|
210
|
+
body: 'claude-pager setup OK',
|
|
211
|
+
signal: AbortSignal.timeout(10000),
|
|
212
|
+
});
|
|
213
|
+
return res.ok;
|
|
214
|
+
}
|
|
215
|
+
catch (err) {
|
|
216
|
+
console.error(String(err));
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
function installHooks() {
|
|
221
|
+
let settings = {};
|
|
222
|
+
if ((0, node_fs_1.existsSync)(CLAUDE_SETTINGS_FILE)) {
|
|
223
|
+
settings = JSON.parse((0, node_fs_1.readFileSync)(CLAUDE_SETTINGS_FILE, 'utf-8'));
|
|
224
|
+
}
|
|
225
|
+
if (!settings.hooks) {
|
|
226
|
+
settings.hooks = {};
|
|
227
|
+
}
|
|
228
|
+
for (const [event, hookConfigs] of Object.entries(HOOKS_CONFIG)) {
|
|
229
|
+
const existing = settings.hooks[event] || [];
|
|
230
|
+
const alreadyInstalled = existing.some(group => group.hooks.some(h => h.command.startsWith('claude-pager-hook')));
|
|
231
|
+
if (!alreadyInstalled) {
|
|
232
|
+
settings.hooks[event] = [...existing, ...hookConfigs];
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
(0, node_fs_1.writeFileSync)(CLAUDE_SETTINGS_FILE, JSON.stringify(settings, null, 2) + '\n');
|
|
236
|
+
console.log('Claude Code hooks installed in ~/.claude/settings.json');
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { RelayConfig } from '../types.js';
|
|
2
|
+
export declare function getDataDir(): string;
|
|
3
|
+
export declare function ensureDataDir(): void;
|
|
4
|
+
export declare function loadConfig(): RelayConfig;
|
|
5
|
+
export declare function saveConfig(config: RelayConfig): void;
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAc/C,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,aAAa,IAAI,IAAI,CAGpC;AAED,wBAAgB,UAAU,IAAI,WAAW,CAOxC;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAGpD"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getDataDir = getDataDir;
|
|
4
|
+
exports.ensureDataDir = ensureDataDir;
|
|
5
|
+
exports.loadConfig = loadConfig;
|
|
6
|
+
exports.saveConfig = saveConfig;
|
|
7
|
+
const node_fs_1 = require("node:fs");
|
|
8
|
+
const node_path_1 = require("node:path");
|
|
9
|
+
const node_os_1 = require("node:os");
|
|
10
|
+
const json_js_1 = require("../utils/json.js");
|
|
11
|
+
const DATA_DIR = (0, node_path_1.join)((0, node_os_1.homedir)(), '.claude-pager');
|
|
12
|
+
const CONFIG_FILE = (0, node_path_1.join)(DATA_DIR, 'config.json');
|
|
13
|
+
const DEFAULT_CONFIG = {
|
|
14
|
+
port: 17380,
|
|
15
|
+
channel: {
|
|
16
|
+
type: 'ntfy',
|
|
17
|
+
},
|
|
18
|
+
injector: 'auto',
|
|
19
|
+
dataDir: DATA_DIR,
|
|
20
|
+
};
|
|
21
|
+
function getDataDir() {
|
|
22
|
+
return DATA_DIR;
|
|
23
|
+
}
|
|
24
|
+
function ensureDataDir() {
|
|
25
|
+
(0, node_fs_1.mkdirSync)(DATA_DIR, { recursive: true });
|
|
26
|
+
(0, node_fs_1.mkdirSync)((0, node_path_1.join)(DATA_DIR, 'sessions'), { recursive: true });
|
|
27
|
+
}
|
|
28
|
+
function loadConfig() {
|
|
29
|
+
ensureDataDir();
|
|
30
|
+
if (!(0, node_fs_1.existsSync)(CONFIG_FILE)) {
|
|
31
|
+
return { ...DEFAULT_CONFIG };
|
|
32
|
+
}
|
|
33
|
+
const raw = (0, node_fs_1.readFileSync)(CONFIG_FILE, 'utf-8');
|
|
34
|
+
return { ...DEFAULT_CONFIG, ...(0, json_js_1.safeJsonParse)(raw, {}) };
|
|
35
|
+
}
|
|
36
|
+
function saveConfig(config) {
|
|
37
|
+
ensureDataDir();
|
|
38
|
+
(0, node_fs_1.writeFileSync)(CONFIG_FILE, JSON.stringify(config, null, 2) + '\n');
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":";;AAkBA,gCAEC;AAED,sCAGC;AAED,gCAOC;AAED,gCAGC;AAvCD,qCAA6E;AAC7E,yCAAiC;AACjC,qCAAkC;AAClC,8CAAiD;AAGjD,MAAM,QAAQ,GAAG,IAAA,gBAAI,EAAC,IAAA,iBAAO,GAAE,EAAE,eAAe,CAAC,CAAC;AAClD,MAAM,WAAW,GAAG,IAAA,gBAAI,EAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AAElD,MAAM,cAAc,GAAgB;IAClC,IAAI,EAAE,KAAK;IACX,OAAO,EAAE;QACP,IAAI,EAAE,MAAM;KACb;IACD,QAAQ,EAAE,MAAM;IAChB,OAAO,EAAE,QAAQ;CAClB,CAAC;AAEF,SAAgB,UAAU;IACxB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAgB,aAAa;IAC3B,IAAA,mBAAS,EAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,IAAA,mBAAS,EAAC,IAAA,gBAAI,EAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,SAAgB,UAAU;IACxB,aAAa,EAAE,CAAC;IAChB,IAAI,CAAC,IAAA,oBAAU,EAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAC/B,CAAC;IACD,MAAM,GAAG,GAAG,IAAA,sBAAY,EAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC/C,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,IAAA,uBAAa,EAAuB,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;AAChF,CAAC;AAED,SAAgB,UAAU,CAAC,MAAmB;IAC5C,aAAa,EAAE,CAAC;IAChB,IAAA,uBAAa,EAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACrE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.test.d.ts","sourceRoot":"","sources":["../../../src/daemon/__tests__/handlers.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_test_1 = require("node:test");
|
|
7
|
+
const strict_1 = __importDefault(require("node:assert/strict"));
|
|
8
|
+
const handlers_js_1 = require("../handlers.js");
|
|
9
|
+
const events_js_1 = require("../../sessions/events.js");
|
|
10
|
+
function makeEvent(id, overrides) {
|
|
11
|
+
return {
|
|
12
|
+
id,
|
|
13
|
+
sessionId: 'sess-1',
|
|
14
|
+
type: 'permission_prompt',
|
|
15
|
+
message: 'Allow Bash?',
|
|
16
|
+
project: '/home/user/project',
|
|
17
|
+
timestamp: Date.now(),
|
|
18
|
+
...overrides,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function mockChannel() {
|
|
22
|
+
const rawSent = [];
|
|
23
|
+
const pickerSent = [];
|
|
24
|
+
return {
|
|
25
|
+
name: 'mock',
|
|
26
|
+
rawSent,
|
|
27
|
+
pickerSent,
|
|
28
|
+
async send() {
|
|
29
|
+
return { success: true };
|
|
30
|
+
},
|
|
31
|
+
async sendRaw(text) {
|
|
32
|
+
rawSent.push(text);
|
|
33
|
+
},
|
|
34
|
+
async sendSessionPicker(text) {
|
|
35
|
+
pickerSent.push({ text });
|
|
36
|
+
return undefined;
|
|
37
|
+
},
|
|
38
|
+
startListening() { },
|
|
39
|
+
stopListening() { },
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function mockInjector() {
|
|
43
|
+
const calls = [];
|
|
44
|
+
return {
|
|
45
|
+
name: 'mock',
|
|
46
|
+
calls,
|
|
47
|
+
async resolve() { return true; },
|
|
48
|
+
async sendResponse(_session, text, eventType) {
|
|
49
|
+
calls.push({ text, type: eventType });
|
|
50
|
+
return true;
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
(0, node_test_1.describe)('createChannelHandlers', () => {
|
|
55
|
+
(0, node_test_1.beforeEach)(() => {
|
|
56
|
+
for (const q of (0, events_js_1.listPending)()) {
|
|
57
|
+
(0, events_js_1.removePending)(q.event.id);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
(0, node_test_1.it)('should route a matched response to the injector', async () => {
|
|
61
|
+
const channel = mockChannel();
|
|
62
|
+
const injector = mockInjector();
|
|
63
|
+
const handlers = (0, handlers_js_1.createChannelHandlers)(channel, injector);
|
|
64
|
+
const event = makeEvent('evt-1');
|
|
65
|
+
const shortId = (0, events_js_1.addPending)(event);
|
|
66
|
+
// Note: getSession will return null since we don't have real session files,
|
|
67
|
+
// so it will fall through to free message routing. Test the fallback path.
|
|
68
|
+
await handlers.onResponse(`#${shortId} allow`);
|
|
69
|
+
// The event gets resolved by resolveResponse, but session won't be found
|
|
70
|
+
// so it falls to free message. The pending should be removed.
|
|
71
|
+
const remaining = (0, events_js_1.listPending)().find(q => q.event.id === 'evt-1');
|
|
72
|
+
strict_1.default.equal(remaining, undefined, 'Pending question should be removed after resolution');
|
|
73
|
+
});
|
|
74
|
+
(0, node_test_1.it)('should handle session picker callback', async () => {
|
|
75
|
+
const channel = mockChannel();
|
|
76
|
+
const injector = mockInjector();
|
|
77
|
+
const handlers = (0, handlers_js_1.createChannelHandlers)(channel, injector);
|
|
78
|
+
// No pending picker state → should not crash
|
|
79
|
+
await handlers.onResponse('__session_pick__:some-session');
|
|
80
|
+
strict_1.default.equal(injector.calls.length, 0);
|
|
81
|
+
});
|
|
82
|
+
(0, node_test_1.it)('should have an onFreeMessage handler', () => {
|
|
83
|
+
const channel = mockChannel();
|
|
84
|
+
const injector = mockInjector();
|
|
85
|
+
const handlers = (0, handlers_js_1.createChannelHandlers)(channel, injector);
|
|
86
|
+
strict_1.default.ok(handlers.onFreeMessage, 'should have onFreeMessage handler');
|
|
87
|
+
});
|
|
88
|
+
(0, node_test_1.it)('should handle free text via onResponse without crashing', async () => {
|
|
89
|
+
const channel = mockChannel();
|
|
90
|
+
const injector = mockInjector();
|
|
91
|
+
const handlers = (0, handlers_js_1.createChannelHandlers)(channel, injector);
|
|
92
|
+
// Should not throw, regardless of session state
|
|
93
|
+
await handlers.onResponse('random text');
|
|
94
|
+
// Either sent "No active sessions" or opened a picker — both are valid
|
|
95
|
+
const handledSomething = channel.rawSent.length > 0 || channel.pickerSent.length > 0;
|
|
96
|
+
strict_1.default.ok(handledSomething, 'Should have routed the message somewhere');
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
//# sourceMappingURL=handlers.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.test.js","sourceRoot":"","sources":["../../../src/daemon/__tests__/handlers.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.test.d.ts","sourceRoot":"","sources":["../../../src/daemon/__tests__/server.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_test_1 = require("node:test");
|
|
7
|
+
const strict_1 = __importDefault(require("node:assert/strict"));
|
|
8
|
+
const server_js_1 = require("../server.js");
|
|
9
|
+
function mockChannel() {
|
|
10
|
+
const sent = [];
|
|
11
|
+
return {
|
|
12
|
+
name: 'mock',
|
|
13
|
+
sent,
|
|
14
|
+
async send(event) {
|
|
15
|
+
sent.push(event);
|
|
16
|
+
return { success: true, messageId: 'mock-msg-1' };
|
|
17
|
+
},
|
|
18
|
+
startListening() { },
|
|
19
|
+
stopListening() { },
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function mockInjector() {
|
|
23
|
+
const injected = [];
|
|
24
|
+
return {
|
|
25
|
+
name: 'mock',
|
|
26
|
+
injected,
|
|
27
|
+
async resolve() { return true; },
|
|
28
|
+
async sendResponse(session, text, _eventType) {
|
|
29
|
+
injected.push({ session, text });
|
|
30
|
+
return true;
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
const TEST_CONFIG = {
|
|
35
|
+
port: 0,
|
|
36
|
+
channel: { type: 'ntfy' },
|
|
37
|
+
injector: 'auto',
|
|
38
|
+
dataDir: '/tmp/claude-pager-test',
|
|
39
|
+
};
|
|
40
|
+
(0, node_test_1.describe)('HTTP server', () => {
|
|
41
|
+
let app;
|
|
42
|
+
let channel;
|
|
43
|
+
let injector;
|
|
44
|
+
(0, node_test_1.before)(async () => {
|
|
45
|
+
channel = mockChannel();
|
|
46
|
+
injector = mockInjector();
|
|
47
|
+
app = await (0, server_js_1.createServer)({ config: TEST_CONFIG, channel, injector });
|
|
48
|
+
});
|
|
49
|
+
(0, node_test_1.after)(async () => {
|
|
50
|
+
await app.close();
|
|
51
|
+
});
|
|
52
|
+
(0, node_test_1.describe)('GET /api/v1/health', () => {
|
|
53
|
+
(0, node_test_1.it)('should return ok status', async () => {
|
|
54
|
+
const res = await app.inject({ method: 'GET', url: '/api/v1/health' });
|
|
55
|
+
strict_1.default.equal(res.statusCode, 200);
|
|
56
|
+
const body = JSON.parse(res.payload);
|
|
57
|
+
strict_1.default.equal(body.status, 'ok');
|
|
58
|
+
strict_1.default.equal(body.channel, 'mock');
|
|
59
|
+
strict_1.default.equal(body.injector, 'mock');
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
(0, node_test_1.describe)('POST /api/v1/events', () => {
|
|
63
|
+
(0, node_test_1.it)('should accept a valid event and send notification', async () => {
|
|
64
|
+
const res = await app.inject({
|
|
65
|
+
method: 'POST',
|
|
66
|
+
url: '/api/v1/events',
|
|
67
|
+
payload: {
|
|
68
|
+
session_id: 'sess-1',
|
|
69
|
+
type: 'permission_prompt',
|
|
70
|
+
message: 'Allow Bash(git push)?',
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
strict_1.default.equal(res.statusCode, 200);
|
|
74
|
+
const body = JSON.parse(res.payload);
|
|
75
|
+
strict_1.default.equal(body.ok, true);
|
|
76
|
+
strict_1.default.ok(body.eventId);
|
|
77
|
+
strict_1.default.ok(body.shortId);
|
|
78
|
+
strict_1.default.equal(channel.sent.length, 1);
|
|
79
|
+
});
|
|
80
|
+
(0, node_test_1.it)('should reject event with missing fields', async () => {
|
|
81
|
+
const res = await app.inject({
|
|
82
|
+
method: 'POST',
|
|
83
|
+
url: '/api/v1/events',
|
|
84
|
+
payload: { session_id: 'sess-1' },
|
|
85
|
+
});
|
|
86
|
+
strict_1.default.equal(res.statusCode, 400);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
(0, node_test_1.describe)('GET /api/v1/pending', () => {
|
|
90
|
+
(0, node_test_1.it)('should list pending questions', async () => {
|
|
91
|
+
const res = await app.inject({ method: 'GET', url: '/api/v1/pending' });
|
|
92
|
+
strict_1.default.equal(res.statusCode, 200);
|
|
93
|
+
const body = JSON.parse(res.payload);
|
|
94
|
+
strict_1.default.ok(Array.isArray(body.pending));
|
|
95
|
+
strict_1.default.ok(body.pending.length >= 1);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
(0, node_test_1.describe)('POST /api/v1/respond', () => {
|
|
99
|
+
(0, node_test_1.it)('should reject response with missing text', async () => {
|
|
100
|
+
const res = await app.inject({
|
|
101
|
+
method: 'POST',
|
|
102
|
+
url: '/api/v1/respond',
|
|
103
|
+
payload: {},
|
|
104
|
+
});
|
|
105
|
+
strict_1.default.equal(res.statusCode, 400);
|
|
106
|
+
});
|
|
107
|
+
(0, node_test_1.it)('should resolve and match a response to pending question', async () => {
|
|
108
|
+
const res = await app.inject({
|
|
109
|
+
method: 'POST',
|
|
110
|
+
url: '/api/v1/respond',
|
|
111
|
+
payload: { text: 'allow' },
|
|
112
|
+
});
|
|
113
|
+
// 410 = session not active (expected since no real session), not 404
|
|
114
|
+
strict_1.default.ok(res.statusCode !== 404, 'Should have found a matching pending question');
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
//# sourceMappingURL=server.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.test.js","sourceRoot":"","sources":["../../../src/daemon/__tests__/server.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ChannelProvider, ChannelListeners } from '../channels/channel.js';
|
|
2
|
+
import type { InputInjector } from '../injectors/injector.js';
|
|
3
|
+
export declare function createChannelHandlers(channel: ChannelProvider, injector: InputInjector): ChannelListeners;
|
|
4
|
+
//# sourceMappingURL=handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/daemon/handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAe,MAAM,wBAAwB,CAAC;AAC7F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAW9D,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,aAAa,GACtB,gBAAgB,CAuKlB"}
|