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
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export interface RelayConfig {
|
|
2
|
+
port: number;
|
|
3
|
+
channel: ChannelConfig;
|
|
4
|
+
injector: 'auto' | 'tmux' | 'xdotool' | 'applescript';
|
|
5
|
+
dataDir: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ChannelConfig {
|
|
8
|
+
type: 'ntfy' | 'telegram';
|
|
9
|
+
ntfy?: NtfyConfig;
|
|
10
|
+
telegram?: TelegramConfig;
|
|
11
|
+
}
|
|
12
|
+
export interface NtfyConfig {
|
|
13
|
+
server: string;
|
|
14
|
+
topic: string;
|
|
15
|
+
user?: string;
|
|
16
|
+
password?: string;
|
|
17
|
+
token?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface TelegramConfig {
|
|
20
|
+
botToken: string;
|
|
21
|
+
chatId: number;
|
|
22
|
+
voiceLanguage?: string;
|
|
23
|
+
}
|
|
24
|
+
export type EventType = 'permission_prompt' | 'idle_prompt';
|
|
25
|
+
export interface RelayEvent {
|
|
26
|
+
id: string;
|
|
27
|
+
sessionId: string;
|
|
28
|
+
type: EventType;
|
|
29
|
+
message: string;
|
|
30
|
+
toolName?: string;
|
|
31
|
+
toolInput?: string;
|
|
32
|
+
project: string;
|
|
33
|
+
timestamp: number;
|
|
34
|
+
}
|
|
35
|
+
export interface SessionInfo {
|
|
36
|
+
sessionId: string;
|
|
37
|
+
pid: number;
|
|
38
|
+
tty: string;
|
|
39
|
+
cwd: string;
|
|
40
|
+
windowId?: number;
|
|
41
|
+
tmuxPane?: string;
|
|
42
|
+
timestamp: number;
|
|
43
|
+
}
|
|
44
|
+
export interface PendingQuestion {
|
|
45
|
+
event: RelayEvent;
|
|
46
|
+
notifiedAt: number;
|
|
47
|
+
channelMessageId?: string;
|
|
48
|
+
shortId: string;
|
|
49
|
+
order: number;
|
|
50
|
+
}
|
|
51
|
+
export interface UserResponse {
|
|
52
|
+
eventId: string;
|
|
53
|
+
response: string;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,aAAa,CAAC;IACvB,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,aAAa,CAAC;IACtD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;IAC1B,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,SAAS,GAAG,mBAAmB,GAAG,aAAa,CAAC;AAE5D,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,UAAU,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html.test.d.ts","sourceRoot":"","sources":["../../../src/utils/__tests__/html.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,42 @@
|
|
|
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 html_js_1 = require("../html.js");
|
|
9
|
+
(0, node_test_1.describe)('html utils', () => {
|
|
10
|
+
(0, node_test_1.describe)('escapeHtml', () => {
|
|
11
|
+
(0, node_test_1.it)('should escape &, <, >', () => {
|
|
12
|
+
strict_1.default.equal((0, html_js_1.escapeHtml)('<b>test & "value"</b>'), '<b>test & "value"</b>');
|
|
13
|
+
});
|
|
14
|
+
(0, node_test_1.it)('should handle empty string', () => {
|
|
15
|
+
strict_1.default.equal((0, html_js_1.escapeHtml)(''), '');
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
(0, node_test_1.describe)('markdownToHtml', () => {
|
|
19
|
+
(0, node_test_1.it)('should convert bold markdown', () => {
|
|
20
|
+
const result = (0, html_js_1.markdownToHtml)('**bold** text');
|
|
21
|
+
strict_1.default.ok(result.includes('<b>bold</b>'));
|
|
22
|
+
});
|
|
23
|
+
(0, node_test_1.it)('should convert code blocks', () => {
|
|
24
|
+
const result = (0, html_js_1.markdownToHtml)('```\ncode\n```');
|
|
25
|
+
strict_1.default.ok(result.includes('<pre>'));
|
|
26
|
+
strict_1.default.ok(result.includes('code'));
|
|
27
|
+
});
|
|
28
|
+
(0, node_test_1.it)('should convert inline code', () => {
|
|
29
|
+
const result = (0, html_js_1.markdownToHtml)('use `command` here');
|
|
30
|
+
strict_1.default.ok(result.includes('<code>command</code>'));
|
|
31
|
+
});
|
|
32
|
+
(0, node_test_1.it)('should convert headings', () => {
|
|
33
|
+
const result = (0, html_js_1.markdownToHtml)('## Title');
|
|
34
|
+
strict_1.default.ok(result.includes('<b>Title</b>'));
|
|
35
|
+
});
|
|
36
|
+
(0, node_test_1.it)('should convert list items', () => {
|
|
37
|
+
const result = (0, html_js_1.markdownToHtml)('- item one');
|
|
38
|
+
strict_1.default.ok(result.includes('• item one'));
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
//# sourceMappingURL=html.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html.test.js","sourceRoot":"","sources":["../../../src/utils/__tests__/html.test.ts"],"names":[],"mappings":";;;;;AAAA,yCAAyC;AACzC,gEAAwC;AACxC,wCAAwD;AAExD,IAAA,oBAAQ,EAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,IAAA,oBAAQ,EAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,IAAA,cAAE,EAAC,uBAAuB,EAAE,GAAG,EAAE;YAC/B,gBAAM,CAAC,KAAK,CAAC,IAAA,oBAAU,EAAC,uBAAuB,CAAC,EAAE,uCAAuC,CAAC,CAAC;QAC7F,CAAC,CAAC,CAAC;QAEH,IAAA,cAAE,EAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,gBAAM,CAAC,KAAK,CAAC,IAAA,oBAAU,EAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,oBAAQ,EAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,IAAA,cAAE,EAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,MAAM,GAAG,IAAA,wBAAc,EAAC,eAAe,CAAC,CAAC;YAC/C,gBAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,IAAA,cAAE,EAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,MAAM,GAAG,IAAA,wBAAc,EAAC,gBAAgB,CAAC,CAAC;YAChD,gBAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;YACpC,gBAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,IAAA,cAAE,EAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,MAAM,GAAG,IAAA,wBAAc,EAAC,oBAAoB,CAAC,CAAC;YACpD,gBAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,IAAA,cAAE,EAAC,yBAAyB,EAAE,GAAG,EAAE;YACjC,MAAM,MAAM,GAAG,IAAA,wBAAc,EAAC,UAAU,CAAC,CAAC;YAC1C,gBAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,IAAA,cAAE,EAAC,2BAA2B,EAAE,GAAG,EAAE;YACnC,MAAM,MAAM,GAAG,IAAA,wBAAc,EAAC,YAAY,CAAC,CAAC;YAC5C,gBAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.test.d.ts","sourceRoot":"","sources":["../../../src/utils/__tests__/json.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,27 @@
|
|
|
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 json_js_1 = require("../json.js");
|
|
9
|
+
(0, node_test_1.describe)('safeJsonParse', () => {
|
|
10
|
+
(0, node_test_1.it)('should parse valid JSON', () => {
|
|
11
|
+
const result = (0, json_js_1.safeJsonParse)('{"a":1}', {});
|
|
12
|
+
strict_1.default.deepEqual(result, { a: 1 });
|
|
13
|
+
});
|
|
14
|
+
(0, node_test_1.it)('should return fallback for invalid JSON', () => {
|
|
15
|
+
const result = (0, json_js_1.safeJsonParse)('not json', { fallback: true });
|
|
16
|
+
strict_1.default.deepEqual(result, { fallback: true });
|
|
17
|
+
});
|
|
18
|
+
(0, node_test_1.it)('should return fallback for empty string', () => {
|
|
19
|
+
const result = (0, json_js_1.safeJsonParse)('', null);
|
|
20
|
+
strict_1.default.equal(result, null);
|
|
21
|
+
});
|
|
22
|
+
(0, node_test_1.it)('should parse arrays', () => {
|
|
23
|
+
const result = (0, json_js_1.safeJsonParse)('[1,2,3]', []);
|
|
24
|
+
strict_1.default.deepEqual(result, [1, 2, 3]);
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
//# sourceMappingURL=json.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.test.js","sourceRoot":"","sources":["../../../src/utils/__tests__/json.test.ts"],"names":[],"mappings":";;;;;AAAA,yCAAyC;AACzC,gEAAwC;AACxC,wCAA2C;AAE3C,IAAA,oBAAQ,EAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAA,cAAE,EAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,MAAM,GAAG,IAAA,uBAAa,EAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC5C,gBAAM,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,IAAA,uBAAa,EAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,gBAAM,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,IAAA,uBAAa,EAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACvC,gBAAM,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,MAAM,MAAM,GAAG,IAAA,uBAAa,EAAW,SAAS,EAAE,EAAE,CAAC,CAAC;QACtD,gBAAM,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.test.d.ts","sourceRoot":"","sources":["../../../src/utils/__tests__/validation.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,38 @@
|
|
|
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 validation_js_1 = require("../validation.js");
|
|
9
|
+
(0, node_test_1.describe)('validation utils', () => {
|
|
10
|
+
(0, node_test_1.describe)('isValidEventType', () => {
|
|
11
|
+
(0, node_test_1.it)('should accept permission_prompt', () => {
|
|
12
|
+
strict_1.default.equal((0, validation_js_1.isValidEventType)('permission_prompt'), true);
|
|
13
|
+
});
|
|
14
|
+
(0, node_test_1.it)('should accept idle_prompt', () => {
|
|
15
|
+
strict_1.default.equal((0, validation_js_1.isValidEventType)('idle_prompt'), true);
|
|
16
|
+
});
|
|
17
|
+
(0, node_test_1.it)('should reject unknown types', () => {
|
|
18
|
+
strict_1.default.equal((0, validation_js_1.isValidEventType)('invalid'), false);
|
|
19
|
+
strict_1.default.equal((0, validation_js_1.isValidEventType)(''), false);
|
|
20
|
+
strict_1.default.equal((0, validation_js_1.isValidEventType)('PERMISSION_PROMPT'), false);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
(0, node_test_1.describe)('isValidSessionId', () => {
|
|
24
|
+
(0, node_test_1.it)('should accept valid session IDs', () => {
|
|
25
|
+
strict_1.default.equal((0, validation_js_1.isValidSessionId)('session-1'), true);
|
|
26
|
+
strict_1.default.equal((0, validation_js_1.isValidSessionId)('abc_def-123'), true);
|
|
27
|
+
strict_1.default.equal((0, validation_js_1.isValidSessionId)('recovered-42'), true);
|
|
28
|
+
});
|
|
29
|
+
(0, node_test_1.it)('should reject invalid session IDs', () => {
|
|
30
|
+
strict_1.default.equal((0, validation_js_1.isValidSessionId)(''), false);
|
|
31
|
+
strict_1.default.equal((0, validation_js_1.isValidSessionId)('../etc/passwd'), false);
|
|
32
|
+
strict_1.default.equal((0, validation_js_1.isValidSessionId)('session id'), false);
|
|
33
|
+
strict_1.default.equal((0, validation_js_1.isValidSessionId)('a/b'), false);
|
|
34
|
+
strict_1.default.equal((0, validation_js_1.isValidSessionId)('a;rm -rf /'), false);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
//# sourceMappingURL=validation.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.test.js","sourceRoot":"","sources":["../../../src/utils/__tests__/validation.test.ts"],"names":[],"mappings":";;;;;AAAA,yCAAyC;AACzC,gEAAwC;AACxC,oDAAsE;AAEtE,IAAA,oBAAQ,EAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,IAAA,oBAAQ,EAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,IAAA,cAAE,EAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,gBAAM,CAAC,KAAK,CAAC,IAAA,gCAAgB,EAAC,mBAAmB,CAAC,EAAE,IAAI,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,IAAA,cAAE,EAAC,2BAA2B,EAAE,GAAG,EAAE;YACnC,gBAAM,CAAC,KAAK,CAAC,IAAA,gCAAgB,EAAC,aAAa,CAAC,EAAE,IAAI,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,IAAA,cAAE,EAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,gBAAM,CAAC,KAAK,CAAC,IAAA,gCAAgB,EAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;YACjD,gBAAM,CAAC,KAAK,CAAC,IAAA,gCAAgB,EAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;YAC1C,gBAAM,CAAC,KAAK,CAAC,IAAA,gCAAgB,EAAC,mBAAmB,CAAC,EAAE,KAAK,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,oBAAQ,EAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,IAAA,cAAE,EAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,gBAAM,CAAC,KAAK,CAAC,IAAA,gCAAgB,EAAC,WAAW,CAAC,EAAE,IAAI,CAAC,CAAC;YAClD,gBAAM,CAAC,KAAK,CAAC,IAAA,gCAAgB,EAAC,aAAa,CAAC,EAAE,IAAI,CAAC,CAAC;YACpD,gBAAM,CAAC,KAAK,CAAC,IAAA,gCAAgB,EAAC,cAAc,CAAC,EAAE,IAAI,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,IAAA,cAAE,EAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,gBAAM,CAAC,KAAK,CAAC,IAAA,gCAAgB,EAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;YAC1C,gBAAM,CAAC,KAAK,CAAC,IAAA,gCAAgB,EAAC,eAAe,CAAC,EAAE,KAAK,CAAC,CAAC;YACvD,gBAAM,CAAC,KAAK,CAAC,IAAA,gCAAgB,EAAC,YAAY,CAAC,EAAE,KAAK,CAAC,CAAC;YACpD,gBAAM,CAAC,KAAK,CAAC,IAAA,gCAAgB,EAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;YAC7C,gBAAM,CAAC,KAAK,CAAC,IAAA,gCAAgB,EAAC,YAAY,CAAC,EAAE,KAAK,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../src/utils/html.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAuCjD"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.escapeHtml = escapeHtml;
|
|
4
|
+
exports.markdownToHtml = markdownToHtml;
|
|
5
|
+
function escapeHtml(text) {
|
|
6
|
+
return text.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
|
|
7
|
+
}
|
|
8
|
+
function markdownToHtml(md) {
|
|
9
|
+
const escaped = escapeHtml(md);
|
|
10
|
+
let result = '';
|
|
11
|
+
let inCodeBlock = false;
|
|
12
|
+
for (const line of escaped.split('\n')) {
|
|
13
|
+
if (line.match(/^```/)) {
|
|
14
|
+
if (inCodeBlock) {
|
|
15
|
+
result += '</pre>\n';
|
|
16
|
+
inCodeBlock = false;
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
result += '<pre>';
|
|
20
|
+
inCodeBlock = true;
|
|
21
|
+
}
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
if (inCodeBlock) {
|
|
25
|
+
result += line + '\n';
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
let converted = line;
|
|
29
|
+
converted = converted.replace(/^#{1,3}\s+(.+)$/, '<b>$1</b>');
|
|
30
|
+
converted = converted.replace(/\*\*(.+?)\*\*/g, '<b>$1</b>');
|
|
31
|
+
converted = converted.replace(/__(.+?)__/g, '<b>$1</b>');
|
|
32
|
+
converted = converted.replace(/(?<!\w)\*([^*]+?)\*(?!\w)/g, '<i>$1</i>');
|
|
33
|
+
converted = converted.replace(/(?<!\w)_([^_]+?)_(?!\w)/g, '<i>$1</i>');
|
|
34
|
+
converted = converted.replace(/`([^`]+?)`/g, '<code>$1</code>');
|
|
35
|
+
converted = converted.replace(/^(\s*)[-*]\s+/, '$1• ');
|
|
36
|
+
result += converted + '\n';
|
|
37
|
+
}
|
|
38
|
+
if (inCodeBlock) {
|
|
39
|
+
result += '</pre>\n';
|
|
40
|
+
}
|
|
41
|
+
return result.trimEnd();
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=html.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/utils/html.ts"],"names":[],"mappings":";;AAAA,gCAEC;AAED,wCAuCC;AA3CD,SAAgB,UAAU,CAAC,IAAY;IACrC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACjF,CAAC;AAED,SAAgB,cAAc,CAAC,EAAU;IACvC,MAAM,OAAO,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;IAC/B,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,WAAW,GAAG,KAAK,CAAC;IAExB,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,IAAI,UAAU,CAAC;gBACrB,WAAW,GAAG,KAAK,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,OAAO,CAAC;gBAClB,WAAW,GAAG,IAAI,CAAC;YACrB,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,IAAI,IAAI,GAAG,IAAI,CAAC;YACtB,SAAS;QACX,CAAC;QAED,IAAI,SAAS,GAAG,IAAI,CAAC;QACrB,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC;QAC9D,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;QAC7D,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;QACzD,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,4BAA4B,EAAE,WAAW,CAAC,CAAC;QACzE,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,0BAA0B,EAAE,WAAW,CAAC,CAAC;QACvE,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;QAChE,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QAEvD,MAAM,IAAI,SAAS,GAAG,IAAI,CAAC;IAC7B,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,IAAI,UAAU,CAAC;IACvB,CAAC;IAED,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/utils/json.ts"],"names":[],"mappings":"AAAA,wBAAgB,aAAa,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CAO5D"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.safeJsonParse = safeJsonParse;
|
|
4
|
+
function safeJsonParse(raw, fallback) {
|
|
5
|
+
try {
|
|
6
|
+
return JSON.parse(raw);
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
console.debug('[json] Failed to parse:', raw.slice(0, 100));
|
|
10
|
+
return fallback;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/utils/json.ts"],"names":[],"mappings":";;AAAA,sCAOC;AAPD,SAAgB,aAAa,CAAI,GAAW,EAAE,QAAW;IACvD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAC5D,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAS7C,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,SAAS,CAEhE;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAEpD"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isValidEventType = isValidEventType;
|
|
4
|
+
exports.isValidSessionId = isValidSessionId;
|
|
5
|
+
const VALID_EVENT_TYPES = new Set([
|
|
6
|
+
'permission_prompt',
|
|
7
|
+
'idle_prompt',
|
|
8
|
+
]);
|
|
9
|
+
const SESSION_ID_RE = /^[\w-]+$/;
|
|
10
|
+
function isValidEventType(type) {
|
|
11
|
+
return VALID_EVENT_TYPES.has(type);
|
|
12
|
+
}
|
|
13
|
+
function isValidSessionId(id) {
|
|
14
|
+
return SESSION_ID_RE.test(id);
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":";;AASA,4CAEC;AAED,4CAEC;AAbD,MAAM,iBAAiB,GAAwB,IAAI,GAAG,CAAY;IAChE,mBAAmB;IACnB,aAAa;CACd,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,UAAU,CAAC;AAEjC,SAAgB,gBAAgB,CAAC,IAAY;IAC3C,OAAO,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,SAAgB,gBAAgB,CAAC,EAAU;IACzC,OAAO,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function transcribeAudio(audioPath: string, language?: string): Promise<{
|
|
2
|
+
text: string;
|
|
3
|
+
language: string;
|
|
4
|
+
}>;
|
|
5
|
+
export declare function downloadTelegramVoice(botToken: string, fileId: string): Promise<string>;
|
|
6
|
+
export declare function cleanupFile(path: string): void;
|
|
7
|
+
//# sourceMappingURL=transcribe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcribe.d.ts","sourceRoot":"","sources":["../../src/voice/transcribe.ts"],"names":[],"mappings":"AA6BA,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAM7C;AAED,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAwBjB;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE9C"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.transcribeAudio = transcribeAudio;
|
|
4
|
+
exports.downloadTelegramVoice = downloadTelegramVoice;
|
|
5
|
+
exports.cleanupFile = cleanupFile;
|
|
6
|
+
const node_child_process_1 = require("node:child_process");
|
|
7
|
+
const node_util_1 = require("node:util");
|
|
8
|
+
const node_fs_1 = require("node:fs");
|
|
9
|
+
const node_path_1 = require("node:path");
|
|
10
|
+
const node_os_1 = require("node:os");
|
|
11
|
+
const exec = (0, node_util_1.promisify)(node_child_process_1.execFile);
|
|
12
|
+
const WHISPER_SCRIPT = `
|
|
13
|
+
import sys, json
|
|
14
|
+
from faster_whisper import WhisperModel
|
|
15
|
+
|
|
16
|
+
model = WhisperModel("medium", device="cpu", compute_type="int8")
|
|
17
|
+
segments, info = model.transcribe(sys.argv[1], language=sys.argv[2] if len(sys.argv) > 2 else None)
|
|
18
|
+
text = " ".join(s.text.strip() for s in segments)
|
|
19
|
+
print(json.dumps({"text": text, "language": info.language}))
|
|
20
|
+
`;
|
|
21
|
+
let scriptPath = null;
|
|
22
|
+
function getScriptPath() {
|
|
23
|
+
if (!scriptPath) {
|
|
24
|
+
const dir = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'claude-pager-whisper-'));
|
|
25
|
+
scriptPath = (0, node_path_1.join)(dir, 'transcribe.py');
|
|
26
|
+
(0, node_fs_1.writeFileSync)(scriptPath, WHISPER_SCRIPT);
|
|
27
|
+
}
|
|
28
|
+
return scriptPath;
|
|
29
|
+
}
|
|
30
|
+
async function transcribeAudio(audioPath, language) {
|
|
31
|
+
const args = [getScriptPath(), audioPath];
|
|
32
|
+
if (language)
|
|
33
|
+
args.push(language);
|
|
34
|
+
const { stdout } = await exec('python3.10', args, { timeout: 60000 });
|
|
35
|
+
return JSON.parse(stdout.trim());
|
|
36
|
+
}
|
|
37
|
+
async function downloadTelegramVoice(botToken, fileId) {
|
|
38
|
+
// Get file path from Telegram
|
|
39
|
+
const res = await fetch(`https://api.telegram.org/bot${botToken}/getFile`, {
|
|
40
|
+
method: 'POST',
|
|
41
|
+
headers: { 'Content-Type': 'application/json' },
|
|
42
|
+
body: JSON.stringify({ file_id: fileId }),
|
|
43
|
+
});
|
|
44
|
+
const data = (await res.json());
|
|
45
|
+
if (!data.ok || !data.result?.file_path) {
|
|
46
|
+
throw new Error('Failed to get file path from Telegram');
|
|
47
|
+
}
|
|
48
|
+
// Download the file
|
|
49
|
+
const fileUrl = `https://api.telegram.org/file/bot${botToken}/${data.result.file_path}`;
|
|
50
|
+
const fileRes = await fetch(fileUrl);
|
|
51
|
+
if (!fileRes.ok)
|
|
52
|
+
throw new Error(`Failed to download file: ${fileRes.status}`);
|
|
53
|
+
const buffer = Buffer.from(await fileRes.arrayBuffer());
|
|
54
|
+
const dir = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'claude-pager-voice-'));
|
|
55
|
+
const ext = data.result.file_path.split('.').pop() || 'ogg';
|
|
56
|
+
const localPath = (0, node_path_1.join)(dir, `voice.${ext}`);
|
|
57
|
+
(0, node_fs_1.writeFileSync)(localPath, buffer);
|
|
58
|
+
return localPath;
|
|
59
|
+
}
|
|
60
|
+
function cleanupFile(path) {
|
|
61
|
+
try {
|
|
62
|
+
(0, node_fs_1.unlinkSync)(path);
|
|
63
|
+
}
|
|
64
|
+
catch { /* ignore */ }
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=transcribe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcribe.js","sourceRoot":"","sources":["../../src/voice/transcribe.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "claude-pager",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Remote notification and response relay for Claude Code CLI sessions",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"bin": {
|
|
8
|
+
"claude-pager": "dist/cli/index.js",
|
|
9
|
+
"claude-pager-hook": "dist/hooks/index.js"
|
|
10
|
+
},
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsc",
|
|
13
|
+
"dev": "tsx watch src/cli/index.ts",
|
|
14
|
+
"test": "node --test dist/**/*.test.js",
|
|
15
|
+
"lint": "eslint src/",
|
|
16
|
+
"clean": "rm -rf dist/"
|
|
17
|
+
},
|
|
18
|
+
"engines": {
|
|
19
|
+
"node": ">=20"
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist/"
|
|
23
|
+
],
|
|
24
|
+
"keywords": [
|
|
25
|
+
"claude",
|
|
26
|
+
"claude-code",
|
|
27
|
+
"notification",
|
|
28
|
+
"relay",
|
|
29
|
+
"ntfy"
|
|
30
|
+
],
|
|
31
|
+
"author": "Seb Bassompierre <sbassompierre@kaseilabs.com>",
|
|
32
|
+
"license": "MIT",
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "https://github.com/sbassomp/claude-pager.git"
|
|
36
|
+
},
|
|
37
|
+
"homepage": "https://github.com/sbassomp/claude-pager",
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"commander": "^13.1.0",
|
|
40
|
+
"fastify": "^5.3.3"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@eslint/js": "^10.0.1",
|
|
44
|
+
"@types/node": "^22.15.0",
|
|
45
|
+
"eslint": "^10.0.3",
|
|
46
|
+
"tsx": "^4.19.0",
|
|
47
|
+
"typescript": "^5.8.3",
|
|
48
|
+
"typescript-eslint": "^8.57.1"
|
|
49
|
+
}
|
|
50
|
+
}
|