beepctl 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 +186 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +34 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/accounts.d.ts +3 -0
- package/dist/commands/accounts.d.ts.map +1 -0
- package/dist/commands/accounts.js +27 -0
- package/dist/commands/accounts.js.map +1 -0
- package/dist/commands/alias.d.ts +3 -0
- package/dist/commands/alias.d.ts.map +1 -0
- package/dist/commands/alias.js +79 -0
- package/dist/commands/alias.js.map +1 -0
- package/dist/commands/archive.d.ts +3 -0
- package/dist/commands/archive.d.ts.map +1 -0
- package/dist/commands/archive.js +35 -0
- package/dist/commands/archive.js.map +1 -0
- package/dist/commands/auth.d.ts +3 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +58 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/chats.d.ts +3 -0
- package/dist/commands/chats.d.ts.map +1 -0
- package/dist/commands/chats.js +227 -0
- package/dist/commands/chats.js.map +1 -0
- package/dist/commands/contacts.d.ts +3 -0
- package/dist/commands/contacts.d.ts.map +1 -0
- package/dist/commands/contacts.js +46 -0
- package/dist/commands/contacts.js.map +1 -0
- package/dist/commands/download.d.ts +3 -0
- package/dist/commands/download.d.ts.map +1 -0
- package/dist/commands/download.js +39 -0
- package/dist/commands/download.js.map +1 -0
- package/dist/commands/focus.d.ts +3 -0
- package/dist/commands/focus.d.ts.map +1 -0
- package/dist/commands/focus.js +49 -0
- package/dist/commands/focus.js.map +1 -0
- package/dist/commands/messages.d.ts +3 -0
- package/dist/commands/messages.d.ts.map +1 -0
- package/dist/commands/messages.js +105 -0
- package/dist/commands/messages.js.map +1 -0
- package/dist/commands/reminders.d.ts +3 -0
- package/dist/commands/reminders.d.ts.map +1 -0
- package/dist/commands/reminders.js +58 -0
- package/dist/commands/reminders.js.map +1 -0
- package/dist/commands/search.d.ts +3 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +211 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/send.d.ts +3 -0
- package/dist/commands/send.d.ts.map +1 -0
- package/dist/commands/send.js +58 -0
- package/dist/commands/send.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/lib/aliases.d.ts +8 -0
- package/dist/lib/aliases.d.ts.map +1 -0
- package/dist/lib/aliases.js +19 -0
- package/dist/lib/aliases.js.map +1 -0
- package/dist/lib/client.d.ts +6 -0
- package/dist/lib/client.d.ts.map +1 -0
- package/dist/lib/client.js +15 -0
- package/dist/lib/client.js.map +1 -0
- package/dist/lib/command-utils.d.ts +38 -0
- package/dist/lib/command-utils.d.ts.map +1 -0
- package/dist/lib/command-utils.js +98 -0
- package/dist/lib/command-utils.js.map +1 -0
- package/dist/lib/config.d.ts +9 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +32 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/dates.d.ts +11 -0
- package/dist/lib/dates.d.ts.map +1 -0
- package/dist/lib/dates.js +74 -0
- package/dist/lib/dates.js.map +1 -0
- package/dist/lib/errors.d.ts +2 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +40 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/types.d.ts +58 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +3 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/tui/App.d.ts +2 -0
- package/dist/tui/App.d.ts.map +1 -0
- package/dist/tui/App.js +31 -0
- package/dist/tui/App.js.map +1 -0
- package/dist/tui/index.d.ts +2 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +15 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/views/ChatList.d.ts +6 -0
- package/dist/tui/views/ChatList.d.ts.map +1 -0
- package/dist/tui/views/ChatList.js +54 -0
- package/dist/tui/views/ChatList.js.map +1 -0
- package/dist/tui/views/Messages.d.ts +8 -0
- package/dist/tui/views/Messages.d.ts.map +1 -0
- package/dist/tui/views/Messages.js +70 -0
- package/dist/tui/views/Messages.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
const MS_PER_MINUTE = 60 * 1000;
|
|
2
|
+
const MS_PER_HOUR = 60 * MS_PER_MINUTE;
|
|
3
|
+
const MS_PER_DAY = 24 * MS_PER_HOUR;
|
|
4
|
+
const MS_PER_WEEK = 7 * MS_PER_DAY;
|
|
5
|
+
function startOfDay(date) {
|
|
6
|
+
const result = new Date(date);
|
|
7
|
+
result.setHours(0, 0, 0, 0);
|
|
8
|
+
return result;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Parse relative date strings into ISO 8601 format.
|
|
12
|
+
* Supports: "1h ago", "2d ago", "3w ago", "1mo ago", "yesterday", "today"
|
|
13
|
+
*/
|
|
14
|
+
export function parseRelativeDate(input) {
|
|
15
|
+
const now = new Date();
|
|
16
|
+
const normalized = input.toLowerCase();
|
|
17
|
+
if (normalized === "yesterday") {
|
|
18
|
+
const yesterday = startOfDay(now);
|
|
19
|
+
yesterday.setDate(yesterday.getDate() - 1);
|
|
20
|
+
return yesterday.toISOString();
|
|
21
|
+
}
|
|
22
|
+
if (normalized === "today") {
|
|
23
|
+
return startOfDay(now).toISOString();
|
|
24
|
+
}
|
|
25
|
+
const match = input.match(/^(\d+)(h|d|w|mo)\s*ago$/i);
|
|
26
|
+
if (!match) {
|
|
27
|
+
throw new Error(`Invalid date format: "${input}". Use: "1h ago", "2d ago", "3w ago", "1mo ago", "yesterday", or "today"`);
|
|
28
|
+
}
|
|
29
|
+
const amount = Number.parseInt(match[1], 10);
|
|
30
|
+
const unit = match[2].toLowerCase();
|
|
31
|
+
if (unit === "mo") {
|
|
32
|
+
const date = new Date(now);
|
|
33
|
+
date.setMonth(date.getMonth() - amount);
|
|
34
|
+
return date.toISOString();
|
|
35
|
+
}
|
|
36
|
+
const msOffsets = {
|
|
37
|
+
h: MS_PER_HOUR,
|
|
38
|
+
d: MS_PER_DAY,
|
|
39
|
+
w: MS_PER_WEEK,
|
|
40
|
+
};
|
|
41
|
+
return new Date(now.getTime() - amount * msOffsets[unit]).toISOString();
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Parse future time strings into Unix timestamp in milliseconds.
|
|
45
|
+
* Supports: "30m", "1h", "2d", "1w", "tomorrow", or ISO date
|
|
46
|
+
*/
|
|
47
|
+
export function parseFutureTime(input) {
|
|
48
|
+
const now = Date.now();
|
|
49
|
+
const normalized = input.toLowerCase();
|
|
50
|
+
if (normalized === "tomorrow") {
|
|
51
|
+
const tomorrow = new Date();
|
|
52
|
+
tomorrow.setDate(tomorrow.getDate() + 1);
|
|
53
|
+
tomorrow.setHours(9, 0, 0, 0);
|
|
54
|
+
return tomorrow.getTime();
|
|
55
|
+
}
|
|
56
|
+
const match = input.match(/^(\d+)(m|h|d|w)$/i);
|
|
57
|
+
if (match) {
|
|
58
|
+
const amount = Number.parseInt(match[1], 10);
|
|
59
|
+
const unit = match[2].toLowerCase();
|
|
60
|
+
const msOffsets = {
|
|
61
|
+
m: MS_PER_MINUTE,
|
|
62
|
+
h: MS_PER_HOUR,
|
|
63
|
+
d: MS_PER_DAY,
|
|
64
|
+
w: MS_PER_WEEK,
|
|
65
|
+
};
|
|
66
|
+
return now + amount * msOffsets[unit];
|
|
67
|
+
}
|
|
68
|
+
const parsed = Date.parse(input);
|
|
69
|
+
if (!Number.isNaN(parsed)) {
|
|
70
|
+
return parsed;
|
|
71
|
+
}
|
|
72
|
+
throw new Error(`Invalid time format: "${input}". Use: "30m", "1h", "2d", "1w", "tomorrow", or ISO date`);
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=dates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dates.js","sourceRoot":"","sources":["../../src/lib/dates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AA+BA,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CAcjD"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import kleur from "kleur";
|
|
2
|
+
const ERROR_HINTS = [
|
|
3
|
+
{
|
|
4
|
+
pattern: "ECONNREFUSED",
|
|
5
|
+
message: "Cannot connect to Beeper Desktop API",
|
|
6
|
+
hint: "Make sure Beeper Desktop is running with API enabled.\n Settings -> Developers -> Enable Beeper Desktop API",
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
pattern: "404",
|
|
10
|
+
message: "Resource not found",
|
|
11
|
+
hint: "Make sure the ID is correct.",
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
pattern: "403",
|
|
15
|
+
message: "Permission denied",
|
|
16
|
+
hint: "Check your token has the required permissions.",
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
pattern: "invalid",
|
|
20
|
+
message: "Invalid URL format",
|
|
21
|
+
hint: "URL should be mxc:// or localmxc://",
|
|
22
|
+
},
|
|
23
|
+
];
|
|
24
|
+
export function handleError(error) {
|
|
25
|
+
if (!(error instanceof Error)) {
|
|
26
|
+
console.error(kleur.red("Unknown error occurred"));
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
const hint = ERROR_HINTS.find((h) => error.message.includes(h.pattern));
|
|
30
|
+
if (hint) {
|
|
31
|
+
console.error(kleur.red(`Error: ${hint.message}`));
|
|
32
|
+
if (hint.hint)
|
|
33
|
+
console.error(kleur.dim(` ${hint.hint}`));
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
console.error(kleur.red(`Error: ${error.message}`));
|
|
37
|
+
}
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAQ1B,MAAM,WAAW,GAAgB;IAChC;QACC,OAAO,EAAE,cAAc;QACvB,OAAO,EAAE,sCAAsC;QAC/C,IAAI,EAAE,+GAA+G;KACrH;IACD;QACC,OAAO,EAAE,KAAK;QACd,OAAO,EAAE,oBAAoB;QAC7B,IAAI,EAAE,8BAA8B;KACpC;IACD;QACC,OAAO,EAAE,KAAK;QACd,OAAO,EAAE,mBAAmB;QAC5B,IAAI,EAAE,gDAAgD;KACtD;IACD;QACC,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE,oBAAoB;QAC7B,IAAI,EAAE,qCAAqC;KAC3C;CACD,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,KAAc;IACzC,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACxE,IAAI,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACnD,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5D,CAAC;SAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export interface AccountUser {
|
|
2
|
+
id: string;
|
|
3
|
+
email?: string;
|
|
4
|
+
fullName?: string;
|
|
5
|
+
displayText?: string;
|
|
6
|
+
username?: string;
|
|
7
|
+
isSelf?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface Account {
|
|
10
|
+
accountID: string;
|
|
11
|
+
network: string;
|
|
12
|
+
user?: AccountUser;
|
|
13
|
+
}
|
|
14
|
+
export interface ChatPreview {
|
|
15
|
+
id: string;
|
|
16
|
+
chatID: string;
|
|
17
|
+
accountID: string;
|
|
18
|
+
senderID: string;
|
|
19
|
+
senderName?: string;
|
|
20
|
+
timestamp: string;
|
|
21
|
+
text: string;
|
|
22
|
+
isSender?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface Chat {
|
|
25
|
+
id: string;
|
|
26
|
+
localChatID?: string;
|
|
27
|
+
accountID: string;
|
|
28
|
+
network?: string;
|
|
29
|
+
title?: string;
|
|
30
|
+
type?: string;
|
|
31
|
+
lastActivity?: string;
|
|
32
|
+
unreadCount?: number;
|
|
33
|
+
isArchived?: boolean;
|
|
34
|
+
isMuted?: boolean;
|
|
35
|
+
isPinned?: boolean;
|
|
36
|
+
preview?: ChatPreview;
|
|
37
|
+
}
|
|
38
|
+
export interface Message {
|
|
39
|
+
id: string;
|
|
40
|
+
chatID: string;
|
|
41
|
+
accountID: string;
|
|
42
|
+
senderID: string;
|
|
43
|
+
senderName?: string;
|
|
44
|
+
text: string;
|
|
45
|
+
timestamp: string;
|
|
46
|
+
attachments?: Attachment[];
|
|
47
|
+
}
|
|
48
|
+
export interface Attachment {
|
|
49
|
+
id: string;
|
|
50
|
+
mimeType: string;
|
|
51
|
+
filename?: string;
|
|
52
|
+
url?: string;
|
|
53
|
+
}
|
|
54
|
+
export interface SearchResult {
|
|
55
|
+
messages: Message[];
|
|
56
|
+
chats: Chat[];
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,OAAO;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,WAAW,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,IAAI;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,OAAO;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,YAAY;IAC5B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,KAAK,EAAE,IAAI,EAAE,CAAC;CACd"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA,mBAAmB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/tui/App.tsx"],"names":[],"mappings":"AAQA,wBAAgB,GAAG,8BAuDlB"}
|
package/dist/tui/App.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "@opentui/react/jsx-runtime";
|
|
2
|
+
import { useKeyboard } from "@opentui/react";
|
|
3
|
+
import { useCallback, useState } from "react";
|
|
4
|
+
import { ChatList } from "./views/ChatList.js";
|
|
5
|
+
import { Messages } from "./views/Messages.js";
|
|
6
|
+
export function App() {
|
|
7
|
+
const [view, setView] = useState("chats");
|
|
8
|
+
const [selectedChatId, setSelectedChatId] = useState(null);
|
|
9
|
+
const [selectedChatTitle, setSelectedChatTitle] = useState("");
|
|
10
|
+
const openChat = useCallback((chatId, title) => {
|
|
11
|
+
setSelectedChatId(chatId);
|
|
12
|
+
setSelectedChatTitle(title);
|
|
13
|
+
setView("messages");
|
|
14
|
+
}, []);
|
|
15
|
+
const goBack = useCallback(() => {
|
|
16
|
+
setView("chats");
|
|
17
|
+
setSelectedChatId(null);
|
|
18
|
+
}, []);
|
|
19
|
+
useKeyboard((key) => {
|
|
20
|
+
if (key.name === "escape" && view === "messages") {
|
|
21
|
+
goBack();
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
return (_jsxs("box", { style: { flexDirection: "column", flexGrow: 1 }, children: [_jsxs("box", { style: {
|
|
25
|
+
height: 3,
|
|
26
|
+
border: true,
|
|
27
|
+
padding: 1,
|
|
28
|
+
justifyContent: "center",
|
|
29
|
+
}, children: [_jsx("text", { fg: "#60A5FA", style: { bold: true }, children: "Beep TUI" }), _jsx("text", { fg: "#888888", children: " | " }), _jsx("text", { fg: "#888888", children: view === "chats" ? "q: quit" : "esc: back | q: quit" })] }), _jsxs("box", { style: { flexGrow: 1 }, children: [view === "chats" && _jsx(ChatList, { onSelectChat: openChat }), view === "messages" && selectedChatId && (_jsx(Messages, { chatId: selectedChatId, chatTitle: selectedChatTitle, onBack: goBack }))] })] }));
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=App.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"App.js","sourceRoot":"","sources":["../../src/tui/App.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAI/C,MAAM,UAAU,GAAG;IAClB,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAO,OAAO,CAAC,CAAC;IAChD,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAC1E,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAAS,EAAE,CAAC,CAAC;IAEvE,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,MAAc,EAAE,KAAa,EAAE,EAAE;QAC9D,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC1B,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC5B,OAAO,CAAC,UAAU,CAAC,CAAC;IACrB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE;QAC/B,OAAO,CAAC,OAAO,CAAC,CAAC;QACjB,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,WAAW,CAAC,CAAC,GAAa,EAAE,EAAE;QAC7B,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YAClD,MAAM,EAAE,CAAC;QACV,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,OAAO,CACN,eAAK,KAAK,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE,aAEnD,eACC,KAAK,EAAE;oBACN,MAAM,EAAE,CAAC;oBACT,MAAM,EAAE,IAAI;oBACZ,OAAO,EAAE,CAAC;oBACV,cAAc,EAAE,QAAQ;iBACxB,aAED,eAAM,EAAE,EAAC,SAAS,EAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,yBAEjC,EACP,eAAM,EAAE,EAAC,SAAS,oBAAW,EAC7B,eAAM,EAAE,EAAC,SAAS,YAChB,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,qBAAqB,GAC/C,IACF,EAGN,eAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,aACzB,IAAI,KAAK,OAAO,IAAI,KAAC,QAAQ,IAAC,YAAY,EAAE,QAAQ,GAAI,EACxD,IAAI,KAAK,UAAU,IAAI,cAAc,IAAI,CACzC,KAAC,QAAQ,IACR,MAAM,EAAE,cAAc,EACtB,SAAS,EAAE,iBAAiB,EAC5B,MAAM,EAAE,MAAM,GACb,CACF,IACI,IACD,CACN,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tui/index.tsx"],"names":[],"mappings":"AAIA,wBAAsB,QAAQ,kBAU7B"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { jsx as _jsx } from "@opentui/react/jsx-runtime";
|
|
2
|
+
import { createCliRenderer } from "@opentui/core";
|
|
3
|
+
import { createRoot } from "@opentui/react";
|
|
4
|
+
import { App } from "./App.js";
|
|
5
|
+
export async function startTui() {
|
|
6
|
+
const renderer = await createCliRenderer({
|
|
7
|
+
exitOnCtrlC: true,
|
|
8
|
+
targetFps: 30,
|
|
9
|
+
useMouse: true,
|
|
10
|
+
useAlternateScreen: true,
|
|
11
|
+
});
|
|
12
|
+
renderer.setTerminalTitle("Beep TUI");
|
|
13
|
+
createRoot(renderer).render(_jsx(App, {}));
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tui/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC7B,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC;QACxC,WAAW,EAAE,IAAI;QACjB,SAAS,EAAE,EAAE;QACb,QAAQ,EAAE,IAAI;QACd,kBAAkB,EAAE,IAAI;KACxB,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACtC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAC,GAAG,KAAG,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatList.d.ts","sourceRoot":"","sources":["../../../src/tui/views/ChatList.tsx"],"names":[],"mappings":"AAKA,UAAU,aAAa;IACtB,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACtD;AAED,wBAAgB,QAAQ,CAAC,EAAE,YAAY,EAAE,EAAE,aAAa,6BA0EvD"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "@opentui/react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState } from "react";
|
|
3
|
+
import { getClient } from "../../lib/client.js";
|
|
4
|
+
export function ChatList({ onSelectChat }) {
|
|
5
|
+
const [chats, setChats] = useState([]);
|
|
6
|
+
const [loading, setLoading] = useState(true);
|
|
7
|
+
const [error, setError] = useState(null);
|
|
8
|
+
useEffect(() => {
|
|
9
|
+
async function loadChats() {
|
|
10
|
+
try {
|
|
11
|
+
const client = getClient();
|
|
12
|
+
const result = [];
|
|
13
|
+
for await (const chat of client.chats.search({ inbox: "primary" })) {
|
|
14
|
+
result.push(chat);
|
|
15
|
+
if (result.length >= 50)
|
|
16
|
+
break;
|
|
17
|
+
}
|
|
18
|
+
setChats(result);
|
|
19
|
+
setLoading(false);
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
setError(err instanceof Error ? err.message : "Failed to load chats");
|
|
23
|
+
setLoading(false);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
loadChats();
|
|
27
|
+
}, []);
|
|
28
|
+
if (loading) {
|
|
29
|
+
return (_jsx("box", { style: { padding: 2 }, children: _jsx("text", { fg: "#888888", children: "Loading chats..." }) }));
|
|
30
|
+
}
|
|
31
|
+
if (error) {
|
|
32
|
+
return (_jsxs("box", { style: { padding: 2, flexDirection: "column", gap: 1 }, children: [_jsxs("text", { fg: "#FF6B6B", children: ["Error: ", error] }), _jsx("text", { fg: "#888888", children: "Make sure Beeper Desktop is running." })] }));
|
|
33
|
+
}
|
|
34
|
+
const options = chats.map((chat) => ({
|
|
35
|
+
name: chat.title || chat.description || "Unknown",
|
|
36
|
+
description: chat.preview?.text
|
|
37
|
+
? truncate(chat.preview.text, 60)
|
|
38
|
+
: `[${chat.network || chat.accountID}]`,
|
|
39
|
+
value: chat.id,
|
|
40
|
+
}));
|
|
41
|
+
return (_jsx("box", { title: `Inbox (${chats.length})`, style: { border: true, flexGrow: 1 }, children: _jsx("select", { style: { flexGrow: 1 }, options: options, focused: true, onChange: (index, option) => {
|
|
42
|
+
if (option) {
|
|
43
|
+
const chat = chats[index];
|
|
44
|
+
onSelectChat(option.value, chat.title || chat.description || "Chat");
|
|
45
|
+
}
|
|
46
|
+
} }) }));
|
|
47
|
+
}
|
|
48
|
+
function truncate(text, maxLength) {
|
|
49
|
+
const clean = text.replace(/\n/g, " ");
|
|
50
|
+
if (clean.length <= maxLength)
|
|
51
|
+
return clean;
|
|
52
|
+
return `${clean.slice(0, maxLength - 3)}...`;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=ChatList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatList.js","sourceRoot":"","sources":["../../../src/tui/views/ChatList.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Messages.d.ts","sourceRoot":"","sources":["../../../src/tui/views/Messages.tsx"],"names":[],"mappings":"AAMA,UAAU,aAAa;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,wBAAgB,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,aAAa,6BAqHpE"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "@opentui/react/jsx-runtime";
|
|
2
|
+
import { useKeyboard } from "@opentui/react";
|
|
3
|
+
import { useCallback, useEffect, useState } from "react";
|
|
4
|
+
import { getClient } from "../../lib/client.js";
|
|
5
|
+
export function Messages({ chatId, chatTitle, onBack }) {
|
|
6
|
+
const [messages, setMessages] = useState([]);
|
|
7
|
+
const [loading, setLoading] = useState(true);
|
|
8
|
+
const [error, setError] = useState(null);
|
|
9
|
+
const [inputValue, setInputValue] = useState("");
|
|
10
|
+
const [sending, setSending] = useState(false);
|
|
11
|
+
const [scrollOffset, setScrollOffset] = useState(0);
|
|
12
|
+
const loadMessages = useCallback(async () => {
|
|
13
|
+
try {
|
|
14
|
+
const client = getClient();
|
|
15
|
+
const result = [];
|
|
16
|
+
for await (const msg of client.messages.list(chatId)) {
|
|
17
|
+
result.push(msg);
|
|
18
|
+
if (result.length >= 50)
|
|
19
|
+
break;
|
|
20
|
+
}
|
|
21
|
+
setMessages(result);
|
|
22
|
+
setLoading(false);
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
setError(err instanceof Error ? err.message : "Failed to load messages");
|
|
26
|
+
setLoading(false);
|
|
27
|
+
}
|
|
28
|
+
}, [chatId]);
|
|
29
|
+
useEffect(() => {
|
|
30
|
+
loadMessages();
|
|
31
|
+
}, [loadMessages]);
|
|
32
|
+
const sendMessage = useCallback(async () => {
|
|
33
|
+
if (!inputValue.trim() || sending)
|
|
34
|
+
return;
|
|
35
|
+
setSending(true);
|
|
36
|
+
try {
|
|
37
|
+
const client = getClient();
|
|
38
|
+
await client.messages.send({ chatID: chatId, text: inputValue });
|
|
39
|
+
setInputValue("");
|
|
40
|
+
await loadMessages();
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
setError(err instanceof Error ? err.message : "Failed to send");
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
setSending(false);
|
|
47
|
+
}
|
|
48
|
+
}, [chatId, inputValue, sending, loadMessages]);
|
|
49
|
+
useKeyboard((key) => {
|
|
50
|
+
if (key.name === "up") {
|
|
51
|
+
setScrollOffset((prev) => Math.min(prev + 1, messages.length - 5));
|
|
52
|
+
}
|
|
53
|
+
else if (key.name === "down") {
|
|
54
|
+
setScrollOffset((prev) => Math.max(prev - 1, 0));
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
if (loading) {
|
|
58
|
+
return (_jsx("box", { style: { padding: 2 }, children: _jsx("text", { fg: "#888888", children: "Loading messages..." }) }));
|
|
59
|
+
}
|
|
60
|
+
if (error) {
|
|
61
|
+
return (_jsxs("box", { style: { padding: 2, flexDirection: "column", gap: 1 }, children: [_jsxs("text", { fg: "#FF6B6B", children: ["Error: ", error] }), _jsx("text", { fg: "#888888", children: "Press ESC to go back" })] }));
|
|
62
|
+
}
|
|
63
|
+
const visibleMessages = messages.slice(scrollOffset, scrollOffset + 20);
|
|
64
|
+
return (_jsxs("box", { style: { flexDirection: "column", flexGrow: 1 }, children: [_jsxs("box", { title: chatTitle, style: { border: true, flexGrow: 1, flexDirection: "column", padding: 1 }, children: [visibleMessages.length === 0 ? (_jsx("text", { fg: "#888888", children: "No messages" })) : (visibleMessages.map((msg, idx) => (_jsxs("box", { style: { flexDirection: "column" }, children: [_jsxs("text", { children: [_jsx("span", { fg: "#60A5FA", style: { bold: true }, children: msg.senderName || msg.senderID || "Unknown" }), _jsxs("span", { fg: "#888888", children: [" ", formatTime(msg.timestamp)] })] }), _jsx("text", { fg: "#FFFFFF", children: msg.text || "[attachment]" })] }, msg.id || idx)))), scrollOffset > 0 && (_jsxs("text", { fg: "#888888", children: ["... ", scrollOffset, " more below"] }))] }), _jsx("box", { title: "Message", style: { border: true, height: 3 }, children: _jsx("input", { placeholder: sending ? "Sending..." : "Type a message...", focused: true, onInput: setInputValue, onSubmit: sendMessage }) })] }));
|
|
65
|
+
}
|
|
66
|
+
function formatTime(timestamp) {
|
|
67
|
+
const date = new Date(timestamp);
|
|
68
|
+
return date.toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" });
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=Messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Messages.js","sourceRoot":"","sources":["../../../src/tui/views/Messages.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEzD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAQhD,MAAM,UAAU,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAiB;IACpE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAY,EAAE,CAAC,CAAC;IACxD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACxD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACjD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEpD,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC3C,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAc,EAAE,CAAC;YAE7B,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACjB,IAAI,MAAM,CAAC,MAAM,IAAI,EAAE;oBAAE,MAAM;YAChC,CAAC;YAED,WAAW,CAAC,MAAM,CAAC,CAAC;YACpB,UAAU,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC;YACzE,UAAU,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;IACF,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,SAAS,CAAC,GAAG,EAAE;QACd,YAAY,EAAE,CAAC;IAChB,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC1C,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,OAAO;YAAE,OAAO;QAE1C,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;YAC3B,MAAM,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;YACjE,aAAa,CAAC,EAAE,CAAC,CAAC;YAClB,MAAM,YAAY,EAAE,CAAC;QACtB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;QACjE,CAAC;gBAAS,CAAC;YACV,UAAU,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;IACF,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;IAEhD,WAAW,CAAC,CAAC,GAAa,EAAE,EAAE;QAC7B,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACvB,eAAe,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QACpE,CAAC;aAAM,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAChC,eAAe,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAClD,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,IAAI,OAAO,EAAE,CAAC;QACb,OAAO,CACN,cAAK,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,YACzB,eAAM,EAAE,EAAC,SAAS,oCAA2B,GACxC,CACN,CAAC;IACH,CAAC;IAED,IAAI,KAAK,EAAE,CAAC;QACX,OAAO,CACN,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,aAC1D,gBAAM,EAAE,EAAC,SAAS,wBAAS,KAAK,IAAQ,EACxC,eAAM,EAAE,EAAC,SAAS,qCAA4B,IACzC,CACN,CAAC;IACH,CAAC;IAED,MAAM,eAAe,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,EAAE,YAAY,GAAG,EAAE,CAAC,CAAC;IAExE,OAAO,CACN,eAAK,KAAK,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE,aAEnD,eACC,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,aAExE,eAAe,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAC/B,eAAM,EAAE,EAAC,SAAS,4BAAmB,CACrC,CAAC,CAAC,CAAC,CACH,eAAe,CAAC,GAAG,CAAC,CAAC,GAAY,EAAE,GAAW,EAAE,EAAE,CAAC,CAClD,eAAyB,KAAK,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,aAC1D,2BACC,eAAM,EAAE,EAAC,SAAS,EAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,YACtC,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,QAAQ,IAAI,SAAS,GACtC,EACP,gBAAM,EAAE,EAAC,SAAS,aAChB,GAAG,EACH,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,IACpB,IACD,EACP,eAAM,EAAE,EAAC,SAAS,YAAE,GAAG,CAAC,IAAI,IAAI,cAAc,GAAQ,KAV7C,GAAG,CAAC,EAAE,IAAI,GAAG,CAWjB,CACN,CAAC,CACF,EACA,YAAY,GAAG,CAAC,IAAI,CACpB,gBAAM,EAAE,EAAC,SAAS,qBAAM,YAAY,mBAAmB,CACvD,IACI,EAGN,cACC,KAAK,EAAC,SAAS,EACf,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,YAElC,gBACC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,mBAAmB,EACzD,OAAO,EAAE,IAAI,EACb,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,WAAW,GACpB,GACG,IACD,CACN,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,SAAiB;IACpC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;IACjC,OAAO,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;AAC5E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,UAAU,CAAC"}
|
package/dist/version.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "beepctl",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "CLI for Beeper Desktop API - unified messaging from terminal",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "dist/index.js",
|
|
8
|
+
"bin": {
|
|
9
|
+
"beep": "dist/cli.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"prepublishOnly": "pnpm run build",
|
|
16
|
+
"build": "tsc",
|
|
17
|
+
"dev": "tsx src/cli.ts",
|
|
18
|
+
"test": "vitest run",
|
|
19
|
+
"test:watch": "vitest",
|
|
20
|
+
"lint": "biome check . && oxlint",
|
|
21
|
+
"lint:fix": "biome check --write . && oxlint --fix",
|
|
22
|
+
"lint:biome": "biome check .",
|
|
23
|
+
"lint:oxlint": "oxlint",
|
|
24
|
+
"binary": "bun build --compile src/cli.ts --outfile beep",
|
|
25
|
+
"typecheck": "tsc --noEmit"
|
|
26
|
+
},
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@beeper/desktop-api": "^4.2.3",
|
|
29
|
+
"commander": "^14.0.0",
|
|
30
|
+
"kleur": "^4.1.5"
|
|
31
|
+
},
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"@biomejs/biome": "^2.0.0",
|
|
34
|
+
"@types/node": "^22.0.0",
|
|
35
|
+
"oxlint": "^1.39.0",
|
|
36
|
+
"tsx": "^4.21.0",
|
|
37
|
+
"typescript": "^5.9.0",
|
|
38
|
+
"vitest": "^4.0.0"
|
|
39
|
+
},
|
|
40
|
+
"engines": {
|
|
41
|
+
"node": ">=20"
|
|
42
|
+
},
|
|
43
|
+
"packageManager": "pnpm@10.11.0",
|
|
44
|
+
"repository": {
|
|
45
|
+
"type": "git",
|
|
46
|
+
"url": "git+https://github.com/blqke/beepcli.git"
|
|
47
|
+
},
|
|
48
|
+
"bugs": {
|
|
49
|
+
"url": "https://github.com/blqke/beepcli/issues"
|
|
50
|
+
},
|
|
51
|
+
"homepage": "https://github.com/blqke/beepcli#readme",
|
|
52
|
+
"author": "blqke",
|
|
53
|
+
"keywords": [
|
|
54
|
+
"cli",
|
|
55
|
+
"beeper",
|
|
56
|
+
"messaging",
|
|
57
|
+
"chat",
|
|
58
|
+
"terminal",
|
|
59
|
+
"matrix",
|
|
60
|
+
"clawdbot"
|
|
61
|
+
]
|
|
62
|
+
}
|