@doist/twist-cli 2.22.0 → 2.23.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/CHANGELOG.md +12 -0
- package/dist/commands/auth/helpers.d.ts +3 -0
- package/dist/commands/auth/helpers.d.ts.map +1 -0
- package/dist/commands/auth/helpers.js +12 -0
- package/dist/commands/auth/helpers.js.map +1 -0
- package/dist/commands/{auth.d.ts → auth/index.d.ts} +1 -1
- package/dist/commands/auth/index.d.ts.map +1 -0
- package/dist/commands/auth/index.js +20 -0
- package/dist/commands/auth/index.js.map +1 -0
- package/dist/commands/auth/login.d.ts +4 -0
- package/dist/commands/auth/login.d.ts.map +1 -0
- package/dist/commands/auth/login.js +62 -0
- package/dist/commands/auth/login.js.map +1 -0
- package/dist/commands/auth/logout.d.ts +2 -0
- package/dist/commands/auth/logout.d.ts.map +1 -0
- package/dist/commands/auth/logout.js +9 -0
- package/dist/commands/auth/logout.js.map +1 -0
- package/dist/commands/auth/status.d.ts +4 -0
- package/dist/commands/auth/status.d.ts.map +1 -0
- package/dist/commands/auth/status.js +33 -0
- package/dist/commands/auth/status.js.map +1 -0
- package/dist/commands/auth/token.d.ts +2 -0
- package/dist/commands/auth/token.d.ts.map +1 -0
- package/dist/commands/auth/token.js +38 -0
- package/dist/commands/auth/token.js.map +1 -0
- package/dist/commands/away/clear.d.ts +3 -0
- package/dist/commands/away/clear.d.ts.map +1 -0
- package/dist/commands/away/clear.js +22 -0
- package/dist/commands/away/clear.js.map +1 -0
- package/dist/commands/away/helpers.d.ts +7 -0
- package/dist/commands/away/helpers.d.ts.map +1 -0
- package/dist/commands/away/helpers.js +37 -0
- package/dist/commands/away/helpers.js.map +1 -0
- package/dist/commands/{away.d.ts → away/index.d.ts} +1 -1
- package/dist/commands/away/index.d.ts.map +1 -0
- package/dist/commands/away/index.js +26 -0
- package/dist/commands/away/index.js.map +1 -0
- package/dist/commands/away/set.d.ts +7 -0
- package/dist/commands/away/set.d.ts.map +1 -0
- package/dist/commands/away/set.js +31 -0
- package/dist/commands/away/set.js.map +1 -0
- package/dist/commands/away/status.d.ts +3 -0
- package/dist/commands/away/status.d.ts.map +1 -0
- package/dist/commands/away/status.js +20 -0
- package/dist/commands/away/status.js.map +1 -0
- package/dist/commands/comment/delete.d.ts +5 -0
- package/dist/commands/comment/delete.d.ts.map +1 -0
- package/dist/commands/comment/delete.js +18 -0
- package/dist/commands/comment/delete.js.map +1 -0
- package/dist/commands/{comment.d.ts → comment/index.d.ts} +1 -1
- package/dist/commands/comment/index.d.ts.map +1 -0
- package/dist/commands/comment/index.js +35 -0
- package/dist/commands/comment/index.js.map +1 -0
- package/dist/commands/comment/update.d.ts +5 -0
- package/dist/commands/comment/update.d.ts.map +1 -0
- package/dist/commands/comment/update.js +35 -0
- package/dist/commands/comment/update.js.map +1 -0
- package/dist/commands/comment/view.d.ts +3 -0
- package/dist/commands/comment/view.d.ts.map +1 -0
- package/dist/commands/comment/view.js +23 -0
- package/dist/commands/comment/view.js.map +1 -0
- package/dist/commands/completion/helpers.d.ts +14 -0
- package/dist/commands/completion/helpers.d.ts.map +1 -0
- package/dist/commands/completion/helpers.js +37 -0
- package/dist/commands/completion/helpers.js.map +1 -0
- package/dist/commands/{completion.d.ts → completion/index.d.ts} +1 -1
- package/dist/commands/completion/index.d.ts.map +1 -0
- package/dist/commands/completion/index.js +22 -0
- package/dist/commands/completion/index.js.map +1 -0
- package/dist/commands/completion/install.d.ts +2 -0
- package/dist/commands/completion/install.d.ts.map +1 -0
- package/dist/commands/completion/install.js +20 -0
- package/dist/commands/completion/install.js.map +1 -0
- package/dist/commands/completion/server.d.ts +3 -0
- package/dist/commands/completion/server.d.ts.map +1 -0
- package/dist/commands/completion/server.js +35 -0
- package/dist/commands/completion/server.js.map +1 -0
- package/dist/commands/completion/uninstall.d.ts +2 -0
- package/dist/commands/completion/uninstall.d.ts.map +1 -0
- package/dist/commands/completion/uninstall.js +19 -0
- package/dist/commands/completion/uninstall.js.map +1 -0
- package/dist/commands/conversation/done.d.ts +3 -0
- package/dist/commands/conversation/done.d.ts.map +1 -0
- package/dist/commands/conversation/done.js +18 -0
- package/dist/commands/conversation/done.js.map +1 -0
- package/dist/commands/conversation/helpers.d.ts +35 -0
- package/dist/commands/conversation/helpers.d.ts.map +1 -0
- package/dist/commands/conversation/helpers.js +144 -0
- package/dist/commands/conversation/helpers.js.map +1 -0
- package/dist/commands/{conversation.d.ts → conversation/index.d.ts} +1 -1
- package/dist/commands/conversation/index.d.ts.map +1 -0
- package/dist/commands/conversation/index.js +77 -0
- package/dist/commands/conversation/index.js.map +1 -0
- package/dist/commands/conversation/mute.d.ts +3 -0
- package/dist/commands/conversation/mute.d.ts.map +1 -0
- package/dist/commands/conversation/mute.js +25 -0
- package/dist/commands/conversation/mute.js.map +1 -0
- package/dist/commands/conversation/reply.d.ts +3 -0
- package/dist/commands/conversation/reply.d.ts.map +1 -0
- package/dist/commands/conversation/reply.js +35 -0
- package/dist/commands/conversation/reply.js.map +1 -0
- package/dist/commands/conversation/unmute.d.ts +3 -0
- package/dist/commands/conversation/unmute.d.ts.map +1 -0
- package/dist/commands/conversation/unmute.js +23 -0
- package/dist/commands/conversation/unmute.js.map +1 -0
- package/dist/commands/conversation/unread.d.ts +3 -0
- package/dist/commands/conversation/unread.d.ts.map +1 -0
- package/dist/commands/conversation/unread.js +63 -0
- package/dist/commands/conversation/unread.js.map +1 -0
- package/dist/commands/conversation/view.d.ts +3 -0
- package/dist/commands/conversation/view.d.ts.map +1 -0
- package/dist/commands/conversation/view.js +65 -0
- package/dist/commands/conversation/view.js.map +1 -0
- package/dist/commands/conversation/with.d.ts +3 -0
- package/dist/commands/conversation/with.d.ts.map +1 -0
- package/dist/commands/conversation/with.js +49 -0
- package/dist/commands/conversation/with.js.map +1 -0
- package/dist/commands/msg/delete.d.ts +5 -0
- package/dist/commands/msg/delete.d.ts.map +1 -0
- package/dist/commands/msg/delete.js +18 -0
- package/dist/commands/msg/delete.js.map +1 -0
- package/dist/commands/{msg.d.ts → msg/index.d.ts} +1 -1
- package/dist/commands/msg/index.d.ts.map +1 -0
- package/dist/commands/msg/index.js +34 -0
- package/dist/commands/msg/index.js.map +1 -0
- package/dist/commands/msg/update.d.ts +5 -0
- package/dist/commands/msg/update.d.ts.map +1 -0
- package/dist/commands/msg/update.js +35 -0
- package/dist/commands/msg/update.js.map +1 -0
- package/dist/commands/msg/view.d.ts +3 -0
- package/dist/commands/msg/view.d.ts.map +1 -0
- package/dist/commands/msg/view.js +28 -0
- package/dist/commands/msg/view.js.map +1 -0
- package/dist/commands/{skill.d.ts → skill/index.d.ts} +1 -1
- package/dist/commands/skill/index.d.ts.map +1 -0
- package/dist/commands/skill/index.js +29 -0
- package/dist/commands/skill/index.js.map +1 -0
- package/dist/commands/skill/install.d.ts +3 -0
- package/dist/commands/skill/install.d.ts.map +1 -0
- package/dist/commands/skill/install.js +21 -0
- package/dist/commands/skill/install.js.map +1 -0
- package/dist/commands/skill/list.d.ts +6 -0
- package/dist/commands/skill/list.d.ts.map +1 -0
- package/dist/commands/skill/list.js +22 -0
- package/dist/commands/skill/list.js.map +1 -0
- package/dist/commands/skill/uninstall.d.ts +3 -0
- package/dist/commands/skill/uninstall.d.ts.map +1 -0
- package/dist/commands/skill/uninstall.js +19 -0
- package/dist/commands/skill/uninstall.js.map +1 -0
- package/dist/commands/skill/update.d.ts +3 -0
- package/dist/commands/skill/update.d.ts.map +1 -0
- package/dist/commands/skill/update.js +42 -0
- package/dist/commands/skill/update.js.map +1 -0
- package/dist/commands/thread/delete.d.ts +7 -0
- package/dist/commands/thread/delete.d.ts.map +1 -0
- package/dist/commands/thread/delete.js +38 -0
- package/dist/commands/thread/delete.js.map +1 -0
- package/dist/commands/{thread.d.ts → thread/index.d.ts} +1 -1
- package/dist/commands/thread/index.d.ts.map +1 -0
- package/dist/commands/{thread.js → thread/index.js} +15 -7
- package/dist/commands/thread/index.js.map +1 -0
- package/dist/commands/update/action.d.ts +1 -0
- package/dist/commands/update/action.d.ts.map +1 -1
- package/dist/commands/update/action.js +28 -8
- package/dist/commands/update/action.js.map +1 -1
- package/dist/commands/update/index.d.ts.map +1 -1
- package/dist/commands/update/index.js +1 -2
- package/dist/commands/update/index.js.map +1 -1
- package/dist/commands/view.d.ts.map +1 -1
- package/dist/commands/view.js +4 -4
- package/dist/commands/view.js.map +1 -1
- package/dist/index.js +8 -8
- package/dist/index.js.map +1 -1
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +1 -0
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +7 -3
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/skills/content.d.ts +1 -1
- package/dist/lib/skills/content.d.ts.map +1 -1
- package/dist/lib/skills/content.js +4 -1
- package/dist/lib/skills/content.js.map +1 -1
- package/package.json +2 -2
- package/dist/commands/auth.d.ts.map +0 -1
- package/dist/commands/auth.js +0 -154
- package/dist/commands/auth.js.map +0 -1
- package/dist/commands/away.d.ts.map +0 -1
- package/dist/commands/away.js +0 -120
- package/dist/commands/away.js.map +0 -1
- package/dist/commands/comment.d.ts.map +0 -1
- package/dist/commands/comment.js +0 -99
- package/dist/commands/comment.js.map +0 -1
- package/dist/commands/completion.d.ts.map +0 -1
- package/dist/commands/completion.js +0 -121
- package/dist/commands/completion.js.map +0 -1
- package/dist/commands/conversation.d.ts.map +0 -1
- package/dist/commands/conversation.js +0 -458
- package/dist/commands/conversation.js.map +0 -1
- package/dist/commands/msg.d.ts.map +0 -1
- package/dist/commands/msg.js +0 -103
- package/dist/commands/msg.js.map +0 -1
- package/dist/commands/skill.d.ts.map +0 -1
- package/dist/commands/skill.js +0 -119
- package/dist/commands/skill.js.map +0 -1
- package/dist/commands/thread.d.ts.map +0 -1
- package/dist/commands/thread.js.map +0 -1
- package/dist/commands/update/channel.d.ts +0 -2
- package/dist/commands/update/channel.d.ts.map +0 -1
- package/dist/commands/update/channel.js +0 -13
- package/dist/commands/update/channel.js.map +0 -1
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { getTwistClient } from '../../lib/api.js';
|
|
2
|
+
import { openEditor, readStdin } from '../../lib/input.js';
|
|
3
|
+
import { formatJson } from '../../lib/output.js';
|
|
4
|
+
import { resolveCommentId } from '../../lib/refs.js';
|
|
5
|
+
export async function updateComment(ref, content, options) {
|
|
6
|
+
const commentId = resolveCommentId(ref);
|
|
7
|
+
let newContent = await readStdin();
|
|
8
|
+
if (!newContent && content) {
|
|
9
|
+
newContent = content;
|
|
10
|
+
}
|
|
11
|
+
if (!newContent) {
|
|
12
|
+
newContent = await openEditor();
|
|
13
|
+
}
|
|
14
|
+
if (!newContent || newContent.trim() === '') {
|
|
15
|
+
console.error('No content provided.');
|
|
16
|
+
process.exit(1);
|
|
17
|
+
}
|
|
18
|
+
if (options.dryRun) {
|
|
19
|
+
console.log(`Dry run: would update comment ${commentId}`);
|
|
20
|
+
console.log('');
|
|
21
|
+
console.log(newContent);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const client = await getTwistClient();
|
|
25
|
+
const comment = await client.comments.updateComment({
|
|
26
|
+
id: commentId,
|
|
27
|
+
content: newContent,
|
|
28
|
+
});
|
|
29
|
+
if (options.json) {
|
|
30
|
+
console.log(formatJson(comment, 'comment', options.full));
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
console.log(`Comment updated: ${comment.url}`);
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/commands/comment/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAE1D,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAIpD,MAAM,CAAC,KAAK,UAAU,aAAa,CAC/B,GAAW,EACX,OAA2B,EAC3B,OAAsB;IAEtB,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAA;IAEvC,IAAI,UAAU,GAAG,MAAM,SAAS,EAAE,CAAA;IAClC,IAAI,CAAC,UAAU,IAAI,OAAO,EAAE,CAAC;QACzB,UAAU,GAAG,OAAO,CAAA;IACxB,CAAC;IACD,IAAI,CAAC,UAAU,EAAE,CAAC;QACd,UAAU,GAAG,MAAM,UAAU,EAAE,CAAA;IACnC,CAAC;IACD,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC1C,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAA;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,iCAAiC,SAAS,EAAE,CAAC,CAAA;QACzD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACf,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;QACvB,OAAM;IACV,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAA;IACrC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC;QAChD,EAAE,EAAE,SAAS;QACb,OAAO,EAAE,UAAU;KACtB,CAAC,CAAA;IAEF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;QACzD,OAAM;IACV,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,oBAAoB,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;AAClD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../src/commands/comment/view.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAIvD,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBlF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { getTwistClient } from '../../lib/api.js';
|
|
2
|
+
import { formatRelativeDate } from '../../lib/dates.js';
|
|
3
|
+
import { renderMarkdown } from '../../lib/markdown.js';
|
|
4
|
+
import { colors, formatJson } from '../../lib/output.js';
|
|
5
|
+
import { resolveCommentId } from '../../lib/refs.js';
|
|
6
|
+
export async function viewComment(ref, options) {
|
|
7
|
+
const commentId = resolveCommentId(ref);
|
|
8
|
+
const client = await getTwistClient();
|
|
9
|
+
const comment = await client.comments.getComment(commentId);
|
|
10
|
+
const userResponse = await client.workspaceUsers.getUserById({ workspaceId: comment.workspaceId, userId: comment.creator }, { batch: false });
|
|
11
|
+
const creatorName = userResponse.name;
|
|
12
|
+
if (options.json) {
|
|
13
|
+
const output = { ...comment, creatorName };
|
|
14
|
+
console.log(formatJson(output, options.full ? undefined : 'comment', options.full));
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const author = colors.author(creatorName);
|
|
18
|
+
const time = colors.timestamp(formatRelativeDate(comment.posted));
|
|
19
|
+
console.log(`${author} ${time} ${colors.timestamp(`id:${comment.id}`)}`);
|
|
20
|
+
console.log(options.raw ? comment.content : renderMarkdown(comment.content));
|
|
21
|
+
console.log('');
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.js","sourceRoot":"","sources":["../../../src/commands/comment/view.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAEtD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEpD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW,EAAE,OAAoB;IAC/D,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAA;IACvC,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAA;IACrC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;IAE3D,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,WAAW,CACxD,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,EAC7D,EAAE,KAAK,EAAE,KAAK,EAAE,CACnB,CAAA;IACD,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAA;IAErC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,EAAE,GAAG,OAAO,EAAE,WAAW,EAAE,CAAA;QAC1C,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;QACnF,OAAM;IACV,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;IACzC,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;IACjE,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,KAAK,IAAI,KAAK,MAAM,CAAC,SAAS,CAAC,MAAM,OAAO,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAA;IAC1E,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA;IAC5E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;AACnB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { SupportedShell } from '@pnpm/tabtab';
|
|
2
|
+
export declare const COMPLETION_EXTENSIONS: Record<SupportedShell, string>;
|
|
3
|
+
/**
|
|
4
|
+
* Find which shells have tw completions installed by checking for the
|
|
5
|
+
* completion script files that tabtab creates.
|
|
6
|
+
*
|
|
7
|
+
* FIXME: Workaround for https://github.com/pnpm/tabtab/issues/34 —
|
|
8
|
+
* tabtab.uninstall() without a shell tries all shells and throws ENOENT
|
|
9
|
+
* for ones that were never installed. We detect which shells are actually
|
|
10
|
+
* installed and uninstall only those. Remove once the upstream issue is fixed.
|
|
11
|
+
*/
|
|
12
|
+
export declare function installedShells(): SupportedShell[];
|
|
13
|
+
export declare function resolveCompleterCommand(): string;
|
|
14
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/commands/completion/helpers.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAIlD,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAKhE,CAAA;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,IAAI,cAAc,EAAE,CAMlD;AAED,wBAAgB,uBAAuB,IAAI,MAAM,CAYhD"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join, resolve } from 'node:path';
|
|
4
|
+
// pwsh is included because tabtab supports it — installedShells() needs to
|
|
5
|
+
// detect and clean up pwsh completion files even though we don't advertise it.
|
|
6
|
+
export const COMPLETION_EXTENSIONS = {
|
|
7
|
+
bash: 'bash',
|
|
8
|
+
zsh: 'zsh',
|
|
9
|
+
fish: 'fish',
|
|
10
|
+
pwsh: 'ps1',
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Find which shells have tw completions installed by checking for the
|
|
14
|
+
* completion script files that tabtab creates.
|
|
15
|
+
*
|
|
16
|
+
* FIXME: Workaround for https://github.com/pnpm/tabtab/issues/34 —
|
|
17
|
+
* tabtab.uninstall() without a shell tries all shells and throws ENOENT
|
|
18
|
+
* for ones that were never installed. We detect which shells are actually
|
|
19
|
+
* installed and uninstall only those. Remove once the upstream issue is fixed.
|
|
20
|
+
*/
|
|
21
|
+
export function installedShells() {
|
|
22
|
+
return Object.entries(COMPLETION_EXTENSIONS)
|
|
23
|
+
.filter(([shell, ext]) => existsSync(join(homedir(), '.config', 'tabtab', shell, `tw.${ext}`)))
|
|
24
|
+
.map(([shell]) => shell);
|
|
25
|
+
}
|
|
26
|
+
export function resolveCompleterCommand() {
|
|
27
|
+
const invokedScript = process.argv[1];
|
|
28
|
+
if (!invokedScript) {
|
|
29
|
+
return 'tw';
|
|
30
|
+
}
|
|
31
|
+
const resolvedScript = resolve(invokedScript);
|
|
32
|
+
if (existsSync(resolvedScript)) {
|
|
33
|
+
return resolvedScript;
|
|
34
|
+
}
|
|
35
|
+
return 'tw';
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/commands/completion/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGzC,2EAA2E;AAC3E,+EAA+E;AAC/E,MAAM,CAAC,MAAM,qBAAqB,GAAmC;IACjE,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,KAAK;CACd,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe;IAC3B,OAAO,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC;SACvC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,CACrB,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,CACvE;SACA,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,KAAuB,CAAC,CAAA;AAClD,CAAC;AAED,MAAM,UAAU,uBAAuB;IACnC,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACrC,IAAI,CAAC,aAAa,EAAE,CAAC;QACjB,OAAO,IAAI,CAAA;IACf,CAAC;IAED,MAAM,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;IAC7C,IAAI,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAC7B,OAAO,cAAc,CAAA;IACzB,CAAC;IAED,OAAO,IAAI,CAAA;AACf,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/completion/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAKnC,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoBhE"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { installCompletion } from './install.js';
|
|
2
|
+
import { handleCompletionServer } from './server.js';
|
|
3
|
+
import { uninstallCompletion } from './uninstall.js';
|
|
4
|
+
export function registerCompletionCommand(program) {
|
|
5
|
+
const completion = program.command('completion').description('Manage shell completions');
|
|
6
|
+
completion
|
|
7
|
+
.command('install [shell]')
|
|
8
|
+
.description('Install shell completions (bash, zsh, fish)')
|
|
9
|
+
.action(installCompletion);
|
|
10
|
+
completion
|
|
11
|
+
.command('uninstall')
|
|
12
|
+
.description('Remove shell completions')
|
|
13
|
+
.action(uninstallCompletion);
|
|
14
|
+
// Hidden command invoked by the shell completion script at TAB time
|
|
15
|
+
program
|
|
16
|
+
.command('completion-server', { hidden: true })
|
|
17
|
+
.description('Completion server (internal)')
|
|
18
|
+
.allowUnknownOption()
|
|
19
|
+
.allowExcessArguments()
|
|
20
|
+
.action(() => handleCompletionServer(program));
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/completion/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAEpD,MAAM,UAAU,yBAAyB,CAAC,OAAgB;IACtD,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,0BAA0B,CAAC,CAAA;IAExF,UAAU;SACL,OAAO,CAAC,iBAAiB,CAAC;SAC1B,WAAW,CAAC,6CAA6C,CAAC;SAC1D,MAAM,CAAC,iBAAiB,CAAC,CAAA;IAE9B,UAAU;SACL,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,mBAAmB,CAAC,CAAA;IAEhC,oEAAoE;IACpE,OAAO;SACF,OAAO,CAAC,mBAAmB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;SAC9C,WAAW,CAAC,8BAA8B,CAAC;SAC3C,kBAAkB,EAAE;SACpB,oBAAoB,EAAE;SACtB,MAAM,CAAC,GAAG,EAAE,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAA;AACtD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/commands/completion/install.ts"],"names":[],"mappings":"AAGA,wBAAsB,iBAAiB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBrE"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { resolveCompleterCommand } from './helpers.js';
|
|
2
|
+
export async function installCompletion(shell) {
|
|
3
|
+
const tabtab = await import('@pnpm/tabtab');
|
|
4
|
+
const completer = resolveCompleterCommand();
|
|
5
|
+
if (shell && !tabtab.isShellSupported(shell)) {
|
|
6
|
+
console.error(`Unsupported shell: ${shell}. Supported: ${tabtab.SUPPORTED_SHELLS.join(', ')}`);
|
|
7
|
+
process.exitCode = 1;
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
await tabtab.install({
|
|
11
|
+
name: 'tw',
|
|
12
|
+
// Use the executable path used to install completions so shell
|
|
13
|
+
// completion doesn't accidentally call an older `tw` on PATH.
|
|
14
|
+
completer,
|
|
15
|
+
shell: shell,
|
|
16
|
+
});
|
|
17
|
+
console.log('Shell completions installed successfully.');
|
|
18
|
+
console.log('Restart your shell or source your shell config to activate.');
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/commands/completion/install.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AAEtD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAAc;IAClD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAA;IAC3C,MAAM,SAAS,GAAG,uBAAuB,EAAE,CAAA;IAE3C,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO,CAAC,KAAK,CACT,sBAAsB,KAAK,gBAAgB,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAClF,CAAA;QACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;QACpB,OAAM;IACV,CAAC;IAED,MAAM,MAAM,CAAC,OAAO,CAAC;QACjB,IAAI,EAAE,IAAI;QACV,+DAA+D;QAC/D,8DAA8D;QAC9D,SAAS;QACT,KAAK,EAAE,KAAuB;KACjC,CAAC,CAAA;IAEF,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAA;IACxD,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAA;AAC9E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/commands/completion/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGxC,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAuC5E"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { getCompletions, parseCompLine } from '../../lib/completion.js';
|
|
2
|
+
export async function handleCompletionServer(program) {
|
|
3
|
+
const tabtab = await import('@pnpm/tabtab');
|
|
4
|
+
const env = tabtab.parseEnv(process.env);
|
|
5
|
+
if (!env.complete) {
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
const shell = tabtab.getShellFromEnv(process.env);
|
|
9
|
+
const words = parseCompLine(env.line);
|
|
10
|
+
let current = env.last;
|
|
11
|
+
// The fish/zsh completion templates always append a trailing space
|
|
12
|
+
// to COMP_LINE, making env.last empty even when the cursor is right
|
|
13
|
+
// after '--flag='. Use env.lastPartial (cursor-position-aware) to
|
|
14
|
+
// detect this case and restore the actual word being completed.
|
|
15
|
+
if (current === '' && env.lastPartial.includes('=')) {
|
|
16
|
+
if (words.at(-1) === '')
|
|
17
|
+
words.pop();
|
|
18
|
+
current = env.lastPartial;
|
|
19
|
+
}
|
|
20
|
+
const completions = getCompletions(program, words, current);
|
|
21
|
+
// Bash treats '=' as a word break (COMP_WORDBREAKS), so readline
|
|
22
|
+
// replaces only the part after '=' with COMPREPLY values. If we
|
|
23
|
+
// return '--flag=value', bash produces '--flag=--flag=value'.
|
|
24
|
+
// Strip the flag prefix so bash gets just the value part.
|
|
25
|
+
if (shell === 'bash' && current.includes('=')) {
|
|
26
|
+
const prefix = current.slice(0, current.indexOf('=') + 1);
|
|
27
|
+
const values = completions
|
|
28
|
+
.map((c) => (c.name.startsWith(prefix) ? c.name.slice(prefix.length) : c.name))
|
|
29
|
+
.filter(Boolean);
|
|
30
|
+
console.log(values.join('\n'));
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
tabtab.log(completions, shell);
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/commands/completion/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAEvE,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,OAAgB;IACzD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAA;IAC3C,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAExC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAChB,OAAM;IACV,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAEjD,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAErC,IAAI,OAAO,GAAG,GAAG,CAAC,IAAI,CAAA;IAEtB,mEAAmE;IACnE,oEAAoE;IACpE,kEAAkE;IAClE,gEAAgE;IAChE,IAAI,OAAO,KAAK,EAAE,IAAI,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAClD,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;YAAE,KAAK,CAAC,GAAG,EAAE,CAAA;QACpC,OAAO,GAAG,GAAG,CAAC,WAAW,CAAA;IAC7B,CAAC;IAED,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;IAE3D,iEAAiE;IACjE,gEAAgE;IAChE,8DAA8D;IAC9D,0DAA0D;IAC1D,IAAI,KAAK,KAAK,MAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;QACzD,MAAM,MAAM,GAAG,WAAW;aACrB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;aAC9E,MAAM,CAAC,OAAO,CAAC,CAAA;QACpB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAC9B,OAAM;IACV,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;AAClC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../../src/commands/completion/uninstall.ts"],"names":[],"mappings":"AAEA,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiBzD"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { installedShells } from './helpers.js';
|
|
2
|
+
export async function uninstallCompletion() {
|
|
3
|
+
// FIXME: Replace with plain tabtab.uninstall({ name: 'tw' }) once
|
|
4
|
+
// https://github.com/pnpm/tabtab/issues/34 is fixed.
|
|
5
|
+
const shells = installedShells();
|
|
6
|
+
if (shells.length === 0) {
|
|
7
|
+
console.log('No shell completions installed.');
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
const tabtab = await import('@pnpm/tabtab');
|
|
11
|
+
for (const shell of shells) {
|
|
12
|
+
await tabtab.uninstall({
|
|
13
|
+
name: 'tw',
|
|
14
|
+
shell,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
console.log('Shell completions removed.');
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=uninstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../../src/commands/completion/uninstall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAE9C,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACrC,kEAAkE;IAClE,qDAAqD;IACrD,MAAM,MAAM,GAAG,eAAe,EAAE,CAAA;IAChC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAA;QAC9C,OAAM;IACV,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAA;IAC3C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,MAAM,CAAC,SAAS,CAAC;YACnB,IAAI,EAAE,IAAI;YACV,KAAK;SACR,CAAC,CAAA;IACN,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAA;AAC7C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"done.d.ts","sourceRoot":"","sources":["../../../src/commands/conversation/done.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE/C,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB3F"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { getTwistClient } from '../../lib/api.js';
|
|
2
|
+
import { formatJson } from '../../lib/output.js';
|
|
3
|
+
import { resolveConversationId } from '../../lib/refs.js';
|
|
4
|
+
export async function markConversationDone(ref, options) {
|
|
5
|
+
const conversationId = resolveConversationId(ref);
|
|
6
|
+
if (options.dryRun) {
|
|
7
|
+
console.log(`Dry run: would archive conversation ${conversationId}`);
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
const client = await getTwistClient();
|
|
11
|
+
await client.conversations.archiveConversation(conversationId);
|
|
12
|
+
if (options.json) {
|
|
13
|
+
console.log(formatJson({ id: conversationId, archived: true }));
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
console.log(`Conversation ${conversationId} archived.`);
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=done.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"done.js","sourceRoot":"","sources":["../../../src/commands/conversation/done.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAGzD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,GAAW,EAAE,OAAoB;IACxE,MAAM,cAAc,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAA;IAEjD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,uCAAuC,cAAc,EAAE,CAAC,CAAA;QACpE,OAAM;IACV,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAA;IACrC,MAAM,MAAM,CAAC,aAAa,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAA;IAE9D,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QAC/D,OAAM;IACV,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,gBAAgB,cAAc,YAAY,CAAC,CAAA;AAC3D,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { Conversation } from '@doist/twist-sdk';
|
|
2
|
+
import type { MutationOptions, PaginatedViewOptions, ViewOptions } from '../../lib/options.js';
|
|
3
|
+
export type UnreadOptions = ViewOptions & {
|
|
4
|
+
workspace?: string;
|
|
5
|
+
};
|
|
6
|
+
export type ConversationViewOptions = PaginatedViewOptions;
|
|
7
|
+
export type ConversationWithOptions = PaginatedViewOptions & {
|
|
8
|
+
workspace?: string;
|
|
9
|
+
includeGroups?: boolean;
|
|
10
|
+
snippet?: boolean;
|
|
11
|
+
};
|
|
12
|
+
export type ReplyOptions = MutationOptions;
|
|
13
|
+
export type MuteOptions = MutationOptions & {
|
|
14
|
+
minutes?: string;
|
|
15
|
+
};
|
|
16
|
+
export type DoneOptions = MutationOptions;
|
|
17
|
+
export declare const CONVERSATION_PAGE_LIMIT = 100;
|
|
18
|
+
export type ConversationPageArgs = {
|
|
19
|
+
workspaceId: number;
|
|
20
|
+
archived?: boolean;
|
|
21
|
+
limit: number;
|
|
22
|
+
beforeId?: number;
|
|
23
|
+
};
|
|
24
|
+
export type ConversationLookupResult = {
|
|
25
|
+
directConversation?: Conversation;
|
|
26
|
+
groupConversationCount: number;
|
|
27
|
+
};
|
|
28
|
+
export declare function buildConversationTitle(conversation: Pick<Conversation, 'title' | 'userIds'>, userMap: Map<number, string>): string;
|
|
29
|
+
export declare function sortByLastActiveDescending(a: Conversation, b: Conversation): number;
|
|
30
|
+
export declare function getConversationPages(initialArgs: ConversationPageArgs): Promise<Conversation[]>;
|
|
31
|
+
export declare function getAllConversations(workspaceId: number): Promise<Conversation[]>;
|
|
32
|
+
export declare function findDirectConversation(workspaceId: number, sessionUserId: number, targetUserId: number): Promise<ConversationLookupResult>;
|
|
33
|
+
export declare function listConversationsWithUser(conversations: Conversation[], workspaceId: number, options: ConversationWithOptions): Promise<void>;
|
|
34
|
+
export declare function parseMinutes(value: string | undefined): number;
|
|
35
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/commands/conversation/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAKpD,OAAO,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAG9F,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAEhE,MAAM,MAAM,uBAAuB,GAAG,oBAAoB,CAAA;AAE1D,MAAM,MAAM,uBAAuB,GAAG,oBAAoB,GAAG;IACzD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,OAAO,CAAC,EAAE,OAAO,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG,eAAe,CAAA;AAE1C,MAAM,MAAM,WAAW,GAAG,eAAe,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAEhE,MAAM,MAAM,WAAW,GAAG,eAAe,CAAA;AAEzC,eAAO,MAAM,uBAAuB,MAAM,CAAA;AAE1C,MAAM,MAAM,oBAAoB,GAAG;IAC/B,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG;IACnC,kBAAkB,CAAC,EAAE,YAAY,CAAA;IACjC,sBAAsB,EAAE,MAAM,CAAA;CACjC,CAAA;AAED,wBAAgB,sBAAsB,CAClC,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,GAAG,SAAS,CAAC,EACrD,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,MAAM,CAKR;AAED,wBAAgB,0BAA0B,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM,CAEnF;AAED,wBAAsB,oBAAoB,CACtC,WAAW,EAAE,oBAAoB,GAClC,OAAO,CAAC,YAAY,EAAE,CAAC,CA8BzB;AAED,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAYtF;AAED,wBAAsB,sBAAsB,CACxC,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,GACrB,OAAO,CAAC,wBAAwB,CAAC,CA6CnC;AAED,wBAAsB,yBAAyB,CAC3C,aAAa,EAAE,YAAY,EAAE,EAC7B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,uBAAuB,GACjC,OAAO,CAAC,IAAI,CAAC,CAuDf;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAQ9D"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { getTwistClient } from '../../lib/api.js';
|
|
3
|
+
import { formatRelativeDate } from '../../lib/dates.js';
|
|
4
|
+
import { renderMarkdown } from '../../lib/markdown.js';
|
|
5
|
+
import { colors, formatJson, formatNdjson, isAccessible } from '../../lib/output.js';
|
|
6
|
+
export const CONVERSATION_PAGE_LIMIT = 100;
|
|
7
|
+
export function buildConversationTitle(conversation, userMap) {
|
|
8
|
+
const participants = conversation.userIds
|
|
9
|
+
.map((id) => userMap.get(id) || `user:${id}`)
|
|
10
|
+
.join(', ');
|
|
11
|
+
return conversation.title || `Conversation with ${participants}`;
|
|
12
|
+
}
|
|
13
|
+
export function sortByLastActiveDescending(a, b) {
|
|
14
|
+
return new Date(b.lastActive).getTime() - new Date(a.lastActive).getTime();
|
|
15
|
+
}
|
|
16
|
+
export async function getConversationPages(initialArgs) {
|
|
17
|
+
const client = await getTwistClient();
|
|
18
|
+
const conversations = [];
|
|
19
|
+
let beforeId = initialArgs.beforeId;
|
|
20
|
+
while (true) {
|
|
21
|
+
const pageArgs = {
|
|
22
|
+
...initialArgs,
|
|
23
|
+
beforeId,
|
|
24
|
+
};
|
|
25
|
+
const page = await client.conversations.getConversations(pageArgs);
|
|
26
|
+
if (page.length === 0) {
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
conversations.push(...page);
|
|
30
|
+
if (page.length < initialArgs.limit) {
|
|
31
|
+
break;
|
|
32
|
+
}
|
|
33
|
+
const nextBeforeId = page[page.length - 1]?.id;
|
|
34
|
+
if (!nextBeforeId || nextBeforeId === beforeId) {
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
beforeId = nextBeforeId;
|
|
38
|
+
}
|
|
39
|
+
return conversations;
|
|
40
|
+
}
|
|
41
|
+
export async function getAllConversations(workspaceId) {
|
|
42
|
+
const [activeConversations, archivedConversations] = await Promise.all([
|
|
43
|
+
getConversationPages({ workspaceId, limit: CONVERSATION_PAGE_LIMIT }),
|
|
44
|
+
getConversationPages({ workspaceId, archived: true, limit: CONVERSATION_PAGE_LIMIT }),
|
|
45
|
+
]);
|
|
46
|
+
const byId = new Map();
|
|
47
|
+
for (const conversation of [...activeConversations, ...archivedConversations]) {
|
|
48
|
+
byId.set(conversation.id, conversation);
|
|
49
|
+
}
|
|
50
|
+
return [...byId.values()].sort(sortByLastActiveDescending);
|
|
51
|
+
}
|
|
52
|
+
export async function findDirectConversation(workspaceId, sessionUserId, targetUserId) {
|
|
53
|
+
const client = await getTwistClient();
|
|
54
|
+
let groupConversationCount = 0;
|
|
55
|
+
for (const archived of [false, true]) {
|
|
56
|
+
let beforeId;
|
|
57
|
+
while (true) {
|
|
58
|
+
const pageArgs = {
|
|
59
|
+
workspaceId,
|
|
60
|
+
archived: archived || undefined,
|
|
61
|
+
limit: CONVERSATION_PAGE_LIMIT,
|
|
62
|
+
beforeId,
|
|
63
|
+
};
|
|
64
|
+
const page = await client.conversations.getConversations(pageArgs);
|
|
65
|
+
if (page.length === 0) {
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
for (const conversation of page) {
|
|
69
|
+
if (!conversation.userIds.includes(targetUserId)) {
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
const isSelfConversation = sessionUserId === targetUserId;
|
|
73
|
+
const isDirect = isSelfConversation
|
|
74
|
+
? conversation.userIds.length === 1
|
|
75
|
+
: conversation.userIds.length === 2 &&
|
|
76
|
+
conversation.userIds.includes(sessionUserId);
|
|
77
|
+
if (isDirect) {
|
|
78
|
+
return { directConversation: conversation, groupConversationCount };
|
|
79
|
+
}
|
|
80
|
+
if (conversation.userIds.length > (isSelfConversation ? 1 : 2)) {
|
|
81
|
+
groupConversationCount += 1;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
beforeId = page[page.length - 1]?.id;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return { groupConversationCount };
|
|
88
|
+
}
|
|
89
|
+
export async function listConversationsWithUser(conversations, workspaceId, options) {
|
|
90
|
+
if (conversations.length === 0) {
|
|
91
|
+
console.log('No matching conversations found.');
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const client = await getTwistClient();
|
|
95
|
+
const userIds = new Set();
|
|
96
|
+
for (const conversation of conversations) {
|
|
97
|
+
for (const userId of conversation.userIds) {
|
|
98
|
+
userIds.add(userId);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
const userCalls = [...userIds].map((userId) => client.workspaceUsers.getUserById({ workspaceId, userId }, { batch: true }));
|
|
102
|
+
const userResponses = await client.batch(...userCalls);
|
|
103
|
+
const userMap = new Map(userResponses.map((response) => [response.data.id, response.data.name]));
|
|
104
|
+
const output = conversations.map((conversation) => ({
|
|
105
|
+
...conversation,
|
|
106
|
+
participantNames: conversation.userIds.map((id) => userMap.get(id)),
|
|
107
|
+
}));
|
|
108
|
+
if (options.json) {
|
|
109
|
+
console.log(formatJson(output, 'conversation', options.full));
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (options.ndjson) {
|
|
113
|
+
console.log(formatNdjson(output, 'conversation', options.full));
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
for (const conversation of conversations) {
|
|
117
|
+
const participants = conversation.userIds
|
|
118
|
+
.map((id) => userMap.get(id) || `user:${id}`)
|
|
119
|
+
.join(', ');
|
|
120
|
+
const title = buildConversationTitle(conversation, userMap);
|
|
121
|
+
const archivedBadge = conversation.archived
|
|
122
|
+
? chalk.yellow(isAccessible() ? ' (archived)' : ' [archived]')
|
|
123
|
+
: '';
|
|
124
|
+
console.log(`${chalk.bold(title)}${archivedBadge}`);
|
|
125
|
+
console.log(` ${colors.timestamp(`id:${conversation.id}`)} ${colors.author(participants)}`);
|
|
126
|
+
if (options.snippet && conversation.snippet) {
|
|
127
|
+
console.log(renderMarkdown(conversation.snippet));
|
|
128
|
+
}
|
|
129
|
+
console.log(` ${colors.timestamp(formatRelativeDate(conversation.lastActive))}`);
|
|
130
|
+
console.log(` ${colors.url(conversation.url)}`);
|
|
131
|
+
console.log('');
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
export function parseMinutes(value) {
|
|
135
|
+
if (!value)
|
|
136
|
+
return 60;
|
|
137
|
+
const parsed = Number(value);
|
|
138
|
+
if (!Number.isInteger(parsed) || parsed <= 0) {
|
|
139
|
+
console.error(`Invalid --minutes value: ${value} (must be a positive integer)`);
|
|
140
|
+
process.exit(1);
|
|
141
|
+
}
|
|
142
|
+
return parsed;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/commands/conversation/helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/conversation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AASnC,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2ElE"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { markConversationDone } from './done.js';
|
|
2
|
+
import { muteConversation } from './mute.js';
|
|
3
|
+
import { replyToConversation } from './reply.js';
|
|
4
|
+
import { unmuteConversation } from './unmute.js';
|
|
5
|
+
import { showUnread } from './unread.js';
|
|
6
|
+
import { viewConversation } from './view.js';
|
|
7
|
+
import { findConversationWithUser } from './with.js';
|
|
8
|
+
export function registerConversationCommand(program) {
|
|
9
|
+
const conversation = program
|
|
10
|
+
.command('conversation')
|
|
11
|
+
.alias('convo')
|
|
12
|
+
.description('Conversation (DM/group) operations');
|
|
13
|
+
conversation
|
|
14
|
+
.command('unread [workspace-ref]')
|
|
15
|
+
.description('List unread conversations')
|
|
16
|
+
.option('--workspace <ref>', 'Workspace ID or name')
|
|
17
|
+
.option('--json', 'Output as JSON')
|
|
18
|
+
.option('--ndjson', 'Output as newline-delimited JSON')
|
|
19
|
+
.option('--full', 'Include all fields in JSON output')
|
|
20
|
+
.action(showUnread);
|
|
21
|
+
conversation
|
|
22
|
+
.command('view [conversation-ref]', { isDefault: true })
|
|
23
|
+
.description('Display a conversation with its messages')
|
|
24
|
+
.option('--limit <n>', 'Max messages to show (default: 50)')
|
|
25
|
+
.option('--since <date>', 'Messages newer than')
|
|
26
|
+
.option('--until <date>', 'Messages older than')
|
|
27
|
+
.option('--raw', 'Show raw markdown instead of rendered')
|
|
28
|
+
.option('--json', 'Output as JSON')
|
|
29
|
+
.option('--ndjson', 'Output as newline-delimited JSON')
|
|
30
|
+
.option('--full', 'Include all fields in JSON output')
|
|
31
|
+
.action((ref, options) => {
|
|
32
|
+
if (!ref) {
|
|
33
|
+
conversation.help();
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
return viewConversation(ref, options);
|
|
37
|
+
});
|
|
38
|
+
conversation
|
|
39
|
+
.command('with <user-ref> [workspace-ref]')
|
|
40
|
+
.description('Find your 1:1 conversation with a user')
|
|
41
|
+
.option('--workspace <ref>', 'Workspace ID or name')
|
|
42
|
+
.option('--include-groups', 'List any conversation that includes this user')
|
|
43
|
+
.option('--snippet', 'Include the latest message snippet in text output')
|
|
44
|
+
.option('--json', 'Output as JSON')
|
|
45
|
+
.option('--ndjson', 'Output as newline-delimited JSON')
|
|
46
|
+
.option('--full', 'Include all fields in JSON output')
|
|
47
|
+
.action(findConversationWithUser);
|
|
48
|
+
conversation
|
|
49
|
+
.command('reply <conversation-ref> [content]')
|
|
50
|
+
.description('Send a message in a conversation')
|
|
51
|
+
.option('--dry-run', 'Show what would be sent without sending')
|
|
52
|
+
.option('--json', 'Output sent message as JSON')
|
|
53
|
+
.option('--full', 'Include all fields in JSON output')
|
|
54
|
+
.action(replyToConversation);
|
|
55
|
+
conversation
|
|
56
|
+
.command('done <conversation-ref>')
|
|
57
|
+
.description('Archive a conversation')
|
|
58
|
+
.option('--dry-run', 'Show what would happen without executing')
|
|
59
|
+
.option('--json', 'Output result as JSON')
|
|
60
|
+
.action(markConversationDone);
|
|
61
|
+
conversation
|
|
62
|
+
.command('mute <conversation-ref>')
|
|
63
|
+
.description('Mute a conversation (stop notifications)')
|
|
64
|
+
.option('--minutes <n>', 'Number of minutes to mute (default: 60)')
|
|
65
|
+
.option('--dry-run', 'Show what would happen without executing')
|
|
66
|
+
.option('--json', 'Output result as JSON')
|
|
67
|
+
.option('--full', 'Include all fields in JSON output')
|
|
68
|
+
.action(muteConversation);
|
|
69
|
+
conversation
|
|
70
|
+
.command('unmute <conversation-ref>')
|
|
71
|
+
.description('Unmute a muted conversation (restore notifications)')
|
|
72
|
+
.option('--dry-run', 'Show what would happen without executing')
|
|
73
|
+
.option('--json', 'Output result as JSON')
|
|
74
|
+
.option('--full', 'Include all fields in JSON output')
|
|
75
|
+
.action(unmuteConversation);
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/conversation/index.ts"],"names":[],"mappings":"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"}
|