@doist/twist-cli 2.21.1 → 2.21.2
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 +6 -0
- package/dist/__mocks__/chalk.d.ts +3 -0
- package/dist/__mocks__/chalk.d.ts.map +1 -0
- package/dist/__mocks__/chalk.js +8 -0
- package/dist/__mocks__/chalk.js.map +1 -0
- package/dist/commands/auth.d.ts +3 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +155 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/away.d.ts +3 -0
- package/dist/commands/away.d.ts.map +1 -0
- package/dist/commands/away.js +120 -0
- package/dist/commands/away.js.map +1 -0
- package/dist/commands/changelog.d.ts +8 -0
- package/dist/commands/changelog.d.ts.map +1 -0
- package/dist/commands/changelog.js +113 -0
- package/dist/commands/changelog.js.map +1 -0
- package/dist/commands/channel.d.ts +3 -0
- package/dist/commands/channel.d.ts.map +1 -0
- package/dist/commands/channel.js +53 -0
- package/dist/commands/channel.js.map +1 -0
- package/dist/commands/comment.d.ts +3 -0
- package/dist/commands/comment.d.ts.map +1 -0
- package/dist/commands/comment.js +99 -0
- package/dist/commands/comment.js.map +1 -0
- package/dist/commands/completion.d.ts +3 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +121 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/conversation.d.ts +3 -0
- package/dist/commands/conversation.d.ts.map +1 -0
- package/dist/commands/conversation.js +458 -0
- package/dist/commands/conversation.js.map +1 -0
- package/dist/commands/inbox.d.ts +3 -0
- package/dist/commands/inbox.d.ts.map +1 -0
- package/dist/commands/inbox.js +127 -0
- package/dist/commands/inbox.js.map +1 -0
- package/dist/commands/msg.d.ts +3 -0
- package/dist/commands/msg.d.ts.map +1 -0
- package/dist/commands/msg.js +103 -0
- package/dist/commands/msg.js.map +1 -0
- package/dist/commands/react.d.ts +3 -0
- package/dist/commands/react.d.ts.map +1 -0
- package/dist/commands/react.js +102 -0
- package/dist/commands/react.js.map +1 -0
- package/dist/commands/search.d.ts +3 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +160 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/skill.d.ts +3 -0
- package/dist/commands/skill.d.ts.map +1 -0
- package/dist/commands/skill.js +119 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/thread/create.d.ts +7 -0
- package/dist/commands/thread/create.d.ts.map +1 -0
- package/dist/commands/thread/create.js +45 -0
- package/dist/commands/thread/create.js.map +1 -0
- package/dist/commands/thread/helpers.d.ts +10 -0
- package/dist/commands/thread/helpers.d.ts.map +1 -0
- package/dist/commands/thread/helpers.js +27 -0
- package/dist/commands/thread/helpers.js.map +1 -0
- package/dist/commands/thread/mutate.d.ts +5 -0
- package/dist/commands/thread/mutate.d.ts.map +1 -0
- package/dist/commands/thread/mutate.js +21 -0
- package/dist/commands/thread/mutate.js.map +1 -0
- package/dist/commands/thread/mute.d.ts +8 -0
- package/dist/commands/thread/mute.d.ts.map +1 -0
- package/dist/commands/thread/mute.js +58 -0
- package/dist/commands/thread/mute.js.map +1 -0
- package/dist/commands/thread/reply.d.ts +9 -0
- package/dist/commands/thread/reply.d.ts.map +1 -0
- package/dist/commands/thread/reply.js +68 -0
- package/dist/commands/thread/reply.js.map +1 -0
- package/dist/commands/thread/view.d.ts +9 -0
- package/dist/commands/thread/view.d.ts.map +1 -0
- package/dist/commands/thread/view.js +175 -0
- package/dist/commands/thread/view.js.map +1 -0
- package/dist/commands/thread.d.ts +3 -0
- package/dist/commands/thread.d.ts.map +1 -0
- package/dist/commands/thread.js +70 -0
- package/dist/commands/thread.js.map +1 -0
- package/dist/commands/update.d.ts +14 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +91 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/user.d.ts +3 -0
- package/dist/commands/user.d.ts.map +1 -0
- package/dist/commands/user.js +67 -0
- package/dist/commands/user.js.map +1 -0
- package/dist/commands/view.d.ts +3 -0
- package/dist/commands/view.d.ts.map +1 -0
- package/dist/commands/view.js +63 -0
- package/dist/commands/view.js.map +1 -0
- package/dist/commands/workspace.d.ts +3 -0
- package/dist/commands/workspace.d.ts.map +1 -0
- package/dist/commands/workspace.js +48 -0
- package/dist/commands/workspace.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +133 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api.d.ts +20 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +229 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/auth.d.ts +21 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +189 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/completion.d.ts +31 -0
- package/dist/lib/completion.d.ts.map +1 -0
- package/dist/lib/completion.js +173 -0
- package/dist/lib/completion.js.map +1 -0
- package/dist/lib/config.d.ts +13 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +26 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/dates.d.ts +3 -0
- package/dist/lib/dates.d.ts.map +1 -0
- package/dist/lib/dates.js +44 -0
- package/dist/lib/dates.js.map +1 -0
- package/dist/lib/input.d.ts +3 -0
- package/dist/lib/input.d.ts.map +1 -0
- package/dist/lib/input.js +52 -0
- package/dist/lib/input.js.map +1 -0
- package/dist/lib/markdown.d.ts +2 -0
- package/dist/lib/markdown.d.ts.map +1 -0
- package/dist/lib/markdown.js +16 -0
- package/dist/lib/markdown.js.map +1 -0
- package/dist/lib/oauth-server.d.ts +13 -0
- package/dist/lib/oauth-server.d.ts.map +1 -0
- package/dist/lib/oauth-server.js +824 -0
- package/dist/lib/oauth-server.js.map +1 -0
- package/dist/lib/oauth.d.ts +31 -0
- package/dist/lib/oauth.d.ts.map +1 -0
- package/dist/lib/oauth.js +140 -0
- package/dist/lib/oauth.js.map +1 -0
- package/dist/lib/options.d.ts +17 -0
- package/dist/lib/options.d.ts.map +1 -0
- package/dist/lib/options.js +2 -0
- package/dist/lib/options.js.map +1 -0
- package/dist/lib/output.d.ts +25 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +128 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/permissions.d.ts +4 -0
- package/dist/lib/permissions.d.ts.map +1 -0
- package/dist/lib/permissions.js +35 -0
- package/dist/lib/permissions.js.map +1 -0
- package/dist/lib/pkce.d.ts +16 -0
- package/dist/lib/pkce.d.ts.map +1 -0
- package/dist/lib/pkce.js +35 -0
- package/dist/lib/pkce.js.map +1 -0
- package/dist/lib/progress.d.ts +29 -0
- package/dist/lib/progress.d.ts.map +1 -0
- package/dist/lib/progress.js +101 -0
- package/dist/lib/progress.js.map +1 -0
- package/dist/lib/public-channels.d.ts +5 -0
- package/dist/lib/public-channels.d.ts.map +1 -0
- package/dist/lib/public-channels.js +35 -0
- package/dist/lib/public-channels.js.map +1 -0
- package/dist/lib/refs.d.ts +37 -0
- package/dist/lib/refs.d.ts.map +1 -0
- package/dist/lib/refs.js +219 -0
- package/dist/lib/refs.js.map +1 -0
- package/dist/lib/search-api.d.ts +25 -0
- package/dist/lib/search-api.d.ts.map +1 -0
- package/dist/lib/search-api.js +85 -0
- package/dist/lib/search-api.js.map +1 -0
- package/dist/lib/secure-store.d.ts +11 -0
- package/dist/lib/secure-store.d.ts.map +1 -0
- package/dist/lib/secure-store.js +57 -0
- package/dist/lib/secure-store.js.map +1 -0
- package/dist/lib/skills/content.d.ts +5 -0
- package/dist/lib/skills/content.d.ts.map +1 -0
- package/dist/lib/skills/content.js +286 -0
- package/dist/lib/skills/content.js.map +1 -0
- package/dist/lib/skills/create-installer.d.ts +9 -0
- package/dist/lib/skills/create-installer.d.ts.map +1 -0
- package/dist/lib/skills/create-installer.js +60 -0
- package/dist/lib/skills/create-installer.js.map +1 -0
- package/dist/lib/skills/index.d.ts +7 -0
- package/dist/lib/skills/index.d.ts.map +1 -0
- package/dist/lib/skills/index.js +54 -0
- package/dist/lib/skills/index.js.map +1 -0
- package/dist/lib/skills/types.d.ts +30 -0
- package/dist/lib/skills/types.d.ts.map +1 -0
- package/dist/lib/skills/types.js +2 -0
- package/dist/lib/skills/types.js.map +1 -0
- package/dist/lib/skills/update-installed.d.ts +9 -0
- package/dist/lib/skills/update-installed.d.ts.map +1 -0
- package/dist/lib/skills/update-installed.js +20 -0
- package/dist/lib/skills/update-installed.js.map +1 -0
- package/dist/lib/spinner.d.ts +24 -0
- package/dist/lib/spinner.d.ts.map +1 -0
- package/dist/lib/spinner.js +126 -0
- package/dist/lib/spinner.js.map +1 -0
- package/dist/postinstall.d.ts +2 -0
- package/dist/postinstall.d.ts.map +1 -0
- package/dist/postinstall.js +3 -0
- package/dist/postinstall.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { getTwistClient } from '../lib/api.js';
|
|
2
|
+
import { formatRelativeDate } from '../lib/dates.js';
|
|
3
|
+
import { openEditor, readStdin } from '../lib/input.js';
|
|
4
|
+
import { renderMarkdown } from '../lib/markdown.js';
|
|
5
|
+
import { colors, formatJson } from '../lib/output.js';
|
|
6
|
+
import { resolveCommentId } from '../lib/refs.js';
|
|
7
|
+
async function viewComment(ref, options) {
|
|
8
|
+
const commentId = resolveCommentId(ref);
|
|
9
|
+
const client = await getTwistClient();
|
|
10
|
+
const comment = await client.comments.getComment(commentId);
|
|
11
|
+
const userResponse = await client.workspaceUsers.getUserById({ workspaceId: comment.workspaceId, userId: comment.creator }, { batch: false });
|
|
12
|
+
const creatorName = userResponse.name;
|
|
13
|
+
if (options.json) {
|
|
14
|
+
const output = { ...comment, creatorName };
|
|
15
|
+
console.log(formatJson(output, options.full ? undefined : 'comment', options.full));
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const author = colors.author(creatorName);
|
|
19
|
+
const time = colors.timestamp(formatRelativeDate(comment.posted));
|
|
20
|
+
console.log(`${author} ${time} ${colors.timestamp(`id:${comment.id}`)}`);
|
|
21
|
+
console.log(options.raw ? comment.content : renderMarkdown(comment.content));
|
|
22
|
+
console.log('');
|
|
23
|
+
}
|
|
24
|
+
async function updateComment(ref, content, options) {
|
|
25
|
+
const commentId = resolveCommentId(ref);
|
|
26
|
+
let newContent = await readStdin();
|
|
27
|
+
if (!newContent && content) {
|
|
28
|
+
newContent = content;
|
|
29
|
+
}
|
|
30
|
+
if (!newContent) {
|
|
31
|
+
newContent = await openEditor();
|
|
32
|
+
}
|
|
33
|
+
if (!newContent || newContent.trim() === '') {
|
|
34
|
+
console.error('No content provided.');
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
if (options.dryRun) {
|
|
38
|
+
console.log(`Dry run: would update comment ${commentId}`);
|
|
39
|
+
console.log('');
|
|
40
|
+
console.log(newContent);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const client = await getTwistClient();
|
|
44
|
+
const comment = await client.comments.updateComment({
|
|
45
|
+
id: commentId,
|
|
46
|
+
content: newContent,
|
|
47
|
+
});
|
|
48
|
+
if (options.json) {
|
|
49
|
+
console.log(formatJson(comment, 'comment', options.full));
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
console.log(`Comment updated: ${comment.url}`);
|
|
53
|
+
}
|
|
54
|
+
async function deleteComment(ref, options) {
|
|
55
|
+
const commentId = resolveCommentId(ref);
|
|
56
|
+
if (options.dryRun) {
|
|
57
|
+
console.log(`Dry run: would delete comment ${commentId}`);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const client = await getTwistClient();
|
|
61
|
+
await client.comments.deleteComment(commentId);
|
|
62
|
+
if (options.json) {
|
|
63
|
+
console.log(formatJson({ id: commentId, deleted: true }));
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
console.log(`Comment ${commentId} deleted.`);
|
|
67
|
+
}
|
|
68
|
+
export function registerCommentCommand(program) {
|
|
69
|
+
const comment = program
|
|
70
|
+
.command('comment')
|
|
71
|
+
.description('Thread comment operations (view, update, delete)');
|
|
72
|
+
comment
|
|
73
|
+
.command('view [comment-ref]', { isDefault: true })
|
|
74
|
+
.description('View a single thread comment')
|
|
75
|
+
.option('--raw', 'Show raw markdown instead of rendered')
|
|
76
|
+
.option('--json', 'Output as JSON')
|
|
77
|
+
.option('--full', 'Include all fields in JSON output')
|
|
78
|
+
.action((ref, options) => {
|
|
79
|
+
if (!ref) {
|
|
80
|
+
comment.help();
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
return viewComment(ref, options);
|
|
84
|
+
});
|
|
85
|
+
comment
|
|
86
|
+
.command('update <comment-ref> [content]')
|
|
87
|
+
.description('Update a thread comment')
|
|
88
|
+
.option('--dry-run', 'Show what would be updated without updating')
|
|
89
|
+
.option('--json', 'Output updated comment as JSON')
|
|
90
|
+
.option('--full', 'Include all fields in JSON output')
|
|
91
|
+
.action(updateComment);
|
|
92
|
+
comment
|
|
93
|
+
.command('delete <comment-ref>')
|
|
94
|
+
.description('Delete a thread comment')
|
|
95
|
+
.option('--dry-run', 'Show what would happen without executing')
|
|
96
|
+
.option('--json', 'Output result as JSON')
|
|
97
|
+
.action(deleteComment);
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=comment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comment.js","sourceRoot":"","sources":["../../src/commands/comment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA2CnC,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkGhE"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join, resolve } from 'node:path';
|
|
4
|
+
import { getCompletions, parseCompLine } from '../lib/completion.js';
|
|
5
|
+
// pwsh is included because tabtab supports it — installedShells() needs to
|
|
6
|
+
// detect and clean up pwsh completion files even though we don't advertise it.
|
|
7
|
+
const COMPLETION_EXTENSIONS = {
|
|
8
|
+
bash: 'bash',
|
|
9
|
+
zsh: 'zsh',
|
|
10
|
+
fish: 'fish',
|
|
11
|
+
pwsh: 'ps1',
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Find which shells have tw completions installed by checking for the
|
|
15
|
+
* completion script files that tabtab creates.
|
|
16
|
+
*
|
|
17
|
+
* FIXME: Workaround for https://github.com/pnpm/tabtab/issues/34 —
|
|
18
|
+
* tabtab.uninstall() without a shell tries all shells and throws ENOENT
|
|
19
|
+
* for ones that were never installed. We detect which shells are actually
|
|
20
|
+
* installed and uninstall only those. Remove once the upstream issue is fixed.
|
|
21
|
+
*/
|
|
22
|
+
function installedShells() {
|
|
23
|
+
return Object.entries(COMPLETION_EXTENSIONS)
|
|
24
|
+
.filter(([shell, ext]) => existsSync(join(homedir(), '.config', 'tabtab', shell, `tw.${ext}`)))
|
|
25
|
+
.map(([shell]) => shell);
|
|
26
|
+
}
|
|
27
|
+
function resolveCompleterCommand() {
|
|
28
|
+
const invokedScript = process.argv[1];
|
|
29
|
+
if (!invokedScript) {
|
|
30
|
+
return 'tw';
|
|
31
|
+
}
|
|
32
|
+
const resolvedScript = resolve(invokedScript);
|
|
33
|
+
if (existsSync(resolvedScript)) {
|
|
34
|
+
return resolvedScript;
|
|
35
|
+
}
|
|
36
|
+
return 'tw';
|
|
37
|
+
}
|
|
38
|
+
export function registerCompletionCommand(program) {
|
|
39
|
+
const completion = program.command('completion').description('Manage shell completions');
|
|
40
|
+
completion
|
|
41
|
+
.command('install [shell]')
|
|
42
|
+
.description('Install shell completions (bash, zsh, fish)')
|
|
43
|
+
.action(async (shell) => {
|
|
44
|
+
const tabtab = await import('@pnpm/tabtab');
|
|
45
|
+
const completer = resolveCompleterCommand();
|
|
46
|
+
if (shell && !tabtab.isShellSupported(shell)) {
|
|
47
|
+
console.error(`Unsupported shell: ${shell}. Supported: ${tabtab.SUPPORTED_SHELLS.join(', ')}`);
|
|
48
|
+
process.exitCode = 1;
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
await tabtab.install({
|
|
52
|
+
name: 'tw',
|
|
53
|
+
// Use the executable path used to install completions so shell
|
|
54
|
+
// completion doesn't accidentally call an older `tw` on PATH.
|
|
55
|
+
completer,
|
|
56
|
+
shell: shell,
|
|
57
|
+
});
|
|
58
|
+
console.log('Shell completions installed successfully.');
|
|
59
|
+
console.log('Restart your shell or source your shell config to activate.');
|
|
60
|
+
});
|
|
61
|
+
completion
|
|
62
|
+
.command('uninstall')
|
|
63
|
+
.description('Remove shell completions')
|
|
64
|
+
.action(async () => {
|
|
65
|
+
// FIXME: Replace with plain tabtab.uninstall({ name: 'tw' }) once
|
|
66
|
+
// https://github.com/pnpm/tabtab/issues/34 is fixed.
|
|
67
|
+
const shells = installedShells();
|
|
68
|
+
if (shells.length === 0) {
|
|
69
|
+
console.log('No shell completions installed.');
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const tabtab = await import('@pnpm/tabtab');
|
|
73
|
+
for (const shell of shells) {
|
|
74
|
+
await tabtab.uninstall({
|
|
75
|
+
name: 'tw',
|
|
76
|
+
shell,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
console.log('Shell completions removed.');
|
|
80
|
+
});
|
|
81
|
+
// Hidden command invoked by the shell completion script at TAB time
|
|
82
|
+
program
|
|
83
|
+
.command('completion-server', { hidden: true })
|
|
84
|
+
.description('Completion server (internal)')
|
|
85
|
+
.allowUnknownOption()
|
|
86
|
+
.allowExcessArguments()
|
|
87
|
+
.action(async () => {
|
|
88
|
+
const tabtab = await import('@pnpm/tabtab');
|
|
89
|
+
const env = tabtab.parseEnv(process.env);
|
|
90
|
+
if (!env.complete) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const shell = tabtab.getShellFromEnv(process.env);
|
|
94
|
+
const words = parseCompLine(env.line);
|
|
95
|
+
let current = env.last;
|
|
96
|
+
// The fish/zsh completion templates always append a trailing space
|
|
97
|
+
// to COMP_LINE, making env.last empty even when the cursor is right
|
|
98
|
+
// after '--flag='. Use env.lastPartial (cursor-position-aware) to
|
|
99
|
+
// detect this case and restore the actual word being completed.
|
|
100
|
+
if (current === '' && env.lastPartial.includes('=')) {
|
|
101
|
+
if (words.at(-1) === '')
|
|
102
|
+
words.pop();
|
|
103
|
+
current = env.lastPartial;
|
|
104
|
+
}
|
|
105
|
+
const completions = getCompletions(program, words, current);
|
|
106
|
+
// Bash treats '=' as a word break (COMP_WORDBREAKS), so readline
|
|
107
|
+
// replaces only the part after '=' with COMPREPLY values. If we
|
|
108
|
+
// return '--flag=value', bash produces '--flag=--flag=value'.
|
|
109
|
+
// Strip the flag prefix so bash gets just the value part.
|
|
110
|
+
if (shell === 'bash' && current.includes('=')) {
|
|
111
|
+
const prefix = current.slice(0, current.indexOf('=') + 1);
|
|
112
|
+
const values = completions
|
|
113
|
+
.map((c) => (c.name.startsWith(prefix) ? c.name.slice(prefix.length) : c.name))
|
|
114
|
+
.filter(Boolean);
|
|
115
|
+
console.log(values.join('\n'));
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
tabtab.log(completions, shell);
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=completion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion.js","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../src/commands/conversation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAuiBnC,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2ElE"}
|