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.
Files changed (107) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +186 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +34 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/accounts.d.ts +3 -0
  8. package/dist/commands/accounts.d.ts.map +1 -0
  9. package/dist/commands/accounts.js +27 -0
  10. package/dist/commands/accounts.js.map +1 -0
  11. package/dist/commands/alias.d.ts +3 -0
  12. package/dist/commands/alias.d.ts.map +1 -0
  13. package/dist/commands/alias.js +79 -0
  14. package/dist/commands/alias.js.map +1 -0
  15. package/dist/commands/archive.d.ts +3 -0
  16. package/dist/commands/archive.d.ts.map +1 -0
  17. package/dist/commands/archive.js +35 -0
  18. package/dist/commands/archive.js.map +1 -0
  19. package/dist/commands/auth.d.ts +3 -0
  20. package/dist/commands/auth.d.ts.map +1 -0
  21. package/dist/commands/auth.js +58 -0
  22. package/dist/commands/auth.js.map +1 -0
  23. package/dist/commands/chats.d.ts +3 -0
  24. package/dist/commands/chats.d.ts.map +1 -0
  25. package/dist/commands/chats.js +227 -0
  26. package/dist/commands/chats.js.map +1 -0
  27. package/dist/commands/contacts.d.ts +3 -0
  28. package/dist/commands/contacts.d.ts.map +1 -0
  29. package/dist/commands/contacts.js +46 -0
  30. package/dist/commands/contacts.js.map +1 -0
  31. package/dist/commands/download.d.ts +3 -0
  32. package/dist/commands/download.d.ts.map +1 -0
  33. package/dist/commands/download.js +39 -0
  34. package/dist/commands/download.js.map +1 -0
  35. package/dist/commands/focus.d.ts +3 -0
  36. package/dist/commands/focus.d.ts.map +1 -0
  37. package/dist/commands/focus.js +49 -0
  38. package/dist/commands/focus.js.map +1 -0
  39. package/dist/commands/messages.d.ts +3 -0
  40. package/dist/commands/messages.d.ts.map +1 -0
  41. package/dist/commands/messages.js +105 -0
  42. package/dist/commands/messages.js.map +1 -0
  43. package/dist/commands/reminders.d.ts +3 -0
  44. package/dist/commands/reminders.d.ts.map +1 -0
  45. package/dist/commands/reminders.js +58 -0
  46. package/dist/commands/reminders.js.map +1 -0
  47. package/dist/commands/search.d.ts +3 -0
  48. package/dist/commands/search.d.ts.map +1 -0
  49. package/dist/commands/search.js +211 -0
  50. package/dist/commands/search.js.map +1 -0
  51. package/dist/commands/send.d.ts +3 -0
  52. package/dist/commands/send.d.ts.map +1 -0
  53. package/dist/commands/send.js +58 -0
  54. package/dist/commands/send.js.map +1 -0
  55. package/dist/index.d.ts +4 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +3 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/lib/aliases.d.ts +8 -0
  60. package/dist/lib/aliases.d.ts.map +1 -0
  61. package/dist/lib/aliases.js +19 -0
  62. package/dist/lib/aliases.js.map +1 -0
  63. package/dist/lib/client.d.ts +6 -0
  64. package/dist/lib/client.d.ts.map +1 -0
  65. package/dist/lib/client.js +15 -0
  66. package/dist/lib/client.js.map +1 -0
  67. package/dist/lib/command-utils.d.ts +38 -0
  68. package/dist/lib/command-utils.d.ts.map +1 -0
  69. package/dist/lib/command-utils.js +98 -0
  70. package/dist/lib/command-utils.js.map +1 -0
  71. package/dist/lib/config.d.ts +9 -0
  72. package/dist/lib/config.d.ts.map +1 -0
  73. package/dist/lib/config.js +32 -0
  74. package/dist/lib/config.js.map +1 -0
  75. package/dist/lib/dates.d.ts +11 -0
  76. package/dist/lib/dates.d.ts.map +1 -0
  77. package/dist/lib/dates.js +74 -0
  78. package/dist/lib/dates.js.map +1 -0
  79. package/dist/lib/errors.d.ts +2 -0
  80. package/dist/lib/errors.d.ts.map +1 -0
  81. package/dist/lib/errors.js +40 -0
  82. package/dist/lib/errors.js.map +1 -0
  83. package/dist/lib/types.d.ts +58 -0
  84. package/dist/lib/types.d.ts.map +1 -0
  85. package/dist/lib/types.js +3 -0
  86. package/dist/lib/types.js.map +1 -0
  87. package/dist/tui/App.d.ts +2 -0
  88. package/dist/tui/App.d.ts.map +1 -0
  89. package/dist/tui/App.js +31 -0
  90. package/dist/tui/App.js.map +1 -0
  91. package/dist/tui/index.d.ts +2 -0
  92. package/dist/tui/index.d.ts.map +1 -0
  93. package/dist/tui/index.js +15 -0
  94. package/dist/tui/index.js.map +1 -0
  95. package/dist/tui/views/ChatList.d.ts +6 -0
  96. package/dist/tui/views/ChatList.d.ts.map +1 -0
  97. package/dist/tui/views/ChatList.js +54 -0
  98. package/dist/tui/views/ChatList.js.map +1 -0
  99. package/dist/tui/views/Messages.d.ts +8 -0
  100. package/dist/tui/views/Messages.d.ts.map +1 -0
  101. package/dist/tui/views/Messages.js +70 -0
  102. package/dist/tui/views/Messages.js.map +1 -0
  103. package/dist/version.d.ts +2 -0
  104. package/dist/version.d.ts.map +1 -0
  105. package/dist/version.js +2 -0
  106. package/dist/version.js.map +1 -0
  107. 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,2 @@
1
+ export declare function handleError(error: unknown): never;
2
+ //# sourceMappingURL=errors.d.ts.map
@@ -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,3 @@
1
+ // Beeper API Types
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA,mBAAmB"}
@@ -0,0 +1,2 @@
1
+ export declare function App(): import("react").ReactNode;
2
+ //# sourceMappingURL=App.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/tui/App.tsx"],"names":[],"mappings":"AAQA,wBAAgB,GAAG,8BAuDlB"}
@@ -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,2 @@
1
+ export declare function startTui(): Promise<void>;
2
+ //# sourceMappingURL=index.d.ts.map
@@ -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,6 @@
1
+ interface ChatListProps {
2
+ onSelectChat: (chatId: string, title: string) => void;
3
+ }
4
+ export declare function ChatList({ onSelectChat }: ChatListProps): import("react").ReactNode;
5
+ export {};
6
+ //# sourceMappingURL=ChatList.d.ts.map
@@ -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,8 @@
1
+ interface MessagesProps {
2
+ chatId: string;
3
+ chatTitle: string;
4
+ onBack: () => void;
5
+ }
6
+ export declare function Messages({ chatId, chatTitle, onBack }: MessagesProps): import("react").ReactNode;
7
+ export {};
8
+ //# sourceMappingURL=Messages.d.ts.map
@@ -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":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const version = "0.1.0";
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,UAAU,CAAC"}
@@ -0,0 +1,2 @@
1
+ export const version = "0.1.0";
2
+ //# sourceMappingURL=version.js.map
@@ -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
+ }