@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/README.md +16 -0
- package/dist/chat.d.ts +2 -0
- package/dist/chat.d.ts.map +1 -0
- package/dist/chat.js +195 -0
- package/dist/chat.js.map +1 -0
- package/dist/commands.d.ts +9 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +297 -0
- package/dist/commands.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +581 -0
- package/dist/index.js.map +1 -0
- package/dist/menu.d.ts +3 -0
- package/dist/menu.d.ts.map +1 -0
- package/dist/menu.js +56 -0
- package/dist/menu.js.map +1 -0
- package/dist/model.d.ts +139 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +2 -0
- package/dist/model.js.map +1 -0
- package/dist/render.d.ts +16 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +69 -0
- package/dist/render.js.map +1 -0
- package/dist/slack-import.d.ts +81 -0
- package/dist/slack-import.d.ts.map +1 -0
- package/dist/slack-import.js +142 -0
- package/dist/slack-import.js.map +1 -0
- package/dist/slash-commands.d.ts +10 -0
- package/dist/slash-commands.d.ts.map +1 -0
- package/dist/slash-commands.js +35 -0
- package/dist/slash-commands.js.map +1 -0
- package/dist/store.d.ts +114 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +1417 -0
- package/dist/store.js.map +1 -0
- package/dist/time.d.ts +2 -0
- package/dist/time.d.ts.map +1 -0
- package/dist/time.js +39 -0
- package/dist/time.js.map +1 -0
- package/package.json +35 -0
- package/scripts/postinstall.mjs +15 -0
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
|
package/dist/menu.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"menu.js","sourceRoot":"","sources":["../src/menu.ts"],"names":[],"mappings":"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"}
|
package/dist/model.d.ts
ADDED
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":""}
|
package/dist/render.d.ts
ADDED
|
@@ -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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"}
|