@ask-thane/thane-cli 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/dist/menu.js ADDED
@@ -0,0 +1,56 @@
1
+ import { emitKeypressEvents } from "node:readline";
2
+ import { stdin as input, stdout as output } from "node:process";
3
+ function renderMenu(commands, selectedIndex) {
4
+ output.write("\x1b[2J\x1b[H");
5
+ output.write("Thane commands\n");
6
+ output.write("Use arrow keys, Return to choose, Esc to close.\n\n");
7
+ commands.forEach((command, index) => {
8
+ const pointer = index === selectedIndex ? "> " : " ";
9
+ output.write(`${pointer}${command.usage.padEnd(28)} ${command.description}\n`);
10
+ });
11
+ }
12
+ export async function runSlashMenu(commands) {
13
+ if (!input.isTTY || !input.setRawMode) {
14
+ output.write(commands.map((command) => `${command.usage} - ${command.description}`).join("\n"));
15
+ output.write("\n");
16
+ return undefined;
17
+ }
18
+ emitKeypressEvents(input);
19
+ input.setRawMode(true);
20
+ input.resume();
21
+ let selectedIndex = 0;
22
+ renderMenu(commands, selectedIndex);
23
+ return new Promise((resolve) => {
24
+ const cleanup = (command) => {
25
+ input.setRawMode?.(false);
26
+ input.off("keypress", onKeypress);
27
+ output.write("\x1b[2J\x1b[H");
28
+ resolve(command);
29
+ };
30
+ const onKeypress = (_chunk, key) => {
31
+ if (key.ctrl && key.name === "c") {
32
+ cleanup();
33
+ return;
34
+ }
35
+ if (key.name === "escape") {
36
+ cleanup();
37
+ return;
38
+ }
39
+ if (key.name === "up") {
40
+ selectedIndex = selectedIndex === 0 ? commands.length - 1 : selectedIndex - 1;
41
+ renderMenu(commands, selectedIndex);
42
+ return;
43
+ }
44
+ if (key.name === "down") {
45
+ selectedIndex = selectedIndex === commands.length - 1 ? 0 : selectedIndex + 1;
46
+ renderMenu(commands, selectedIndex);
47
+ return;
48
+ }
49
+ if (key.name === "return") {
50
+ cleanup(commands[selectedIndex]);
51
+ }
52
+ };
53
+ input.on("keypress", onKeypress);
54
+ });
55
+ }
56
+ //# sourceMappingURL=menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu.js","sourceRoot":"","sources":["../src/menu.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,139 @@
1
+ export type WorkspaceRole = "owner" | "admin" | "member";
2
+ export type ChannelVisibility = "public" | "private";
3
+ export interface ThaneAccount {
4
+ id: string;
5
+ email: string;
6
+ displayName: string;
7
+ createdAt: string;
8
+ }
9
+ export interface ThaneWorkspaceMember {
10
+ id: string;
11
+ workspaceId: string;
12
+ accountId: string;
13
+ userId: string;
14
+ role: WorkspaceRole;
15
+ joinedAt: string;
16
+ }
17
+ export interface AskThaneIntegration {
18
+ workspaceId: string;
19
+ enabled: boolean;
20
+ botUserId: string;
21
+ linkedAccountEmail: string;
22
+ provider: "thane_cli";
23
+ externalUserId: string;
24
+ connectedAt: string;
25
+ lastEventAt?: string;
26
+ }
27
+ export type PingLocation = "origin" | "thane_cli" | "slack" | "both";
28
+ export type ThaneCliPlanTier = "free" | "cli_team";
29
+ export type BillingStatus = "active" | "inactive" | "past_due";
30
+ export interface WorkspaceBillingPlan {
31
+ workspaceId: string;
32
+ planTier: ThaneCliPlanTier;
33
+ status: BillingStatus;
34
+ stripeCheckoutUrl?: string;
35
+ stripeCustomerId?: string;
36
+ stripeSubscriptionId?: string;
37
+ updatedAt: string;
38
+ }
39
+ export interface NotificationPreference {
40
+ accountId: string;
41
+ preferredPingLocation: PingLocation;
42
+ updatedAt: string;
43
+ updatedBy?: "user" | "ask_thane";
44
+ }
45
+ export interface PendingLogin {
46
+ email: string;
47
+ code: string;
48
+ expiresAt: string;
49
+ createdAt: string;
50
+ }
51
+ export interface ThaneUser {
52
+ id: string;
53
+ workspaceId: string;
54
+ accountId?: string;
55
+ handle: string;
56
+ displayName: string;
57
+ email?: string;
58
+ }
59
+ export interface ThaneWorkspace {
60
+ id: string;
61
+ slug: string;
62
+ name: string;
63
+ createdAt: string;
64
+ }
65
+ export interface ThaneChannel {
66
+ id: string;
67
+ workspaceId: string;
68
+ name: string;
69
+ kind: "channel" | "dm";
70
+ visibility: ChannelVisibility;
71
+ memberIds: string[];
72
+ topic?: string;
73
+ createdAt: string;
74
+ }
75
+ export interface ThaneReaction {
76
+ emoji: string;
77
+ by: string;
78
+ createdAt: string;
79
+ }
80
+ export interface ThaneMessage {
81
+ id: string;
82
+ workspaceId: string;
83
+ channelId: string;
84
+ authorId: string;
85
+ text: string;
86
+ createdAt: string;
87
+ threadRootId?: string;
88
+ reactions: ThaneReaction[];
89
+ mentions: string[];
90
+ }
91
+ export interface ThaneReadState {
92
+ workspaceId: string;
93
+ channelId: string;
94
+ userId: string;
95
+ lastReadAt: string;
96
+ }
97
+ export interface ThaneStoreData {
98
+ currentAccountId?: string;
99
+ accounts: ThaneAccount[];
100
+ workspaceMembers: ThaneWorkspaceMember[];
101
+ askThaneIntegrations: AskThaneIntegration[];
102
+ notificationPreferences: NotificationPreference[];
103
+ billingPlans: WorkspaceBillingPlan[];
104
+ pendingLogins: PendingLogin[];
105
+ activeWorkspaceId: string;
106
+ workspaces: ThaneWorkspace[];
107
+ currentUserId: string;
108
+ users: ThaneUser[];
109
+ channels: ThaneChannel[];
110
+ messages: ThaneMessage[];
111
+ readStates: ThaneReadState[];
112
+ }
113
+ export interface MessageView {
114
+ id: string;
115
+ workspace: string;
116
+ channel: string;
117
+ conversationKind: "channel" | "dm";
118
+ author: string;
119
+ text: string;
120
+ createdAt: string;
121
+ threadRootId?: string;
122
+ replyCount: number;
123
+ reactions: ThaneReaction[];
124
+ mentions: string[];
125
+ mentionsMe: boolean;
126
+ }
127
+ export interface ConversationSummary {
128
+ workspace: string;
129
+ workspaceId: string;
130
+ conversationId: string;
131
+ conversation: string;
132
+ conversationKind: "channel" | "dm";
133
+ unreadCount: number;
134
+ mentionCount: number;
135
+ latestMessageAt?: string;
136
+ latestAuthor?: string;
137
+ latestText?: string;
138
+ }
139
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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"}
package/dist/model.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ import type { ConversationSummary, MessageView, ThaneAccount, ThaneChannel, ThaneUser, ThaneWorkspace, WorkspaceRole } from "./model.js";
2
+ export declare function printJson(value: unknown): void;
3
+ export declare function renderChannels(channels: ThaneChannel[]): string;
4
+ export declare function renderDms(dms: ThaneChannel[]): string;
5
+ export declare function renderUsers(users: ThaneUser[]): string;
6
+ export declare function renderMembers(members: Array<{
7
+ user: ThaneUser;
8
+ account?: ThaneAccount;
9
+ role: WorkspaceRole;
10
+ joinedAt: string;
11
+ }>): string;
12
+ export declare function renderWorkspaces(workspaces: ThaneWorkspace[], activeWorkspaceId: string): string;
13
+ export declare function renderInbox(summaries: ConversationSummary[]): string;
14
+ export declare function renderMessages(messages: MessageView[]): string;
15
+ export declare function renderMessage(message: MessageView): string;
16
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEzI,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAE9C;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,CAO/D;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,YAAY,EAAE,GAAG,MAAM,CAKrD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,CAKtD;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,CAAC,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,GACjG,MAAM,CAOR;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,cAAc,EAAE,EAAE,iBAAiB,EAAE,MAAM,GAAG,MAAM,CAOhG;AAED,wBAAgB,WAAW,CAAC,SAAS,EAAE,mBAAmB,EAAE,GAAG,MAAM,CAYpE;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,CAK9D;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAU1D"}
package/dist/render.js ADDED
@@ -0,0 +1,69 @@
1
+ export function printJson(value) {
2
+ process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
3
+ }
4
+ export function renderChannels(channels) {
5
+ if (channels.length === 0) {
6
+ return "No channels yet.";
7
+ }
8
+ return channels
9
+ .map((channel) => `#${channel.name} (${channel.visibility})${channel.topic ? ` - ${channel.topic}` : ""}`)
10
+ .join("\n");
11
+ }
12
+ export function renderDms(dms) {
13
+ if (dms.length === 0) {
14
+ return "No DMs yet.";
15
+ }
16
+ return dms.map((dm) => `@${dm.name}`).join("\n");
17
+ }
18
+ export function renderUsers(users) {
19
+ if (users.length === 0) {
20
+ return "No users yet.";
21
+ }
22
+ return users.map((user) => `@${user.handle} - ${user.displayName}`).join("\n");
23
+ }
24
+ export function renderMembers(members) {
25
+ if (members.length === 0) {
26
+ return "No members yet.";
27
+ }
28
+ return members
29
+ .map((member) => `@${member.user.handle} (${member.role}) - ${member.account?.email ?? member.user.email ?? "no email"}`)
30
+ .join("\n");
31
+ }
32
+ export function renderWorkspaces(workspaces, activeWorkspaceId) {
33
+ if (workspaces.length === 0) {
34
+ return "No workspaces yet.";
35
+ }
36
+ return workspaces
37
+ .map((workspace) => `${workspace.id === activeWorkspaceId ? "*" : " "} ${workspace.slug} - ${workspace.name}`)
38
+ .join("\n");
39
+ }
40
+ export function renderInbox(summaries) {
41
+ if (summaries.length === 0) {
42
+ return "No unread conversations.";
43
+ }
44
+ return summaries
45
+ .map((summary) => {
46
+ const prefix = summary.conversationKind === "dm" ? "@" : "#";
47
+ const mention = summary.mentionCount > 0 ? `, ${summary.mentionCount} mention${summary.mentionCount === 1 ? "" : "s"}` : "";
48
+ const latest = summary.latestText ? ` - ${summary.latestAuthor ?? "unknown"}: ${summary.latestText}` : "";
49
+ return `${summary.workspace} ${prefix}${summary.conversation} ${summary.unreadCount} unread${mention}${latest}`;
50
+ })
51
+ .join("\n");
52
+ }
53
+ export function renderMessages(messages) {
54
+ if (messages.length === 0) {
55
+ return "No messages found.";
56
+ }
57
+ return messages.map(renderMessage).join("\n");
58
+ }
59
+ export function renderMessage(message) {
60
+ const date = new Date(message.createdAt);
61
+ const stamp = Number.isNaN(date.getTime()) ? message.createdAt : date.toLocaleString();
62
+ const conversation = message.conversationKind === "dm" ? `@${message.channel}` : `#${message.channel}`;
63
+ const thread = message.replyCount > 0 ? ` thread: ${message.replyCount} replies` : "";
64
+ const reply = message.threadRootId ? ` in-thread:${message.threadRootId}` : "";
65
+ const reactions = message.reactions.length > 0 ? ` reactions: ${message.reactions.map((reaction) => reaction.emoji).join(" ")}` : "";
66
+ const mention = message.mentionsMe ? " mentions you" : "";
67
+ return `[${stamp}] ${conversation} ${message.author}: ${message.text}\n id: ${message.id}${thread}${reply}${reactions}${mention}`;
68
+ }
69
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ export interface SlackExportUser {
2
+ id: string;
3
+ name?: string;
4
+ real_name?: string;
5
+ deleted?: boolean;
6
+ is_bot?: boolean;
7
+ profile?: {
8
+ email?: string;
9
+ real_name?: string;
10
+ display_name?: string;
11
+ };
12
+ }
13
+ export interface SlackExportConversation {
14
+ id: string;
15
+ name?: string;
16
+ members?: string[];
17
+ topic?: {
18
+ value?: string;
19
+ };
20
+ purpose?: {
21
+ value?: string;
22
+ };
23
+ created?: number;
24
+ is_archived?: boolean;
25
+ }
26
+ export interface SlackExportReaction {
27
+ name?: string;
28
+ users?: string[];
29
+ }
30
+ export interface SlackExportFile {
31
+ id?: string;
32
+ name?: string;
33
+ title?: string;
34
+ url_private?: string;
35
+ permalink?: string;
36
+ }
37
+ export interface SlackExportMessage {
38
+ type?: string;
39
+ subtype?: string;
40
+ user?: string;
41
+ username?: string;
42
+ bot_id?: string;
43
+ text?: string;
44
+ ts?: string;
45
+ thread_ts?: string;
46
+ reactions?: SlackExportReaction[];
47
+ files?: SlackExportFile[];
48
+ }
49
+ export interface ParsedSlackConversation {
50
+ source: "channels" | "groups" | "dms" | "mpims";
51
+ conversation: SlackExportConversation;
52
+ }
53
+ export interface SlackMessageFile {
54
+ path: string;
55
+ folder: string;
56
+ messages: SlackExportMessage[];
57
+ }
58
+ export interface ParsedSlackExport {
59
+ users: SlackExportUser[];
60
+ conversations: ParsedSlackConversation[];
61
+ messageFiles: SlackMessageFile[];
62
+ }
63
+ export interface SlackImportPreview {
64
+ users: number;
65
+ accountsWithEmail: number;
66
+ publicChannels: number;
67
+ privateChannels: number;
68
+ dms: number;
69
+ messages: number;
70
+ threadedReplies: number;
71
+ reactions: number;
72
+ files: number;
73
+ skippedFiles: string[];
74
+ requiresTeamPlan: boolean;
75
+ }
76
+ export declare function parseSlackExportZip(zipPath: string): Promise<ParsedSlackExport>;
77
+ export declare function previewSlackExport(exportData: ParsedSlackExport, freeLimits: {
78
+ members: number;
79
+ privateChannels: number;
80
+ }): SlackImportPreview;
81
+ //# sourceMappingURL=slack-import.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack-import.d.ts","sourceRoot":"","sources":["../src/slack-import.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,142 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { inflateRawSync } from "node:zlib";
3
+ const textDecoder = new TextDecoder("utf-8");
4
+ function uint16(data, offset) {
5
+ return data[offset] | (data[offset + 1] << 8);
6
+ }
7
+ function uint32(data, offset) {
8
+ return (data[offset] | (data[offset + 1] << 8) | (data[offset + 2] << 16) | (data[offset + 3] << 24)) >>> 0;
9
+ }
10
+ function findEndOfCentralDirectory(data) {
11
+ for (let offset = data.length - 22; offset >= Math.max(0, data.length - 66_000); offset -= 1) {
12
+ if (uint32(data, offset) === 0x06054b50) {
13
+ return offset;
14
+ }
15
+ }
16
+ throw new Error("This does not look like a ZIP file.");
17
+ }
18
+ function listZipEntries(data) {
19
+ const eocd = findEndOfCentralDirectory(data);
20
+ const entryCount = uint16(data, eocd + 10);
21
+ const centralDirectoryOffset = uint32(data, eocd + 16);
22
+ const entries = [];
23
+ let offset = centralDirectoryOffset;
24
+ for (let index = 0; index < entryCount; index += 1) {
25
+ if (uint32(data, offset) !== 0x02014b50) {
26
+ throw new Error("Could not read the ZIP central directory.");
27
+ }
28
+ const compression = uint16(data, offset + 10);
29
+ const compressedSize = uint32(data, offset + 20);
30
+ const fileNameLength = uint16(data, offset + 28);
31
+ const extraLength = uint16(data, offset + 30);
32
+ const commentLength = uint16(data, offset + 32);
33
+ const localHeaderOffset = uint32(data, offset + 42);
34
+ const fileNameStart = offset + 46;
35
+ const name = textDecoder.decode(data.slice(fileNameStart, fileNameStart + fileNameLength));
36
+ entries.push({ name, compression, compressedSize, localHeaderOffset });
37
+ offset = fileNameStart + fileNameLength + extraLength + commentLength;
38
+ }
39
+ return entries;
40
+ }
41
+ function readZipEntry(data, entry) {
42
+ const offset = entry.localHeaderOffset;
43
+ if (uint32(data, offset) !== 0x04034b50) {
44
+ throw new Error(`Could not read ZIP entry ${entry.name}.`);
45
+ }
46
+ const fileNameLength = uint16(data, offset + 26);
47
+ const extraLength = uint16(data, offset + 28);
48
+ const dataStart = offset + 30 + fileNameLength + extraLength;
49
+ const compressed = data.slice(dataStart, dataStart + entry.compressedSize);
50
+ if (entry.compression === 0) {
51
+ return textDecoder.decode(compressed);
52
+ }
53
+ if (entry.compression === 8) {
54
+ return textDecoder.decode(inflateRawSync(compressed));
55
+ }
56
+ throw new Error(`Unsupported ZIP compression method ${entry.compression} for ${entry.name}.`);
57
+ }
58
+ function parseJsonArray(path, content) {
59
+ const parsed = JSON.parse(content);
60
+ if (!Array.isArray(parsed)) {
61
+ throw new Error(`Expected ${path} to contain a JSON array.`);
62
+ }
63
+ return parsed;
64
+ }
65
+ function stripTopLevelFolder(path) {
66
+ const parts = path.split("/").filter(Boolean);
67
+ if (parts.length > 1 && !["users.json", "channels.json", "groups.json", "dms.json", "mpims.json"].includes(parts[0])) {
68
+ return parts.slice(1).join("/");
69
+ }
70
+ return parts.join("/");
71
+ }
72
+ function isDateJson(path) {
73
+ return /\/\d{4}-\d{2}-\d{2}\.json$/.test(`/${path}`);
74
+ }
75
+ function folderFromMessagePath(path) {
76
+ const parts = path.split("/").filter(Boolean);
77
+ return parts.length >= 2 ? parts[parts.length - 2] : "";
78
+ }
79
+ export async function parseSlackExportZip(zipPath) {
80
+ const data = await readFile(zipPath);
81
+ const entries = listZipEntries(data).filter((entry) => !entry.name.endsWith("/") && !entry.name.includes("__MACOSX/"));
82
+ const jsonByPath = new Map();
83
+ for (const entry of entries) {
84
+ const normalizedPath = stripTopLevelFolder(entry.name);
85
+ if (!normalizedPath.endsWith(".json")) {
86
+ continue;
87
+ }
88
+ jsonByPath.set(normalizedPath, readZipEntry(data, entry));
89
+ }
90
+ const users = jsonByPath.has("users.json") ? parseJsonArray("users.json", jsonByPath.get("users.json")) : [];
91
+ const conversations = [];
92
+ const conversationSources = [
93
+ { path: "channels.json", source: "channels" },
94
+ { path: "groups.json", source: "groups" },
95
+ { path: "dms.json", source: "dms" },
96
+ { path: "mpims.json", source: "mpims" }
97
+ ];
98
+ for (const source of conversationSources) {
99
+ const content = jsonByPath.get(source.path);
100
+ if (!content) {
101
+ continue;
102
+ }
103
+ for (const conversation of parseJsonArray(source.path, content)) {
104
+ conversations.push({ source: source.source, conversation });
105
+ }
106
+ }
107
+ const messageFiles = [];
108
+ for (const [path, content] of jsonByPath) {
109
+ if (!isDateJson(path)) {
110
+ continue;
111
+ }
112
+ messageFiles.push({
113
+ path,
114
+ folder: folderFromMessagePath(path),
115
+ messages: parseJsonArray(path, content)
116
+ });
117
+ }
118
+ return { users, conversations, messageFiles };
119
+ }
120
+ export function previewSlackExport(exportData, freeLimits) {
121
+ const publicChannels = exportData.conversations.filter((item) => item.source === "channels").length;
122
+ const privateChannels = exportData.conversations.filter((item) => item.source === "groups").length;
123
+ const dms = exportData.conversations.filter((item) => item.source === "dms" || item.source === "mpims").length;
124
+ const messages = exportData.messageFiles.reduce((sum, file) => sum + file.messages.length, 0);
125
+ const threadedReplies = exportData.messageFiles.reduce((sum, file) => sum + file.messages.filter((message) => message.thread_ts && message.ts && message.thread_ts !== message.ts).length, 0);
126
+ const reactions = exportData.messageFiles.reduce((sum, file) => sum + file.messages.reduce((fileSum, message) => fileSum + (message.reactions?.length ?? 0), 0), 0);
127
+ const files = exportData.messageFiles.reduce((sum, file) => sum + file.messages.reduce((fileSum, message) => fileSum + (message.files?.length ?? 0), 0), 0);
128
+ return {
129
+ users: exportData.users.length,
130
+ accountsWithEmail: exportData.users.filter((user) => user.profile?.email).length,
131
+ publicChannels,
132
+ privateChannels,
133
+ dms,
134
+ messages,
135
+ threadedReplies,
136
+ reactions,
137
+ files,
138
+ skippedFiles: [],
139
+ requiresTeamPlan: exportData.users.length > freeLimits.members || privateChannels > freeLimits.privateChannels
140
+ };
141
+ }
142
+ //# sourceMappingURL=slack-import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack-import.js","sourceRoot":"","sources":["../src/slack-import.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface SlashCommand {
2
+ name: string;
3
+ usage: string;
4
+ description: string;
5
+ needsArgument: boolean;
6
+ }
7
+ export declare const slashCommands: SlashCommand[];
8
+ export declare function renderSlashCommands(): string;
9
+ export declare function completeSlashCommand(line: string): [string[], string];
10
+ //# sourceMappingURL=slash-commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slash-commands.d.ts","sourceRoot":"","sources":["../src/slash-commands.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,eAAO,MAAM,aAAa,EAAE,YAAY,EAmBvC,CAAC;AAEF,wBAAgB,mBAAmB,IAAI,MAAM,CAI5C;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAQrE"}
@@ -0,0 +1,35 @@
1
+ export const slashCommands = [
2
+ { name: "/commands", usage: "/commands", description: "Show slash commands.", needsArgument: false },
3
+ { name: "/menu", usage: "/menu", description: "Open an arrow-key command menu.", needsArgument: false },
4
+ { name: "/inbox", usage: "/inbox", description: "Show unread summaries in this workspace.", needsArgument: false },
5
+ { name: "/inbox all", usage: "/inbox all", description: "Show unread summaries across all workspaces.", needsArgument: false },
6
+ { name: "/workspaces", usage: "/workspaces", description: "List workspaces.", needsArgument: false },
7
+ { name: "/workspace", usage: "/workspace <slug>", description: "Switch workspace and focus #general.", needsArgument: true },
8
+ { name: "/channels", usage: "/channels", description: "List channels in this workspace.", needsArgument: false },
9
+ { name: "/join", usage: "/join <channel>", description: "Switch to a channel.", needsArgument: true },
10
+ { name: "/leave", usage: "/leave", description: "Leave the focused channel.", needsArgument: false },
11
+ { name: "/members", usage: "/members", description: "Show members of the focused channel.", needsArgument: false },
12
+ { name: "/dm", usage: "/dm <handle>", description: "Switch to a DM.", needsArgument: true },
13
+ { name: "/recent", usage: "/recent", description: "Show recent messages in the focused conversation.", needsArgument: false },
14
+ { name: "/thread", usage: "/thread <message-id>", description: "Show a message thread.", needsArgument: true },
15
+ { name: "/reply", usage: "/reply <message-id> <text>", description: "Reply in a thread.", needsArgument: true },
16
+ { name: "/react", usage: "/react <message-id> <emoji>", description: "React to a message.", needsArgument: true },
17
+ { name: "/search", usage: "/search <query>", description: "Search messages in this workspace.", needsArgument: true },
18
+ { name: "/quit", usage: "/quit", description: "Leave chat.", needsArgument: false },
19
+ { name: "/exit", usage: "/exit", description: "Leave chat.", needsArgument: false }
20
+ ];
21
+ export function renderSlashCommands() {
22
+ return slashCommands
23
+ .map((command) => `${command.usage.padEnd(28)} ${command.description}`)
24
+ .join("\n");
25
+ }
26
+ export function completeSlashCommand(line) {
27
+ if (!line.startsWith("/")) {
28
+ return [[], line];
29
+ }
30
+ const hits = slashCommands
31
+ .map((command) => command.name)
32
+ .filter((name) => name.startsWith(line));
33
+ return [hits.length > 0 ? hits : slashCommands.map((command) => command.name), line];
34
+ }
35
+ //# sourceMappingURL=slash-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slash-commands.js","sourceRoot":"","sources":["../src/slash-commands.ts"],"names":[],"mappings":"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"}